@nickkupriyanov/slotline-react 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/useMediaQuery.ts","../src/hooks/useAnimatedHeight.ts","../src/animations/motion.tsx","../src/animations/css.tsx","../src/context.tsx","../src/hooks/useFocusTrap.ts","../src/components/icons.tsx","../src/components/CalendarStep.tsx","../src/components/ConfirmedStep.tsx","../src/components/DetailsStep.tsx","../src/components/DurationFooter.tsx","../src/components/Progress.tsx","../src/components/SlotsStep.tsx","../src/components/SlotlineView.tsx","../src/hooks/useControllableState.ts","../src/hooks/useResolvedTheme.ts","../src/useBookingFlow.ts","../src/Slotline.tsx","../src/motion.ts"],"names":["useState","useEffect","StepHost","jsx","cx","Item","Height","useCallback","useRef","jsxs","format","stepIndex","FLOW_STEPS","useMemo","todayKey","monthKeyOf","countSlots","formatFullDay","formatTime","Slotline"],"mappings":"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","file":"motion.js","sourcesContent":["import { useEffect, useState } from 'react';\n\nfunction subscribe(query: string, listener: (matches: boolean) => void): () => void {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return () => {};\n const list = window.matchMedia(query);\n const handler = (event: MediaQueryListEvent) => listener(event.matches);\n listener(list.matches);\n list.addEventListener('change', handler);\n return () => list.removeEventListener('change', handler);\n}\n\n/** Tracks any media query, SSR-safe. */\nexport function useMediaQuery(query: string): boolean {\n const [matches, setMatches] = useState(false);\n\n useEffect(() => {\n let active = true;\n const unsubscribe = subscribe(query, (next) => {\n if (active) setMatches(next);\n });\n return () => {\n active = false;\n unsubscribe();\n };\n }, [query]);\n\n return matches;\n}\n\n/** `true` when the user asked the OS to reduce motion. */\nexport function useReducedMotion(): boolean {\n return useMediaQuery('(prefers-reduced-motion: reduce)');\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useReducedMotion } from './useMediaQuery';\n\nexport interface UseAnimatedHeightResult<T extends HTMLElement> {\n /** Attach to the inner element whose natural height should be followed. */\n contentRef: React.RefObject<T | null>;\n /** Inline style for the clipping wrapper (`undefined` disables animation). */\n style: React.CSSProperties | undefined;\n /** `true` while the wrapper animates — lets CSS disable clipping afterwards. */\n animating: boolean;\n}\n\n/**\n * Follows the height of `contentRef` and animates the wrapper between values.\n *\n * Content is clipped *only* while animating, so focus rings and shadows are\n * never cut off at rest — the detail that usually makes this trick look cheap.\n * Under `prefers-reduced-motion: reduce` the wrapper keeps its natural height.\n */\nexport function useAnimatedHeight<T extends HTMLElement>(\n durationMs = 320,\n): UseAnimatedHeightResult<T> {\n const contentRef = useRef<T | null>(null);\n const heightRef = useRef<number | undefined>(undefined);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [height, setHeight] = useState<number>();\n const [animating, setAnimating] = useState(false);\n const reducedMotion = useReducedMotion();\n\n const measure = useCallback(() => {\n const element = contentRef.current;\n if (!element) return;\n const next = element.getBoundingClientRect().height;\n if (!(next > 0)) return;\n\n const previous = heightRef.current;\n if (previous !== undefined && Math.abs(previous - next) >= 1) {\n setAnimating(true);\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setAnimating(false), durationMs);\n }\n heightRef.current = next;\n setHeight((current) => (current === next ? current : next));\n }, [durationMs]);\n\n useEffect(() => {\n if (reducedMotion) return;\n measure();\n\n const element = contentRef.current;\n if (!element || typeof ResizeObserver === 'undefined') {\n window.addEventListener('resize', measure);\n return () => window.removeEventListener('resize', measure);\n }\n const observer = new ResizeObserver(() => measure());\n observer.observe(element);\n return () => observer.disconnect();\n }, [measure, reducedMotion]);\n\n useEffect(\n () => () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n },\n [],\n );\n\n if (reducedMotion) {\n return { contentRef, style: undefined, animating: false };\n }\n\n const style: React.CSSProperties | undefined =\n height === undefined\n ? undefined\n : {\n height,\n overflow: animating ? 'hidden' : 'visible',\n transition: `height ${durationMs}ms var(--sl-ease-soft)`,\n };\n\n return { contentRef, style, animating };\n}\n","import type { ComponentType, ReactNode } from 'react';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { useAnimatedHeight } from '../hooks/useAnimatedHeight';\nimport type { AnimationKit, HeightProps, StaggerItemProps, StepHostProps } from '../types';\nimport { cx } from '@nickkupriyanov/slotline-core';\n\nconst spring = { type: 'spring', stiffness: 420, damping: 34, mass: 0.7 } as const;\n\n/**\n * `motion.button` conflicts with the DOM button props we accept (`onDragStart`\n * and friends have incompatible signatures), so the component is narrowed here\n * instead of leaking casts into the widget.\n */\nconst MotionButton = motion.button as unknown as ComponentType<\n Record<string, unknown> & { children?: ReactNode; className?: string }\n>;\n\nfunction StepHost({ stepKey, direction, className, children }: StepHostProps) {\n const forward = direction === 1;\n return (\n <div className={cx('sl-step-host', className)} data-direction={forward ? 'forward' : 'back'}>\n <AnimatePresence mode=\"wait\" initial={false}>\n <motion.div\n key={stepKey}\n className=\"sl-step\"\n initial={{ opacity: 0, y: forward ? 12 : -12, scale: 0.99 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: forward ? -10 : 10, scale: 0.99 }}\n transition={spring}\n >\n {children}\n </motion.div>\n </AnimatePresence>\n </div>\n );\n}\n\nfunction Item({ index, className, type = 'button', children, ...rest }: StaggerItemProps) {\n return (\n <MotionButton\n {...rest}\n type={type}\n className={cx('sl-stagger-item', className)}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ ...spring, delay: Math.min(index, 14) * 0.018 }}\n whileTap={{ scale: 0.97 }}\n >\n {children}\n </MotionButton>\n );\n}\n\nfunction Height({ className, children }: HeightProps) {\n const { contentRef, style } = useAnimatedHeight<HTMLDivElement>();\n return (\n <div className={cx('sl-height', className)} style={style}>\n <div className=\"sl-height-content\" ref={contentRef}>\n {children}\n </div>\n </div>\n );\n}\n\n/**\n * Spring-based kit. Requires the optional `motion` peer dependency and is the\n * whole point of the `@nickkupriyanov/slotline-react/motion` entry point.\n */\nexport const motionAnimations: AnimationKit = {\n StepHost,\n Item,\n Height,\n};\n","import type { CSSProperties } from 'react';\nimport { useAnimatedHeight } from '../hooks/useAnimatedHeight';\nimport type { AnimationKit, HeightProps, StaggerItemProps, StepHostProps } from '../types';\nimport { cx } from '@nickkupriyanov/slotline-core';\n\nfunction StepHost({ stepKey, direction, className, children }: StepHostProps) {\n return (\n <div\n className={cx('sl-step-host', className)}\n data-direction={direction === 1 ? 'forward' : 'back'}\n >\n <div className=\"sl-step\" key={stepKey}>\n {children}\n </div>\n </div>\n );\n}\n\nfunction Item({ index, className, style, type = 'button', children, ...rest }: StaggerItemProps) {\n return (\n <button\n {...rest}\n type={type}\n className={cx('sl-slot', 'sl-stagger-item', className)}\n style={{ ...style, '--sl-index': index } as CSSProperties}\n >\n {children}\n </button>\n );\n}\n\nfunction Height({ className, children }: HeightProps) {\n const { contentRef, style } = useAnimatedHeight<HTMLDivElement>();\n return (\n <div className={cx('sl-height', className)} style={style}>\n <div className=\"sl-height-content\" ref={contentRef}>\n {children}\n </div>\n </div>\n );\n}\n\n/**\n * The default kit: no runtime, no dependencies. Every transition is a CSS\n * animation or transition, and all of them collapse under\n * `prefers-reduced-motion: reduce`.\n */\nexport const cssAnimations: AnimationKit = {\n StepHost,\n Item,\n Height,\n};\n","import { createContext, useCallback, useContext } from 'react';\nimport { cssAnimations } from './animations/css';\nimport { SLOT_CLASS, cx, type ClassValue } from '@nickkupriyanov/slotline-core';\nimport type { UseBookingFlowResult } from './useBookingFlow';\nimport type { AnimationKit, SlotlineClassSlot } from './types';\n\n/* -------------------------------------------------------------------------- */\n/* Flow context */\n/* -------------------------------------------------------------------------- */\n\nexport const FlowContext = createContext<UseBookingFlowResult | null>(null);\n\n/**\n * Reads the booking flow from the nearest `<Slotline>` / `<SlotlineProvider>`.\n * This is the hook to build a fully custom UI on top of.\n */\nexport function useSlotlineContext(): UseBookingFlowResult {\n const flow = useContext(FlowContext);\n if (!flow) {\n throw new Error(\n '[slotline] useSlotlineContext() must be used inside <Slotline> or <SlotlineProvider>.',\n );\n }\n return flow;\n}\n\n/** Internal short alias used by the built-in components. */\nexport const useFlow = useSlotlineContext;\n\n/* -------------------------------------------------------------------------- */\n/* UI context */\n/* -------------------------------------------------------------------------- */\n\nexport interface SlotlineUIContextValue {\n animations: AnimationKit;\n classNames?: Partial<Record<SlotlineClassSlot, string>>;\n autoFocus: boolean;\n trapFocus: boolean;\n className?: string;\n}\n\nexport const UIContext = createContext<SlotlineUIContextValue>({\n animations: cssAnimations,\n autoFocus: false,\n trapFocus: false,\n});\n\nexport function useUI(): SlotlineUIContextValue {\n return useContext(UIContext);\n}\n\nexport function useAnimations(): AnimationKit {\n return useContext(UIContext).animations;\n}\n\n/** `classes('day', isToday && 'is-today')` → `\"sl-day is-today <consumer class>\"`. */\nexport function useClassNames(): (slot: SlotlineClassSlot, ...extra: ClassValue[]) => string {\n const { classNames } = useUI();\n return useCallback(\n (slot: SlotlineClassSlot, ...extra: ClassValue[]) =>\n cx(SLOT_CLASS[slot], classNames?.[slot], ...extra),\n [classNames],\n );\n}\n","import { useEffect } from 'react';\n\nconst FOCUSABLE = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])',\n].join(',');\n\nfunction focusableWithin(container: HTMLElement): HTMLElement[] {\n return Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE)).filter(\n (element) =>\n element.offsetParent !== null || element === document.activeElement || element.tabIndex >= 0,\n );\n}\n\nexport interface UseFocusTrapOptions {\n active: boolean;\n /** Called on `Escape`. */\n onEscape?: () => void;\n}\n\n/**\n * Keeps `Tab` inside the widget while it is mounted and optionally routes\n * `Escape` to the consumer. Deliberately not a modal trap: it never blocks the\n * rest of the page from receiving focus programmatically.\n */\nexport function useFocusTrap(\n containerRef: React.RefObject<HTMLElement | null>,\n { active, onEscape }: UseFocusTrapOptions,\n): void {\n useEffect(() => {\n if (!active) return;\n const container = containerRef.current;\n if (!container) return;\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && onEscape) {\n event.stopPropagation();\n onEscape();\n return;\n }\n if (event.key !== 'Tab') return;\n\n const focusable = focusableWithin(container);\n if (focusable.length === 0) {\n event.preventDefault();\n container.focus();\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n const activeElement = document.activeElement as HTMLElement | null;\n\n if (!activeElement || !container.contains(activeElement)) {\n event.preventDefault();\n (event.shiftKey ? last : first).focus();\n return;\n }\n if (!event.shiftKey && activeElement === last) {\n event.preventDefault();\n first.focus();\n } else if (event.shiftKey && activeElement === first) {\n event.preventDefault();\n last.focus();\n }\n };\n\n container.addEventListener('keydown', onKeyDown);\n return () => container.removeEventListener('keydown', onKeyDown);\n }, [active, containerRef, onEscape]);\n}\n","import type { ComponentPropsWithoutRef, ReactNode } from 'react';\n\nexport function ChevronLeftIcon(props: ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" aria-hidden=\"true\" focusable=\"false\" {...props}>\n <path\n d=\"M14.5 5.5 8 12l6.5 6.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function ChevronRightIcon(props: ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" aria-hidden=\"true\" focusable=\"false\" {...props}>\n <path\n d=\"M9.5 5.5 16 12l-6.5 6.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function ArrowRightIcon(props: ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" aria-hidden=\"true\" focusable=\"false\" {...props}>\n <path\n d=\"M4 12h15m0 0-6-6m6 6-6 6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function CalendarIcon(props: ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" aria-hidden=\"true\" focusable=\"false\" {...props}>\n <rect\n x=\"3.5\"\n y=\"5\"\n width=\"17\"\n height=\"15.5\"\n rx=\"3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.7\"\n />\n <path\n d=\"M3.5 9.5h17M8 3.5v3M16 3.5v3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.7\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function ClockIcon(props: ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\" {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"8.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.7\" />\n <path\n d=\"M12 7.5V12l3 2\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.7\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function CheckIcon(props: ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"26\" height=\"26\" aria-hidden=\"true\" focusable=\"false\" {...props}>\n <path\n className=\"sl-check-path\"\n d=\"M5 12.5 10 17.5 19 7\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function SpinnerIcon(props: ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\" {...props}>\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"8\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"34 14\"\n />\n </svg>\n );\n}\n\nexport interface IconProps {\n children: ReactNode;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport {\n addDays,\n countSlots,\n format,\n formatFullDay,\n monthKeyOf,\n todayKey,\n weekdayIndex,\n} from '@nickkupriyanov/slotline-core';\nimport { useClassNames, useFlow } from '../context';\nimport { ChevronLeftIcon, ChevronRightIcon } from './icons';\n\nfunction chunk<T>(values: T[], size: number): T[][] {\n const rows: T[][] = [];\n for (let index = 0; index < values.length; index += size) {\n rows.push(values.slice(index, index + size));\n }\n return rows;\n}\n\n/**\n * Step 1 — the month grid. Days carrying availability render a dot and become\n * selectable; everything else stays visible but inert, exactly like the\n * reference design.\n */\nexport function CalendarStep() {\n const {\n state,\n messages,\n locale,\n timeZone,\n timeZoneName,\n monthLabel,\n monthGrid,\n weekdayHeaders,\n weekdayLongNames,\n weekStartsOn,\n actions,\n availabilityOf,\n isDayBookable,\n } = useFlow();\n const cls = useClassNames();\n const gridRef = useRef<HTMLDivElement>(null);\n const pendingFocusRef = useRef(false);\n /** Day-of-month to restore after PageUp/PageDown swapped the visible month. */\n const pendingMonthFocusRef = useRef<string | null>(null);\n const [focusKey, setFocusKey] = useState<string | null>(null);\n const today = todayKey(timeZone);\n\n const rows = useMemo(() => chunk(monthGrid, 7), [monthGrid]);\n\n const firstBookable = useMemo(\n () => monthGrid.find((day) => monthKeyOf(day) === state.month && isDayBookable(day)),\n [monthGrid, state.month, isDayBookable],\n );\n\n /**\n * The single tab stop of the grid (roving tabindex). The candidate has to\n * exist in the *current* grid: after a month change the previously focused\n * key is gone, and a stale value would leave every cell at `tabindex=\"-1\"`.\n */\n const focusTarget = useMemo(() => {\n if (focusKey && monthGrid.includes(focusKey)) return focusKey;\n if (state.selectedDate && monthGrid.includes(state.selectedDate)) return state.selectedDate;\n return firstBookable ?? monthGrid[0] ?? `${state.month}-01`;\n }, [focusKey, monthGrid, state.selectedDate, firstBookable, state.month]);\n\n useEffect(() => {\n if (!pendingFocusRef.current || !focusKey) return;\n pendingFocusRef.current = false;\n const node = gridRef.current?.querySelector<HTMLElement>(`[data-day=\"${focusKey}\"]`);\n node?.focus();\n }, [focusKey, monthGrid]);\n\n // PageUp/PageDown rebuild the grid, so bring the keyboard along — otherwise\n // focus dies with the unmounted cell.\n useEffect(() => {\n const dayOfMonth = pendingMonthFocusRef.current;\n if (!dayOfMonth) return;\n pendingMonthFocusRef.current = null;\n const sameDay = monthGrid.find(\n (candidate) => monthKeyOf(candidate) === state.month && candidate.slice(8, 10) === dayOfMonth,\n );\n const target = sameDay ?? monthGrid.find((candidate) => monthKeyOf(candidate) === state.month);\n if (!target) return;\n pendingFocusRef.current = true;\n setFocusKey(target);\n }, [state.month, monthGrid]);\n\n const moveFocus = useCallback((nextKey: string) => {\n pendingFocusRef.current = true;\n setFocusKey(nextKey);\n }, []);\n\n const onKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n const current = (event.target as HTMLElement).dataset?.day;\n if (!current) return;\n const offsetFromWeekStart = (weekdayIndex(current) - weekStartsOn + 7) % 7;\n let next: string | undefined;\n\n switch (event.key) {\n case 'ArrowLeft':\n next = addDays(current, -1);\n break;\n case 'ArrowRight':\n next = addDays(current, 1);\n break;\n case 'ArrowUp':\n next = addDays(current, -7);\n break;\n case 'ArrowDown':\n next = addDays(current, 7);\n break;\n case 'Home':\n next = addDays(current, -offsetFromWeekStart);\n break;\n case 'End':\n next = addDays(current, 6 - offsetFromWeekStart);\n break;\n case 'PageUp':\n event.preventDefault();\n pendingMonthFocusRef.current = current.slice(8, 10);\n actions.previousMonth();\n return;\n case 'PageDown':\n event.preventDefault();\n pendingMonthFocusRef.current = current.slice(8, 10);\n actions.nextMonth();\n return;\n default:\n return;\n }\n\n event.preventDefault();\n const last = monthGrid[monthGrid.length - 1];\n const first = monthGrid[0];\n if (last && first && (next < first || next > last)) {\n actions.goToMonth(monthKeyOf(next));\n }\n moveFocus(next);\n },\n [actions, monthGrid, moveFocus, weekStartsOn],\n );\n\n return (\n <div className={cls('calendar')} data-status={state.daysStatus}>\n <div className={cls('calendarHeader')}>\n <h3 className={cls('monthLabel')}>{monthLabel}</h3>\n <div className=\"sl-calendar-nav\">\n <button\n type=\"button\"\n className={cls('navButton')}\n onClick={actions.previousMonth}\n aria-label={messages.previousMonth}\n >\n <ChevronLeftIcon />\n </button>\n <button\n type=\"button\"\n className={cls('navButton')}\n onClick={actions.nextMonth}\n aria-label={messages.nextMonth}\n >\n <ChevronRightIcon />\n </button>\n </div>\n </div>\n\n <div className={cls('weekdays')}>\n {weekdayHeaders.map((label, index) => (\n <span key={weekdayLongNames[index] ?? index} className={cls('weekday')}>\n <span aria-hidden=\"true\">{label}</span>\n <span className=\"sl-visually-hidden\">{weekdayLongNames[index]}</span>\n </span>\n ))}\n </div>\n\n {state.daysStatus === 'error' ? (\n <div className={cls('error')} role=\"alert\">\n <span>{state.daysError}</span>\n <button type=\"button\" className=\"sl-link-button\" onClick={actions.reloadAvailability}>\n {messages.retry}\n </button>\n </div>\n ) : null}\n\n <div\n ref={gridRef}\n key={state.month}\n className={cls('grid')}\n role=\"grid\"\n aria-label={messages.calendarLabel}\n aria-busy={state.daysStatus === 'loading'}\n onKeyDown={onKeyDown}\n >\n {rows.map((row, rowIndex) => (\n <div className=\"sl-grid-row\" role=\"row\" key={row[0]}>\n {row.map((day, cellIndex) => {\n const outside = monthKeyOf(day) !== state.month;\n const bookable = isDayBookable(day);\n const count = countSlots(availabilityOf(day));\n const selected = state.selectedDate === day;\n const label = [\n formatFullDay(day, locale),\n count !== undefined && count > 0\n ? format(messages.slotsCount, { count })\n : messages.dayUnavailable,\n ].join(', ');\n\n return (\n <button\n key={day}\n type=\"button\"\n role=\"gridcell\"\n data-day={day}\n tabIndex={day === focusTarget ? 0 : -1}\n aria-selected={selected || undefined}\n aria-disabled={!bookable || undefined}\n aria-current={day === today ? 'date' : undefined}\n aria-label={label}\n className={cls(\n 'day',\n outside && 'is-outside',\n selected && 'is-selected',\n bookable && 'is-bookable',\n )}\n style={{ '--sl-index': rowIndex * 7 + cellIndex } as React.CSSProperties}\n onClick={() => {\n if (!bookable) return;\n actions.selectDate(day);\n }}\n >\n <span className=\"sl-day-number\">{Number(day.slice(8, 10))}</span>\n <span\n className={cls('dayDot')}\n aria-hidden=\"true\"\n data-visible={bookable || undefined}\n />\n </button>\n );\n })}\n </div>\n ))}\n </div>\n\n <p className=\"sl-timezone\">\n {format(messages.timeZoneHint, { zone: timeZoneName ?? timeZone, timeZone })}\n </p>\n </div>\n );\n}\n","import { format } from '@nickkupriyanov/slotline-core';\nimport { useClassNames, useFlow } from '../context';\nimport { CheckIcon } from './icons';\n\n/** Step 4 — confirmation. */\nexport function ConfirmedStep() {\n const { state, messages, selectedDateLabel, selectedTimeLabel, durationLabel, actions } =\n useFlow();\n const cls = useClassNames();\n\n const inviteeEmail =\n (typeof state.result?.inviteeEmail === 'string' ? state.result.inviteeEmail : undefined) ??\n state.details.email;\n\n return (\n <div className={cls('confirmation')}>\n <span className={cls('confirmationIcon')} aria-hidden=\"true\">\n <CheckIcon />\n </span>\n <h3 className={cls('confirmationTitle')}>{messages.bookedTitle}</h3>\n <div className={cls('confirmationText')}>\n <p>\n {format(messages.bookedSummary, {\n date: selectedDateLabel,\n time: selectedTimeLabel,\n duration: durationLabel,\n })}\n </p>\n <p>{format(messages.inviteSent, { email: inviteeEmail })}</p>\n </div>\n <button type=\"button\" className={cls('secondaryButton')} onClick={actions.reset}>\n {messages.bookAnother}\n </button>\n </div>\n );\n}\n","import { useId } from 'react';\nimport { useClassNames, useFlow } from '../context';\nimport { ArrowRightIcon, CalendarIcon, ClockIcon, SpinnerIcon } from './icons';\n\ninterface FieldProps {\n name: 'name' | 'email';\n label: string;\n value: string;\n type?: string;\n error?: string;\n disabled?: boolean;\n autoFocus?: boolean;\n onChange: (value: string) => void;\n onBlur: () => void;\n}\n\nfunction Field({\n name,\n label,\n value,\n type = 'text',\n error,\n disabled,\n autoFocus,\n onChange,\n onBlur,\n}: FieldProps) {\n const cls = useClassNames();\n const errorId = useId();\n\n return (\n <div className={cls('field')} data-invalid={error ? 'true' : undefined}>\n <input\n id={name}\n name={name}\n type={type}\n inputMode={type === 'email' ? 'email' : undefined}\n autoComplete={name === 'email' ? 'email' : 'name'}\n className={cls('input')}\n // The reference design has no visible labels; the accessible name comes\n // from aria-label so the placeholder can stay pure decoration.\n aria-label={label}\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? errorId : undefined}\n placeholder={label}\n value={value}\n disabled={disabled}\n autoFocus={autoFocus}\n onChange={(event) => onChange(event.target.value)}\n onBlur={onBlur}\n />\n {error ? (\n <p className=\"sl-field-error\" id={errorId} role=\"alert\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n\n/** Step 3 — recap of the selection plus the two required fields. */\nexport function DetailsStep() {\n const {\n state,\n messages,\n selectedDateLabel,\n selectedTimeLabel,\n durationLabel,\n actions,\n shownFieldErrors,\n detailsValid,\n } = useFlow();\n const cls = useClassNames();\n const submitting = state.submitStatus === 'submitting';\n\n return (\n <div className=\"sl-details-step\">\n <div className={cls('summary')}>\n <span className=\"sl-summary-icon\" aria-hidden=\"true\">\n <CalendarIcon />\n </span>\n <div className=\"sl-summary-body\">\n <p className=\"sl-summary-date\">{selectedDateLabel}</p>\n <p className=\"sl-summary-meta\">\n <ClockIcon />\n <span>\n {selectedTimeLabel} · {durationLabel}\n </span>\n </p>\n </div>\n </div>\n\n <form\n className={cls('form')}\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n void actions.submit();\n }}\n >\n <Field\n name=\"name\"\n label={messages.nameLabel}\n value={state.details.name}\n error={shownFieldErrors.name}\n disabled={submitting}\n autoFocus\n onChange={(value) => actions.setDetails({ name: value })}\n onBlur={() => actions.touchField('name')}\n />\n <Field\n name=\"email\"\n label={messages.emailLabel}\n type=\"email\"\n value={state.details.email}\n error={shownFieldErrors.email}\n disabled={submitting}\n onChange={(value) => actions.setDetails({ email: value })}\n onBlur={() => actions.touchField('email')}\n />\n\n {state.submitError ? (\n <div className={cls('error')} role=\"alert\">\n <span>{state.submitError}</span>\n <button\n type=\"button\"\n className=\"sl-link-button\"\n onClick={() => void actions.submit()}\n >\n {messages.retry}\n </button>\n </div>\n ) : null}\n\n <button\n type=\"submit\"\n className={cls('submit')}\n disabled={submitting || !detailsValid}\n data-loading={submitting ? 'true' : undefined}\n >\n <span>{submitting ? messages.confirming : messages.confirm}</span>\n {submitting ? (\n <SpinnerIcon className=\"sl-spinner\" />\n ) : (\n <ArrowRightIcon className=\"sl-submit-arrow\" />\n )}\n </button>\n </form>\n </div>\n );\n}\n","import { format } from '@nickkupriyanov/slotline-core';\nimport { useClassNames, useFlow } from '../context';\n\n/** The duration picker shown under the calendar, mirroring the reference design. */\nexport function DurationFooter() {\n const { state, messages, durations, actions } = useFlow();\n const cls = useClassNames();\n\n return (\n <footer className={cls('footer')}>\n {/* The group carries the accessible name, so the visible caption is decorative. */}\n <span className=\"sl-duration-label\" aria-hidden=\"true\">\n {messages.durationLabel}\n </span>\n <div className=\"sl-duration-group\" role=\"radiogroup\" aria-label={messages.durationGroupLabel}>\n {durations.map((minutes) => {\n const active = minutes === state.duration;\n const label = format(messages.duration, { count: minutes });\n return (\n <button\n key={minutes}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n aria-label={label}\n className=\"sl-duration-pill\"\n data-state={active ? 'active' : 'idle'}\n onClick={() => actions.setDuration(minutes)}\n >\n {label}\n </button>\n );\n })}\n </div>\n </footer>\n );\n}\n","import { FLOW_STEPS, format, stepIndex } from '@nickkupriyanov/slotline-core';\nimport { useClassNames, useFlow } from '../context';\n\n/** Three morphing pills: narrow while upcoming, wide once reached. */\nexport function Progress() {\n const { state, messages } = useFlow();\n const cls = useClassNames();\n const index = stepIndex(state.step);\n\n return (\n <div\n className={cls('progress')}\n role=\"progressbar\"\n aria-valuemin={1}\n aria-valuemax={FLOW_STEPS.length}\n aria-valuenow={index + 1}\n aria-valuetext={format(messages.progressLabel, {\n step: index + 1,\n total: FLOW_STEPS.length,\n })}\n >\n {FLOW_STEPS.map((step, position) => (\n <span\n key={step}\n className=\"sl-progress-pill\"\n data-state={position <= index ? 'done' : 'todo'}\n aria-hidden=\"true\"\n />\n ))}\n </div>\n );\n}\n","import { format, formatTime } from '@nickkupriyanov/slotline-core';\nimport { useClassNames, useAnimations, useFlow } from '../context';\nimport { CalendarIcon } from './icons';\n\nconst SKELETON_COUNT = 9;\n\n/** Step 2 — the slots of the selected day. */\nexport function SlotsStep() {\n const { state, messages, locale, timeZone, selectedDateLabel, actions } = useFlow();\n const cls = useClassNames();\n const { Item } = useAnimations();\n const loading = state.slotsStatus === 'loading' || state.slotsStatus === 'idle';\n\n return (\n <div className=\"sl-slots-step\">\n <div className={cls('slotsHeader')}>\n <span className=\"sl-slots-icon\" aria-hidden=\"true\">\n <CalendarIcon />\n </span>\n <h3 className=\"sl-slots-title\">{selectedDateLabel}</h3>\n {state.slotsStatus === 'ready' ? (\n <span className={cls('slotsCount')}>\n {format(messages.slotsCount, { count: state.slots.length })}\n </span>\n ) : null}\n </div>\n\n {loading ? (\n <div className={cls('slots')} aria-hidden=\"true\">\n {Array.from({ length: SKELETON_COUNT }, (_, index) => (\n <div\n key={index}\n className={cls('skeleton')}\n style={{ '--sl-index': index } as React.CSSProperties}\n />\n ))}\n </div>\n ) : null}\n\n {state.slotsStatus === 'error' ? (\n <div className={cls('error')} role=\"alert\">\n <span>{state.slotsError}</span>\n <button type=\"button\" className=\"sl-link-button\" onClick={actions.reloadSlots}>\n {messages.retry}\n </button>\n </div>\n ) : null}\n\n {state.slotsStatus === 'ready' && state.slots.length === 0 ? (\n <div className={cls('empty')}>\n <p className=\"sl-empty-title\">{messages.noSlotsTitle}</p>\n <p className=\"sl-empty-body\">{messages.noSlotsBody}</p>\n <button type=\"button\" className={cls('secondaryButton')} onClick={actions.back}>\n {messages.pickAnotherDay}\n </button>\n </div>\n ) : null}\n\n {state.slotsStatus === 'ready' && state.slots.length > 0 ? (\n <div className={cls('slots')} role=\"group\" aria-label={messages.slotsLabel}>\n {state.slots.map((slot, index) => {\n const selected = state.selectedSlot?.start === slot.start;\n return (\n <Item\n key={slot.start}\n index={index}\n className={cls('slot', selected && 'is-selected')}\n aria-current={selected ? 'true' : undefined}\n onClick={() => actions.selectSlot(slot)}\n >\n {formatTime(slot.start, timeZone, locale)}\n </Item>\n );\n })}\n </div>\n ) : null}\n </div>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport { FLOW_STEPS, format, stepIndex } from '@nickkupriyanov/slotline-core';\nimport { useClassNames, useFlow, useUI } from '../context';\nimport { useFocusTrap } from '../hooks/useFocusTrap';\nimport { CalendarStep } from './CalendarStep';\nimport { ConfirmedStep } from './ConfirmedStep';\nimport { DetailsStep } from './DetailsStep';\nimport { DurationFooter } from './DurationFooter';\nimport { Progress } from './Progress';\nimport { SlotsStep } from './SlotsStep';\nimport { ChevronLeftIcon } from './icons';\n\nfunction StepBody() {\n const { state } = useFlow();\n switch (state.step) {\n case 'time':\n return <SlotsStep />;\n case 'details':\n return <DetailsStep />;\n case 'confirmed':\n return <ConfirmedStep />;\n case 'date':\n default:\n return <CalendarStep />;\n }\n}\n\n/** The full widget: card, header, progress, panel, footer. */\nexport function SlotlineView() {\n const flow = useFlow();\n const { state, messages, title, durationLabel, actions, canGoBack } = flow;\n const submitting = state.submitStatus === 'submitting';\n const ui = useUI();\n const cls = useClassNames();\n const Animations = ui.animations;\n const cardRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const mountedRef = useRef(false);\n\n useFocusTrap(cardRef, {\n active: ui.trapFocus,\n ...(canGoBack ? { onEscape: actions.back } : {}),\n });\n\n // Keep DOM focus inside the widget when the previous step unmounts the\n // element the user activated — otherwise focus silently falls back to <body>.\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n if (ui.autoFocus) panelRef.current?.focus();\n return;\n }\n const active = typeof document === 'undefined' ? null : document.activeElement;\n if (!active || active === document.body) panelRef.current?.focus();\n }, [state.step, ui.autoFocus]);\n\n const announcement =\n state.step === 'confirmed'\n ? `${messages.bookedTitle}. ${format(messages.bookedSummary, {\n date: flow.selectedDateLabel,\n time: flow.selectedTimeLabel,\n duration: durationLabel,\n })}`\n : format(messages.progressLabel, {\n step: stepIndex(state.step) + 1,\n total: FLOW_STEPS.length,\n });\n\n return (\n <div\n className={cls('root', ui.className)}\n data-sl-theme={flow.theme}\n data-sl-step={state.step}\n lang={flow.locale}\n >\n <div className={cls('card')} ref={cardRef}>\n <header className={cls('header')}>\n {canGoBack ? (\n <button\n type=\"button\"\n className=\"sl-icon-button\"\n onClick={actions.back}\n aria-label={messages.back}\n disabled={submitting}\n >\n <ChevronLeftIcon />\n </button>\n ) : null}\n <div className=\"sl-header-main\">\n <h2 className={cls('title')}>{title}</h2>\n <span className={cls('badge')}>{durationLabel}</span>\n </div>\n <Progress />\n </header>\n\n <div className={cls('panel')} ref={panelRef} tabIndex={-1}>\n <Animations.Height>\n <Animations.StepHost stepKey={state.step} direction={state.direction}>\n <StepBody />\n </Animations.StepHost>\n </Animations.Height>\n </div>\n\n {state.step === 'date' ? <DurationFooter /> : null}\n\n <div className=\"sl-visually-hidden\" role=\"status\" aria-live=\"polite\">\n {announcement}\n </div>\n </div>\n </div>\n );\n}\n","import { useCallback, useRef, useState } from 'react';\n\nexport interface UseControllableStateOptions<T> {\n value?: T;\n defaultValue: T;\n onChange?: (value: T) => void;\n}\n\n/**\n * Small controlled/uncontrolled helper — the widget works both ways without\n * duplicating state logic in the component.\n */\nexport function useControllableState<T>({\n value,\n defaultValue,\n onChange,\n}: UseControllableStateOptions<T>): [T, (next: T) => void] {\n const [internal, setInternal] = useState<T>(defaultValue);\n const isControlled = value !== undefined;\n const current = isControlled ? (value as T) : internal;\n\n const onChangeRef = useRef(onChange);\n onChangeRef.current = onChange;\n\n const setValue = useCallback(\n (next: T) => {\n if (!isControlled) setInternal(next);\n onChangeRef.current?.(next);\n },\n [isControlled],\n );\n\n return [current, setValue];\n}\n","import { useEffect, useState } from 'react';\nimport type { SlotlineTheme } from '../types';\n\n/**\n * Resolves `system` to a concrete theme and keeps it in sync with the OS.\n * The widget exposes the result as `data-sl-theme`, so the stylesheet only\n * needs two token blocks.\n */\nexport function useResolvedTheme(theme: SlotlineTheme): 'dark' | 'light' {\n const [systemTheme, setSystemTheme] = useState<'dark' | 'light'>(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return 'dark';\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n });\n\n useEffect(() => {\n if (theme !== 'system') return;\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return;\n const list = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (event: MediaQueryListEvent) => setSystemTheme(event.matches ? 'dark' : 'light');\n list.addEventListener('change', handler);\n return () => list.removeEventListener('change', handler);\n }, [theme]);\n\n if (theme === 'system') return systemTheme;\n return theme;\n}\n","/**\n * The headless core of Slotline: state machine + data loading + validation.\n * `Slotline` is a thin view over this hook, and you can build your own UI on it.\n */\nimport { useCallback, useEffect, useMemo, useReducer, useRef } from 'react';\nimport {\n addMonths,\n buildMonthGrid,\n clampDayKey,\n compareDayKeys,\n countSlots,\n createFlowState,\n dayKeyOf,\n detectLocale,\n endOf,\n firstDayOfMonth,\n flowReducer,\n format,\n formatFullDay,\n formatMonthYear,\n formatTime,\n formatTimeZoneName,\n hasErrors,\n lastDayOfMonth,\n monthKeyOf,\n normalizeDateInput,\n resolveMessages,\n resolveTimeZone,\n rotateToWeekStart,\n shortWeekdayNames,\n todayKey,\n validateDetails,\n visibleErrors,\n weekdayNames,\n type FieldErrors,\n type FlowState,\n} from '@nickkupriyanov/slotline-core';\nimport { useControllableState } from './hooks/useControllableState';\nimport { useResolvedTheme } from './hooks/useResolvedTheme';\nimport type {\n SlotlineMessages,\n SlotlineProps,\n SlotlineStep,\n SlotlineTheme,\n BookingAdapter,\n BookingRequest,\n BookingResult,\n DayAvailability,\n TimeSlot,\n} from './types';\n\nexport interface UseBookingFlowResult {\n state: FlowState;\n /** Merged copy for the active locale. */\n messages: SlotlineMessages;\n /** Locale used for `Intl` formatting. */\n locale: string;\n timeZone: string;\n /** Short zone hint, e.g. `GMT+2`. */\n timeZoneName?: string;\n theme: Exclude<SlotlineTheme, 'system'>;\n /** Header title for the current step. */\n title: string;\n durations: number[];\n weekStartsOn: 0 | 1;\n minDate?: string;\n maxDate?: string;\n /** The 42 day keys of the visible month view. */\n monthGrid: string[];\n /** Short weekday headers, rotated to `weekStartsOn`. */\n weekdayHeaders: string[];\n /** Long weekday names for accessible headers, rotated to `weekStartsOn`. */\n weekdayLongNames: string[];\n monthLabel: string;\n selectedDateLabel: string;\n selectedTimeLabel: string;\n durationLabel: string;\n /** Availability for one day, if the adapter knows about it. */\n availabilityOf: (dayKey: string) => DayAvailability | undefined;\n isDayBookable: (dayKey: string) => boolean;\n canGoBack: boolean;\n fieldErrors: FieldErrors;\n shownFieldErrors: FieldErrors;\n /** `true` when the details form can be submitted. */\n detailsValid: boolean;\n actions: {\n selectDate: (dayKey: string) => void;\n selectSlot: (slot: TimeSlot) => void;\n setDuration: (minutes: number) => void;\n setDetails: (details: Partial<{ name: string; email: string; notes: string }>) => void;\n /** Marks a field as touched so its validation message becomes visible. */\n touchField: (field: 'name' | 'email') => void;\n back: () => void;\n submit: () => Promise<void>;\n reset: () => void;\n goToMonth: (monthKey: string) => void;\n previousMonth: () => void;\n nextMonth: () => void;\n reloadAvailability: () => void;\n reloadSlots: () => void;\n };\n}\n\nfunction toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value));\n}\n\nfunction messageOf(value: unknown, fallback: string): string {\n const error = toError(value);\n return error.message && error.message !== 'undefined' ? error.message : fallback;\n}\n\nexport function useBookingFlow(props: SlotlineProps): UseBookingFlowResult {\n const {\n adapter,\n durations = [15, 30, 60],\n duration: durationProp,\n defaultDuration,\n onDurationChange,\n timeZone: timeZoneProp,\n locale: localeProp,\n messages: messagesProp,\n theme = 'dark',\n minDate: minDateProp,\n maxDate: maxDateProp,\n weekStartsOn = 0,\n onBooked,\n onError,\n onDismiss,\n } = props;\n\n const locale = localeProp ?? detectLocale();\n const timeZone = timeZoneProp ?? resolveTimeZone();\n const resolvedTheme = useResolvedTheme(theme);\n const messages = useMemo(() => resolveMessages(locale, messagesProp), [locale, messagesProp]);\n\n const durationOptions = useMemo(\n () => (durations.length > 0 ? durations : [15, 30, 60]),\n [durations],\n );\n const [duration, setDurationValue] = useControllableState<number>({\n value: durationProp,\n defaultValue: defaultDuration ?? durationOptions[0] ?? 15,\n onChange: onDurationChange,\n });\n\n const minDate = useMemo(() => normalizeDateInput(minDateProp, timeZone), [minDateProp, timeZone]);\n const maxDate = useMemo(() => normalizeDateInput(maxDateProp, timeZone), [maxDateProp, timeZone]);\n\n const today = todayKey(timeZone);\n const earliestDate = minDate ?? today;\n const initialMonth = monthKeyOf(clampDayKey(earliestDate, minDate, maxDate));\n\n const [state, dispatch] = useReducer(flowReducer, undefined, () =>\n createFlowState({ duration, month: initialMonth }),\n );\n\n /* ---------------------------------------------------------------- refs -- */\n\n const adapterRef = useRef<BookingAdapter>(adapter);\n adapterRef.current = adapter;\n const stateRef = useRef(state);\n stateRef.current = state;\n const messagesRef = useRef(messages);\n messagesRef.current = messages;\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n const onBookedRef = useRef(onBooked);\n onBookedRef.current = onBooked;\n\n /** Keeps two public `actions.submit()` calls from overlapping. */\n const submitLockRef = useRef(false);\n const daysTokenRef = useRef(0);\n const slotsTokenRef = useRef(0);\n const [availabilityNonce, setAvailabilityNonce] = useReducer((n: number) => n + 1, 0);\n const [slotsNonce, setSlotsNonce] = useReducer((n: number) => n + 1, 0);\n\n /* --------------------------------------------------- keep duration sync -- */\n\n useEffect(() => {\n dispatch({ type: 'setDuration', duration });\n }, [duration]);\n\n /* ------------------------------------------------------- availability -- */\n\n useEffect(() => {\n const controller = new AbortController();\n const token = (daysTokenRef.current += 1);\n const from = firstDayOfMonth(state.month);\n const to = lastDayOfMonth(state.month);\n\n dispatch({ type: 'daysLoading', token });\n void (async () => {\n try {\n const days = await adapterRef.current.getAvailability({\n from,\n to,\n duration,\n timeZone,\n signal: controller.signal,\n });\n if (controller.signal.aborted) return;\n dispatch({ type: 'daysLoaded', token, days: Array.isArray(days) ? days : [] });\n } catch (error) {\n if (controller.signal.aborted) return;\n dispatch({\n type: 'daysFailed',\n token,\n error: messageOf(error, messagesRef.current.genericError),\n });\n onErrorRef.current?.(toError(error));\n }\n })();\n\n return () => controller.abort();\n }, [state.month, duration, timeZone, availabilityNonce]);\n\n /* -------------------------------------------------------------- slots -- */\n\n const daysRef = useRef(state.days);\n daysRef.current = state.days;\n\n useEffect(() => {\n const date = state.selectedDate;\n if (!date) return;\n\n const token = (slotsTokenRef.current += 1);\n // Register the token with the reducer *before* a response can arrive:\n // `slotsLoaded` / `slotsFailed` are dropped unless they carry the newest one.\n dispatch({ type: 'slotsLoading', token });\n\n const inline = daysRef.current[date]?.slots;\n if (inline && inline.length > 0) {\n dispatch({ type: 'slotsLoaded', token, slots: inline });\n return;\n }\n\n const controller = new AbortController();\n void (async () => {\n try {\n const slots = await adapterRef.current.getSlots({\n date,\n duration,\n timeZone,\n signal: controller.signal,\n });\n if (controller.signal.aborted) return;\n dispatch({ type: 'slotsLoaded', token, slots: Array.isArray(slots) ? slots : [] });\n } catch (error) {\n if (controller.signal.aborted) return;\n dispatch({\n type: 'slotsFailed',\n token,\n error: messageOf(error, messagesRef.current.genericError),\n });\n onErrorRef.current?.(toError(error));\n }\n })();\n\n return () => controller.abort();\n }, [state.selectedDate, state.selectionNonce, duration, timeZone, slotsNonce]);\n\n /* ------------------------------------------------------------- actions -- */\n\n const selectDate = useCallback((dayKey: string) => {\n dispatch({ type: 'selectDate', date: dayKey });\n }, []);\n\n const selectSlot = useCallback((slot: TimeSlot) => {\n dispatch({ type: 'selectSlot', slot });\n }, []);\n\n const setDuration = useCallback(\n (minutes: number) => {\n setDurationValue(minutes);\n },\n [setDurationValue],\n );\n\n const setDetails = useCallback(\n (details: Partial<{ name: string; email: string; notes: string }>) => {\n dispatch({ type: 'setDetails', details });\n },\n [],\n );\n\n const goToMonth = useCallback((monthKey: string) => {\n dispatch({ type: 'setMonth', month: monthKey });\n }, []);\n\n const touchField = useCallback((field: 'name' | 'email') => {\n dispatch({ type: 'touch', field });\n }, []);\n\n const reset = useCallback(() => {\n dispatch({ type: 'reset' });\n }, []);\n\n const back = useCallback(() => {\n const current = stateRef.current;\n // Never navigate away from an in-flight booking: the response would land on\n // a different step than the one the user is looking at.\n if (current.submitStatus === 'submitting') return;\n // Nothing sits above the calendar, and the confirmation is terminal —\n // both are the consumer's cue to close the widget.\n if (current.step === 'date' || current.step === 'confirmed') {\n onDismiss?.();\n return;\n }\n dispatch({ type: 'back' });\n }, [onDismiss]);\n\n const reloadAvailability = useCallback(() => {\n setAvailabilityNonce();\n }, []);\n\n const reloadSlots = useCallback(() => {\n setSlotsNonce();\n }, []);\n\n const submit = useCallback(async () => {\n // `actions.submit()` is public, so the disabled button alone cannot keep\n // two requests from overlapping — the lock is set before the first await.\n if (submitLockRef.current) return;\n\n const snapshot = stateRef.current;\n const currentMessages = messagesRef.current;\n dispatch({ type: 'touch', field: 'name' });\n dispatch({ type: 'touch', field: 'email' });\n\n const errors = validateDetails(snapshot.details, currentMessages);\n if (hasErrors(errors) || !snapshot.selectedSlot || !snapshot.selectedDate) return;\n\n const request: BookingRequest = {\n slot: { ...snapshot.selectedSlot, end: endOf(snapshot.selectedSlot, snapshot.duration) },\n date: snapshot.selectedDate,\n duration: snapshot.duration,\n timeZone,\n details: {\n name: snapshot.details.name.trim(),\n email: snapshot.details.email.trim(),\n ...(snapshot.details.notes ? { notes: snapshot.details.notes } : {}),\n },\n };\n\n /** The response may only drive the UI while this is still the same scenario. */\n const scenario = snapshot.scenarioId;\n const stillCurrent = () => {\n const current = stateRef.current;\n return (\n // `scenarioId` also covers \"reset, then book the very same slot again\":\n // the date and the slot can match a second time, the scenario cannot.\n current.scenarioId === scenario &&\n current.selectedDate === request.date &&\n current.selectedSlot?.start === request.slot.start\n );\n };\n\n submitLockRef.current = true;\n dispatch({ type: 'submitStart' });\n try {\n const result: BookingResult = await adapterRef.current.createBooking(request);\n // The booking exists, so the consumer always hears about it.\n onBookedRef.current?.(result ?? {}, request);\n if (stillCurrent()) dispatch({ type: 'submitSucceeded', scenario, result: result ?? {} });\n } catch (error) {\n onErrorRef.current?.(toError(error));\n if (stillCurrent()) {\n dispatch({\n type: 'submitFailed',\n scenario,\n error: messageOf(error, currentMessages.genericError),\n });\n }\n } finally {\n submitLockRef.current = false;\n }\n }, [timeZone]);\n\n /* ----------------------------------------------------------- selectors -- */\n\n const monthGrid = useMemo(\n () => buildMonthGrid(state.month, weekStartsOn),\n [state.month, weekStartsOn],\n );\n\n const weekdayHeaders = useMemo(\n () => rotateToWeekStart(shortWeekdayNames(locale, messages.weekdays), weekStartsOn),\n [locale, messages.weekdays, weekStartsOn],\n );\n\n const weekdayLong = useMemo(\n () => rotateToWeekStart(weekdayNames(locale), weekStartsOn),\n [locale, weekStartsOn],\n );\n\n const fieldErrors = useMemo(\n () => validateDetails(state.details, messages),\n [state.details, messages],\n );\n\n const availabilityOf = useCallback((dayKey: string) => state.days[dayKey], [state.days]);\n\n const isDayBookable = useCallback(\n (dayKey: string) => {\n if (compareDayKeys(dayKey, earliestDate) < 0) return false;\n if (maxDate && compareDayKeys(dayKey, maxDate) > 0) return false;\n const availability = state.days[dayKey];\n if (!availability) return false;\n const count = countSlots(availability);\n return count === undefined ? true : count > 0;\n },\n [state.days, earliestDate, maxDate],\n );\n\n const selectedDateLabel = state.selectedDate ? formatFullDay(state.selectedDate, locale) : '';\n const selectedTimeLabel = state.selectedSlot\n ? formatTime(state.selectedSlot.start, timeZone, locale)\n : '';\n\n return {\n state,\n messages,\n locale,\n timeZone,\n timeZoneName: state.step === 'date' ? formatTimeZoneName(timeZone, locale) : undefined,\n theme: resolvedTheme,\n title: state.step === 'confirmed' ? messages.bookedHeader : (props.title ?? messages.title),\n durations: durationOptions,\n weekStartsOn,\n ...(minDate ? { minDate } : {}),\n ...(maxDate ? { maxDate } : {}),\n monthGrid,\n weekdayHeaders,\n weekdayLongNames: weekdayLong,\n monthLabel: formatMonthYear(state.month, locale),\n selectedDateLabel,\n selectedTimeLabel,\n durationLabel: format(messages.duration, { count: duration }),\n availabilityOf,\n isDayBookable,\n // The confirmation is terminal: there is nothing to go back to, so the back\n // affordance only appears there when the consumer supplied `onDismiss`.\n canGoBack: (state.step !== 'date' && state.step !== 'confirmed') || Boolean(onDismiss),\n fieldErrors,\n shownFieldErrors: visibleErrors(fieldErrors, state.touched),\n detailsValid: !hasErrors(fieldErrors),\n actions: {\n selectDate,\n selectSlot,\n setDuration,\n setDetails,\n touchField,\n back,\n submit,\n reset,\n goToMonth,\n previousMonth: () => goToMonth(addMonths(stateRef.current.month, -1)),\n nextMonth: () => goToMonth(addMonths(stateRef.current.month, 1)),\n reloadAvailability,\n reloadSlots,\n },\n };\n}\n\n/** Convenience re-export for consumers that only need the day key of a date. */\nexport { dayKeyOf };\n\nexport type { SlotlineStep };\n","import { useMemo } from 'react';\nimport { cssAnimations } from './animations/css';\nimport { SlotlineView } from './components/SlotlineView';\nimport { FlowContext, UIContext, type SlotlineUIContextValue } from './context';\nimport { useBookingFlow } from './useBookingFlow';\nimport type { AnimationKit, SlotlineProps, SlotlineProviderProps } from './types';\n\n/**\n * Provides the booking flow to any UI. Use it directly to build a custom\n * widget on top of `useSlotlineContext()`.\n */\nexport function SlotlineProvider(props: SlotlineProviderProps) {\n const { children } = props;\n const flow = useBookingFlow(props);\n\n const ui = useMemo<SlotlineUIContextValue>(\n () => ({\n animations: props.animations ?? cssAnimations,\n classNames: props.classNames,\n autoFocus: props.autoFocus ?? false,\n trapFocus: props.trapFocus ?? false,\n className: props.className,\n }),\n [\n props.animations,\n props.classNames,\n props.autoFocus,\n props.trapFocus,\n props.className,\n ],\n );\n\n return (\n <FlowContext.Provider value={flow}>\n <UIContext.Provider value={ui}>{children}</UIContext.Provider>\n </FlowContext.Provider>\n );\n}\n\n/**\n * Builds a `Slotline` bound to a specific animation kit — used by\n * `@nickkupriyanov/slotline-react/motion` and available for custom kits.\n */\nexport function createSlotline(animations: AnimationKit) {\n function ComposedSlotline(props: SlotlineProps) {\n return (\n <SlotlineProvider {...props} animations={props.animations ?? animations}>\n <SlotlineView />\n </SlotlineProvider>\n );\n }\n ComposedSlotline.displayName = 'Slotline';\n return ComposedSlotline;\n}\n\n/**\n * The ready-made widget: calendar → slots → details → confirmation.\n *\n * ```tsx\n * import { Slotline } from '@nickkupriyanov/slotline-react';\n * import '@nickkupriyanov/slotline-react/styles.css';\n *\n * <Slotline adapter={adapter} theme=\"dark\" locale=\"ru\" />\n * ```\n */\nexport const Slotline = createSlotline(cssAnimations);\n","/**\n * @nickkupriyanov/slotline-react/motion — the same widget with spring-based transitions.\n *\n * ```tsx\n * import { Slotline } from '@nickkupriyanov/slotline-react/motion';\n * import '@nickkupriyanov/slotline-react/styles.css';\n * ```\n *\n * Requires the optional `motion` peer dependency.\n */\nimport { motionAnimations } from './animations/motion';\nimport { createSlotline } from './Slotline';\n\nexport * from './public';\nexport { motionAnimations };\n\n/** Identical API to the default `Slotline`, with `motion` driving the transitions. */\nexport const Slotline = createSlotline(motionAnimations);\n"]}
1
+ {"version":3,"sources":["../src/hooks/useMediaQuery.ts","../src/hooks/useAnimatedHeight.ts","../src/animations/motion.tsx","../src/animations/css.tsx","../src/context.tsx","../src/hooks/useFocusTrap.ts","../src/components/AttemptStep.tsx","../src/components/icons.tsx","../src/components/CalendarStep.tsx","../src/components/ConfirmedStep.tsx","../src/components/DetailsStep.tsx","../src/components/DurationFooter.tsx","../src/components/Progress.tsx","../src/components/SlotsStep.tsx","../src/components/SlotlineView.tsx","../src/hooks/useResolvedTheme.ts","../src/useBookingFlow.ts","../src/Slotline.tsx","../src/motion.ts"],"names":["useState","useEffect","StepHost","jsx","cx","Item","Height","jsxs","useRef","useCallback","observeMediaQuery","useMemo","useSyncExternalStore","Slotline"],"mappings":"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","file":"motion.js","sourcesContent":["import { useEffect, useState } from 'react';\nimport { REDUCED_MOTION_QUERY, observeMediaQuery } from '@nickkupriyanov/slotline-core/dom';\n\n/** Tracks any media query, SSR-safe. */\nexport function useMediaQuery(query: string): boolean {\n const [matches, setMatches] = useState(false);\n\n // The watcher reports the current value immediately, so nothing is missed\n // between the first render and the effect.\n useEffect(() => observeMediaQuery(query, setMatches), [query]);\n\n return matches;\n}\n\n/** `true` when the user asked the OS to reduce motion. */\nexport function useReducedMotion(): boolean {\n return useMediaQuery(REDUCED_MOTION_QUERY);\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { observeAnimatedHeight, type AnimatedHeightState } from '@nickkupriyanov/slotline-core/dom';\nimport { useReducedMotion } from './useMediaQuery';\n\nexport interface UseAnimatedHeightResult<T extends HTMLElement> {\n /** Attach to the inner element whose natural height should be followed. */\n contentRef: React.RefObject<T | null>;\n /** Inline style for the clipping wrapper (`undefined` disables animation). */\n style: React.CSSProperties | undefined;\n /** `true` while the wrapper animates — lets CSS disable clipping afterwards. */\n animating: boolean;\n}\n\n/**\n * Follows the height of `contentRef` and animates the wrapper between values.\n *\n * Content is clipped *only* while animating, so focus rings and shadows are\n * never cut off at rest — the detail that usually makes this trick look cheap.\n * Under `prefers-reduced-motion: reduce` the wrapper keeps its natural height.\n *\n * The measurement and the timing belong to `@nickkupriyanov/slotline-core/dom`;\n * what stays here is the ref, the state and the inline style.\n */\nexport function useAnimatedHeight<T extends HTMLElement>(\n durationMs = 320,\n): UseAnimatedHeightResult<T> {\n const contentRef = useRef<T | null>(null);\n const [state, setState] = useState<AnimatedHeightState>({\n height: undefined,\n animating: false,\n });\n const reducedMotion = useReducedMotion();\n\n useEffect(() => {\n const element = contentRef.current;\n if (!element || reducedMotion) return;\n return observeAnimatedHeight(element, { durationMs, onChange: setState });\n }, [durationMs, reducedMotion]);\n\n if (reducedMotion) {\n return { contentRef, style: undefined, animating: false };\n }\n\n const style: React.CSSProperties | undefined =\n state.height === undefined\n ? undefined\n : {\n height: state.height,\n overflow: state.animating ? 'hidden' : 'visible',\n transition: `height ${durationMs}ms var(--sl-ease-soft)`,\n };\n\n return { contentRef, style, animating: state.animating };\n}\n","import type { ComponentType, ReactNode } from 'react';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { useAnimatedHeight } from '../hooks/useAnimatedHeight';\nimport type { AnimationKit, HeightProps, StaggerItemProps, StepHostProps } from '../types';\nimport { cx } from '@nickkupriyanov/slotline-core';\n\nconst spring = { type: 'spring', stiffness: 420, damping: 34, mass: 0.7 } as const;\n\n/**\n * `motion.button` conflicts with the DOM button props we accept (`onDragStart`\n * and friends have incompatible signatures), so the component is narrowed here\n * instead of leaking casts into the widget.\n */\nconst MotionButton = motion.button as unknown as ComponentType<\n Record<string, unknown> & { children?: ReactNode; className?: string }\n>;\n\nfunction StepHost({ stepKey, direction, className, children }: StepHostProps) {\n const forward = direction === 1;\n return (\n <div className={cx('sl-step-host', className)} data-direction={forward ? 'forward' : 'back'}>\n <AnimatePresence mode=\"wait\" initial={false}>\n <motion.div\n key={stepKey}\n className=\"sl-step\"\n initial={{ opacity: 0, y: forward ? 12 : -12, scale: 0.99 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: forward ? -10 : 10, scale: 0.99 }}\n transition={spring}\n >\n {children}\n </motion.div>\n </AnimatePresence>\n </div>\n );\n}\n\nfunction Item({ index, className, type = 'button', children, ...rest }: StaggerItemProps) {\n return (\n <MotionButton\n {...rest}\n type={type}\n className={cx('sl-stagger-item', className)}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ ...spring, delay: Math.min(index, 14) * 0.018 }}\n whileTap={{ scale: 0.97 }}\n >\n {children}\n </MotionButton>\n );\n}\n\nfunction Height({ className, children }: HeightProps) {\n const { contentRef, style } = useAnimatedHeight<HTMLDivElement>();\n return (\n <div className={cx('sl-height', className)} style={style}>\n <div className=\"sl-height-content\" ref={contentRef}>\n {children}\n </div>\n </div>\n );\n}\n\n/**\n * Spring-based kit. Requires the optional `motion` peer dependency and is the\n * whole point of the `@nickkupriyanov/slotline-react/motion` entry point.\n */\nexport const motionAnimations: AnimationKit = {\n StepHost,\n Item,\n Height,\n};\n","import type { CSSProperties } from 'react';\nimport { useAnimatedHeight } from '../hooks/useAnimatedHeight';\nimport type { AnimationKit, HeightProps, StaggerItemProps, StepHostProps } from '../types';\nimport { cx } from '@nickkupriyanov/slotline-core';\n\nfunction StepHost({ stepKey, direction, className, children }: StepHostProps) {\n return (\n <div\n className={cx('sl-step-host', className)}\n data-direction={direction === 1 ? 'forward' : 'back'}\n >\n <div className=\"sl-step\" key={stepKey}>\n {children}\n </div>\n </div>\n );\n}\n\nfunction Item({ index, className, style, type = 'button', children, ...rest }: StaggerItemProps) {\n return (\n <button\n {...rest}\n type={type}\n className={cx('sl-slot', 'sl-stagger-item', className)}\n style={{ ...style, '--sl-index': index } as CSSProperties}\n >\n {children}\n </button>\n );\n}\n\nfunction Height({ className, children }: HeightProps) {\n const { contentRef, style } = useAnimatedHeight<HTMLDivElement>();\n return (\n <div className={cx('sl-height', className)} style={style}>\n <div className=\"sl-height-content\" ref={contentRef}>\n {children}\n </div>\n </div>\n );\n}\n\n/**\n * The default kit: no runtime, no dependencies. Every transition is a CSS\n * animation or transition, and all of them collapse under\n * `prefers-reduced-motion: reduce`.\n */\nexport const cssAnimations: AnimationKit = {\n StepHost,\n Item,\n Height,\n};\n","import { createContext, useCallback, useContext } from 'react';\nimport {\n SLOT_CLASS,\n cx,\n defaultMessages,\n type BookingControllerActions,\n type BookingSnapshot,\n type ClassValue,\n type SlotlineMessages,\n} from '@nickkupriyanov/slotline-core';\nimport { cssAnimations } from './animations/css';\nimport type { AnimationKit, SlotlineClassSlot, SlotlineTheme } from './types';\n\n/* -------------------------------------------------------------------------- */\n/* Flow context */\n/* -------------------------------------------------------------------------- */\n\n/** What the flow hands to a binding: one immutable snapshot and the actions. */\nexport interface UseBookingFlowResult {\n snapshot: BookingSnapshot;\n actions: BookingControllerActions;\n}\n\nexport const FlowContext = createContext<UseBookingFlowResult | null>(null);\n\n/**\n * Reads the booking flow from the nearest `<Slotline>` / `<SlotlineProvider>`.\n * This is the hook to build a fully custom UI on top of.\n */\nexport function useSlotlineContext(): UseBookingFlowResult {\n const flow = useContext(FlowContext);\n if (!flow) {\n throw new Error(\n '[slotline] useSlotlineContext() must be used inside <Slotline> or <SlotlineProvider>.',\n );\n }\n return flow;\n}\n\n/** Internal short alias used by the built-in components. */\nexport const useFlow = useSlotlineContext;\n\n/* -------------------------------------------------------------------------- */\n/* UI context */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Presentation values shared by the built-in parts. Copy and locale live here\n * rather than in the view model: they are how the application asked the widget to\n * speak, not something derived from the flow.\n */\nexport interface SlotlineUIContextValue {\n animations: AnimationKit;\n classNames?: Partial<Record<SlotlineClassSlot, string>>;\n className?: string;\n autoFocus: boolean;\n trapFocus: boolean;\n /** Whether the application supplied a dismiss handler. */\n canDismiss: boolean;\n /** Asks the application to look up the outcome of an unresolved attempt. */\n onCheckStatus?: (() => void) | undefined;\n messages: SlotlineMessages;\n locale: string;\n theme: Exclude<SlotlineTheme, 'system'>;\n}\n\nexport const UIContext = createContext<SlotlineUIContextValue>({\n animations: cssAnimations,\n autoFocus: false,\n trapFocus: false,\n canDismiss: false,\n messages: defaultMessages.en,\n locale: 'en',\n theme: 'dark',\n});\n\nexport function useUI(): SlotlineUIContextValue {\n return useContext(UIContext);\n}\n\nexport function useAnimations(): AnimationKit {\n return useContext(UIContext).animations;\n}\n\n/** `classes('day', isToday && 'is-today')` → `\"sl-day is-today <consumer class>\"`. */\nexport function useClassNames(): (slot: SlotlineClassSlot, ...extra: ClassValue[]) => string {\n const { classNames } = useUI();\n return useCallback(\n (slot: SlotlineClassSlot, ...extra: ClassValue[]) =>\n cx(SLOT_CLASS[slot], classNames?.[slot], ...extra),\n [classNames],\n );\n}\n","import { useEffect } from 'react';\nimport { trapFocus } from '@nickkupriyanov/slotline-core/dom';\n\nexport interface UseFocusTrapOptions {\n active: boolean;\n /** Called on `Escape`. */\n onEscape?: () => void;\n}\n\n/**\n * Keeps `Tab` inside the widget while it is mounted and optionally routes\n * `Escape` to the consumer. The trap itself is framework-free\n * (`@nickkupriyanov/slotline-core/dom`); this hook only ties it to the lifecycle.\n */\nexport function useFocusTrap(\n containerRef: React.RefObject<HTMLElement | null>,\n { active, onEscape }: UseFocusTrapOptions,\n): void {\n useEffect(() => {\n const container = containerRef.current;\n if (!active || !container) return;\n return trapFocus(container, onEscape ? { onEscape } : {});\n }, [active, containerRef, onEscape]);\n}\n","import { useClassNames, useFlow, useUI } from '../context';\n\n/**\n * The service screen of an operation: the request has left, and the flow is\n * blocked until its outcome is known.\n *\n * It shows the frozen request rather than the current draft — the user has to see\n * what was actually sent — and offers a repeat only when the adapter promised that\n * repeating is safe.\n */\nexport function AttemptStep() {\n const { snapshot, actions } = useFlow();\n const { messages, onCheckStatus } = useUI();\n const cls = useClassNames();\n const attempt = snapshot.view.attempt;\n\n if (!attempt) return null;\n\n return (\n <div className={cls('empty')} data-attempt={attempt.status}>\n <p className=\"sl-empty-title\">{attempt.title}</p>\n <p className=\"sl-empty-body\">{attempt.description}</p>\n {attempt.instructions ? <p className=\"sl-empty-body\">{attempt.instructions}</p> : null}\n\n <div className={cls('summary')} aria-label={attempt.summaryLabel}>\n <div className=\"sl-summary-body\">\n <p className=\"sl-summary-date\">{attempt.summary.dateLabel}</p>\n <p className=\"sl-summary-meta\">\n <span>\n {attempt.summary.timeLabel} · {attempt.summary.durationLabel}\n </span>\n </p>\n </div>\n </div>\n\n <p className=\"sl-empty-body\">{attempt.retryDescription}</p>\n\n {attempt.retryAllowed ? (\n <button type=\"button\" className={cls('submit')} onClick={actions.retry}>\n {attempt.retryLabel}\n </button>\n ) : null}\n\n {attempt.canCheckStatus && onCheckStatus ? (\n <button type=\"button\" className={cls('secondaryButton')} onClick={() => onCheckStatus()}>\n {attempt.checkStatusLabel}\n </button>\n ) : null}\n\n {/* The visible copy stays in the dictionary; nothing renders raw markup. */}\n <span className=\"sl-visually-hidden\">{messages.attemptSummaryLabel}</span>\n </div>\n );\n}\n","import type { ComponentPropsWithoutRef, ReactNode } from 'react';\n\nexport function ChevronLeftIcon(props: ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" aria-hidden=\"true\" focusable=\"false\" {...props}>\n <path\n d=\"M14.5 5.5 8 12l6.5 6.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function ChevronRightIcon(props: ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" aria-hidden=\"true\" focusable=\"false\" {...props}>\n <path\n d=\"M9.5 5.5 16 12l-6.5 6.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function ArrowRightIcon(props: ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" aria-hidden=\"true\" focusable=\"false\" {...props}>\n <path\n d=\"M4 12h15m0 0-6-6m6 6-6 6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function CalendarIcon(props: ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" aria-hidden=\"true\" focusable=\"false\" {...props}>\n <rect\n x=\"3.5\"\n y=\"5\"\n width=\"17\"\n height=\"15.5\"\n rx=\"3.5\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.7\"\n />\n <path\n d=\"M3.5 9.5h17M8 3.5v3M16 3.5v3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.7\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function ClockIcon(props: ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\" {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"8.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.7\" />\n <path\n d=\"M12 7.5V12l3 2\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.7\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nexport function CheckIcon(props: ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"26\" height=\"26\" aria-hidden=\"true\" focusable=\"false\" {...props}>\n <path\n className=\"sl-check-path\"\n d=\"M5 12.5 10 17.5 19 7\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.1\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport function SpinnerIcon(props: ComponentPropsWithoutRef<'svg'>) {\n return (\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\" {...props}>\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"8\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeDasharray=\"34 14\"\n />\n </svg>\n );\n}\n\nexport interface IconProps {\n children: ReactNode;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { addDays, monthKeyOf, weekdayIndex } from '@nickkupriyanov/slotline-core';\nimport { useClassNames, useFlow, useUI } from '../context';\nimport { ChevronLeftIcon, ChevronRightIcon } from './icons';\n\nfunction chunk<T>(values: T[], size: number): T[][] {\n const rows: T[][] = [];\n for (let index = 0; index < values.length; index += size) {\n rows.push(values.slice(index, index + size));\n }\n return rows;\n}\n\n/**\n * Step 1 — the month grid. Days carrying availability render a dot and become\n * selectable; everything else stays visible but inert, exactly like the\n * reference design.\n *\n * Everything it renders comes from the view model, including the accessible name\n * of a day; the component only owns focus, roving tabindex and keyboard\n * navigation.\n */\nexport function CalendarStep() {\n const { snapshot, actions } = useFlow();\n const { messages } = useUI();\n const cls = useClassNames();\n const view = snapshot.view;\n const { month, days } = view;\n const selectedDate = view.selection.date;\n\n const gridRef = useRef<HTMLDivElement>(null);\n const pendingFocusRef = useRef(false);\n /** Day-of-month to restore after PageUp/PageDown swapped the visible month. */\n const pendingMonthFocusRef = useRef<string | null>(null);\n const [focusKey, setFocusKey] = useState<string | null>(null);\n\n const rows = useMemo(() => chunk(month.grid, 7), [month.grid]);\n\n const firstBookable = useMemo(\n () => month.grid.find((day) => monthKeyOf(day) === month.key && days[day]?.bookable),\n [month.grid, month.key, days],\n );\n\n /**\n * The single tab stop of the grid (roving tabindex). The candidate has to\n * exist in the *current* grid: after a month change the previously focused\n * key is gone, and a stale value would leave every cell at `tabindex=\"-1\"`.\n */\n const focusTarget = useMemo(() => {\n if (focusKey && month.grid.includes(focusKey)) return focusKey;\n if (selectedDate && month.grid.includes(selectedDate)) return selectedDate;\n return firstBookable ?? month.grid[0] ?? `${month.key}-01`;\n }, [focusKey, month.grid, selectedDate, firstBookable, month.key]);\n\n useEffect(() => {\n if (!pendingFocusRef.current || !focusKey) return;\n pendingFocusRef.current = false;\n const node = gridRef.current?.querySelector<HTMLElement>(`[data-day=\"${focusKey}\"]`);\n node?.focus();\n }, [focusKey, month.grid]);\n\n // PageUp/PageDown rebuild the grid, so bring the keyboard along — otherwise\n // focus dies with the unmounted cell.\n useEffect(() => {\n const dayOfMonth = pendingMonthFocusRef.current;\n if (!dayOfMonth) return;\n pendingMonthFocusRef.current = null;\n const sameDay = month.grid.find(\n (candidate) => monthKeyOf(candidate) === month.key && candidate.slice(8, 10) === dayOfMonth,\n );\n const target = sameDay ?? month.grid.find((candidate) => monthKeyOf(candidate) === month.key);\n if (!target) return;\n pendingFocusRef.current = true;\n setFocusKey(target);\n }, [month.key, month.grid]);\n\n const moveFocus = useCallback((nextKey: string) => {\n pendingFocusRef.current = true;\n setFocusKey(nextKey);\n }, []);\n\n const onKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>) => {\n const current = (event.target as HTMLElement).dataset?.day;\n if (!current) return;\n const offsetFromWeekStart = (weekdayIndex(current) - month.weekStartsOn + 7) % 7;\n let next: string | undefined;\n\n switch (event.key) {\n case 'ArrowLeft':\n next = addDays(current, -1);\n break;\n case 'ArrowRight':\n next = addDays(current, 1);\n break;\n case 'ArrowUp':\n next = addDays(current, -7);\n break;\n case 'ArrowDown':\n next = addDays(current, 7);\n break;\n case 'Home':\n next = addDays(current, -offsetFromWeekStart);\n break;\n case 'End':\n next = addDays(current, 6 - offsetFromWeekStart);\n break;\n case 'PageUp':\n event.preventDefault();\n pendingMonthFocusRef.current = current.slice(8, 10);\n actions.previousMonth();\n return;\n case 'PageDown':\n event.preventDefault();\n pendingMonthFocusRef.current = current.slice(8, 10);\n actions.nextMonth();\n return;\n default:\n return;\n }\n\n event.preventDefault();\n const last = month.grid[month.grid.length - 1];\n const first = month.grid[0];\n if (last && first && (next < first || next > last)) {\n actions.goToMonth(monthKeyOf(next));\n }\n moveFocus(next);\n },\n [actions, month.grid, month.key, month.weekStartsOn],\n );\n\n return (\n <div className={cls('calendar')} data-status={month.status}>\n <div className={cls('calendarHeader')}>\n <h3 className={cls('monthLabel')}>{month.label}</h3>\n <div className=\"sl-calendar-nav\">\n <button\n type=\"button\"\n className={cls('navButton')}\n onClick={actions.previousMonth}\n aria-label={messages.previousMonth}\n >\n <ChevronLeftIcon />\n </button>\n <button\n type=\"button\"\n className={cls('navButton')}\n onClick={actions.nextMonth}\n aria-label={messages.nextMonth}\n >\n <ChevronRightIcon />\n </button>\n </div>\n </div>\n\n <div className={cls('weekdays')}>\n {month.weekdayHeaders.map((label, index) => (\n <span key={month.weekdayLongNames[index] ?? index} className={cls('weekday')}>\n <span aria-hidden=\"true\">{label}</span>\n <span className=\"sl-visually-hidden\">{month.weekdayLongNames[index]}</span>\n </span>\n ))}\n </div>\n\n <div className={cls('error')} role=\"alert\">\n <span>{month.error}</span>\n <button type=\"button\" className=\"sl-link-button\" onClick={actions.reloadAvailability}>\n {messages.retry}\n </button>\n </div>\n\n <div\n ref={gridRef}\n key={month.key}\n className={cls('grid')}\n role=\"grid\"\n aria-label={messages.calendarLabel}\n aria-busy={month.status === 'loading'}\n onKeyDown={onKeyDown}\n >\n {rows.map((row, rowIndex) => (\n <div className=\"sl-grid-row\" role=\"row\" key={row[0]}>\n {row.map((day, cellIndex) => {\n const cell = days[day];\n const bookable = cell?.bookable ?? false;\n return (\n <button\n key={day}\n type=\"button\"\n role=\"gridcell\"\n data-day={day}\n tabIndex={day === focusTarget ? 0 : -1}\n aria-selected={cell?.isSelected || undefined}\n aria-disabled={!bookable || undefined}\n aria-current={cell?.isToday ? 'date' : undefined}\n aria-label={cell?.label}\n className={cls(\n 'day',\n cell?.isOutside && 'is-outside',\n cell?.isSelected && 'is-selected',\n bookable && 'is-bookable',\n )}\n style={{ '--sl-index': rowIndex * 7 + cellIndex } as React.CSSProperties}\n onClick={() => {\n if (!bookable) return;\n actions.selectDate(day);\n }}\n >\n <span className=\"sl-day-number\">{Number(day.slice(8, 10))}</span>\n <span\n className={cls('dayDot')}\n aria-hidden=\"true\"\n data-visible={bookable || undefined}\n />\n </button>\n );\n })}\n </div>\n ))}\n </div>\n\n <p className=\"sl-timezone\">{view.time.zoneHint}</p>\n </div>\n );\n}\n","import { useClassNames, useFlow } from '../context';\nimport { CheckIcon } from './icons';\n\n/**\n * Step 4 — confirmation.\n *\n * Every line comes from the view, which itself comes from what the backend\n * reported: the invitation appears only for a status the adapter actually sent.\n */\nexport function ConfirmedStep() {\n const { snapshot, actions } = useFlow();\n const cls = useClassNames();\n const confirmation = snapshot.view.confirmation;\n\n if (!confirmation) return null;\n\n return (\n <div className={cls('confirmation')}>\n <span className={cls('confirmationIcon')} aria-hidden=\"true\">\n <CheckIcon />\n </span>\n <h3 className={cls('confirmationTitle')}>{confirmation.title}</h3>\n <div className={cls('confirmationText')}>\n <p>{confirmation.summary}</p>\n {confirmation.invitation ? <p>{confirmation.invitation}</p> : null}\n </div>\n <button type=\"button\" className={cls('secondaryButton')} onClick={actions.reset}>\n {confirmation.bookAnotherLabel}\n </button>\n </div>\n );\n}\n","import { useId } from 'react';\nimport type { BookingValues, ResolvedBookingField } from '@nickkupriyanov/slotline-core';\nimport { useClassNames, useFlow, useUI } from '../context';\nimport { ArrowRightIcon, CalendarIcon, ClockIcon, SpinnerIcon } from './icons';\n\ninterface FieldProps {\n field: ResolvedBookingField;\n value: unknown;\n error?: string;\n disabled?: boolean;\n autoFocus?: boolean;\n onChange: (value: unknown) => void;\n onBlur: () => void;\n}\n\n/** Browser hints for the fields the widget knows by name. */\nfunction autoCompleteOf(name: string): string | undefined {\n if (name === 'name') return 'name';\n if (name === 'email') return 'email';\n if (name === 'tel' || name === 'phone') return 'tel';\n return undefined;\n}\n\nfunction inputTypeOf(field: ResolvedBookingField): string {\n if (field.type === 'email') return 'email';\n if (field.type === 'tel') return 'tel';\n if (field.type === 'number') return 'number';\n return 'text';\n}\n\nfunction textOf(value: unknown): string {\n if (value === undefined || value === null || typeof value === 'boolean') return '';\n return String(value);\n}\n\n/**\n * One field of the form. The kind comes from the configuration, so a replaced\n * field list renders through the same markup as the built-in pair.\n */\nfunction Field({ field, value, error, disabled, autoFocus, onChange, onBlur }: FieldProps) {\n const cls = useClassNames();\n const generatedId = useId();\n const errorId = `${generatedId}-error`;\n const hintId = `${generatedId}-hint`;\n\n // The reference design has no visible labels; the accessible name comes from\n // aria-label so the placeholder can stay pure decoration.\n const shared = {\n id: generatedId,\n name: field.name,\n 'aria-label': field.label,\n 'aria-invalid': error ? (true as const) : undefined,\n 'aria-describedby': error ? errorId : field.hint ? hintId : undefined,\n disabled,\n };\n\n return (\n <div className={cls('field')} data-invalid={error ? 'true' : undefined}>\n {field.type === 'textarea' ? (\n <textarea\n {...shared}\n className={cls('input')}\n placeholder={field.placeholder ?? field.label}\n value={textOf(value)}\n onChange={(event) => onChange(event.target.value)}\n onBlur={onBlur}\n />\n ) : field.type === 'select' ? (\n <select\n {...shared}\n className={cls('input')}\n value={textOf(value)}\n onChange={(event) => onChange(event.target.value)}\n onBlur={onBlur}\n >\n <option value=\"\">{field.placeholder ?? ''}</option>\n {(field.options ?? []).map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n ) : field.type === 'checkbox' ? (\n <label className=\"sl-checkbox\">\n <input\n {...shared}\n type=\"checkbox\"\n checked={value === true}\n onChange={(event) => onChange(event.target.checked)}\n onBlur={onBlur}\n />\n <span>{field.label}</span>\n </label>\n ) : (\n <input\n {...shared}\n type={inputTypeOf(field)}\n inputMode={\n field.type === 'number' ? 'numeric' : field.type === 'email' ? 'email' : undefined\n }\n autoComplete={autoCompleteOf(field.name)}\n className={cls('input')}\n placeholder={field.placeholder ?? field.label}\n value={textOf(value)}\n autoFocus={autoFocus}\n onChange={(event) => onChange(event.target.value)}\n onBlur={onBlur}\n />\n )}\n\n {field.hint && !error ? (\n <p className=\"sl-field-hint\" id={hintId}>\n {field.hint}\n </p>\n ) : null}\n\n {error ? (\n <p className=\"sl-field-error\" id={errorId} role=\"alert\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n\n/** Step 3 — recap of the selection plus the configured fields. */\nexport function DetailsStep() {\n const { snapshot, actions } = useFlow();\n const { messages } = useUI();\n const cls = useClassNames();\n const view = snapshot.view;\n const form = view.form;\n\n return (\n <div className=\"sl-details-step\">\n <div className={cls('summary')}>\n <span className=\"sl-summary-icon\" aria-hidden=\"true\">\n <CalendarIcon />\n </span>\n <div className=\"sl-summary-body\">\n <p className=\"sl-summary-date\">{view.time.dateLabel}</p>\n <p className=\"sl-summary-meta\">\n <ClockIcon />\n <span>\n {view.time.label} · {view.duration.label}\n </span>\n </p>\n </div>\n </div>\n\n <form\n className={cls('form')}\n noValidate\n onSubmit={(event) => {\n event.preventDefault();\n void actions.submit();\n }}\n >\n {form.fields.map((field, index) => (\n <Field\n key={field.name}\n field={field}\n value={form.values[field.name]}\n error={form.visibleErrors[field.name]}\n disabled={form.submitting}\n autoFocus={index === 0}\n onChange={(value) => actions.setValues({ [field.name]: value } as BookingValues)}\n onBlur={() => actions.touchField(field.name)}\n />\n ))}\n\n {form.formError ? (\n <div className={cls('error')} role=\"alert\">\n <span>{form.formError}</span>\n </div>\n ) : null}\n\n {form.submitError ? (\n <div className={cls('error')} role=\"alert\">\n <span>{form.submitError}</span>\n <button type=\"button\" className=\"sl-link-button\" onClick={() => void actions.submit()}>\n {messages.retry}\n </button>\n </div>\n ) : null}\n\n <button\n type=\"submit\"\n className={cls('submit')}\n disabled={form.submitting}\n data-loading={form.submitting ? 'true' : undefined}\n >\n <span>{form.submitLabel}</span>\n {form.submitting ? (\n <SpinnerIcon className=\"sl-spinner\" />\n ) : (\n <ArrowRightIcon className=\"sl-submit-arrow\" />\n )}\n </button>\n </form>\n </div>\n );\n}\n","import { format } from '@nickkupriyanov/slotline-core';\nimport { useClassNames, useFlow, useUI } from '../context';\n\n/** The duration picker shown under the calendar, mirroring the reference design. */\nexport function DurationFooter() {\n const { snapshot, actions } = useFlow();\n const { messages } = useUI();\n const cls = useClassNames();\n const duration = snapshot.view.duration;\n\n if (!duration.showSelector) return null;\n\n return (\n <footer className={cls('footer')}>\n {/* The group carries the accessible name, so the visible caption is decorative. */}\n <span className=\"sl-duration-label\" aria-hidden=\"true\">\n {messages.durationLabel}\n </span>\n <div className=\"sl-duration-group\" role=\"radiogroup\" aria-label={messages.durationGroupLabel}>\n {duration.options.map((minutes) => {\n const active = minutes === duration.current;\n const label = format(messages.duration, { count: minutes });\n return (\n <button\n key={minutes}\n type=\"button\"\n role=\"radio\"\n aria-checked={active}\n aria-label={label}\n className=\"sl-duration-pill\"\n data-state={active ? 'active' : 'idle'}\n onClick={() => actions.setDuration(minutes)}\n >\n {label}\n </button>\n );\n })}\n </div>\n </footer>\n );\n}\n","import { useClassNames, useFlow } from '../context';\n\n/** Three morphing pills: narrow while upcoming, wide once reached. */\nexport function Progress() {\n const { snapshot } = useFlow();\n const cls = useClassNames();\n const { progress } = snapshot.view;\n\n return (\n <div\n className={cls('progress')}\n role=\"progressbar\"\n aria-valuemin={1}\n aria-valuemax={progress.total}\n aria-valuenow={progress.current}\n aria-valuetext={progress.label}\n >\n {progress.steps.map((step, position) => (\n <span\n key={step}\n className=\"sl-progress-pill\"\n data-state={position < progress.current ? 'done' : 'todo'}\n aria-hidden=\"true\"\n />\n ))}\n </div>\n );\n}\n","import { useClassNames, useFlow, useUI } from '../context';\nimport { CalendarIcon } from './icons';\n\nconst SKELETON_COUNT = 9;\n\n/** Step 2 — the slots of the selected day. */\nexport function SlotsStep() {\n const { snapshot, actions } = useFlow();\n const { messages } = useUI();\n const cls = useClassNames();\n const Animations = useUI().animations;\n const view = snapshot.view;\n const { slots, time } = view;\n\n return (\n <div className=\"sl-slots-step\">\n <div className={cls('slotsHeader')}>\n <span className=\"sl-slots-icon\" aria-hidden=\"true\">\n <CalendarIcon />\n </span>\n <h3 className=\"sl-slots-title\">{time.dateLabel}</h3>\n {slots.countLabel ? <span className={cls('slotsCount')}>{slots.countLabel}</span> : null}\n </div>\n\n {slots.loading ? (\n <div className={cls('slots')} aria-hidden=\"true\">\n {Array.from({ length: SKELETON_COUNT }, (_, index) => (\n <div\n key={index}\n className={cls('skeleton')}\n style={{ '--sl-index': index } as React.CSSProperties}\n />\n ))}\n </div>\n ) : null}\n\n {slots.status === 'error' ? (\n <div className={cls('error')} role=\"alert\">\n <span>{slots.error}</span>\n <button type=\"button\" className=\"sl-link-button\" onClick={actions.reloadSlots}>\n {messages.retry}\n </button>\n </div>\n ) : null}\n\n {slots.empty ? (\n <div className={cls('empty')}>\n <p className=\"sl-empty-title\">{messages.noSlotsTitle}</p>\n <p className=\"sl-empty-body\">{messages.noSlotsBody}</p>\n <button type=\"button\" className={cls('secondaryButton')} onClick={actions.back}>\n {messages.pickAnotherDay}\n </button>\n </div>\n ) : null}\n\n {slots.status === 'ready' && slots.count > 0 ? (\n <div className={cls('slots')} role=\"group\" aria-label={slots.label}>\n {slots.items.map((slot, index) => (\n <Animations.Item\n key={slot.id}\n index={index}\n className={cls('slot', slot.selected && 'is-selected')}\n aria-current={slot.selected ? 'true' : undefined}\n aria-label={slot.utcOffsetLabel ? `${slot.label} ${slot.utcOffsetLabel}` : undefined}\n onClick={() => actions.selectSlot(slot)}\n >\n {slot.label}\n </Animations.Item>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport { useClassNames, useFlow, useUI } from '../context';\nimport { useFocusTrap } from '../hooks/useFocusTrap';\nimport { AttemptStep } from './AttemptStep';\nimport { CalendarStep } from './CalendarStep';\nimport { ConfirmedStep } from './ConfirmedStep';\nimport { DetailsStep } from './DetailsStep';\nimport { DurationFooter } from './DurationFooter';\nimport { Progress } from './Progress';\nimport { SlotsStep } from './SlotsStep';\nimport { ChevronLeftIcon } from './icons';\n\nfunction StepBody() {\n const { snapshot } = useFlow();\n\n switch (snapshot.view.step) {\n case 'time':\n return <SlotsStep />;\n case 'details':\n return <DetailsStep />;\n case 'attempt':\n return <AttemptStep />;\n case 'confirmed':\n return <ConfirmedStep />;\n case 'date':\n default:\n return <CalendarStep />;\n }\n}\n\n/** The full widget: card, header, progress, panel, footer. */\nexport function SlotlineView() {\n const { snapshot, actions } = useFlow();\n const ui = useUI();\n const cls = useClassNames();\n const Animations = ui.animations;\n const view = snapshot.view;\n const cardRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const mountedRef = useRef(false);\n\n // The confirmation is terminal and the attempt screen is blocked, so on those\n // only an application-supplied dismiss handler makes going \"back\" meaningful.\n const canGoBack =\n view.actions.canGoBack ||\n ((view.step === 'date' || view.step === 'confirmed') && ui.canDismiss);\n\n useFocusTrap(cardRef, {\n active: ui.trapFocus,\n ...(canGoBack ? { onEscape: actions.back } : {}),\n });\n\n // Keep DOM focus inside the widget when the previous step unmounts the\n // element the user activated — otherwise focus silently falls back to <body>.\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n if (ui.autoFocus) panelRef.current?.focus();\n return;\n }\n const active = typeof document === 'undefined' ? null : document.activeElement;\n if (!active || active === document.body) panelRef.current?.focus();\n }, [view.step, ui.autoFocus]);\n\n return (\n <div\n className={cls('root', ui.className)}\n data-sl-theme={ui.theme}\n data-sl-step={view.step}\n lang={ui.locale}\n >\n <div className={cls('card')} ref={cardRef}>\n <header className={cls('header')}>\n {canGoBack ? (\n <button\n type=\"button\"\n className=\"sl-icon-button\"\n onClick={actions.back}\n aria-label={ui.messages.back}\n disabled={view.form.submitting}\n >\n <ChevronLeftIcon />\n </button>\n ) : null}\n <div className=\"sl-header-main\">\n <h2 className={cls('title')}>{view.title}</h2>\n <span className={cls('badge')}>{view.duration.label}</span>\n </div>\n <Progress />\n </header>\n\n <div className={cls('panel')} ref={panelRef} tabIndex={-1}>\n <Animations.Height>\n <Animations.StepHost stepKey={view.step} direction={view.direction}>\n <StepBody />\n </Animations.StepHost>\n </Animations.Height>\n </div>\n\n {view.step === 'date' ? <DurationFooter /> : null}\n\n <div className=\"sl-visually-hidden\" role=\"status\" aria-live=\"polite\">\n {view.live.message}\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\nimport {\n DARK_SCHEME_QUERY,\n canMatchMedia,\n matchesMediaQuery,\n observeMediaQuery,\n} from '@nickkupriyanov/slotline-core/dom';\nimport type { SlotlineTheme } from '../types';\n\n/** What the host says, defaulting to the widget's own dark theme. */\nfunction hostTheme(): 'dark' | 'light' {\n if (!canMatchMedia()) return 'dark';\n return matchesMediaQuery(DARK_SCHEME_QUERY) ? 'dark' : 'light';\n}\n\n/**\n * Resolves `system` to a concrete theme and keeps it in sync with the OS.\n * The widget exposes the result as `data-sl-theme`, so the stylesheet only\n * needs two token blocks.\n */\nexport function useResolvedTheme(theme: SlotlineTheme): 'dark' | 'light' {\n const [resolved, setResolved] = useState(hostTheme);\n\n useEffect(() => {\n if (theme !== 'system') return;\n return observeMediaQuery(DARK_SCHEME_QUERY, (matches) =>\n setResolved(matches ? 'dark' : 'light'),\n );\n }, [theme]);\n\n return theme === 'system' ? resolved : theme;\n}\n","/**\n * The React binding of the booking controller.\n *\n * The hook owns nothing but the lifecycle: it creates one controller per mounted\n * widget, keeps it in step with the props, and subscribes with\n * `useSyncExternalStore`. Everything the widget shows comes from the controller's\n * snapshot, so React and Angular render the same derivation instead of each\n * formatting dates their own way.\n */\nimport { useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport {\n createBookingController,\n detectLocale,\n resolveMessages,\n resolveTimeZone,\n type BookingConfigOverrides,\n type AvailabilityAdapter,\n type BookingAdapter,\n type BookingController,\n type BookingControllerInputs,\n type BookingControllerOptions,\n type BookingRequest,\n type BookingSnapshot,\n type DefaultBookingValues,\n} from '@nickkupriyanov/slotline-core';\nimport { observeVisibilityChange } from '@nickkupriyanov/slotline-core/dom';\nimport { cssAnimations } from './animations/css';\nimport type { SlotlineUIContextValue, UseBookingFlowResult } from './context';\nimport { useResolvedTheme } from './hooks/useResolvedTheme';\nimport type { SlotlineProps } from './types';\n\n/** The flow's public shape, so consumers can keep importing it from the hook. */\nexport type { UseBookingFlowResult } from './context';\n\n/**\n * Browser language and zone, read once and applied *after* mounting. The first\n * render — the one the server also produces — uses the deterministic fallbacks, so\n * rendering and hydration agree and the widget then switches to what the visitor\n * actually uses.\n */\nlet cachedBrowserDefaults: { locale: string; timeZone: string } | null = null;\n\nfunction readBrowserDefaults(): { locale: string; timeZone: string } {\n cachedBrowserDefaults ??= { locale: detectLocale(), timeZone: resolveTimeZone() };\n return cachedBrowserDefaults;\n}\n\nfunction useBrowserDefaults(): { locale: string; timeZone: string } | null {\n const [defaults, setDefaults] = useState<{ locale: string; timeZone: string } | null>(null);\n\n useEffect(() => {\n setDefaults(readBrowserDefaults());\n }, []);\n\n return defaults;\n}\n\ntype BrowserDefaults = { locale: string; timeZone: string } | null;\n\n/** Builds the controller's options from the props. */\nfunction optionsOf<TValues>(\n props: SlotlineProps<TValues>,\n browser: BrowserDefaults,\n): BookingControllerOptions<TValues> {\n return {\n adapter: adapterOf(props) as BookingAdapter<TValues>,\n config: configOf(props, browser),\n inputs: inputsOf(props, browser),\n ...(props.attempt == null ? {} : { initialAttempt: props.attempt }),\n };\n}\n\n/** The adapter the widget works against. */\nfunction adapterOf<TValues>(\n props: SlotlineProps<TValues>,\n): BookingAdapter<TValues> | AvailabilityAdapter<TValues> {\n return props.adapter;\n}\n\nfunction configOf<TValues>(\n props: SlotlineProps<TValues>,\n browser: BrowserDefaults,\n): BookingConfigOverrides {\n const locale = props.locale ?? browser?.locale;\n return {\n ...(locale === undefined ? {} : { locale }),\n ...(props.messages === undefined ? {} : { messages: props.messages }),\n ...(props.weekStartsOn === undefined ? {} : { weekStartsOn: props.weekStartsOn }),\n ...(props.durations === undefined ? {} : { durationOptions: props.durations }),\n ...(props.minDate === undefined ? {} : { minDate: props.minDate }),\n ...(props.maxDate === undefined ? {} : { maxDate: props.maxDate }),\n ...(props.title === undefined ? {} : { title: props.title }),\n ...(props.context === undefined ? {} : { context: props.context }),\n };\n}\n\n/**\n * A time zone or hour cycle from the props is a controlled value; without one, the\n * browser's own is handed over as the initial value — which is why the controller\n * treats a `default*` that appears for the first time as the initial value rather\n * than as a late re-initialisation.\n */\nfunction inputsOf<TValues>(\n props: SlotlineProps<TValues>,\n browser: BrowserDefaults,\n): BookingControllerInputs<TValues> {\n const inputs: BookingControllerInputs<TValues> = {};\n\n if (props.timeZone !== undefined) inputs.timeZone = props.timeZone;\n else {\n const timeZone = props.defaultTimeZone ?? browser?.timeZone;\n if (timeZone !== undefined) inputs.defaultTimeZone = timeZone;\n }\n\n if (props.duration !== undefined) inputs.duration = props.duration;\n if (props.defaultDuration !== undefined) inputs.defaultDuration = props.defaultDuration;\n\n if (props.timeFormat !== undefined) inputs.timeFormat = props.timeFormat;\n else if (props.defaultTimeFormat !== undefined)\n inputs.defaultTimeFormat = props.defaultTimeFormat;\n\n return inputs;\n}\n\n/**\n * Creates the controller once and keeps it alive for as long as the widget is\n * mounted. Starting and stopping are the controller's own concern, so a Strict\n * Mode double mount sends nothing twice.\n */\nexport function useBookingController<TValues = DefaultBookingValues>(\n props: SlotlineProps<TValues>,\n): BookingController<TValues> {\n const browser = useBrowserDefaults();\n const propsRef = useRef(props);\n propsRef.current = props;\n const browserRef = useRef(browser);\n browserRef.current = browser;\n\n const controllerRef = useRef<BookingController<TValues> | null>(null);\n if (controllerRef.current === null) {\n controllerRef.current = createBookingController<TValues>({\n ...optionsOf(props, browser),\n handlers: {\n // Every handler reads the latest props, so a re-render never leaves a\n // stale callback behind.\n onBooked: (result, request) =>\n // The flow carries the payload as plain values; the adapter's own type is\n // what the application declared for its form.\n propsRef.current.onBooked?.(result, request as unknown as BookingRequest<TValues>),\n onError: (error, context) => propsRef.current.onError?.(error, context),\n onDismiss: () => propsRef.current.onDismiss?.(),\n onDurationChange: (duration, metadata) =>\n propsRef.current.onDurationChange?.(duration, metadata),\n onTimeFormatChange: (timeFormat, metadata) =>\n propsRef.current.onTimeFormatChange?.(timeFormat, metadata),\n onContextChange: (context, metadata) =>\n propsRef.current.onContextChange?.(context, metadata),\n },\n });\n }\n const controller = controllerRef.current;\n\n // Props are the source of truth on every render. The controller compares them\n // structurally, so re-supplying equal values costs nothing.\n useEffect(() => {\n controller.updateAdapter(adapterOf(propsRef.current));\n controller.updateConfig(configOf(propsRef.current, browserRef.current));\n controller.updateInputs(inputsOf(propsRef.current, browserRef.current));\n });\n\n useEffect(() => {\n controller.start();\n return () => controller.stop();\n }, [controller]);\n\n // A tab that comes back may have slept through midnight, or through the end of\n // a safe-retry window.\n useEffect(() => observeVisibilityChange(() => controller.refreshTime()), [controller]);\n\n return controller;\n}\n\nfunction useSubscribedFlow<TValues>(controller: BookingController<TValues>): UseBookingFlowResult {\n const snapshot: BookingSnapshot = useSyncExternalStore(\n controller.subscribe,\n controller.getSnapshot,\n controller.getSnapshot,\n );\n\n return useMemo(() => ({ snapshot, actions: controller.actions }), [snapshot, controller]);\n}\n\n/**\n * The headless widget: the whole flow, no markup.\n *\n * ```tsx\n * const { snapshot, actions } = useBookingFlow({ adapter });\n * ```\n */\nexport function useBookingFlow<TValues = DefaultBookingValues>(\n props: SlotlineProps<TValues>,\n): UseBookingFlowResult {\n return useSubscribedFlow(useBookingController(props));\n}\n\n/** Presentation values shared by the built-in parts. */\nexport function useSlotlineUI<TValues = DefaultBookingValues>(\n props: SlotlineProps<TValues>,\n): SlotlineUIContextValue {\n const browser = useBrowserDefaults();\n const locale = props.locale ?? browser?.locale ?? 'en';\n const messages = useMemo(() => resolveMessages(locale, props.messages), [locale, props.messages]);\n const theme = useResolvedTheme(props.theme ?? 'dark');\n\n return useMemo<SlotlineUIContextValue>(\n () => ({\n animations: props.animations ?? cssAnimations,\n classNames: props.classNames,\n className: props.className,\n autoFocus: props.autoFocus ?? false,\n trapFocus: props.trapFocus ?? false,\n canDismiss: Boolean(props.onDismiss),\n onCheckStatus: props.onCheckStatus,\n messages,\n locale,\n theme,\n }),\n [\n props.animations,\n props.classNames,\n props.className,\n props.autoFocus,\n props.trapFocus,\n props.onDismiss,\n props.onCheckStatus,\n messages,\n locale,\n theme,\n ],\n );\n}\n","import { cssAnimations } from './animations/css';\nimport { SlotlineView } from './components/SlotlineView';\nimport { FlowContext, UIContext } from './context';\nimport { useBookingController, useSlotlineUI } from './useBookingFlow';\nimport { useMemo, useSyncExternalStore } from 'react';\nimport type { DefaultBookingValues } from '@nickkupriyanov/slotline-core';\nimport type { AnimationKit, SlotlineProps, SlotlineProviderProps } from './types';\n\n/**\n * Provides the booking flow to any UI. Use it directly to build a custom widget\n * on top of `useSlotlineContext()`.\n *\n * The provider owns exactly one controller: it is created here, kept in step with\n * the props, started after mounting and stopped on unmount.\n */\nexport function SlotlineProvider<TValues = DefaultBookingValues>(\n props: SlotlineProviderProps<TValues>,\n) {\n const { children } = props;\n const controller = useBookingController(props);\n const ui = useSlotlineUI(props);\n\n const snapshot = useSyncExternalStore(\n controller.subscribe,\n controller.getSnapshot,\n controller.getSnapshot,\n );\n const flow = useMemo(() => ({ snapshot, actions: controller.actions }), [snapshot, controller]);\n\n return (\n <FlowContext.Provider value={flow}>\n <UIContext.Provider value={ui}>{children}</UIContext.Provider>\n </FlowContext.Provider>\n );\n}\n\n/**\n * Builds a `Slotline` bound to a specific animation kit — used by\n * `@nickkupriyanov/slotline-react/motion` and available for custom kits.\n */\nexport function createSlotline(animations: AnimationKit) {\n function ComposedSlotline<TValues = DefaultBookingValues>(props: SlotlineProps<TValues>) {\n return (\n <SlotlineProvider {...props} animations={props.animations ?? animations}>\n <SlotlineView />\n </SlotlineProvider>\n );\n }\n ComposedSlotline.displayName = 'Slotline';\n return ComposedSlotline;\n}\n\n/**\n * The ready-made widget: calendar → slots → details → confirmation.\n *\n * ```tsx\n * import { Slotline } from '@nickkupriyanov/slotline-react';\n * import '@nickkupriyanov/slotline-react/styles.css';\n *\n * <Slotline adapter={adapter} theme=\"dark\" locale=\"ru\" />\n * ```\n */\nexport const Slotline = createSlotline(cssAnimations);\n","/**\n * @nickkupriyanov/slotline-react/motion — the same widget with spring-based transitions.\n *\n * ```tsx\n * import { Slotline } from '@nickkupriyanov/slotline-react/motion';\n * import '@nickkupriyanov/slotline-react/styles.css';\n * ```\n *\n * Requires the optional `motion` peer dependency.\n */\nimport { motionAnimations } from './animations/motion';\nimport { createSlotline } from './Slotline';\n\nexport * from './public';\nexport { motionAnimations };\n\n/** Identical API to the default `Slotline`, with `motion` driving the transitions. */\nexport const Slotline = createSlotline(motionAnimations);\n"]}
package/dist/slotline.css CHANGED
@@ -71,8 +71,7 @@
71
71
  --sl-skeleton-shine: rgba(255, 255, 255, 0.12);
72
72
 
73
73
  --sl-shadow-card:
74
- 0 1px 0 rgba(255, 255, 255, 0.03) inset,
75
- 0 32px 64px -32px rgba(0, 0, 0, 0.9),
74
+ 0 1px 0 rgba(255, 255, 255, 0.03) inset, 0 32px 64px -32px rgba(0, 0, 0, 0.9),
76
75
  0 8px 24px -16px rgba(0, 0, 0, 0.7);
77
76
  }
78
77
 
@@ -115,8 +114,7 @@
115
114
  --sl-skeleton-shine: rgba(23, 23, 25, 0.12);
116
115
 
117
116
  --sl-shadow-card:
118
- 0 32px 64px -40px rgba(23, 23, 25, 0.35),
119
- 0 6px 20px -12px rgba(23, 23, 25, 0.12);
117
+ 0 32px 64px -40px rgba(23, 23, 25, 0.35), 0 6px 20px -12px rgba(23, 23, 25, 0.12);
120
118
  }
121
119
 
122
120
  /* ---- src/styles/base.css ---- */
@@ -657,13 +655,12 @@
657
655
 
658
656
  .sl-skeleton {
659
657
  height: 44px;
660
- background:
661
- linear-gradient(
662
- 100deg,
663
- var(--sl-skeleton-base) 30%,
664
- var(--sl-skeleton-shine) 50%,
665
- var(--sl-skeleton-base) 70%
666
- );
658
+ background: linear-gradient(
659
+ 100deg,
660
+ var(--sl-skeleton-base) 30%,
661
+ var(--sl-skeleton-shine) 50%,
662
+ var(--sl-skeleton-base) 70%
663
+ );
667
664
  background-size: 220% 100%;
668
665
  border-radius: var(--sl-radius-control);
669
666
  animation: sl-shimmer 1.4s linear infinite;
@@ -1056,3 +1053,13 @@
1056
1053
  font-size: 17px;
1057
1054
  }
1058
1055
  }
1056
+
1057
+ /* A form can disable the field: the widget stays visible and readable, but stops
1058
+ taking pointer input, and the parts it drives report themselves as unavailable. */
1059
+ .sl-root[data-sl-disabled='true'] {
1060
+ pointer-events: none;
1061
+ }
1062
+
1063
+ .sl-root[data-sl-disabled='true'] .sl-card {
1064
+ opacity: 0.6;
1065
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nickkupriyanov/slotline-react",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Themable, accessible React booking widget: month calendar → time slots → details → confirmation. CSS-variable theming, dark theme by default, soft animations, bring-your-own backend.",
5
5
  "keywords": [
6
6
  "react",
@@ -56,7 +56,7 @@
56
56
  "access": "public"
57
57
  },
58
58
  "dependencies": {
59
- "@nickkupriyanov/slotline-core": "^0.1.0"
59
+ "@nickkupriyanov/slotline-core": "^0.2.0"
60
60
  },
61
61
  "peerDependencies": {
62
62
  "react": "^18.2.0 || ^19.0.0",