@hotelcard/ui 0.0.54 → 0.0.56

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.

Potentially problematic release.


This version of @hotelcard/ui might be problematic. Click here for more details.

@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/locales/index.ts","../src/context/UIContext.tsx","../src/components/Button/Button.tsx","../src/components/Badge/Badge.tsx","../src/components/Rating/Rating.tsx","../src/components/Divider/Divider.tsx","../src/components/Chip/Chip.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/RadioButton/RadioButton.tsx","../src/components/SectionHeader/SectionHeader.tsx","../src/components/Modal/Modal.tsx","../src/components/Card/Card.tsx","../src/components/BaseCard/BaseCard.tsx","../src/components/BaseCard/BaseCardSkeleton.tsx","../src/components/Dropdown/Dropdown.tsx","../src/components/Input/Input.tsx","../src/components/Block/Block.tsx","../src/components/ReviewCard/ReviewCard.tsx","../src/components/FAQ/FAQ.tsx","../src/components/Benefits/Benefits.tsx","../src/components/Pin/Pin.tsx","../src/components/EmptyState/EmptyState.tsx","../src/hooks/useDebounce.ts","../src/hooks/useResponsive.ts","../src/hooks/useWindowData.ts","../src/hooks/useTranslation.ts","../src/components/DateSelector/DualCalendar.tsx","../src/components/DateSelector/WhenContent.tsx","../src/components/DateSelector/DateSelector.tsx","../src/components/GuestSelector/GuestContent.tsx","../src/components/GuestSelector/GuestSelector.tsx","../src/components/LocationAutocomplete/LocationAutocomplete.tsx","../src/components/MobileSortModal/MobileSortModal.tsx","../src/components/SearchControlsBar/SearchControlsBar.tsx","../src/components/HotelCard/HotelCardImage.tsx","../src/components/HotelCard/HotelCardContent.tsx","../src/components/HotelCard/HotelCard.tsx","../src/components/HotelCard/HotelCardSkeleton.tsx","../src/services/autocomplete.ts","../src/components/SearchModal/LocationSearchContent/LocationSearchContent.tsx","../src/components/SearchModal/SearchModal.tsx","../src/components/FilterPanel/components/CollapsibleFilterSection.tsx","../src/components/FilterPanel/components/FilterCheckboxItem.tsx","../src/components/FilterPanel/components/ExperienceFilter.tsx","../src/components/FilterPanel/components/HotelCategoryFilter.tsx","../src/components/FilterPanel/components/MealsFilter.tsx","../src/components/FilterPanel/components/PriceRangeFilter.tsx","../src/components/FilterPanel/components/RegionsFilter.tsx","../src/components/FilterPanel/components/ReviewsFilter.tsx","../src/components/FilterPanel/components/SelectedFiltersRow.tsx","../src/components/FilterPanel/components/TransportFilter.tsx","../src/components/FilterPanel/components/WellnessFilter.tsx","../src/components/FilterPanel/components/FilterMinimap.tsx","../src/components/FilterPanel/components/FilterSkeleton/FilterSkeleton.tsx","../src/components/FilterPanel/FilterPanel.tsx","../src/components/FilterModal/FilterModal.tsx","../src/components/BookingCard/BookingCardDetails.tsx","../src/components/BookingCard/FeaturedBookingCard.tsx","../src/components/BookingCard/CompactBookingCard.tsx","../src/components/BookingCard/BookingCardSkeleton.tsx","../src/components/icons/HeartIcon.tsx","../src/components/icons/StarIcon.tsx","../src/components/icons/ChevronLeftIcon.tsx","../src/components/icons/ChevronRightIcon.tsx","../src/components/icons/PinIcon.tsx","../src/utils/formatPrice.ts","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/toDate.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/constructFrom.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/constants.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/_lib/defaultOptions.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/startOfWeek.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/startOfISOWeek.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/getISOWeekYear.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/startOfDay.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/differenceInCalendarDays.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/startOfISOWeekYear.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/isDate.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/isValid.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/startOfYear.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-US/_lib/formatDistance.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/_lib/buildFormatLongFn.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-US/_lib/formatLong.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-US/_lib/formatRelative.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/_lib/buildLocalizeFn.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-US/_lib/localize.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/_lib/buildMatchFn.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/_lib/buildMatchPatternFn.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-US/_lib/match.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-US.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/getDayOfYear.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/getISOWeek.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/getWeekYear.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/startOfWeekYear.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/getWeek.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/_lib/addLeadingZeros.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/_lib/format/lightFormatters.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/_lib/format/formatters.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/_lib/format/longFormatters.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/_lib/protectedTokens.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/format.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/isSameWeek.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/parseISO.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/de/_lib/formatDistance.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/de/_lib/formatLong.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/de/_lib/formatRelative.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/de/_lib/localize.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/de/_lib/match.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/de.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/fr/_lib/formatDistance.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/fr/_lib/formatLong.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/fr/_lib/formatRelative.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/fr/_lib/localize.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/fr/_lib/match.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/fr.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/it/_lib/formatDistance.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/it/_lib/formatLong.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/it/_lib/formatRelative.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/it/_lib/localize.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/it/_lib/match.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/it.mjs","../src/utils/formatDate.ts","../src/utils/calculateDiscount.ts"],"sourcesContent":["import de from './de.json';\nimport en from './en.json';\nimport fr from './fr.json';\nimport it from './it.json';\n\nexport const translations = { de, en, fr, it } as const;\n\nexport type Locale = keyof typeof translations;\nexport type TranslationKeys = typeof en;\n","import React, { createContext, useContext, ReactNode, useMemo } from 'react';\nimport { translations, type Locale } from '../locales';\n\n/** Translation options for interpolation */\nexport interface TranslateOptions {\n [key: string]: string | number;\n}\n\n/** Translation function type */\nexport type TranslateFunction = (key: string, optionsOrFallback?: TranslateOptions | string, fallback?: string) => string;\n\nexport interface UIContextValue {\n /** Current locale (e.g., 'de', 'en', 'fr', 'it') */\n locale: Locale;\n /** Currency code (e.g., 'CHF', 'EUR') */\n currency: string;\n /** Whether the app is running on desktop (default: false for mobile-first) */\n isDesktop: boolean;\n /** Base URL for API calls (e.g., 'https://hotelcard.ch') */\n apiBaseUrl: string;\n /** Translation function - looks up keys from internal translations */\n t: TranslateFunction;\n}\n\n/**\n * Get nested value from object using dot notation\n * e.g., getNestedValue({ a: { b: 'value' } }, 'a.b') => 'value'\n */\nfunction getNestedValue(obj: Record<string, unknown>, path: string): string | undefined {\n const keys = path.split('.');\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n\n return typeof current === 'string' ? current : undefined;\n}\n\n/**\n * Interpolate variables in a translation string\n * Replaces {{variable}} with the value from options\n */\nfunction interpolate(str: string, options: TranslateOptions): string {\n return str.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => {\n const value = options[key];\n return value !== undefined ? String(value) : `{{${key}}}`;\n });\n}\n\n/**\n * Create translation function for a given locale\n */\nfunction createTranslateFunction(locale: Locale): TranslateFunction {\n const localeTranslations = translations[locale] || translations.en;\n\n return (key: string, optionsOrFallback?: TranslateOptions | string, fallback?: string): string => {\n const value = getNestedValue(localeTranslations as Record<string, unknown>, key);\n\n // Determine if second param is options object or fallback string\n const isOptions = optionsOrFallback && typeof optionsOrFallback === 'object';\n const options = isOptions ? optionsOrFallback : undefined;\n const fallbackStr = isOptions ? fallback : (optionsOrFallback as string | undefined);\n\n const result = value ?? fallbackStr ?? key;\n\n // Apply interpolation if options provided\n return options ? interpolate(result, options) : result;\n };\n}\n\nconst defaultT = createTranslateFunction('de');\n\nconst defaultValue: UIContextValue = {\n locale: 'de',\n currency: 'CHF',\n isDesktop: false,\n apiBaseUrl: '',\n t: defaultT,\n};\n\nconst UIContext = createContext<UIContextValue>(defaultValue);\n\nexport interface HotelCardUIProviderProps {\n /** Current locale */\n locale?: Locale;\n /** Currency code */\n currency?: string;\n /** Whether running on desktop */\n isDesktop?: boolean;\n /** Base URL for API calls (e.g., 'https://hotelcard.ch') */\n apiBaseUrl?: string;\n /** Optional custom translation function (overrides internal translations) */\n t?: TranslateFunction;\n children: ReactNode;\n}\n\n/**\n * HotelCardUIProvider - Configure shared UI components\n *\n * Wrap your app with this provider to configure locale, currency, and responsive mode\n * for all @hotelcard/ui components.\n *\n * @example\n * ```tsx\n * import { HotelCardUIProvider } from '@hotelcard/ui';\n *\n * <HotelCardUIProvider locale=\"de\" currency=\"CHF\">\n * <App />\n * </HotelCardUIProvider>\n * ```\n */\nexport const HotelCardUIProvider: React.FC<HotelCardUIProviderProps> = ({\n locale = 'de',\n currency = 'CHF',\n isDesktop = false,\n apiBaseUrl = '',\n t: customT,\n children,\n}) => {\n // Create translation function based on locale, or use custom one\n const t = useMemo(\n () => customT ?? createTranslateFunction(locale),\n [locale, customT]\n );\n\n const value: UIContextValue = useMemo(\n () => ({ locale, currency, isDesktop, apiBaseUrl, t }),\n [locale, currency, isDesktop, apiBaseUrl, t]\n );\n\n return (\n <UIContext.Provider value={value}>\n {children}\n </UIContext.Provider>\n );\n};\n\n/**\n * Hook to access UI context values\n * Returns locale, currency, and isDesktop\n */\nexport const useUIContext = (): UIContextValue => {\n return useContext(UIContext);\n};\n\nexport { UIContext };\n","import { forwardRef } from 'react';\nimport { ButtonProps } from \"./Button.types\";\nimport './Button.css';\n\n// CSS class prefix to avoid conflicts\nconst cx = (className: string) => `hc-btn-${className}`;\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(({\n variant = 'primary',\n size = 'medium',\n leftIcon,\n rightIcon,\n children,\n className = '',\n disabled,\n iconOnly = false,\n style,\n ...props\n}, ref) => {\n\n // Build className based on variant, size, and state\n const getButtonClasses = () => {\n const classes: string[] = [cx('button')];\n\n // Link variant\n if (variant === 'link') {\n classes.push(cx('link'));\n classes.push(cx(size));\n return classes.join(' ');\n }\n\n // Icon-only variant\n if (iconOnly) {\n classes.push(cx('icon-only'));\n classes.push(cx(size));\n classes.push(cx(variant));\n return classes.join(' ');\n }\n\n // Standard button\n classes.push(cx('standard'));\n classes.push(cx(size));\n classes.push(cx(variant));\n\n return classes.join(' ');\n };\n\n return (\n <button\n ref={ref}\n style={style}\n className={`${getButtonClasses()} ${className}`}\n disabled={disabled}\n {...props}\n >\n {iconOnly ? (\n children\n ) : (\n <>\n {leftIcon && (\n <span className={cx('icon-wrapper')}>\n {leftIcon}\n </span>\n )}\n <span className={cx('text-wrapper')}>{children}</span>\n {rightIcon && (\n <span className={cx('icon-wrapper')}>\n {rightIcon}\n </span>\n )}\n </>\n )}\n </button>\n );\n});\n\nButton.displayName = 'Button';\n\nexport { Button };\n","import { BadgeProps } from './Badge.types';\nimport './Badge.css';\n\n// CSS class prefix to avoid conflicts\nconst cx = (className: string) => `hc-badge-${className}`;\n\nconst Badge: React.FC<BadgeProps> = ({\n color = 'primary',\n size = 'large',\n style = 'heavy',\n icon = false,\n children,\n className = ''\n}) => {\n // Build color-style variant class name\n const colorStyleKey = `${color}${style.charAt(0).toUpperCase()}${style.slice(1)}`;\n\n // Build badge classes\n const badgeClasses = [\n cx('badge'),\n cx(`badge--${size}`),\n cx(`badge--${colorStyleKey}`),\n className\n ].filter(Boolean).join(' ');\n\n // Build icon classes\n const iconClasses = [\n cx('icon'),\n cx(`icon--${size}`)\n ].join(' ');\n\n // Build text classes\n const textClasses = [\n cx('text'),\n size === 'large' && icon ? cx('text--largeWithIcon') : ''\n ].filter(Boolean).join(' ');\n\n return (\n <div className={badgeClasses}>\n {icon && (\n <div className={iconClasses}>\n {/* Icon implementation would go here */}\n </div>\n )}\n\n <div className={textClasses}>\n {children}\n </div>\n </div>\n );\n};\n\nBadge.displayName = 'Badge';\n\nexport { Badge };\n","import { RatingProps } from './Rating.types';\nimport './Rating.css';\n\n// CSS class prefix to avoid conflicts\nconst cx = (className: string) => `hc-rating-${className}`;\n\n// Full star icon (filled)\nconst StarIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_full)\">\n <path d=\"M12.0004 0.5C12.393 0.5 12.7551 0.723172 12.9339 1.07325L16.1402 7.38333L23.1155 8.49482C23.5037 8.55608 23.8265 8.83176 23.9487 9.20809C24.0708 9.58442 23.9705 9.99576 23.6957 10.2758L18.7008 15.2863L19.8045 22.2834C19.8656 22.6728 19.7042 23.0667 19.3857 23.2986C19.0673 23.5305 18.6441 23.5655 18.2951 23.3861L12.0004 20.1742L5.70561 23.3861C5.35663 23.5655 4.93349 23.5305 4.61504 23.2986C4.29659 23.0667 4.13519 22.6772 4.19626 22.2834L5.29555 15.2863L0.305106 10.2758C0.0259198 9.99576 -0.0700504 9.58442 0.0520935 9.20809C0.174237 8.83176 0.492684 8.55608 0.885289 8.49482L7.86058 7.38333L11.0712 1.07325C11.2501 0.723172 11.6121 0.5 12.0047 0.5H12.0004Z\" fill=\"#FBB041\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_full\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Half star icon\nconst HalfStarIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <defs>\n <clipPath id=\"half\">\n <rect x=\"0\" y=\"0\" width=\"12\" height=\"24\" />\n </clipPath>\n </defs>\n <path\n clipPath=\"url(#half)\"\n d=\"M12.0004 0.5C12.393 0.5 12.7551 0.723172 12.9339 1.07325L16.1402 7.38333L23.1155 8.49482C23.5037 8.55608 23.8265 8.83176 23.9487 9.20809C24.0708 9.58442 23.9705 9.99576 23.6957 10.2758L18.7008 15.2863L19.8045 22.2834C19.8656 22.6728 19.7042 23.0667 19.3857 23.2986C19.0673 23.5305 18.6441 23.5655 18.2951 23.3861L12.0004 20.1742L5.70561 23.3861C5.35663 23.5655 4.93349 23.5305 4.61504 23.2986C4.29659 23.0667 4.13519 22.6772 4.19626 22.2834L5.29555 15.2863L0.305106 10.2758C0.0259198 9.99576 -0.0700504 9.58442 0.0520935 9.20809C0.174237 8.83176 0.492684 8.55608 0.885289 8.49482L7.86058 7.38333L11.0712 1.07325C11.2501 0.723172 11.6121 0.5 12.0047 0.5H12.0004Z\"\n fill=\"#FBB041\"\n />\n <path\n d=\"M12.0004 0.5C12.393 0.5 12.7551 0.723172 12.9339 1.07325L16.1402 7.38333L23.1155 8.49482C23.5037 8.55608 23.8265 8.83176 23.9487 9.20809C24.0708 9.58442 23.9705 9.99576 23.6957 10.2758L18.7008 15.2863L19.8045 22.2834C19.8656 22.6728 19.7042 23.0667 19.3857 23.2986C19.0673 23.5305 18.6441 23.5655 18.2951 23.3861L12.0004 20.1742L5.70561 23.3861C5.35663 23.5655 4.93349 23.5305 4.61504 23.2986C4.29659 23.0667 4.13519 22.6772 4.19626 22.2834L5.29555 15.2863L0.305106 10.2758C0.0259198 9.99576 -0.0700504 9.58442 0.0520935 9.20809C0.174237 8.83176 0.492684 8.55608 0.885289 8.49482L7.86058 7.38333L11.0712 1.07325C11.2501 0.723172 11.6121 0.5 12.0047 0.5H12.0004ZM12.0004 3.86071L9.47898 8.81426C9.3263 9.11182 9.04275 9.32187 8.71122 9.37438L3.23656 10.2496L7.15389 14.1835C7.38945 14.4198 7.49851 14.7568 7.44616 15.0893L6.58243 20.5811L11.5249 18.0606C11.8215 17.9074 12.1749 17.9074 12.4759 18.0606L17.4183 20.5811L16.5546 15.0893C16.5023 14.7568 16.6113 14.4198 16.8469 14.1835L20.7642 10.2496L15.2895 9.37438C14.958 9.32187 14.6745 9.11182 14.5218 8.81426L12.0004 3.86071Z\"\n fill=\"#9A5A00\"\n />\n </svg>\n);\n\n// Empty star icon (outline only)\nconst EmptyStarIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_empty)\">\n <path d=\"M12.0004 0.5C12.393 0.5 12.7551 0.723172 12.9339 1.07325L16.1402 7.38333L23.1155 8.49482C23.5037 8.55608 23.8265 8.83176 23.9487 9.20809C24.0708 9.58442 23.9705 9.99576 23.6957 10.2758L18.7008 15.2863L19.8045 22.2834C19.8656 22.6728 19.7042 23.0667 19.3857 23.2986C19.0673 23.5305 18.6441 23.5655 18.2951 23.3861L12.0004 20.1742L5.70561 23.3861C5.35663 23.5655 4.93349 23.5305 4.61504 23.2986C4.29659 23.0667 4.13519 22.6772 4.19626 22.2834L5.29555 15.2863L0.305106 10.2758C0.0259198 9.99576 -0.0700504 9.58442 0.0520935 9.20809C0.174237 8.83176 0.492684 8.55608 0.885289 8.49482L7.86058 7.38333L11.0712 1.07325C11.2501 0.723172 11.6121 0.5 12.0047 0.5H12.0004ZM12.0004 3.86071L9.47898 8.81426C9.3263 9.11182 9.04275 9.32187 8.71122 9.37438L3.23656 10.2496L7.15389 14.1835C7.38945 14.4198 7.49851 14.7568 7.44616 15.0893L6.58243 20.5811L11.5249 18.0606C11.8215 17.9074 12.1749 17.9074 12.4759 18.0606L17.4183 20.5811L16.5546 15.0893C16.5023 14.7568 16.6113 14.4198 16.8469 14.1835L20.7642 10.2496L15.2895 9.37438C14.958 9.32187 14.6745 9.11182 14.5218 8.81426L12.0004 3.86071Z\" fill=\"#9A5A00\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_empty\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\nconst Rating: React.FC<RatingProps> = ({\n variant = 'stars',\n value,\n maxValue = 5,\n showValue = false,\n name,\n date,\n quote,\n size = 'medium',\n className = ''\n}) => {\n // Ensure value is between 0 and maxValue\n const clampedValue = Math.min(Math.max(0, value), maxValue);\n\n // Calculate full, half, and empty stars\n const fullStars = Math.floor(clampedValue);\n const hasHalfStar = clampedValue % 1 >= 0.5;\n const emptyStars = maxValue - fullStars - (hasHalfStar ? 1 : 0);\n\n const renderStars = () => {\n const starClasses = [\n cx('star'),\n cx(`star--${size}`)\n ].filter(Boolean).join(' ');\n\n const stars = [];\n\n // Full stars\n for (let i = 0; i < fullStars; i++) {\n stars.push(\n <span key={`full-${i}`} className={starClasses}>\n <StarIcon />\n </span>\n );\n }\n\n // Half star\n if (hasHalfStar) {\n stars.push(\n <span key=\"half\" className={starClasses}>\n <HalfStarIcon />\n </span>\n );\n }\n\n // Empty stars\n for (let i = 0; i < emptyStars; i++) {\n stars.push(\n <span key={`empty-${i}`} className={starClasses}>\n <EmptyStarIcon />\n </span>\n );\n }\n\n return stars;\n };\n\n // Stars only variant\n if (variant === 'stars') {\n const containerClasses = [cx('starsContainer'), className].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n <div className={cx('starContainer')}>\n {renderStars()}\n </div>\n {showValue && (\n <span className={cx('valueDisplay')}>\n {clampedValue.toLocaleString('de-CH')}\n </span>\n )}\n </div>\n );\n }\n\n // Result variant - single character display\n if (variant === 'result') {\n const containerClasses = [cx('resultContainer'), className].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n <span className={cx('resultChar')}>N</span>\n <div>\n {renderStars()}\n </div>\n </div>\n );\n }\n\n // Block variant - full review block\n const containerClasses = [cx('blockContainer'), className].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n <div className={cx('blockHeader')}>\n <div className={cx('blockHeaderLeft')}>\n {name && <span className={cx('blockName')}>{name}</span>}\n <div>\n {renderStars()}\n </div>\n </div>\n {date && <span className={cx('blockDate')}>{date}</span>}\n </div>\n {quote && <p className={cx('blockQuote')}>{quote}</p>}\n </div>\n );\n};\n\nRating.displayName = 'Rating';\n\nexport { Rating };\n","import { DividerProps } from './Divider.types';\nimport './Divider.css';\n\n// CSS class prefix\nconst cx = (className: string) => `hc-divider-${className}`;\n\nconst Divider: React.FC<DividerProps> = ({\n label,\n orientation = 'horizontal',\n className = ''\n}) => {\n const isHorizontal = orientation === 'horizontal';\n\n if (!label) {\n // Clean variant - just the line\n const lineClass = isHorizontal\n ? cx('lineStandalone--horizontal')\n : cx('lineStandalone--vertical');\n\n return (\n <div\n className={[lineClass, className].filter(Boolean).join(' ')}\n role=\"separator\"\n aria-orientation={orientation}\n />\n );\n }\n\n // Label variant - line with text in the middle\n const containerClass = isHorizontal\n ? cx('container--horizontal')\n : cx('container--vertical');\n\n const lineClass = isHorizontal\n ? cx('line--horizontal')\n : cx('line--vertical');\n\n const containerClasses = [\n cx('container'),\n containerClass,\n className\n ].filter(Boolean).join(' ');\n\n return (\n <div\n className={containerClasses}\n role=\"separator\"\n aria-orientation={orientation}\n aria-label={typeof label === 'string' ? label : undefined}\n >\n <div className={lineClass} />\n <span className={cx('label')}>{label}</span>\n <div className={lineClass} />\n </div>\n );\n};\n\nDivider.displayName = 'Divider';\n\nexport { Divider };\n","import { ChipProps } from './Chip.types';\nimport './Chip.css';\n\n// CSS class prefix\nconst cx = (className: string) => `hc-chip-${className}`;\n\n// Close icon SVG\nconst CloseIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_chip_close)\">\n <path d=\"M12 2.25C14.5859 2.25 17.0658 3.27723 18.8943 5.10571C20.7228 6.93419 21.75 9.41414 21.75 12C21.75 14.5859 20.7228 17.0658 18.8943 18.8943C17.0658 20.7228 14.5859 21.75 12 21.75C9.41414 21.75 6.93419 20.7228 5.10571 18.8943C3.27723 17.0658 2.25 14.5859 2.25 12C2.25 9.41414 3.27723 6.93419 5.10571 5.10571C6.93419 3.27723 9.41414 2.25 12 2.25ZM12 24C15.1826 24 18.2348 22.7357 20.4853 20.4853C22.7357 18.2348 24 15.1826 24 12C24 8.8174 22.7357 5.76516 20.4853 3.51472C18.2348 1.26428 15.1826 0 12 0C8.8174 0 5.76516 1.26428 3.51472 3.51472C1.26428 5.76516 0 8.8174 0 12C0 15.1826 1.26428 18.2348 3.51472 20.4853C5.76516 22.7357 8.8174 24 12 24ZM7.82812 7.82812C7.3875 8.26875 7.3875 8.98125 7.82812 9.41719L10.4062 11.9953L7.82812 14.5734C7.3875 15.0141 7.3875 15.7266 7.82812 16.1625C8.26875 16.5984 8.98125 16.6031 9.41719 16.1625L11.9953 13.5844L14.5734 16.1625C15.0141 16.6031 15.7266 16.6031 16.1625 16.1625C16.5984 15.7219 16.6031 15.0094 16.1625 14.5734L13.5844 11.9953L16.1625 9.41719C16.6031 8.97656 16.6031 8.26406 16.1625 7.82812C15.7219 7.39219 15.0094 7.3875 14.5734 7.82812L11.9953 10.4062L9.41719 7.82812C8.97656 7.3875 8.26406 7.3875 7.82812 7.82812Z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_chip_close\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\nconst Chip: React.FC<ChipProps> = ({\n label,\n count,\n size = 'small',\n state = 'idle',\n removable = true,\n onClick,\n onRemove,\n className = '',\n disabled = false,\n}) => {\n // Determine effective state\n const effectiveState = disabled ? 'disabled' : state;\n\n // Build chip classes\n const chipClasses = [\n cx('chip'),\n cx(`chip--${size}`),\n cx(`chip--${effectiveState}`),\n className,\n ].filter(Boolean).join(' ');\n\n // Build label classes\n const labelClasses = [cx('label'), cx(`label--${size}`)].join(' ');\n\n // Build count badge classes\n const countBadgeClasses = [cx('countBadge'), cx(`countBadge--${size}`)].join(' ');\n\n const handleClick = () => {\n if (disabled) return;\n\n if (removable && onRemove) {\n onRemove();\n } else if (onClick) {\n onClick();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (removable && onRemove) {\n onRemove();\n } else if (onClick) {\n onClick();\n }\n }\n };\n\n return (\n <button\n type=\"button\"\n className={chipClasses}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n aria-label={removable ? `Remove filter: ${label}` : label}\n >\n <span className={labelClasses}>{label}</span>\n\n {count !== undefined && <span className={countBadgeClasses}>{count}</span>}\n\n {removable && (\n <span className={cx('closeIcon')} aria-hidden=\"true\">\n <CloseIcon />\n </span>\n )}\n </button>\n );\n};\n\nChip.displayName = 'Chip';\n\nexport { Chip };\n","import { useState } from 'react';\nimport { CheckboxProps } from './Checkbox.types';\nimport './Checkbox.css';\n\n// CSS class prefix\nconst cx = (className: string) => `hc-checkbox-${className}`;\n\nconst Checkbox: React.FC<CheckboxProps> = ({\n label,\n checked,\n defaultChecked = false,\n onChange,\n disabled = false,\n error = false,\n name,\n id,\n className = '',\n size = 'medium',\n}) => {\n const [localChecked, setLocalChecked] = useState(defaultChecked);\n const [isFocused, setIsFocused] = useState(false);\n\n const actualChecked = checked !== undefined ? checked : localChecked;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newChecked = e.target.checked;\n if (checked === undefined) {\n setLocalChecked(newChecked);\n }\n onChange?.(newChecked);\n };\n\n // Build container classes\n const containerClasses = [\n cx('container'),\n disabled && cx('container--disabled'),\n className,\n ].filter(Boolean).join(' ');\n\n // Build checkbox wrapper classes\n const wrapperClasses = [\n cx('wrapper'),\n cx(`wrapper--${size}`),\n ].filter(Boolean).join(' ');\n\n // Build checkbox box classes\n const boxClasses = [\n cx('box'),\n cx(`box--${size}`),\n actualChecked && cx('box--checked'),\n disabled && cx('box--disabled'),\n error && !actualChecked && cx('box--error'),\n isFocused && cx('box--focused'),\n ].filter(Boolean).join(' ');\n\n // Build input classes\n const inputClasses = [\n cx('input'),\n disabled && cx('input--disabled'),\n ].filter(Boolean).join(' ');\n\n // Build checkmark classes\n const checkmarkClasses = [\n cx('checkmark'),\n cx(`checkmark--${size}`),\n actualChecked && cx('checkmark--checked'),\n ].filter(Boolean).join(' ');\n\n // Build label classes\n const labelClasses = [\n cx('label'),\n disabled && cx('label--disabled'),\n error && !disabled && cx('label--error'),\n ].filter(Boolean).join(' ');\n\n return (\n <label className={containerClasses}>\n <div className={wrapperClasses}>\n <div className={boxClasses} />\n <input\n type=\"checkbox\"\n id={id}\n name={name}\n checked={actualChecked}\n onChange={handleChange}\n disabled={disabled}\n className={inputClasses}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n aria-invalid={error}\n />\n <svg\n className={checkmarkClasses}\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2.5 6L5 8.5L9.5 3.5\"\n stroke=\"var(--content-action-highlight-inverse-idle, #ffffff)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n {label && <span className={labelClasses}>{label}</span>}\n </label>\n );\n};\n\nCheckbox.displayName = 'Checkbox';\n\nexport { Checkbox };\n","import React from 'react';\nimport { RadioButtonProps } from './RadioButton.types';\nimport './RadioButton.css';\n\n// CSS class prefix\nconst cx = (className: string) => `hc-radio-${className}`;\n\nconst RadioButton: React.FC<RadioButtonProps> = ({\n id,\n checked,\n onChange,\n name,\n value,\n disabled = false,\n className = '',\n label,\n autoComplete,\n}) => {\n const handleClick = () => {\n if (!disabled && !checked) {\n onChange(true);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (!disabled && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n if (!checked) {\n onChange(true);\n }\n }\n };\n\n // Build container classes\n const containerClasses = [\n cx('container'),\n disabled && cx('container--disabled'),\n className,\n ].filter(Boolean).join(' ');\n\n // Build outer circle classes\n const outerCircleClasses = [\n cx('outerCircle'),\n checked && cx('outerCircle--checked'),\n disabled && cx('outerCircle--disabled'),\n ].filter(Boolean).join(' ');\n\n // Build inner dot classes\n const innerDotClasses = [\n cx('innerDot'),\n checked && cx('innerDot--checked'),\n ].filter(Boolean).join(' ');\n\n return (\n <div\n role=\"radio\"\n aria-checked={checked}\n tabIndex={disabled ? -1 : 0}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={containerClasses}\n aria-disabled={disabled}\n >\n {/* Radio button visual wrapper */}\n <div className={cx('wrapper')}>\n {/* Hidden input for form submission */}\n <input\n id={id}\n type=\"radio\"\n name={name}\n value={value}\n checked={checked}\n disabled={disabled}\n autoComplete={autoComplete}\n onChange={() => {}} // Controlled by parent onClick\n className={cx('hiddenInput')}\n />\n\n {/* Outer circle */}\n <div className={outerCircleClasses} />\n\n {/* Inner dot - only visible when checked */}\n <div className={innerDotClasses} />\n </div>\n\n {label && (\n <label htmlFor={id} className={cx('label')}>\n {label}\n </label>\n )}\n </div>\n );\n};\n\nRadioButton.displayName = 'RadioButton';\n\nexport { RadioButton };\n","import { SectionHeaderProps } from './SectionHeader.types';\nimport './SectionHeader.css';\n\n// CSS class prefix\nconst cx = (className: string) => `hc-section-${className}`;\n\n// Chevron right icon\nconst ChevronRightIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n);\n\nconst SectionHeader: React.FC<SectionHeaderProps> = ({\n title,\n showAllLabel,\n onShowAllClick,\n className = '',\n}) => {\n const headerClasses = [cx('header'), className].filter(Boolean).join(' ');\n\n return (\n <div className={headerClasses}>\n <h2 className={cx('title')}>{title}</h2>\n {showAllLabel && onShowAllClick && (\n <button className={cx('showAllButton')} onClick={onShowAllClick}>\n <span>{showAllLabel}</span>\n <ChevronRightIcon />\n </button>\n )}\n </div>\n );\n};\n\nSectionHeader.displayName = 'SectionHeader';\n\nexport { SectionHeader };\n","import React, { useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { ModalProps } from './Modal.types';\nimport './Modal.css';\n\n// CSS class prefix\nconst cx = (className: string) => `hc-modal-${className}`;\n\n// Close icon SVG\nconst CloseIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\n <path\n d=\"M0.330469 1.91953C-0.110156 1.47891 -0.110156 0.766406 0.330469 0.330469C0.771094 -0.105469 1.48359 -0.110156 1.91953 0.330469L8.99766 7.40859L16.0758 0.330469C16.5164 -0.110156 17.2289 -0.110156 17.6648 0.330469C18.1008 0.771094 18.1055 1.48359 17.6648 1.91953L10.5867 8.99766L17.6648 16.0758C18.1055 16.5164 18.1055 17.2289 17.6648 17.6648C17.2242 18.1008 16.5117 18.1055 16.0758 17.6648L8.99766 10.5867L1.91953 17.6648C1.47891 18.1055 0.766406 18.1055 0.330469 17.6648C-0.105469 17.2242 -0.110156 16.5117 0.330469 16.0758L7.40859 8.99766L0.330469 1.91953Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nconst Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n children,\n width = 'var(--grid-tablet-device-width, 600px)',\n className = '',\n showCloseButton = true,\n disableBackdropClick = false,\n}) => {\n const modalRef = useRef<HTMLDivElement>(null);\n\n // Handle escape key\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.body.style.overflow = '';\n };\n }, [isOpen, onClose]);\n\n // Handle click outside\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget && !disableBackdropClick) {\n onClose();\n }\n };\n\n if (!isOpen) return null;\n\n const modalClasses = [cx('content'), className].filter(Boolean).join(' ');\n\n const modalContent = (\n <div className={cx('backdrop')} onClick={handleBackdropClick}>\n <div\n ref={modalRef}\n className={modalClasses}\n style={{ maxWidth: width }}\n >\n {showCloseButton && (\n <button\n className={cx('closeButton')}\n onClick={onClose}\n aria-label=\"Close modal\"\n >\n <CloseIcon />\n </button>\n )}\n {children}\n </div>\n </div>\n );\n\n // Check if we're in a browser environment\n if (typeof document !== 'undefined') {\n return createPortal(modalContent, document.body);\n }\n\n return modalContent;\n};\n\nModal.displayName = 'Modal';\n\nexport { Modal };\n","import React from 'react';\nimport { CardProps } from './Card.types';\nimport { Badge } from '../Badge';\nimport './Card.css';\n\n// CSS class prefix\nconst cx = (className: string) => `hc-card-${className}`;\n\n// Star icon - 9x9\nconst StarIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\">\n <g clipPath=\"url(#clip0_card_star)\">\n <path\n d=\"M4.80018 0.366577C4.93104 0.366577 5.05173 0.440968 5.11135 0.557659L6.18011 2.66102L8.50521 3.03152C8.63462 3.05194 8.74222 3.14383 8.78294 3.26927C8.82365 3.39472 8.79021 3.53183 8.6986 3.62518L7.03366 5.29533L7.40155 7.6277C7.42191 7.75752 7.3681 7.88879 7.26195 7.9661C7.15581 8.04341 7.01476 8.05508 6.89843 7.99528L4.80018 6.92463L2.70192 7.99528C2.58559 8.05508 2.44454 8.04341 2.33839 7.9661C2.23225 7.88879 2.17844 7.75898 2.1988 7.6277L2.56523 5.29533L0.901751 3.62518C0.808689 3.53183 0.776699 3.39472 0.817413 3.26927C0.858128 3.14383 0.964277 3.05194 1.09515 3.03152L3.42024 2.66102L4.49045 0.557659C4.55007 0.440968 4.67076 0.366577 4.80163 0.366577H4.80018Z\"\n fill=\"#1F2937\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_card_star\">\n <rect width=\"8\" height=\"8\" fill=\"white\" transform=\"translate(0.800049 0.199951)\" />\n </clipPath>\n </defs>\n </svg>\n);\n\n// Comment bubble icon for rating info\nconst CommentIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 36 38\" fill=\"#478EFA\" className={cx('ratingSvg')}>\n <path d=\"M4 0C1.79086 0 0 1.79086 0 4V32V38L9 32H32C34.2091 32 36 30.2091 36 28V0H4Z\" />\n </svg>\n);\n\n// Default placeholder image\nconst PLACEHOLDER =\n 'data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"100\" fill=\"%23e5e7eb\"%3E%3Crect width=\"100\" height=\"100\" /%3E%3C/svg%3E';\n\n// Helper to repeat elements\nconst repeat = (n: number, renderFn: (i: number) => React.ReactNode) =>\n Array.from({ length: n }, (_, i) => renderFn(i));\n\nconst Card: React.FC<CardProps> = ({\n image,\n imageAlt = '',\n label,\n price,\n stars,\n isSuperior = false,\n badge,\n onClick,\n className = '',\n variant = 'mobile',\n hasRating,\n withPadding = false,\n withHeight = false,\n ratingInfo,\n context,\n swissLodgeLabel = 'Swiss Lodge',\n}) => {\n const isDesktop = variant === 'desktop';\n\n // Build dynamic class names\n const containerClasses = [\n cx('card'),\n cx(`card--${variant}`),\n onClick && cx('card--clickable'),\n withPadding && cx('card--withPadding'),\n withHeight && cx('card--withHeight'),\n className,\n ].filter(Boolean).join(' ');\n\n const starsRowClasses = [\n cx('starsRow'),\n context === 'hotel-deals' && cx('starsRow--fixed'),\n ].filter(Boolean).join(' ');\n\n const labelClasses = [\n cx('label'),\n isDesktop ? cx('label--desktop') : cx('label--mobile'),\n context === 'hotel-deals' && cx('label--hotelDeals'),\n !isDesktop && context !== 'hotel-deals' && cx('label--mobileOverflow'),\n !hasRating && cx('label--noRating'),\n ].filter(Boolean).join(' ');\n\n const priceClasses = [\n cx('price'),\n context === 'hotel-deals' && hasRating && cx('price--hotelDealsWithRating'),\n context === 'hotel-deals' && !hasRating && cx('price--hotelDealsNoRating'),\n context !== 'hotel-deals' && !hasRating && cx('price--noRating'),\n context !== 'hotel-deals' && hasRating && cx('price--regularWithRating'),\n ].filter(Boolean).join(' ');\n\n const displayImage = image || PLACEHOLDER;\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (onClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick();\n }\n };\n\n // Render rating info section\n const renderRatingInfo = () => {\n if (!ratingInfo) return null;\n return (\n <span className={cx('ratingInfo')}>\n <CommentIcon />\n <span className={cx('ratingLabel')}>{ratingInfo.label}</span>\n <span className={cx('ratingValue')}>{ratingInfo.value}</span>\n </span>\n );\n };\n\n return (\n <div\n className={containerClasses}\n onClick={onClick}\n onKeyDown={handleKeyDown}\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n <div className={cx('imageContainer')}>\n <img\n src={displayImage}\n alt={imageAlt}\n className={cx('image')}\n loading=\"lazy\"\n />\n <div className={cx('shadowOverlay')} />\n {badge && (\n <div className={cx('badgeWrapper')}>\n <Badge\n color={badge.variant || 'primary'}\n size={isDesktop ? 'large' : 'small'}\n >\n {badge.text}\n </Badge>\n </div>\n )}\n </div>\n\n <div className={cx('textContainer')}>\n {/* Stars row */}\n <div className={starsRowClasses}>\n {stars !== undefined && stars > 0 ? (\n <>\n {/* Swiss Lodge (rating = 6) */}\n {stars === 6 ? (\n <span className={cx('swissLodge')}>{swissLodgeLabel}</span>\n ) : (\n <>\n {isDesktop ? (\n <>\n <div className={cx('starsContainer')}>\n {repeat(Math.floor(stars), (i) => (\n <StarIcon key={i} />\n ))}\n {isSuperior && (\n <span className={cx('superiorBadge')}>(s)</span>\n )}\n </div>\n <div>{renderRatingInfo()}</div>\n </>\n ) : (\n <>\n <div className={cx('starsContainer')}>\n {repeat(Math.floor(stars), (i) => (\n <StarIcon key={i} />\n ))}\n </div>\n {isSuperior && (\n <span className={cx('superiorBadge')}>(s)</span>\n )}\n {renderRatingInfo()}\n </>\n )}\n </>\n )}\n </>\n ) : (\n <div className={cx('starsPlaceholder')}>&nbsp;</div>\n )}\n </div>\n {label && <div className={labelClasses}>{label}</div>}\n {price && <div className={priceClasses}>{price}</div>}\n </div>\n </div>\n );\n};\n\nCard.displayName = 'Card';\n\nexport { Card };\n","import React, { useState } from 'react';\nimport type { BaseCardProps, BaseCardImageProps, BaseCardContentProps } from './BaseCard.types';\nimport './BaseCard.css';\n\n// Default placeholder for failed images\nconst DEFAULT_PLACEHOLDER = 'data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"400\" height=\"300\" fill=\"%23e5e7eb\"%3E%3Crect width=\"400\" height=\"300\" /%3E%3C/svg%3E';\n\n/**\n * BaseCard - Container component\n *\n * A composable card container that provides consistent styling.\n * Use with BaseCardImage and BaseCardContent for complete cards.\n *\n * @example\n * ```tsx\n * <BaseCard hoverable onClick={handleClick}>\n * <BaseCardImage src={imageUrl} alt=\"Hotel\" topRightSlot={<FavoriteButton />} />\n * <BaseCardContent padding=\"large\">\n * <h3>Hotel Name</h3>\n * <p>Location</p>\n * </BaseCardContent>\n * </BaseCard>\n * ```\n */\nexport const BaseCard: React.FC<BaseCardProps> = ({\n children,\n className = '',\n onClick,\n hoverable = true,\n borderRadius,\n}) => {\n const classNames = [\n 'hc-base-card',\n hoverable && 'hc-base-card--hoverable',\n onClick && 'hc-base-card--clickable',\n className,\n ].filter(Boolean).join(' ');\n\n const style = borderRadius\n ? { '--hc-base-card-radius': typeof borderRadius === 'number' ? `${borderRadius}px` : borderRadius } as React.CSSProperties\n : undefined;\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (onClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick();\n }\n };\n\n return (\n <div\n className={classNames}\n onClick={onClick}\n onKeyDown={onClick ? handleKeyDown : undefined}\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n style={style}\n >\n {children}\n </div>\n );\n};\n\n/**\n * BaseCardImage - Image container with overlay slots\n *\n * Provides consistent image styling with support for overlays\n * like badges, favorite buttons, and indicators.\n */\nexport const BaseCardImage: React.FC<BaseCardImageProps> = ({\n src,\n alt,\n height,\n aspectRatio,\n topLeftSlot,\n topRightSlot,\n bottomSlot,\n centerSlot,\n showGradient = true,\n onClick,\n style,\n className = '',\n placeholder = DEFAULT_PLACEHOLDER,\n borderRadius,\n}) => {\n const [imageSrc, setImageSrc] = useState(src);\n const [hasError, setHasError] = useState(false);\n\n const handleError = () => {\n if (!hasError) {\n setHasError(true);\n setImageSrc(placeholder);\n }\n };\n\n // Update src when prop changes\n React.useEffect(() => {\n setImageSrc(src);\n setHasError(false);\n }, [src]);\n\n const containerClass = [\n 'hc-base-card__image-container',\n aspectRatio ? 'hc-base-card__image-container--ratio' : 'hc-base-card__image-container--fixed',\n className,\n ].filter(Boolean).join(' ');\n\n const containerStyle: React.CSSProperties = {\n ...style,\n ...(height && { '--hc-base-card-image-height': typeof height === 'number' ? `${height}px` : height }),\n ...(aspectRatio && { '--hc-base-card-aspect-ratio': aspectRatio }),\n ...(borderRadius && { borderRadius }),\n } as React.CSSProperties;\n\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n e.stopPropagation();\n onClick();\n }\n };\n\n // Check if we have both top-left and top-right slots (use row layout)\n const hasTopRow = topLeftSlot && topRightSlot;\n\n return (\n <div\n className={containerClass}\n style={containerStyle}\n onClick={onClick ? handleClick : undefined}\n >\n <img\n src={imageSrc}\n alt={alt}\n className=\"hc-base-card__image\"\n loading=\"lazy\"\n onError={handleError}\n draggable=\"false\"\n />\n\n {showGradient && <div className=\"hc-base-card__image-gradient\" />}\n\n {/* Top row layout when both slots are present */}\n {hasTopRow && (\n <div className=\"hc-base-card__overlay hc-base-card__overlay--top-row\">\n <div>{topLeftSlot}</div>\n <div>{topRightSlot}</div>\n </div>\n )}\n\n {/* Individual slots when only one is present */}\n {!hasTopRow && topLeftSlot && (\n <div className=\"hc-base-card__overlay hc-base-card__overlay--top-left\">\n {topLeftSlot}\n </div>\n )}\n\n {!hasTopRow && topRightSlot && (\n <div className=\"hc-base-card__overlay hc-base-card__overlay--top-right\">\n {topRightSlot}\n </div>\n )}\n\n {centerSlot && (\n <div className=\"hc-base-card__overlay hc-base-card__overlay--center\">\n {centerSlot}\n </div>\n )}\n\n {bottomSlot && (\n <div className=\"hc-base-card__overlay hc-base-card__overlay--bottom\">\n {bottomSlot}\n </div>\n )}\n </div>\n );\n};\n\n/**\n * BaseCardContent - Content container with configurable padding\n *\n * Wraps card content with consistent spacing.\n */\nexport const BaseCardContent: React.FC<BaseCardContentProps> = ({\n children,\n padding = 'large',\n className = '',\n style,\n onClick,\n}) => {\n const classNames = [\n 'hc-base-card__content',\n `hc-base-card__content--padding-${padding}`,\n onClick && 'hc-base-card__content--clickable',\n className,\n ].filter(Boolean).join(' ');\n\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n e.stopPropagation();\n onClick();\n }\n };\n\n return (\n <div\n className={classNames}\n style={style}\n onClick={onClick ? handleClick : undefined}\n >\n {children}\n </div>\n );\n};\n\nBaseCard.displayName = 'BaseCard';\nBaseCardImage.displayName = 'BaseCardImage';\nBaseCardContent.displayName = 'BaseCardContent';\n","import React from 'react';\nimport './BaseCardSkeleton.css';\n\nexport interface BaseCardSkeletonProps {\n /** Content placeholders to render below image */\n children: React.ReactNode;\n /** Image section height (default: 268.5px for mobile) */\n imageHeight?: number | string;\n /** Aspect ratio for image (alternative to fixed height) */\n imageAspectRatio?: string;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * BaseCardSkeleton - Base loading placeholder for card components\n *\n * Provides the shared card shell with image skeleton.\n * Children should be skeleton placeholders for specific content.\n *\n * @example\n * ```tsx\n * <BaseCardSkeleton>\n * <div className=\"skeleton\" style={{ height: 20, width: '60%' }} />\n * <div className=\"skeleton\" style={{ height: 16, width: '40%' }} />\n * </BaseCardSkeleton>\n * ```\n */\nexport const BaseCardSkeleton: React.FC<BaseCardSkeletonProps> = ({\n children,\n imageHeight,\n imageAspectRatio,\n className = '',\n}) => {\n const imageStyle: React.CSSProperties = {};\n\n if (imageAspectRatio) {\n imageStyle.aspectRatio = imageAspectRatio;\n } else if (imageHeight) {\n imageStyle.height = typeof imageHeight === 'number' ? `${imageHeight}px` : imageHeight;\n }\n\n return (\n <div className={`hc-base-card-skeleton ${className}`}>\n <div\n className=\"hc-base-card-skeleton__image hc-skeleton\"\n style={imageStyle}\n />\n <div className=\"hc-base-card-skeleton__content\">\n {children}\n </div>\n </div>\n );\n};\n\nBaseCardSkeleton.displayName = 'BaseCardSkeleton';\n","import React, { useState, useRef, useEffect } from 'react';\nimport { DropdownProps } from './Dropdown.types';\nimport './Dropdown.css';\n\n// CSS class prefix\nconst cx = (className: string) => `hc-dropdown-${className}`;\n\n// Chevron icon\nconst ChevronIcon = () => (\n <svg width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" fill=\"none\">\n <path\n d=\"M1 1L6 6L11 1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst Dropdown: React.FC<DropdownProps> = ({\n options = [],\n disabled = false,\n error = false,\n defaultValue,\n value,\n onChange,\n className = '',\n name,\n id,\n placeholder = 'Select...',\n}) => {\n const [localValue, setLocalValue] = useState(defaultValue || '');\n const [isOpen, setIsOpen] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const actualValue = value !== undefined ? value : localValue;\n const selectedLabel = options.find((o) => o.value === actualValue)?.label || placeholder;\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const handleSelect = (selectedValue: string) => {\n if (value === undefined) {\n setLocalValue(selectedValue);\n }\n onChange?.(selectedValue);\n setIsOpen(false);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (disabled) return;\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n setIsOpen(!isOpen);\n } else if (event.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n // Build container classes\n const containerClasses = [\n cx('container'),\n disabled && cx('container--disabled'),\n className,\n ].filter(Boolean).join(' ');\n\n // Build button classes\n const buttonClasses = [\n cx('button'),\n error && cx('button--error'),\n isFocused && !error && cx('button--focus'),\n disabled && cx('button--disabled'),\n isOpen && cx('button--open'),\n ].filter(Boolean).join(' ');\n\n // Build chevron classes\n const chevronClasses = [\n cx('chevron'),\n isOpen && cx('chevron--open'),\n ].filter(Boolean).join(' ');\n\n // Build dropdown list classes\n const listClasses = [\n cx('list'),\n isOpen && cx('list--open'),\n ].filter(Boolean).join(' ');\n\n return (\n <div ref={dropdownRef} className={containerClasses}>\n <div\n className={buttonClasses}\n tabIndex={disabled ? -1 : 0}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n onKeyDown={handleKeyDown}\n onFocus={() => !disabled && setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-disabled={disabled}\n >\n <span>{selectedLabel}</span>\n <span className={chevronClasses}>\n <ChevronIcon />\n </span>\n </div>\n\n <ul role=\"listbox\" className={listClasses}>\n {options.map((option) => (\n <li\n key={option.value}\n role=\"option\"\n aria-selected={actualValue === option.value}\n onClick={() => handleSelect(option.value)}\n className={`${cx('option')} ${\n actualValue === option.value ? cx('option--selected') : ''\n }`}\n >\n {option.label}\n </li>\n ))}\n </ul>\n\n {/* Hidden native select for form compatibility */}\n <select\n id={id}\n name={name}\n value={actualValue}\n onChange={(e) => handleSelect(e.target.value)}\n disabled={disabled}\n className={cx('hiddenSelect')}\n >\n {!actualValue && <option value=\"\">{placeholder}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n );\n};\n\nDropdown.displayName = 'Dropdown';\n\nexport { Dropdown };\n","import React, { useState, useRef } from 'react';\nimport { InputProps } from './Input.types';\nimport './Input.css';\n\n// CSS class prefix\nconst cx = (className: string) => `hc-input-${className}`;\n\nconst Input: React.FC<InputProps> = ({\n label,\n placeholder = 'Placeholder',\n helper,\n value,\n defaultValue = '',\n onChange,\n onFocus,\n onBlur,\n type = 'text',\n error = false,\n disabled = false,\n leftIcon,\n rightIcon,\n prefix,\n className = '',\n inputClassName = '',\n wrapperClassName = '',\n name,\n id,\n required = false,\n autoComplete,\n autoFocus = false,\n readOnly = false,\n inputProps,\n}) => {\n const [localValue, setLocalValue] = useState(defaultValue);\n const [isFocused, setIsFocused] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const actualValue = value !== undefined ? value : localValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n if (value === undefined) {\n setLocalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n const handleFocus = () => {\n setIsFocused(true);\n onFocus?.();\n };\n\n const handleBlur = () => {\n setIsFocused(false);\n onBlur?.();\n };\n\n // Build container classes\n const containerClasses = [cx('container'), className].filter(Boolean).join(' ');\n\n // Build label classes\n const labelClasses = [\n cx('label'),\n (disabled || readOnly) && cx('label--disabled'),\n ].filter(Boolean).join(' ');\n\n // Build wrapper classes\n const wrapperClasses = [\n cx('wrapper'),\n isFocused && cx('wrapper--focus'),\n error && cx('wrapper--error'),\n (disabled || readOnly) && cx('wrapper--disabled'),\n wrapperClassName,\n ].filter(Boolean).join(' ');\n\n // Build input classes\n const inputClasses = [\n cx('input'),\n (disabled || readOnly) && cx('input--disabled'),\n inputClassName,\n ].filter(Boolean).join(' ');\n\n // Build helper classes\n const helperClasses = [\n cx('helper'),\n error && cx('helper--error'),\n (disabled || readOnly) && cx('helper--disabled'),\n ].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n {label && (\n <label htmlFor={id} className={labelClasses}>\n {label}\n </label>\n )}\n\n <div\n className={wrapperClasses}\n onClick={() => !disabled && !readOnly && inputRef.current?.focus()}\n >\n {leftIcon && <div className={cx('icon')}>{leftIcon}</div>}\n\n {prefix && <div className={cx('prefix')}>{prefix}</div>}\n\n <input\n ref={inputRef}\n type={type}\n id={id}\n name={name}\n value={actualValue}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n autoComplete={autoComplete}\n autoFocus={autoFocus}\n readOnly={readOnly}\n className={inputClasses}\n {...inputProps}\n />\n\n {rightIcon && rightIcon}\n </div>\n\n {helper && <div className={helperClasses}>{helper}</div>}\n </div>\n );\n};\n\nInput.displayName = 'Input';\n\nexport { Input };\n","import { ReactNode } from 'react';\nimport './Block.css';\n\nconst cx = (className: string) => `hc-block-${className}`;\n\nexport interface BlockProps {\n /** Type of block to render */\n variant?: 'icon' | 'image';\n /** Icon or image to display */\n visual?: ReactNode;\n /** Label/title text */\n label: string;\n /** Description text (for icon variant) */\n description?: string;\n /** Style variant for icon blocks */\n style?: 'primary' | 'secondary';\n /** Click handler */\n onClick?: () => void;\n /** Whether to show arrow (for image variant) */\n showArrow?: boolean;\n /** Additional CSS class names */\n className?: string;\n}\n\nconst Block: React.FC<BlockProps> = ({\n variant = 'icon',\n visual,\n label,\n description,\n style = 'primary',\n onClick,\n showArrow = true,\n className = ''\n}) => {\n if (variant === 'icon') {\n const containerClasses = [\n cx('icon'),\n onClick && cx('icon--clickable'),\n className\n ].filter(Boolean).join(' ');\n\n const iconContainerClass = style === 'primary'\n ? cx('icon-container--primary')\n : cx('icon-container--secondary');\n\n return (\n <div\n className={containerClasses}\n onClick={onClick}\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n <div className={iconContainerClass}>\n {visual}\n </div>\n <div className={cx('text-container')}>\n <div className={cx('icon-label')}>{label}</div>\n {description && <div className={cx('icon-description')}>{description}</div>}\n </div>\n </div>\n );\n }\n\n // Image Block variant\n const containerClasses = [\n cx('image'),\n onClick && cx('image--clickable'),\n className\n ].filter(Boolean).join(' ');\n\n return (\n <div\n className={containerClasses}\n onClick={onClick}\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n <div className={cx('image-container')}>\n {visual}\n </div>\n <div className={cx('footer')}>\n <span className={cx('image-label')}>{label}</span>\n {showArrow && (\n <span className={cx('arrow')}>→</span>\n )}\n </div>\n </div>\n );\n};\n\nBlock.displayName = 'Block';\n\nexport { Block };\n","import { Rating } from '../Rating';\nimport './ReviewCard.css';\n\nconst cx = (className: string) => `hc-review-${className}`;\n\nexport interface ReviewCardProps {\n /** Reviewer's name */\n name: string;\n /** Review date */\n date: string;\n /** Rating value (1-5) */\n rating: number;\n /** Review text/quote */\n quote: string;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst ReviewCard: React.FC<ReviewCardProps> = ({\n name,\n date,\n rating,\n quote,\n className\n}) => {\n const containerClasses = [cx('container'), className].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n <div className={cx('name')}>{name}</div>\n <div className={cx('frame')}>\n <div className={cx('stars')}>\n <Rating variant=\"stars\" value={rating} size=\"medium\" />\n </div>\n <div className={cx('quote')}>{quote}</div>\n </div>\n <div className={cx('date')}>{date}</div>\n </div>\n );\n};\n\nReviewCard.displayName = 'ReviewCard';\n\nexport { ReviewCard };\n","import { useState } from 'react';\nimport { Button } from '../Button';\nimport './FAQ.css';\n\nconst cx = (className: string) => `hc-faq-${className}`;\n\nexport interface FAQItem {\n question: string;\n answer: string;\n}\n\nexport interface FAQProps {\n items: FAQItem[];\n defaultOpenIndex?: number | null;\n allowMultiple?: boolean;\n className?: string;\n}\n\nconst ChevronIcon = ({ isOpen }: { isOpen: boolean }) => {\n const iconClasses = [\n cx('chevron'),\n isOpen && cx('chevron--open')\n ].filter(Boolean).join(' ');\n\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={iconClasses}\n >\n <path\n d=\"M6 9L12 15L18 9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nconst FAQ: React.FC<FAQProps> = ({\n items,\n defaultOpenIndex = null,\n allowMultiple = false,\n className\n}) => {\n const [openIndices, setOpenIndices] = useState<Set<number>>(\n defaultOpenIndex !== null ? new Set([defaultOpenIndex]) : new Set()\n );\n\n const toggleItem = (index: number) => {\n setOpenIndices(prev => {\n const newSet = new Set(prev);\n if (newSet.has(index)) {\n newSet.delete(index);\n } else {\n if (!allowMultiple) {\n newSet.clear();\n }\n newSet.add(index);\n }\n return newSet;\n });\n };\n\n const containerClasses = [cx('container'), className].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n {items.map((item, index) => {\n const isOpen = openIndices.has(index);\n const answerClasses = isOpen\n ? cx('answer--open')\n : cx('answer');\n\n return (\n <div key={index} className={cx('item')}>\n <Button\n variant=\"link\"\n size=\"medium\"\n className={cx('question-btn')}\n onClick={() => toggleItem(index)}\n aria-expanded={isOpen}\n aria-controls={`faq-answer-${index}`}\n rightIcon={\n <div className={cx('icon-container')}>\n <ChevronIcon isOpen={isOpen} />\n </div>\n }\n >\n <span className={cx('question-text')}>{item.question}</span>\n </Button>\n <div id={`faq-answer-${index}`} className={answerClasses}>\n <p className={cx('answer-text')}>{item.answer}</p>\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n\nFAQ.displayName = 'FAQ';\n\nexport { FAQ };\n","import { Button } from '../Button';\nimport './Benefits.css';\n\nconst cx = (className: string) => `hc-benefits-${className}`;\n\nexport interface BenefitItem {\n icon?: string;\n title: string;\n description?: string;\n}\n\nexport interface BenefitsProps {\n title?: string;\n subtitle?: string;\n benefits?: BenefitItem[];\n contactTitle?: string;\n contactDescription?: string;\n contactButtonText?: string;\n onContactClick?: () => void;\n className?: string;\n}\n\nconst Benefits: React.FC<BenefitsProps> = ({\n title = 'Ihre Vorteile mit HotelCard',\n subtitle = 'Mit HotelCard sparen Sie bei jedem Aufenthalt',\n benefits = [\n {\n title: 'Über 500 Hotels',\n description: 'Grosse Auswahl in der ganzen Schweiz'\n },\n {\n title: 'Bis zu 50% Rabatt',\n description: 'Exklusive Mitglieder-Preise'\n },\n {\n title: 'Kein Buchungszwang',\n description: 'Buchen Sie, wann Sie möchten'\n },\n {\n title: 'Kostenlose Stornierung',\n description: 'Flexible Buchungsbedingungen'\n }\n ],\n contactTitle = 'Haben Sie Fragen?',\n contactDescription = 'Unser Kundenservice hilft Ihnen gerne weiter',\n contactButtonText = 'Kontakt aufnehmen',\n onContactClick,\n className\n}) => {\n const sectionClasses = [cx('section'), className].filter(Boolean).join(' ');\n\n return (\n <section className={sectionClasses}>\n <div className={cx('container')}>\n <div className={cx('header')}>\n <h2 className={cx('title')}>{title}</h2>\n {subtitle && <p className={cx('subtitle')}>{subtitle}</p>}\n </div>\n\n <div className={cx('grid')}>\n {benefits.map((benefit, index) => (\n <div key={index} className={cx('item')}>\n <h3 className={cx('item-title')}>{benefit.title}</h3>\n {benefit.description && (\n <p className={cx('item-description')}>{benefit.description}</p>\n )}\n </div>\n ))}\n </div>\n\n {contactTitle && (\n <div className={cx('contact-card')}>\n <h3 className={cx('contact-title')}>{contactTitle}</h3>\n {contactDescription && (\n <p className={cx('contact-description')}>{contactDescription}</p>\n )}\n {contactButtonText && (\n <Button\n variant=\"secondary\"\n size=\"medium\"\n onClick={onContactClick}\n className={cx('contact-btn')}\n >\n {contactButtonText}\n </Button>\n )}\n </div>\n )}\n </div>\n </section>\n );\n};\n\nBenefits.displayName = 'Benefits';\n\nexport { Benefits };\n","import React, { forwardRef } from 'react';\nimport './Pin.css';\n\nconst cx = (className: string) => `hc-pin-${className}`;\n\nexport interface PinProps {\n /** Pin variant - 'price' shows currency/price, 'hotel' shows house icon */\n variant?: 'price' | 'hotel';\n /** Whether the hotel has been viewed (secondary style) */\n viewed?: boolean;\n /** Currency code to display */\n currency?: string;\n /** Price to display */\n price?: number | string;\n /** Whether to show the favorite (heart) icon */\n showFavorite?: boolean;\n /** Whether the pin is disabled */\n disabled?: boolean;\n /** Click handler */\n onClick?: () => void;\n /** Additional class name */\n className?: string;\n}\n\n// Heart filled icon for favorites\nconst HeartIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M8 14.2333L6.96667 13.2933C3.6 10.24 1.33333 8.18667 1.33333 5.66667C1.33333 3.61333 2.94667 2 5 2C6.16 2 7.27333 2.54 8 3.39333C8.72667 2.54 9.84 2 11 2C13.0533 2 14.6667 3.61333 14.6667 5.66667C14.6667 8.18667 12.4 10.24 9.03333 13.2933L8 14.2333Z\" />\n </svg>\n);\n\n// Home/Hotel icon for hotel variant\nconst HomeIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M6.66667 13.3333V9.33333H9.33333V13.3333H12.6667V8H14.6667L8 2L1.33333 8H3.33333V13.3333H6.66667Z\" />\n </svg>\n);\n\n/**\n * Pin Component\n *\n * Map marker pin with price or hotel icon variants.\n * Used for displaying hotel markers on maps.\n *\n * @example\n * // Price pin (default)\n * <Pin price={150} currency=\"CHF\" showFavorite />\n *\n * // Viewed price pin (secondary style)\n * <Pin price={150} viewed showFavorite />\n *\n * // Hotel pin (for clusters)\n * <Pin variant=\"hotel\" />\n */\nconst Pin = forwardRef<HTMLButtonElement, PinProps>(\n (\n {\n variant = 'price',\n viewed = false,\n currency = 'CHF',\n price = 0,\n showFavorite = false,\n disabled = false,\n onClick,\n className = '',\n },\n ref\n ) => {\n // Determine style variant based on viewed state\n const styleVariant = viewed ? 'secondary' : 'primary';\n\n // Build class names\n const pinClasses = [\n cx('pin'),\n cx(styleVariant),\n variant === 'hotel' && cx('hotel'),\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // Format price for display\n const formattedPrice =\n typeof price === 'number' ? Math.round(price).toString() : price;\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={pinClasses}\n disabled={disabled}\n onClick={onClick}\n >\n {/* Main body pill */}\n <div className={cx('body')}>\n {variant === 'price' ? (\n <>\n <span className={cx('currency')}>{currency}</span>\n <span className={cx('price')}>{formattedPrice}</span>\n {showFavorite && (\n <div className={cx('favorite-container')}>\n <HeartIcon className={cx('favorite-icon')} />\n </div>\n )}\n </>\n ) : (\n <HomeIcon className={cx('hotel-icon')} />\n )}\n </div>\n\n {/* Pointer arrow at bottom */}\n <div className={cx('pointer')}>\n <div className={cx('pointer-inner')} />\n </div>\n </button>\n );\n }\n);\n\nPin.displayName = 'Pin';\n\nexport { Pin };\n","import React from 'react';\nimport { Button } from '../Button';\nimport './EmptyState.css';\n\nexport interface EmptyStateProps {\n /** Image URL or React node (icon/illustration) */\n image?: string | React.ReactNode;\n /** Main heading */\n title: string;\n /** Description - can include line breaks or be multiple sentences */\n description: string;\n /** Optional action button */\n action?: {\n label: string;\n onClick: () => void;\n variant?: 'primary' | 'secondary';\n };\n /** Additional class name */\n className?: string;\n}\n\n/**\n * EmptyState - Generic empty state component\n *\n * Use for: no bookings, no favourites, no search results, etc.\n */\nexport const EmptyState: React.FC<EmptyStateProps> = ({\n image,\n title,\n description,\n action,\n className,\n}) => {\n return (\n <div className={`hc-empty-state ${className || ''}`}>\n {image && (\n <div className=\"hc-empty-state__icon-wrapper\">\n {typeof image === 'string' ? (\n <img src={image} alt=\"\" aria-hidden=\"true\" />\n ) : (\n image\n )}\n </div>\n )}\n <h2 className=\"hc-empty-state__title\">{title}</h2>\n <p className=\"hc-empty-state__description\">{description}</p>\n {action && (\n <div className=\"hc-empty-state__action\">\n <Button\n variant={action.variant || 'secondary'}\n size=\"medium\"\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n </div>\n )}\n </div>\n );\n};\n\nEmptyState.displayName = 'EmptyState';\n","import { useState, useEffect } from 'react';\n\nexport const useDebounce = <T>(value: T, delay: number): T => {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n};\n","import { useState, useEffect } from 'react';\n\n/**\n * useResponsive - Detect responsive breakpoints\n *\n * Automatically detects screen size and updates when window resizes.\n * Works without HotelCardUIProvider - uses window.innerWidth detection.\n *\n * Breakpoints:\n * - Desktop: >= 1024px\n * - Mobile: < 1024px\n *\n * @example\n * ```tsx\n * const { isDesktop } = useResponsive();\n *\n * return isDesktop ? <DesktopView /> : <MobileView />;\n * ```\n */\nexport const useResponsive = () => {\n const [width, setWidth] = useState<number>(\n typeof window !== 'undefined' ? window.innerWidth : 1024\n );\n\n useEffect(() => {\n const handleResize = () => {\n setWidth(window.innerWidth);\n };\n\n handleResize();\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return {\n isDesktop: width >= 1024,\n };\n};\n","import { useUIContext } from '../context';\n\n/**\n * useWindowData - Get locale and currency from UI context\n *\n * Returns locale and currency from the HotelCardUIProvider context.\n * Defaults: locale='de', currency='CHF'\n *\n * @example\n * ```tsx\n * const { locale, currency } = useWindowData();\n * ```\n */\nexport const useWindowData = () => {\n const { locale, currency } = useUIContext();\n return { locale, currency };\n};\n","import { useTranslation as useI18nTranslation } from 'react-i18next';\n\ntype TranslateFunction = (key: string, optionsOrFallback?: string | Record<string, unknown>, fallback?: string) => string;\n\n/**\n * useTranslation - Wrapper around react-i18next useTranslation\n *\n * Provides translation function for UI components.\n * Consuming apps must have react-i18next configured.\n *\n * Supports multiple call signatures:\n * - t('key') - just the key\n * - t('key', 'fallback') - key with fallback string\n * - t('key', { count: 2 }) - key with options\n * - t('key', { count: 2 }, 'fallback') - key with options and fallback\n *\n * @example\n * ```tsx\n * const { t } = useTranslation();\n * return <span>{t('search:label.dates')}</span>;\n * ```\n */\nexport const useTranslation = (namespace?: string | string[]) => {\n const { t: i18nT, i18n } = useI18nTranslation(namespace);\n\n // Simple wrapper that converts to string and supports fallback\n // Using 'as unknown as string' to work around react-i18next's complex type signature\n const t: TranslateFunction = (key, optionsOrFallback, fallback) => {\n // Handle multiple call signatures:\n // t('key', 'fallback') - second arg is string fallback\n // t('key', { options }) - second arg is options object\n // t('key', { options }, 'fallback') - both options and fallback\n let options: Record<string, unknown> | undefined;\n let actualFallback: string | undefined;\n\n if (typeof optionsOrFallback === 'string') {\n actualFallback = optionsOrFallback;\n } else if (optionsOrFallback) {\n options = optionsOrFallback;\n actualFallback = fallback;\n } else {\n actualFallback = fallback;\n }\n\n const result = (i18nT as (k: string, opts?: object) => unknown)(key, options ?? {});\n const resultStr = String(result);\n\n // If translation returns the key itself, use fallback if provided\n if (resultStr === key && actualFallback !== undefined) {\n return actualFallback;\n }\n return resultStr;\n };\n\n return { t, i18n };\n};\n","import React, { useState } from 'react';\nimport { useResponsive } from '../../hooks';\nimport styles from './DualCalendar.module.css';\n\ninterface DualCalendarProps {\n startDate: string | null;\n endDate: string | null;\n onDateSelect: (date: string) => void;\n minDate?: string;\n locale?: string;\n}\n\nconst DualCalendar: React.FC<DualCalendarProps> = ({\n startDate,\n endDate,\n onDateSelect,\n minDate,\n locale = 'de-CH',\n}) => {\n const { isDesktop } = useResponsive();\n const [currentMonth, setCurrentMonth] = useState(new Date());\n const isStartDate = (dateStr: string) => startDate === dateStr;\n const isEndDate = (dateStr: string) => endDate === dateStr;\n\n const isMidDate = (dateStr: string) => {\n if (!startDate || !endDate) return false;\n return dateStr > startDate && dateStr < endDate;\n };\n const endOfMonth = (date: Date) => new Date(date.getFullYear(), date.getMonth() + 1, 0);\n\n const getDaysInMonth = (date: Date) => {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n };\n\n const getFirstDayOfMonth = (date: Date) => {\n // getDay() returns 0=Sunday, 1=Monday, etc.\n // Calendar starts with Monday, so convert: Monday=0, Tuesday=1, ..., Sunday=6\n const day = new Date(date.getFullYear(), date.getMonth(), 1).getDay();\n return day === 0 ? 6 : day - 1;\n };\n\n const formatMonthYear = (date: Date) => {\n return date.toLocaleDateString(locale, { month: 'long', year: 'numeric' });\n };\n\n // Generate localized weekday names (starting from Monday)\n const getWeekDays = () => {\n const days = [];\n // Start from Monday (Jan 6, 2020 was a Monday)\n const baseDate = new Date(2020, 0, 6);\n for (let i = 0; i < 7; i++) {\n const date = new Date(baseDate);\n date.setDate(baseDate.getDate() + i);\n days.push(date.toLocaleDateString(locale, { weekday: 'short' }).slice(0, 2));\n }\n return days;\n };\n\n const weekDays = getWeekDays();\n\nconst isDateDisabled = (dateStr: string) => {\n const today = new Date();\n const oneYearFromToday = new Date(today.getFullYear() + 1, today.getMonth(), today.getDate());\n\n const dateParts = dateStr.split('-').map(Number); // [YYYY, MM, DD]\n const date = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]);\n\n // Disable if before minDate\n if (minDate) {\n const minParts = minDate.split('-').map(Number);\n const min = new Date(minParts[0], minParts[1] - 1, minParts[2]);\n if (date < min) return true;\n }\n\n // Disable if after one year from today\n if (date > oneYearFromToday) return true;\n\n return false;\n };\n\n\n const generateCalendar = (monthOffset: number) => {\n const date = new Date(currentMonth.getFullYear(), currentMonth.getMonth() + monthOffset, 1);\n const daysInMonth = getDaysInMonth(date);\n const firstDay = getFirstDayOfMonth(date);\n const days = [];\n\n // Add empty cells for days before month starts\n for (let i = 0; i < firstDay; i++) {\n days.push(<div key={`empty-${i}`} className={styles.dayCell} />);\n }\n\n // Add day cells\n for (let day = 1; day <= daysInMonth; day++) {\n const dateStr = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n const disabled = isDateDisabled(dateStr);\n const start = isStartDate(dateStr);\n const end = isEndDate(dateStr);\n const inRange = isMidDate(dateStr);\n\n const dayCellClasses = [\n styles.dayCell,\n styles.dayButton,\n disabled && styles['dayButton--disabled'],\n start && styles['dayButton--start'],\n end && styles['dayButton--end'],\n inRange && styles['dayButton--inRange'],\n ].filter(Boolean).join(' ');\n\n\n days.push(\n <button\n key={day}\n type=\"button\"\n className={dayCellClasses}\n onClick={() => !disabled && onDateSelect(dateStr)}\n disabled={disabled}\n >\n {day}\n </button>\n );\n }\n\n return days;\n };\n\n const handlePrevMonth = () => {\n setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1, 1));\n };\n\n const handleNextMonth = () => {\n setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1, 1));\n };\n\n const prevMonth = new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1, 1);\n // ✅ New: Enable/disable previous button based on minDate\n const isPrevDisabled = minDate ? endOfMonth(prevMonth) < new Date(minDate) : false;\n const today = new Date();\n const maxMonth = new Date(today.getFullYear() + 1, today.getMonth(), 1);\n\n // Next month date (the month that would be shown if we click Next)\n const nextMonth = new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1, 1);\n\n // Disable Next button if nextMonth exceeds one year from today\n const isNextDisabled = nextMonth >= maxMonth;\n const isNextDisabledMobile = nextMonth > maxMonth;\n\n const PrevArrowIcon = () => {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className={styles.positionAbs}>\n <path d=\"M6.09652 9.36666C5.74908 9.71647 5.74908 10.2821 6.09652 10.6282L11.8223 16.4043C12.1698 16.7541 12.7316 16.7541 13.0754 16.4043C13.4191 16.0545 13.4228 15.4888 13.0754 15.1428L7.97791 9.9993L13.0754 4.85584C13.4228 4.50603 13.4228 3.94038 13.0754 3.59429C12.7279 3.2482 12.1661 3.24448 11.8223 3.59429L6.09652 9.36666Z\" fill=\"#1F2937\"/>\n </svg>\n );\n };\n\n const NextArrowIcon = () => {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className={styles.positionAbs}>\n <path d=\"M13.9035 9.36666C14.2509 9.71647 14.2509 10.2821 13.9035 10.6282L8.17767 16.4043C7.83023 16.7541 7.2684 16.7541 6.92465 16.4043C6.5809 16.0545 6.5772 15.4888 6.92465 15.1428L12.0221 9.9993L6.92465 4.85584C6.5772 4.50603 6.5772 3.94038 6.92465 3.59429C7.27209 3.2482 7.83392 3.24448 8.17767 3.59429L13.9035 9.37039V9.36666Z\" fill=\"#1F2937\"/>\n </svg>\n );\n };\n\n const containerClasses = [\n styles.container,\n !isDesktop && styles.containerMobile\n ].filter(Boolean).join(' ');\n\n const calendarsContainerClasses = [\n styles.calendarsContainer,\n !isDesktop && styles.calendarsContainerMobile\n ].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n {/* Mobile: Navigation row at top */}\n {!isDesktop && (\n <div className={styles.navigation}>\n <button\n type=\"button\"\n className={[\n styles.navButton,\n styles.prevIconButton,\n isPrevDisabled && styles.navButtonDisabled\n ].filter(Boolean).join(' ')}\n onClick={handlePrevMonth}\n disabled={isPrevDisabled}\n >\n <PrevArrowIcon />\n </button>\n <h3 className={styles.monthTitleMobile}>{formatMonthYear(currentMonth)}</h3>\n <button\n type=\"button\"\n className={[\n styles.navButton, \n styles.nextIconButton, \n isNextDisabledMobile && styles.navButtonDisabled].filter(Boolean).join(' ')\n }\n onClick={handleNextMonth}\n disabled={isNextDisabledMobile}\n >\n <NextArrowIcon />\n </button>\n </div>\n )}\n\n {/* Desktop: Nav arrows on outer edges with calendars in between */}\n {isDesktop ? (\n <div className={styles.desktopLayout}>\n <button\n type=\"button\"\n className={[\n styles.navButton,\n styles.prevIconButton,\n isPrevDisabled && styles.navButtonDisabled\n ].filter(Boolean).join(' ')}\n onClick={handlePrevMonth} \n disabled={isPrevDisabled}\n >\n <PrevArrowIcon />\n </button>\n\n <div className={calendarsContainerClasses}>\n {/* First Calendar */}\n <div className={styles.calendar}>\n <h3 className={styles.monthTitle}>{formatMonthYear(currentMonth)}</h3>\n <div className={styles.weekDaysRow}>\n {weekDays.map((day, index) => (\n <div\n key={day}\n className={`${styles.weekDay} ${index >= 5 ? styles.weekDayWeekend : ''}`}\n >\n {day}\n </div>\n ))}\n </div>\n <div className={styles.daysGrid}>\n {generateCalendar(0)}\n </div>\n </div>\n\n {/* Second Calendar */}\n <div className={styles.calendar}>\n <h3 className={styles.monthTitle}>{formatMonthYear(nextMonth)}</h3>\n <div className={styles.weekDaysRow}>\n {weekDays.map((day, index) => (\n <div\n key={day}\n className={`${styles.weekDay} ${index >= 5 ? styles.weekDayWeekend : ''}`}\n >\n {day}\n </div>\n ))}\n </div>\n <div className={styles.daysGrid}>\n {generateCalendar(1)}\n </div>\n </div>\n </div>\n\n <button\n type=\"button\"\n className={[\n styles.navButton, \n styles.nextIconButton, \n isNextDisabled && styles.navButtonDisabled].filter(Boolean).join(' ')\n }\n onClick={handleNextMonth}\n disabled={isNextDisabled}\n >\n <NextArrowIcon />\n </button>\n </div>\n ) : (\n /* Mobile: Single calendar below navigation */\n <div className={calendarsContainerClasses}>\n <div className={styles.calendar}>\n <div className={styles.weekDaysRow}>\n {weekDays.map((day, index) => (\n <div\n key={day}\n className={`${styles.weekDay} ${index >= 5 ? styles.weekDayWeekend : ''}`}\n >\n {day}\n </div>\n ))}\n </div>\n <div className={styles.daysGrid}>\n {generateCalendar(0)}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default DualCalendar;\n","import React, { useState, useEffect } from 'react';\nimport { useWindowData, useResponsive } from '../../hooks';\nimport { useUIContext } from '../../context/UIContext';\nimport styles from './WhenContent.module.css';\nimport DualCalendar from './DualCalendar';\nimport { Button } from '../Button';\n\n// Map app locale to BCP 47 locale tag for Intl API\nconst getDateLocale = (locale: string): string => {\n const localeMap: Record<string, string> = {\n de: 'de-CH',\n en: 'en-GB',\n fr: 'fr-CH',\n it: 'it-CH',\n };\n return localeMap[locale] || 'de-CH';\n};\n\nexport interface DateRange {\n start: string | null;\n end: string | null;\n}\n\nexport interface WhenContentProps {\n /** Initial date range */\n initialDateRange?: DateRange;\n /** Initial month filter selection */\n initialMonthFilter?: string[] | null;\n /** Called when date range changes */\n onChange?: (dateRange: DateRange | null) => void;\n /** Called when month filter changes */\n onMonthFilterChange?: (months: string[] | null) => void;\n /** Display variant: 'dropdown' for desktop, 'expanded' for mobile modal */\n variant?: 'dropdown' | 'expanded';\n /** Show apply button (desktop dropdown) */\n showApplyButton?: boolean;\n /** Called when apply is clicked */\n onApply?: () => void;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * WhenContent - Shared date/time selection UI\n *\n * Used in:\n * - Desktop search bar (as dropdown below input)\n * - Mobile search modal (as expanded section)\n *\n * Features:\n * - Segmented control (Dates/Flexible tabs)\n * - Calendar view for specific date range selection\n * - Month chips grid for flexible month selection\n * - \"Anytime\" option for no date filter\n */\nexport const WhenContent: React.FC<WhenContentProps> = ({\n initialDateRange = { start: null, end: null },\n initialMonthFilter = null,\n onChange,\n onMonthFilterChange,\n variant = 'dropdown',\n showApplyButton = true,\n onApply,\n className = '',\n}) => {\n const { t } = useUIContext();\n const { locale } = useWindowData();\n const { isDesktop } = useResponsive();\n const dateLocale = getDateLocale(locale);\n\n const [dateRange, setDateRange] = useState<DateRange>(initialDateRange);\n const [mode, setMode] = useState<'anytime' | 'dates'>(\n initialDateRange.start ? 'dates' : 'anytime'\n );\n // Derive selected months from prop - parent is the source of truth\n const selectedMonths = initialMonthFilter || [];\n const isAnytimeSelected = selectedMonths.length === 0;\n\n // Sync date range and mode when parent changes filters\n useEffect(() => {\n if (initialDateRange.start || initialDateRange.end) {\n setDateRange(initialDateRange);\n setMode('dates');\n } else {\n setDateRange(initialDateRange);\n if (initialMonthFilter && initialMonthFilter.length > 0) {\n setMode('anytime');\n }\n }\n }, [initialDateRange, initialMonthFilter]);\n\n // Generate 12 months starting from current month\n const generateMonths = () => {\n const months = [];\n const now = new Date();\n\n for (let i = 0; i < 12; i++) {\n const date = new Date(now.getFullYear(), now.getMonth() + i, 1);\n months.push({\n label: date.toLocaleDateString(dateLocale, { month: 'long' }),\n year: date.getFullYear(),\n value: `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`,\n disabled: false,\n });\n }\n\n return months;\n };\n\n const months = generateMonths();\n\n const handleAnytimeClick = () => {\n setDateRange({ start: null, end: null });\n onChange?.(null);\n onMonthFilterChange?.(null);\n };\n\n const handleMonthToggle = (monthValue: string) => {\n const newSelectedMonths = selectedMonths.includes(monthValue)\n ? selectedMonths.filter((m) => m !== monthValue)\n : [...selectedMonths, monthValue];\n\n setDateRange({ start: null, end: null });\n onChange?.(null);\n\n if (newSelectedMonths.length === 0) {\n onMonthFilterChange?.(null);\n } else {\n onMonthFilterChange?.(newSelectedMonths);\n }\n };\n\n const handleApply = () => {\n if (mode === 'anytime') {\n if (selectedMonths.length === 0) {\n onChange?.(null);\n }\n } else {\n if (dateRange.start && dateRange.end) {\n onChange?.(dateRange);\n }\n }\n onApply?.();\n };\n\n const handleModeSwitch = (newMode: 'anytime' | 'dates') => {\n setMode(newMode);\n if (newMode === 'anytime') {\n setDateRange({ start: null, end: null });\n onChange?.(null);\n onMonthFilterChange?.(null);\n } else {\n onMonthFilterChange?.(null);\n }\n };\n\n const getTodayDate = () => {\n const today = new Date();\n return today.toISOString().split('T')[0];\n };\n\n const getNextDate = (dateString: string): string => {\n const date = new Date(dateString);\n date.setDate(date.getDate() + 1);\n return date.toISOString().split('T')[0];\n };\n\n const handleDateSelect = (date: string) => {\n if (!dateRange.start || (dateRange.start && dateRange.end)) {\n const newRange = { start: date, end: null };\n setDateRange(newRange);\n onChange?.(newRange);\n } else if (date === dateRange.start) {\n const nextDate = getNextDate(date);\n const newRange = { start: dateRange.start, end: nextDate };\n setDateRange(newRange);\n onChange?.(newRange);\n } else if (date > dateRange.start) {\n const newRange = { start: dateRange.start, end: date };\n setDateRange(newRange);\n onChange?.(newRange);\n } else {\n const newRange = { start: date, end: null };\n setDateRange(newRange);\n onChange?.(newRange);\n }\n };\n\n const containerClasses = [\n styles.container,\n variant === 'expanded' ? styles.containerExpanded : styles.containerDropdown,\n className,\n ].filter(Boolean).join(' ');\n\n const monthGridClasses = [\n styles.monthGrid,\n !isDesktop && styles.monthGridMobile,\n ].filter(Boolean).join(' ');\n\n const contentClasses = [\n styles.content,\n mode === 'dates' && styles.contentDatesActive,\n ].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n {/* Section title - only in expanded variant (mobile modal) */}\n {variant === 'expanded' && (\n <h2 className={styles.sectionTitle}>{t('label.when')}</h2>\n )}\n\n {/* Header with tabs and apply button */}\n <div className={styles.header}>\n <div className={styles.tabs}>\n <button\n type=\"button\"\n className={`${styles.tab} ${mode === 'dates' ? styles.tabActive : ''}`}\n onClick={() => handleModeSwitch('dates')}\n >\n {t('label.dates')}\n </button>\n <button\n type=\"button\"\n className={`${styles.tab} ${mode === 'anytime' ? styles.tabActive : ''}`}\n onClick={() => handleModeSwitch('anytime')}\n >\n {t('label.flexible')}\n </button>\n </div>\n {showApplyButton && (\n <div className={styles.applyButtonContainer}>\n <Button variant=\"secondary\" size=\"medium\" onClick={handleApply}>\n {t('date_selector.apply')}\n </Button>\n </div>\n )}\n </div>\n\n {/* Content */}\n <div className={contentClasses}>\n {mode === 'anytime' ? (\n <div className={styles.flexibleContent}>\n <h3 className={styles.contentHeading}>{t('general.when-months')}</h3>\n <div className={monthGridClasses}>\n {/* Anytime button - first option */}\n <button\n type=\"button\"\n className={`${styles.monthButton} ${styles.anytimeButton} ${\n isAnytimeSelected ? styles.monthButtonSelected : ''\n }`}\n onClick={handleAnytimeClick}\n >\n <span className={styles.monthLabel}>{t('label.anytime')}</span>\n </button>\n {/* Month buttons */}\n {months.map((month) => (\n <button\n key={month.value}\n type=\"button\"\n className={`${styles.monthButton} ${\n selectedMonths.includes(month.value) ? styles.monthButtonSelected : ''\n } ${month.disabled ? styles.monthButtonDisabled : ''}`}\n onClick={() => !month.disabled && handleMonthToggle(month.value)}\n disabled={month.disabled}\n >\n <span className={styles.monthLabel}>{month.label}</span>\n <span className={styles.monthYear}>{month.year}</span>\n </button>\n ))}\n </div>\n </div>\n ) : (\n <div className={styles.datesContent}>\n <DualCalendar\n startDate={dateRange.start}\n endDate={dateRange.end}\n locale={dateLocale}\n onDateSelect={handleDateSelect}\n minDate={getTodayDate()}\n />\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default WhenContent;\n","import React, { useState, useRef, useEffect, useMemo } from 'react';\nimport { useWindowData, useResponsive } from '../../hooks';\nimport { useUIContext } from '../../context/UIContext';\nimport styles from './DateSelector.module.css';\nimport { WhenContent } from './WhenContent';\nimport type { DateRange } from './WhenContent';\n\n// Map app locale to BCP 47 locale tag for Intl API\nconst getDateLocale = (locale: string): string => {\n const localeMap: Record<string, string> = {\n de: 'de-CH',\n en: 'en-GB',\n fr: 'fr-CH',\n it: 'it-CH',\n };\n return localeMap[locale] || 'de-CH';\n};\n\nexport interface DateSelectorProps {\n initialDateRange?: DateRange;\n initialMonthFilter?: string[] | null;\n onChange?: (dateRange: DateRange | null) => void;\n onMonthFilterChange?: (months: string[] | null) => void;\n /** Called when dropdown closes - receives current values for immediate use */\n onClose?: (dateRange: DateRange | null, monthFilter: string[] | null) => void;\n disabled?: boolean;\n className?: string;\n icon?: React.ReactNode;\n}\n\nconst CalendarIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M19 4H18V2H16V4H8V2H6V4H5C3.9 4 3 4.9 3 6V20C3 21.1 3.9 22 5 22H19C20.1 22 21 21.1 21 20V6C21 4.9 20.1 4 19 4ZM19 20H5V9H19V20Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nconst DateSelector: React.FC<DateSelectorProps> = ({\n initialDateRange = { start: null, end: null },\n initialMonthFilter = null,\n onChange,\n onMonthFilterChange,\n onClose,\n disabled = false,\n className,\n icon,\n}) => {\n const { t } = useUIContext();\n const { locale } = useWindowData();\n const { isDesktop } = useResponsive();\n const dateLocale = getDateLocale(locale);\n const [dateRange, setDateRange] = useState<DateRange>(initialDateRange);\n const [isOpen, setIsOpen] = useState(false);\n const [selectedMonths, setSelectedMonths] = useState<string[]>(initialMonthFilter || []);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Sync internal state when parent changes filters\n useEffect(() => {\n setDateRange((prev) => {\n if (\n prev.start === initialDateRange.start &&\n prev.end === initialDateRange.end\n ) {\n return prev;\n }\n return initialDateRange;\n });\n\n setSelectedMonths((prev) => {\n const next = initialMonthFilter || [];\n if (\n prev.length === next.length &&\n prev.every((m, i) => m === next[i])\n ) {\n return prev;\n }\n return next;\n });\n }, [initialDateRange.start, initialDateRange.end, initialMonthFilter]);\n\n // Close dropdown when clicking outside - auto-apply changes\n useEffect(() => {\n if (!isOpen) return;\n\n const handlePointerDown = (event: PointerEvent) => {\n if (!dropdownRef.current) return;\n\n if (!dropdownRef.current.contains(event.target as Node)) {\n // Apply changes before closing (same as clicking \"Anwenden\")\n const newDateRange = (dateRange.start && dateRange.end) ? dateRange : null;\n const newMonthFilter = selectedMonths.length ? selectedMonths : null;\n\n onChange?.(newDateRange);\n onMonthFilterChange?.(newMonthFilter);\n\n setIsOpen(false);\n // Pass values directly for auto-submit (state might not be updated yet)\n onClose?.(newDateRange, newMonthFilter);\n }\n };\n\n document.addEventListener('pointerdown', handlePointerDown);\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown);\n };\n }, [isOpen, dateRange, selectedMonths, onChange, onMonthFilterChange, onClose]);\n\n\n /* -----------------------------\n Memoized months (performance)\n ------------------------------ */\n const months = useMemo(() => {\n const now = new Date();\n return Array.from({ length: 12 }, (_, i) => {\n const date = new Date(now.getFullYear(), now.getMonth() + i, 1);\n return {\n label: date.toLocaleDateString(dateLocale, { month: 'long' }),\n year: date.getFullYear(),\n value: `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`,\n };\n });\n }, [dateLocale]);\n\n /* -----------------------------\n Display label\n ------------------------------ */\n const formatDateDisplay = () => {\n if (dateRange.start && dateRange.end) {\n const format = (d: string) =>\n new Date(d).toLocaleDateString(dateLocale, { month: 'short', day: 'numeric' });\n\n return `${format(dateRange.start)} - ${format(dateRange.end)}`;\n }\n\n if (selectedMonths.length === 1) {\n const month = months.find((m) => m.value === selectedMonths[0]);\n return month ? `${month.label} ${month.year}` : t('label.flexible');\n }\n\n if (selectedMonths.length > 1) {\n return `${selectedMonths.length} ${t('label.months')}`;\n }\n\n return t('label.flexible');\n };\n\n /* -----------------------------\n Local-only handlers\n ------------------------------ */\n const handleDateRangeChange = (range: DateRange | null) => {\n setDateRange(range ?? { start: null, end: null });\n };\n\n const handleMonthFilterChange = (months: string[] | null) => {\n setSelectedMonths(months || []);\n };\n\n /* -----------------------------\n Apply (commit to parent)\n ------------------------------ */\n const handleApply = () => {\n if (dateRange.start && dateRange.end) {\n onChange?.(dateRange);\n } else {\n onChange?.(null);\n }\n\n onMonthFilterChange?.(selectedMonths.length ? selectedMonths : null);\n setIsOpen(false);\n };\n\n const buttonClasses = [\n styles.button,\n disabled && styles['button--disabled'],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const dropdownClasses = [\n styles.dropdown,\n isOpen && styles['dropdown--open'],\n !isDesktop && styles.dropdownMobile,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div ref={dropdownRef} className={styles.container}>\n <button\n type=\"button\"\n className={buttonClasses}\n onClick={() => !disabled && setIsOpen((v) => !v)}\n disabled={disabled}\n >\n <span className={styles.icon}>{icon || <CalendarIcon />}</span>\n <span className={styles.label}>{formatDateDisplay()}</span>\n </button>\n\n {/* Backdrop */}\n {isOpen && (\n <div\n className={styles.backdrop}\n onClick={() => {\n // Apply changes before closing (same as clicking \"Anwenden\")\n const newDateRange = (dateRange.start && dateRange.end) ? dateRange : null;\n const newMonthFilter = selectedMonths.length ? selectedMonths : null;\n\n onChange?.(newDateRange);\n onMonthFilterChange?.(newMonthFilter);\n setIsOpen(false);\n onClose?.(newDateRange, newMonthFilter);\n }}\n aria-hidden=\"true\"\n />\n )}\n\n <div className={dropdownClasses}>\n <WhenContent\n initialDateRange={dateRange}\n initialMonthFilter={selectedMonths.length ? selectedMonths : null}\n onChange={handleDateRangeChange}\n onMonthFilterChange={handleMonthFilterChange}\n variant=\"dropdown\"\n showApplyButton\n onApply={handleApply}\n />\n </div>\n </div>\n );\n};\n\nexport default DateSelector;\n","import React from 'react';\nimport { useUIContext } from '../../context';\nimport './GuestContent.css';\n\n// Icons\nconst MinusIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M0 10C0 9.48047 0.477679 9.0625 1.07143 9.0625H18.9286C19.5223 9.0625 20 9.48047 20 10C20 10.5195 19.5223 10.9375 18.9286 10.9375H1.07143C0.477679 10.9375 0 10.5195 0 10Z\" fill=\"currentColor\"/>\n </svg>\n);\n\nconst PlusIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M11.0714 2.1875C11.0714 1.66797 10.5938 1.25 10 1.25C9.40625 1.25 8.92857 1.66797 8.92857 2.1875V9.0625H1.07143C0.477679 9.0625 0 9.48047 0 10C0 10.5195 0.477679 10.9375 1.07143 10.9375H8.92857V17.8125C8.92857 18.332 9.40625 18.75 10 18.75C10.5938 18.75 11.0714 18.332 11.0714 17.8125V10.9375H18.9286C19.5223 10.9375 20 10.5195 20 10C20 9.48047 19.5223 9.0625 18.9286 9.0625H11.0714V2.1875Z\" fill=\"currentColor\"/>\n </svg>\n);\n\nconst DropdownIcon = () => (\n <svg\n className=\"hc-guest-content__select-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n d=\"M11.24 16.6873C11.6598 17.1042 12.3386 17.1042 12.7539 16.6873L19.6852 9.81633C20.1049 9.39939 20.1049 8.7252 19.6852 8.3127C19.2654 7.9002 18.5866 7.89577 18.1713 8.3127L11.9992 14.4296L5.82701 8.3127C5.40724 7.89577 4.72846 7.89577 4.31316 8.3127C3.89785 8.72964 3.89338 9.40383 4.31316 9.81633L11.2445 16.6873H11.24Z\"\n fill=\"#6B7280\"\n />\n </svg>\n);\n\n/**\n * Guest counts object\n */\nexport interface GuestCounts {\n adults: number;\n children: number;\n childrenAges: Array<number | null>;\n}\n\nexport interface ChildAgeError {\n index: number;\n message: string;\n}\n\nexport interface GuestContentProps {\n /** Current guest counts */\n guests: GuestCounts;\n /** Called when guests change */\n onChange: (guests: GuestCounts) => void;\n /** Current pet filter value (0 or 1) */\n petFilter?: number;\n /** Called when pet filter changes */\n onPetChange?: (value: number) => void;\n /** Show pet toggle */\n showPetToggle?: boolean;\n /** Additional class name for container */\n className?: string;\n /** Validation errors for child ages */\n childAgeErrors?: ChildAgeError[];\n /** Called when an error is cleared (user selects an age) */\n onErrorClear?: (index: number) => void;\n}\n\n/**\n * GuestContent - Shared guest selection UI\n *\n * Used by both desktop GuestSelector dropdown and mobile SearchModal.\n * Contains adults counter, children counter with age dropdowns, and optional pet toggle.\n * Translations handled internally via UIContext.\n */\nexport const GuestContent: React.FC<GuestContentProps> = ({\n guests,\n onChange,\n petFilter = 0,\n onPetChange,\n showPetToggle = true,\n className = '',\n childAgeErrors = [],\n onErrorClear,\n}) => {\n const { t } = useUIContext();\n\n // Get translations from context\n const labels = {\n adults: t('form.adults', 'Adults'),\n children: t('form.children', 'Children'),\n pet: t('form.pet', 'Pet'),\n ageOfChild: t('form.age-of-child', 'Age of child'),\n age: t('form.age', 'Age'),\n decreaseAdults: 'Decrease adults',\n increaseAdults: 'Increase adults',\n decreaseChildren: 'Decrease children',\n increaseChildren: 'Increase children',\n togglePets: 'Toggle pets',\n };\n\n // Ensure childrenAges is always an array\n const childrenAges = Array.isArray(guests.childrenAges) ? guests.childrenAges : [];\n\n const handleIncrement = (type: 'adults' | 'children') => {\n if (type === 'children' && guests.children >= 6) return;\n if (type === 'adults' && guests.adults >= 10) return;\n\n const newChildrenAges = type === 'children'\n ? [...childrenAges, null]\n : childrenAges;\n\n onChange({\n ...guests,\n [type]: guests[type] + 1,\n childrenAges: newChildrenAges,\n });\n };\n\n const handleDecrement = (type: 'adults' | 'children') => {\n if (type === 'adults' && guests.adults <= 1) return;\n if (type === 'children' && guests.children <= 0) return;\n\n const newChildrenAges = type === 'children'\n ? childrenAges.slice(0, -1)\n : childrenAges;\n\n onChange({\n ...guests,\n [type]: guests[type] - 1,\n childrenAges: newChildrenAges,\n });\n };\n\n const handleAgeChange = (index: number, value: string) => {\n const newChildrenAges = [...childrenAges];\n newChildrenAges[index] = value === '' ? null : parseInt(value, 10);\n onChange({\n ...guests,\n childrenAges: newChildrenAges,\n });\n // Clear error for this index when user selects an age\n onErrorClear?.(index);\n };\n\n const containerClasses = ['hc-guest-content', className].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n {/* Adults Row */}\n <div className=\"hc-guest-content__row\">\n <div className=\"hc-guest-content__label\">\n <span className=\"hc-guest-content__name\">{labels.adults}</span>\n </div>\n <div className=\"hc-guest-content__counter\">\n <button\n type=\"button\"\n className=\"hc-guest-content__counter-button\"\n onClick={() => handleDecrement('adults')}\n disabled={guests.adults <= 1}\n aria-label={labels.decreaseAdults}\n >\n <MinusIcon />\n </button>\n <span className=\"hc-guest-content__counter-value\">{guests.adults}</span>\n <button\n type=\"button\"\n className=\"hc-guest-content__counter-button\"\n onClick={() => handleIncrement('adults')}\n disabled={guests.adults >= 10}\n aria-label={labels.increaseAdults}\n >\n <PlusIcon />\n </button>\n </div>\n </div>\n\n {/* Children Row */}\n <div className=\"hc-guest-content__row hc-guest-content__row--children\">\n <div className=\"hc-guest-content__row-header\">\n <div className=\"hc-guest-content__label\">\n <span className=\"hc-guest-content__name\">{labels.children}</span>\n </div>\n <div className=\"hc-guest-content__counter\">\n <button\n type=\"button\"\n className=\"hc-guest-content__counter-button\"\n onClick={() => handleDecrement('children')}\n disabled={guests.children <= 0}\n aria-label={labels.decreaseChildren}\n >\n <MinusIcon />\n </button>\n <span className=\"hc-guest-content__counter-value\">{guests.children}</span>\n <button\n type=\"button\"\n className=\"hc-guest-content__counter-button\"\n onClick={() => handleIncrement('children')}\n disabled={guests.children >= 6}\n aria-label={labels.increaseChildren}\n >\n <PlusIcon />\n </button>\n </div>\n </div>\n\n {/* Children Age Dropdowns */}\n {guests.children > 0 && (\n <div\n className=\"hc-guest-content__children-dropdowns\"\n style={{\n gridTemplateColumns: guests.children === 1 ? '1fr' : 'repeat(2, 1fr)',\n }}\n >\n {Array.from({ length: guests.children }).map((_, index) => {\n const currentAge = childrenAges[index];\n const hasError = childAgeErrors.some(error => error.index === index);\n const errorMessage = childAgeErrors.find(error => error.index === index)?.message;\n\n return (\n <div key={index} className=\"hc-guest-content__child-dropdown\">\n <label htmlFor={`child-age-${index}`}>\n {labels.ageOfChild}\n </label>\n <div className=\"hc-guest-content__select-wrapper\">\n <select\n id={`child-age-${index}`}\n value={currentAge === null || currentAge === undefined ? '' : currentAge}\n onChange={(e) => handleAgeChange(index, e.target.value)}\n className={`hc-guest-content__select ${hasError ? 'hc-guest-content__select--error' : ''}`}\n aria-invalid={hasError}\n aria-describedby={hasError ? `error-${index}` : undefined}\n >\n <option value=\"\">{labels.age}</option>\n {Array.from({ length: 18 }, (_, age) => (\n <option key={age} value={age}>\n {age}\n </option>\n ))}\n </select>\n <DropdownIcon />\n </div>\n {hasError && (\n <span id={`error-${index}`} className=\"hc-guest-content__error-text\">\n {errorMessage}\n </span>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Pet Toggle */}\n {showPetToggle && (\n <div className=\"hc-guest-content__row\">\n <div className=\"hc-guest-content__label\">\n <span className=\"hc-guest-content__name\">{labels.pet}</span>\n </div>\n <div className=\"hc-guest-content__toggle-wrapper\">\n <label className=\"hc-guest-content__toggle\">\n <input\n type=\"checkbox\"\n checked={petFilter === 1}\n onChange={(e) => onPetChange?.(e.target.checked ? 1 : 0)}\n aria-label={labels.togglePets}\n />\n <span className=\"hc-guest-content__slider\" />\n </label>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default GuestContent;\n","import React, { useState, useRef, useEffect } from 'react';\nimport { useUIContext } from '../../context/UIContext';\nimport { GuestContent, type GuestCounts, type ChildAgeError } from './GuestContent';\nimport styles from './GuestSelector.module.css';\n\ninterface GuestSelectorProps {\n initialGuests?: GuestCounts;\n initialPetValue?: number;\n onChange?: (guests: GuestCounts) => void;\n onPetChange?: (pet: number) => void;\n /** Called when dropdown closes - receives current values for immediate use */\n onClose?: (guests: GuestCounts, petFilter: number) => void;\n disabled?: boolean;\n className?: string;\n icon?: React.ReactNode;\n childAgeErrors?: ChildAgeError[];\n}\n\n// Default person icon\nconst PersonIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M12 12C14.21 12 16 10.21 16 8C16 5.79 14.21 4 12 4C9.79 4 8 5.79 8 8C8 10.21 9.79 12 12 12ZM12 14C9.33 14 4 15.34 4 18V20H20V18C20 15.34 14.67 14 12 14Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\n/**\n * GuestSelector - Dropdown wrapper for GuestContent\n *\n * Features:\n * - Button trigger showing current guest count\n * - Dropdown with GuestContent\n * - Auto-submit on close (click outside)\n */\nconst GuestSelector: React.FC<GuestSelectorProps> = ({\n initialGuests = { adults: 2, children: 0, childrenAges: [] },\n initialPetValue = 0,\n onChange,\n onPetChange,\n onClose,\n disabled = false,\n className,\n icon,\n childAgeErrors = []\n}) => {\n const { t } = useUIContext();\n const [guests, setGuests] = useState<GuestCounts>(initialGuests);\n const [petFilter, setPetFilter] = useState<number>(initialPetValue);\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const [errors, setErrors] = useState<ChildAgeError[]>([]);\n\n const totalGuests = guests.adults + guests.children;\n\n // Sync internal state when parent resets the guests\n useEffect(() => {\n setGuests(initialGuests);\n }, [initialGuests]);\n\n useEffect(() => {\n if (childAgeErrors.length > 0) {\n setErrors(childAgeErrors);\n setIsOpen(true);\n }\n }, [childAgeErrors]);\n\n // Close dropdown when clicking outside - trigger auto-submit\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n // Pass current values directly for auto-submit (state might not be updated yet)\n onClose?.(guests, petFilter);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen, guests, petFilter, onClose]);\n\n const handleGuestChange = (newGuests: GuestCounts) => {\n setGuests(newGuests);\n onChange?.(newGuests);\n // Clear errors when children count changes\n if (newGuests.children !== guests.children) {\n setErrors([]);\n }\n };\n\n const handlePetChange = (value: number) => {\n setPetFilter(value);\n onPetChange?.(value);\n };\n\n const handleErrorClear = (index: number) => {\n setErrors(prev => prev.filter(error => error.index !== index));\n };\n\n const buttonClasses = [\n styles.button,\n disabled && styles['button--disabled'],\n className\n ].filter(Boolean).join(' ');\n\n const dropdownClasses = [\n styles.dropdown,\n isOpen && styles['dropdown--open']\n ].filter(Boolean).join(' ');\n\n return (\n <div ref={dropdownRef} className={styles.container}>\n <button\n type=\"button\"\n className={buttonClasses}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n >\n <span className={styles.icon}>\n {icon || <PersonIcon />}\n </span>\n <span className={styles.label}>\n {totalGuests} {totalGuests === 1 ? t('form.guest') : t('form.guests')}\n </span>\n </button>\n\n <div className={dropdownClasses}>\n <GuestContent\n guests={guests}\n onChange={handleGuestChange}\n petFilter={petFilter}\n onPetChange={handlePetChange}\n showPetToggle={true}\n childAgeErrors={errors}\n onErrorClear={handleErrorClear}\n />\n </div>\n </div>\n );\n};\n\nexport { GuestSelector };\nexport type { GuestSelectorProps };\n","import React, { useState, useEffect, useRef, useMemo } from 'react';\nimport { useTranslation, useWindowData } from '../../hooks';\nimport styles from './LocationAutocomplete.module.css';\n\n// SVG Icons matching Figma design\n\nconst SearchLocationIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_location)\">\n <path d=\"M9.75 2.25C11.7391 2.25 13.6468 3.04018 15.0533 4.4467C16.4598 5.85322 17.25 7.76088 17.25 9.75C17.25 11.7391 16.4598 13.6468 15.0533 15.0533C13.6468 16.4598 11.7391 17.25 9.75 17.25C7.76088 17.25 5.85322 16.4598 4.4467 15.0533C3.04018 13.6468 2.25 11.7391 2.25 9.75C2.25 7.76088 3.04018 5.85322 4.4467 4.4467C5.85322 3.04018 7.76088 2.25 9.75 2.25ZM9.75 19.5C12.0375 19.5 14.1422 18.7125 15.8016 17.3953L22.0781 23.6719C22.5187 24.1125 23.2312 24.1125 23.6672 23.6719C24.1031 23.2313 24.1078 22.5188 23.6672 22.0828L17.3953 15.8016C18.7125 14.1422 19.5 12.0375 19.5 9.75C19.5 4.36406 15.1359 0 9.75 0C4.36406 0 0 4.36406 0 9.75C0 15.1359 4.36406 19.5 9.75 19.5ZM13.5 8.25C13.5 6.17812 11.8219 4.5 9.75 4.5C7.67812 4.5 6 6.17812 6 8.25C6 10.5375 8.17969 13.4813 9.21562 14.7469C9.49687 15.0891 10.0031 15.0891 10.2797 14.7469C11.3156 13.4813 13.4953 10.5375 13.4953 8.25H13.5ZM8.25 8.25C8.25 7.85218 8.40804 7.47064 8.68934 7.18934C8.97064 6.90804 9.35217 6.75 9.75 6.75C10.1478 6.75 10.5294 6.90804 10.8107 7.18934C11.092 7.47064 11.25 7.85218 11.25 8.25C11.25 8.64782 11.092 9.02936 10.8107 9.31066C10.5294 9.59196 10.1478 9.75 9.75 9.75C9.35217 9.75 8.97064 9.59196 8.68934 9.31066C8.40804 9.02936 8.25 8.64782 8.25 8.25Z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_location\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\nconst ClearIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"16\" viewBox=\"0 0 24 16\" fill=\"none\">\n <path d=\"M8.55417 0C7.84583 0 7.16667 0.279167 6.66667 0.779167L0.391667 7.05833C0.141667 7.30833 0 7.64583 0 8C0 8.35417 0.141667 8.69167 0.391667 8.94167L6.66667 15.2208C7.16667 15.7208 7.84583 16 8.55417 16H21.3333C22.8042 16 24 14.8042 24 13.3333V2.66667C24 1.19583 22.8042 0 21.3333 0H8.55417ZM22 2.66667V13.3333C22 13.7 21.7 14 21.3333 14H8.55417C8.37917 14 8.20833 13.9292 8.08333 13.8042L2.275 8L8.07917 2.19583C8.20417 2.07083 8.375 2 8.55 2H21.3333C21.7 2 22 2.3 22 2.66667ZM11.8375 5.17083C11.4458 5.5625 11.4458 6.19583 11.8375 6.58333L13.25 7.99583L11.8375 9.40833C11.4458 9.8 11.4458 10.4333 11.8375 10.8208C12.2292 11.2083 12.8625 11.2125 13.25 10.8208L14.6625 9.40833L16.075 10.8208C16.4667 11.2125 17.1 11.2125 17.4875 10.8208C17.875 10.4292 17.8792 9.79583 17.4875 9.40833L16.075 7.99583L17.4875 6.58333C17.8792 6.19167 17.8792 5.55833 17.4875 5.17083C17.0958 4.78333 16.4625 4.77917 16.075 5.17083L14.6625 6.58333L13.25 5.17083C12.8583 4.77917 12.225 4.77917 11.8375 5.17083Z\" fill=\"#1F2937\"/>\n </svg>\n);\n\nconst AllDestinationsIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clipPath=\"url(#clip0_1151_67394)\">\n <path d=\"M8.125 1.875C9.7826 1.875 11.3723 2.53348 12.5444 3.70558C13.7165 4.87768 14.375 6.4674 14.375 8.125C14.375 9.7826 13.7165 11.3723 12.5444 12.5444C11.3723 13.7165 9.7826 14.375 8.125 14.375C6.4674 14.375 4.87768 13.7165 3.70558 12.5444C2.53348 11.3723 1.875 9.7826 1.875 8.125C1.875 6.4674 2.53348 4.87768 3.70558 3.70558C4.87768 2.53348 6.4674 1.875 8.125 1.875ZM8.125 16.25C10.0312 16.25 11.7852 15.5937 13.168 14.4961L18.3984 19.7266C18.7656 20.0937 19.3594 20.0937 19.7227 19.7266C20.0859 19.3594 20.0898 18.7656 19.7227 18.4023L14.4961 13.168C15.5937 11.7852 16.25 10.0312 16.25 8.125C16.25 3.63672 12.6133 0 8.125 0C3.63672 0 0 3.63672 0 8.125C0 12.6133 3.63672 16.25 8.125 16.25ZM11.25 6.875C11.25 5.14844 9.85156 3.75 8.125 3.75C6.39844 3.75 5 5.14844 5 6.875C5 8.78125 6.81641 11.2344 7.67969 12.2891C7.91406 12.5742 8.33594 12.5742 8.56641 12.2891C9.42969 11.2344 11.2461 8.78125 11.2461 6.875H11.25ZM6.875 6.875C6.875 6.54348 7.0067 6.22554 7.24112 5.99112C7.47554 5.7567 7.79348 5.625 8.125 5.625C8.45652 5.625 8.77446 5.7567 9.00888 5.99112C9.2433 6.22554 9.375 6.54348 9.375 6.875C9.375 7.20652 9.2433 7.52446 9.00888 7.75888C8.77446 7.9933 8.45652 8.125 8.125 8.125C7.79348 8.125 7.47554 7.9933 7.24112 7.75888C7.0067 7.52446 6.875 7.20652 6.875 6.875Z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1151_67394\">\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\nconst NearMeIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clipPath=\"url(#clip0_nearme_desktop)\">\n <path d=\"M9.0625 2.8125C9.0625 2.56386 9.16127 2.3254 9.33709 2.14959C9.5129 1.97377 9.75136 1.875 10 1.875C10.2486 1.875 10.4871 1.97377 10.6629 2.14959C10.8387 2.3254 10.9375 2.56386 10.9375 2.8125C10.9375 3.06114 10.8387 3.2996 10.6629 3.47541C10.4871 3.65123 10.2486 3.75 10 3.75C9.75136 3.75 9.5129 3.65123 9.33709 3.47541C9.16127 3.2996 9.0625 3.06114 9.0625 2.8125ZM12.8125 2.8125C12.8125 2.06658 12.5162 1.35121 11.9887 0.823762C11.4613 0.296316 10.7459 0 10 0C9.25408 0 8.53871 0.296316 8.01126 0.823762C7.48382 1.35121 7.1875 2.06658 7.1875 2.8125C7.1875 3.55842 7.48382 4.27379 8.01126 4.80124C8.53871 5.32868 9.25408 5.625 10 5.625C10.7459 5.625 11.4613 5.32868 11.9887 4.80124C12.5162 4.27379 12.8125 3.55842 12.8125 2.8125ZM5.625 9.6875V10.7305C5.625 11.3125 5.85547 11.8672 6.26562 12.2773L6.94141 12.9531L7.32812 15.0742C7.51563 16.1133 8.42188 16.8711 9.48047 16.8711H10.5195C11.5781 16.8711 12.4844 16.1133 12.6719 15.0742L13.0586 12.9531L13.7344 12.2773C14.1445 11.8672 14.375 11.3125 14.375 10.7305V9.6875C14.375 7.78906 12.8359 6.25 10.9375 6.25H9.0625C7.16406 6.25 5.625 7.78906 5.625 9.6875ZM9.0625 8.125H10.9375C11.8008 8.125 12.5 8.82422 12.5 9.6875V10.7305C12.5 10.8125 12.4688 10.8945 12.4102 10.9531L11.5234 11.8359C11.3867 11.9688 11.2969 12.1445 11.2656 12.332L10.8281 14.7422C10.8008 14.8906 10.6719 15 10.5195 15H9.48047C9.32812 15 9.19922 14.8906 9.17188 14.7422L8.73438 12.332C8.69922 12.1445 8.60938 11.9727 8.47656 11.8359L7.59375 10.9531C7.53516 10.8945 7.50391 10.8164 7.50391 10.7305V9.6875C7.50391 8.82422 8.20312 8.125 9.06641 8.125H9.0625ZM5.23047 13.457C4.58203 13.5547 3.97266 13.6758 3.42188 13.8203C2.54688 14.0469 1.75781 14.3398 1.16406 14.7305C0.589844 15.1055 0 15.7031 0 16.5664C0 17.4297 0.589844 18.0273 1.16406 18.4023C1.75781 18.7852 2.54688 19.0781 3.42188 19.3047C5.18359 19.7617 7.53516 20 10 20C12.4648 20 14.8164 19.7617 16.5781 19.3047C17.4531 19.0781 18.2422 18.7852 18.8359 18.3945C19.4102 18.0195 20 17.4219 20 16.5586C20 15.6953 19.4102 15.0977 18.8359 14.7227C18.2422 14.3359 17.4492 14.0391 16.5781 13.8125C16.0273 13.6719 15.4219 13.5508 14.7695 13.4492L14.5625 15.3164C15.125 15.4023 15.6445 15.5078 16.1094 15.6289C18.3203 16.1992 18.3203 16.9141 16.1094 17.4844C14.5508 17.8867 12.3672 18.1172 10 18.1172C7.63281 18.1172 5.44922 17.8867 3.89062 17.4844C1.67969 16.9141 1.67969 16.1992 3.89062 15.6289C4.35547 15.5078 4.875 15.4023 5.4375 15.3164L5.23047 13.4492V13.457Z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_nearme_desktop\">\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\nconst HotelIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clipPath=\"url(#clip0_1151_67415)\">\n <path d=\"M0.9375 0C0.417969 0 0 0.417969 0 0.9375C0 1.45703 0.417969 1.875 0.9375 1.875H1.25V18.125H0.9375C0.417969 18.125 0 18.543 0 19.0625C0 19.582 0.417969 20 0.9375 20H19.0625C19.582 20 20 19.582 20 19.0625C20 18.543 19.582 18.125 19.0625 18.125H18.75V1.875H19.0625C19.582 1.875 20 1.45703 20 0.9375C20 0.417969 19.582 0 19.0625 0H0.9375ZM16.875 18.125H11.25V15H13.125C13.4688 15 13.7539 14.7188 13.6992 14.3789C13.4023 12.6055 11.8594 11.25 10 11.25C8.14062 11.25 6.59766 12.6016 6.30078 14.3789C6.24219 14.7188 6.52734 15 6.875 15H8.75V18.125H3.125V1.875H16.875V18.125ZM5.625 3.75C5.28125 3.75 5 4.03125 5 4.375V5.625C5 5.96875 5.28125 6.25 5.625 6.25H6.875C7.21875 6.25 7.5 5.96875 7.5 5.625V4.375C7.5 4.03125 7.21875 3.75 6.875 3.75H5.625ZM8.75 4.375V5.625C8.75 5.96875 9.03125 6.25 9.375 6.25H10.625C10.9688 6.25 11.25 5.96875 11.25 5.625V4.375C11.25 4.03125 10.9688 3.75 10.625 3.75H9.375C9.03125 3.75 8.75 4.03125 8.75 4.375ZM13.125 3.75C12.7812 3.75 12.5 4.03125 12.5 4.375V5.625C12.5 5.96875 12.7812 6.25 13.125 6.25H14.375C14.7188 6.25 15 5.96875 15 5.625V4.375C15 4.03125 14.7188 3.75 14.375 3.75H13.125ZM5 8.125V9.375C5 9.71875 5.28125 10 5.625 10H6.875C7.21875 10 7.5 9.71875 7.5 9.375V8.125C7.5 7.78125 7.21875 7.5 6.875 7.5H5.625C5.28125 7.5 5 7.78125 5 8.125ZM9.375 7.5C9.03125 7.5 8.75 7.78125 8.75 8.125V9.375C8.75 9.71875 9.03125 10 9.375 10H10.625C10.9688 10 11.25 9.71875 11.25 9.375V8.125C11.25 7.78125 10.9688 7.5 10.625 7.5H9.375ZM12.5 8.125V9.375C12.5 9.71875 12.7812 10 13.125 10H14.375C14.7188 10 15 9.71875 15 9.375V8.125C15 7.78125 14.7188 7.5 14.375 7.5H13.125C12.7812 7.5 12.5 7.78125 12.5 8.125Z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1151_67415\">\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\nconst LocationIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 10.8333C11.3807 10.8333 12.5 9.71404 12.5 8.33333C12.5 6.95262 11.3807 5.83333 10 5.83333C8.61929 5.83333 7.5 6.95262 7.5 8.33333C7.5 9.71404 8.61929 10.8333 10 10.8333Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M10 18.3333C10 18.3333 16.6667 13.3333 16.6667 8.33333C16.6667 4.65143 13.6819 1.66667 10 1.66667C6.31811 1.66667 3.33334 4.65143 3.33334 8.33333C3.33334 13.3333 10 18.3333 10 18.3333Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nconst RegionIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7.5 2.5L2.5 5V17.5L7.5 15M7.5 2.5L12.5 5M7.5 2.5V15M12.5 5L17.5 2.5V15L12.5 17.5M12.5 5V17.5M12.5 17.5L7.5 15\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nconst CountryIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"10\" cy=\"10\" r=\"8.25\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <path d=\"M2.5 10H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n <path d=\"M10 1.75C10 1.75 6.25 5 6.25 10C6.25 15 10 18.25 10 18.25\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n <path d=\"M10 1.75C10 1.75 13.75 5 13.75 10C13.75 15 10 18.25 10 18.25\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n);\n\nexport interface LocationSuggestion {\n type: 'hotel' | 'city' | 'region' | 'country';\n name: string;\n id?: number;\n slug?: string;\n city?: string;\n region?: string;\n latitude?: number;\n longitude?: number;\n}\n\nexport interface LocationAutocompleteProps {\n value: string;\n onChange: (value: string) => void;\n onSelect?: (suggestion: LocationSuggestion) => void;\n onSubmit?: (\n selectedValue: string,\n coordinates?: { lat: number; lng: number } | null,\n regionId?: number | null,\n setQueryValue?: boolean,\n destinationMode?: string\n ) => void;\n /** Function to fetch autocomplete suggestions - provided by consuming app */\n onAutocomplete?: (query: string) => Promise<LocationSuggestion[]>;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * LocationAutocomplete - Input with autocomplete suggestions\n *\n * Features:\n * - Debounced API calls (300ms)\n * - Keyboard navigation (up/down arrows, enter, escape)\n * - Click outside to close\n * - Shows hotels, cities, and regions grouped by type\n * - Shows \"All destinations\" and \"Nearby\" options when no query\n */\nexport const LocationAutocomplete: React.FC<LocationAutocompleteProps> = ({\n value,\n onChange,\n onSelect,\n onSubmit,\n onAutocomplete,\n placeholder = 'Enter location',\n disabled = false,\n className = '',\n}) => {\n const { t } = useTranslation();\n const { locale } = useWindowData();\n const [suggestions, setSuggestions] = useState<LocationSuggestion[]>([]);\n const [isOpen, setIsOpen] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n const [isLoading, setIsLoading] = useState(false);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const debounceRef = useRef<NodeJS.Timeout>();\n\n const isIconActive = isFocused || value.trim().length > 0;\n\n // Group suggestions by type\n const groupedSuggestions = useMemo(() => {\n const hotels = suggestions.filter(s => s.type === 'hotel');\n const cities = suggestions.filter(s => s.type === 'city');\n const regions = suggestions.filter(s => s.type === 'region');\n const countries = suggestions.filter(s => s.type === 'country');\n return { hotels, cities, regions, countries };\n }, [suggestions]);\n\n // Calculate total items for keyboard navigation\n const allItems = useMemo(() => {\n const quickOptions = [\n { type: 'anywhere' as const, name: t('search:label.anywhere', 'All destinations') },\n { type: 'nearme' as const, name: t('search:label.nearby', 'Near me') },\n ];\n return [\n ...quickOptions,\n ...groupedSuggestions.cities,\n ...groupedSuggestions.regions,\n ...groupedSuggestions.countries,\n ...groupedSuggestions.hotels,\n ];\n }, [groupedSuggestions, t]);\n\n // Fetch suggestions from API\n const fetchSuggestions = async (query: string) => {\n if (query.length < 3 || !onAutocomplete) {\n setSuggestions([]);\n return;\n }\n\n try {\n setIsLoading(true);\n const results = await onAutocomplete(query);\n setSuggestions(results);\n setSelectedIndex(-1);\n } catch (error) {\n console.error('Autocomplete error:', error);\n setSuggestions([]);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Debounced search\n useEffect(() => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n\n debounceRef.current = setTimeout(() => {\n fetchSuggestions(value);\n }, 300);\n\n return () => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n };\n }, [value]);\n\n // Click outside to close\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node) &&\n inputRef.current &&\n !inputRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n setIsOpen(true);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange('');\n inputRef.current?.focus();\n };\n\n const handleSelect = (suggestion: LocationSuggestion | { type: 'anywhere' | 'nearme'; name: string }) => {\n if (suggestion.type === 'anywhere') {\n onChange('');\n setIsOpen(false);\n setTimeout(() => onSubmit?.('', null, null, false), 0);\n return;\n }\n\n if (suggestion.type === 'nearme') {\n if ('geolocation' in navigator) {\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const coordinates = {\n lat: position.coords.latitude,\n lng: position.coords.longitude,\n };\n onChange(t('search:label.nearby', 'Near me'));\n setIsOpen(false);\n setTimeout(() => onSubmit?.(t('search:label.nearby', 'Near me'), coordinates, null, false), 0);\n },\n () => {\n onChange('');\n setIsOpen(false);\n setTimeout(() => onSubmit?.('', null, null, false), 0);\n },\n { enableHighAccuracy: false, timeout: 10000, maximumAge: 300000 }\n );\n } else {\n onChange('');\n setIsOpen(false);\n setTimeout(() => onSubmit?.('', null, null, false), 0);\n }\n return;\n }\n\n const displayText = suggestion.name;\n const coordinates = getCoordinates(suggestion as LocationSuggestion);\n const regionId = (suggestion.type === 'region') ? (suggestion as LocationSuggestion).id : null;\n\n onChange(displayText);\n setIsOpen(false);\n\n if (onSelect && 'city' in suggestion) {\n onSelect(suggestion as LocationSuggestion);\n }\n\n setTimeout(() => onSubmit?.(displayText, coordinates, regionId, true, suggestion.type), 0);\n };\n\n const getCoordinates = (params: LocationSuggestion) => {\n if (!params?.latitude || !params?.longitude) {\n return null;\n }\n return {\n lat: params.latitude,\n lng: params.longitude,\n };\n };\n\n // Keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isOpen || allItems.length === 0) {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n setIsOpen(true);\n }\n return;\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n setSelectedIndex((prev) => prev < allItems.length - 1 ? prev + 1 : prev);\n break;\n case 'ArrowUp':\n e.preventDefault();\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : -1));\n break;\n case 'Enter':\n e.preventDefault();\n if (selectedIndex >= 0 && selectedIndex < allItems.length) {\n handleSelect(allItems[selectedIndex]);\n }\n break;\n case 'Escape':\n e.preventDefault();\n setIsOpen(false);\n setSelectedIndex(-1);\n break;\n }\n };\n\n const getIcon = (type: string) => {\n switch (type) {\n case 'hotel': return <HotelIcon />;\n case 'city': return <LocationIcon />;\n case 'region': return <RegionIcon />;\n case 'country': return <CountryIcon />;\n case 'anywhere': return <AllDestinationsIcon />;\n case 'nearme': return <NearMeIcon />;\n default: return <AllDestinationsIcon />;\n }\n };\n\n const highlightMatch = (text: string, query: string) => {\n if (!query || query.length < 3) {\n return <span>{text}</span>;\n }\n\n const lowerText = text.toLowerCase();\n const lowerQuery = query.toLowerCase();\n const matchIndex = lowerText.indexOf(lowerQuery);\n\n if (matchIndex === -1) {\n return <span>{text}</span>;\n }\n\n const beforeMatch = text.slice(0, matchIndex);\n const match = text.slice(matchIndex, matchIndex + query.length);\n const afterMatch = text.slice(matchIndex + query.length);\n\n return (\n <span>\n {beforeMatch}\n <span className={styles.suggestionNameBold}>{match}</span>\n {afterMatch}\n </span>\n );\n };\n\n const QUICK_OPTIONS_COUNT = 2;\n const citiesStartIndex = QUICK_OPTIONS_COUNT;\n const regionsStartIndex = citiesStartIndex + groupedSuggestions.cities.length;\n const countriesStartIndex = regionsStartIndex + groupedSuggestions.regions.length;\n const hotelsStartIndex = countriesStartIndex + groupedSuggestions.countries.length;\n\n const hasSearchResults = suggestions.length > 0;\n const showEmptyState = value.length >= 2 && !hasSearchResults && !isLoading;\n\n return (\n <div className={styles.container}>\n <span className={`${styles.iconWrapper} ${isIconActive ? styles.iconWrapperActive : ''}`}>\n <SearchLocationIcon />\n </span>\n\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={() => {\n setIsFocused(true);\n setIsOpen(true);\n }}\n onBlur={() => setIsFocused(false)}\n placeholder={isFocused ? '' : placeholder}\n disabled={disabled}\n className={`${styles.input} ${className}`}\n aria-label=\"Search location\"\n aria-autocomplete=\"list\"\n aria-expanded={isOpen}\n autoComplete=\"off\"\n />\n\n {value.trim().length > 0 && (\n <button\n type=\"button\"\n className={styles.clearButton}\n onClick={handleClear}\n aria-label={t('search:label.clear', 'Clear')}\n >\n <ClearIcon />\n </button>\n )}\n\n {isLoading && (\n <div className={styles.loadingIndicator}>\n <span>...</span>\n </div>\n )}\n\n {isOpen && (\n <div ref={dropdownRef} className={styles.dropdown}>\n {!hasSearchResults && !showEmptyState && (\n <div className={styles.dropdownHeader}>\n {t('search:general.suggested-destinations', 'Suggested destinations')}\n </div>\n )}\n\n {!hasSearchResults && !showEmptyState && (\n <div className={styles.section}>\n <button\n type=\"button\"\n className={`${styles.suggestion} ${selectedIndex === 0 ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelect({ type: 'anywhere', name: t('search:label.anywhere', 'All destinations') })}\n onMouseEnter={() => setSelectedIndex(0)}\n >\n <span className={styles.icon}>{getIcon('anywhere')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {t('search:label.anywhere', 'All destinations')}\n </div>\n </div>\n </button>\n\n <button\n type=\"button\"\n className={`${styles.suggestion} ${selectedIndex === 1 ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelect({ type: 'nearme', name: t('search:label.nearby', 'Near me') })}\n onMouseEnter={() => setSelectedIndex(1)}\n >\n <span className={styles.icon}>{getIcon('nearme')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {t('search:label.nearby', 'Near me')}\n </div>\n </div>\n </button>\n </div>\n )}\n\n {groupedSuggestions.cities.length > 0 && (\n <div className={styles.section}>\n <div className={styles.sectionHeader}>\n {t('search:dropdown.cities', 'Cities')}\n </div>\n <div>\n {groupedSuggestions.cities.map((suggestion, index) => {\n const itemIndex = citiesStartIndex + index;\n return (\n <button\n key={`city-${suggestion.name}-${index}`}\n type=\"button\"\n className={`${styles.suggestion} ${itemIndex === selectedIndex ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelect(suggestion)}\n onMouseEnter={() => setSelectedIndex(itemIndex)}\n >\n <span className={styles.icon}>{getIcon('city')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {highlightMatch(suggestion.name, value)}\n </div>\n {suggestion.region && (\n <div className={styles.suggestionMeta}>{suggestion.region}</div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {groupedSuggestions.regions.length > 0 && (\n <div className={styles.section}>\n <div className={styles.sectionHeader}>\n {t('search:dropdown.regions', 'Regions')}\n </div>\n <div>\n {groupedSuggestions.regions.map((suggestion, index) => {\n const itemIndex = regionsStartIndex + index;\n return (\n <button\n key={`region-${suggestion.name}-${index}`}\n type=\"button\"\n className={`${styles.suggestion} ${itemIndex === selectedIndex ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelect(suggestion)}\n onMouseEnter={() => setSelectedIndex(itemIndex)}\n >\n <span className={styles.icon}>{getIcon('region')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {highlightMatch(suggestion.name, value)}\n </div>\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {groupedSuggestions.countries.length > 0 && (\n <div className={styles.section}>\n <div className={styles.sectionHeader}>\n {t('search:dropdown.countries', 'Countries')}\n </div>\n <div>\n {groupedSuggestions.countries.map((suggestion, index) => {\n const itemIndex = countriesStartIndex + index;\n return (\n <button\n key={`country-${suggestion.name}-${index}`}\n type=\"button\"\n className={`${styles.suggestion} ${itemIndex === selectedIndex ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelect(suggestion)}\n onMouseEnter={() => setSelectedIndex(itemIndex)}\n >\n <span className={styles.icon}>{getIcon('country')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {highlightMatch(suggestion.name, value)}\n </div>\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {groupedSuggestions.hotels.length > 0 && (\n <div className={styles.section}>\n <div className={styles.sectionHeader}>\n {t('search:dropdown.hotels', 'Hotels')}\n </div>\n <div>\n {groupedSuggestions.hotels.map((suggestion, index) => {\n const itemIndex = hotelsStartIndex + index;\n return (\n <button\n key={`hotel-${suggestion.name}-${index}`}\n type=\"button\"\n className={`${styles.suggestion} ${itemIndex === selectedIndex ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelect(suggestion)}\n onMouseEnter={() => setSelectedIndex(itemIndex)}\n >\n <span className={styles.icon}>{getIcon('hotel')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {highlightMatch(suggestion.name, value)}\n </div>\n {suggestion.city && (\n <div className={styles.suggestionMeta}>\n {suggestion.city}\n {suggestion.region && `, ${suggestion.region}`}\n </div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {showEmptyState && (\n <div className={styles.emptyState}>\n {t('search:dropdown.no-results', 'No results found')}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { useUIContext } from '../../context';\nimport { Button } from '../Button';\nimport styles from './MobileSortModal.module.css';\n\n// Close icon\nconst CloseIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M2.77539 4.09961C2.4082 3.73242 2.4082 3.13867 2.77539 2.77539C3.14258 2.41211 3.73633 2.4082 4.09961 2.77539L9.99805 8.67383L15.8965 2.77539C16.2637 2.4082 16.8574 2.4082 17.2207 2.77539C17.584 3.14258 17.5879 3.73633 17.2207 4.09961L11.3223 9.99805L17.2207 15.8965C17.5879 16.2637 17.5879 16.8574 17.2207 17.2207C16.8535 17.584 16.2598 17.5879 15.8965 17.2207L9.99805 11.3223L4.09961 17.2207C3.73242 17.5879 3.13867 17.5879 2.77539 17.2207C2.41211 16.8535 2.4082 16.2598 2.77539 15.8965L8.67383 9.99805L2.77539 4.09961Z\" fill=\"#1F2937\"/>\n </svg>\n);\n\nexport type SortOption = 'relevance' | 'price_asc' | 'price_desc' | 'rating';\n\ninterface SortOptionItem {\n value: SortOption;\n labelKey: string;\n defaultLabel: string;\n}\n\nexport interface MobileSortModalProps {\n isOpen: boolean;\n onClose: () => void;\n value: SortOption;\n onChange: (sort: SortOption) => void;\n}\n\n/**\n * MobileSortModal - Bottom sheet for sort options on mobile\n *\n * Figma: 451:31579\n *\n * Features:\n * - Slides up from bottom with native feel\n * - Dark backdrop overlay\n * - Radio button list for sort options\n */\nexport const MobileSortModal: React.FC<MobileSortModalProps> = ({\n isOpen,\n onClose,\n value,\n onChange,\n}) => {\n const { t } = useUIContext();\n\n const sortOptions: SortOptionItem[] = [\n { value: 'relevance', labelKey: 'filter.relevance', defaultLabel: 'Relevance' },\n { value: 'price_asc', labelKey: 'filter.price-low-high', defaultLabel: 'Price low to high' },\n { value: 'price_desc', labelKey: 'filter.price-high-low', defaultLabel: 'Price high to low' },\n { value: 'rating', labelKey: 'filter.best-rating', defaultLabel: 'Best guest rating' },\n ];\n\n const handleSelect = (option: SortOption) => {\n onChange(option);\n onClose();\n };\n\n // Prevent body scroll when modal is open\n React.useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = '';\n };\n }\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n return (\n <div className={styles.overlay} onClick={onClose}>\n <div\n className={styles.sheet}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className={styles.header}>\n <h2 className={styles.title}>\n {t('subheadline.sort-by', 'Sort by')}\n </h2>\n <Button\n variant=\"secondary\"\n size=\"small\"\n iconOnly\n onClick={onClose}\n aria-label={t('aria.close', 'Close')}\n >\n <CloseIcon />\n </Button>\n </div>\n\n {/* Options list */}\n <div className={styles.optionsList}>\n {sortOptions.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n className={styles.optionItem}\n onClick={() => handleSelect(option.value)}\n role=\"radio\"\n aria-checked={value === option.value}\n >\n <span className={`${styles.radio} ${value === option.value ? styles.radioActive : ''}`}>\n {value === option.value && <span className={styles.radioInner} />}\n </span>\n <span className={styles.optionLabel}>\n {t(option.labelKey, option.defaultLabel)}\n </span>\n </button>\n ))}\n </div>\n </div>\n </div>\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport { useResponsive } from '../../hooks';\nimport { useUIContext } from '../../context/UIContext';\nimport { Button } from '../Button';\nimport { DateSelector, type DateRange } from '../DateSelector';\nimport { LocationAutocomplete, type LocationSuggestion } from '../LocationAutocomplete';\nimport { GuestSelector, type GuestCounts, type ChildAgeError } from '../GuestSelector';\nimport styles from './SearchControlsBar.module.css';\n\n// SVG Icons matching Figma design (24x24, color inherited from CSS)\nconst SearchIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_1029_77629)\">\n <path d=\"M17.25 9.75C17.25 7.76088 16.4598 5.85322 15.0533 4.4467C13.6468 3.04018 11.7391 2.25 9.75 2.25C7.76088 2.25 5.85322 3.04018 4.4467 4.4467C3.04018 5.85322 2.25 7.76088 2.25 9.75C2.25 11.7391 3.04018 13.6468 4.4467 15.0533C5.85322 16.4598 7.76088 17.25 9.75 17.25C11.7391 17.25 13.6468 16.4598 15.0533 15.0533C16.4598 13.6468 17.25 11.7391 17.25 9.75ZM15.8016 17.3953C14.1422 18.7125 12.0375 19.5 9.75 19.5C4.36406 19.5 0 15.1359 0 9.75C0 4.36406 4.36406 0 9.75 0C15.1359 0 19.5 4.36406 19.5 9.75C19.5 12.0375 18.7125 14.1422 17.3953 15.8016L23.6719 22.0781C24.1125 22.5187 24.1125 23.2312 23.6719 23.6672C23.2313 24.1031 22.5188 24.1078 22.0828 23.6672L15.8016 17.3953Z\" fill=\"#4B5563\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1029_77629\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Filter icon (20x20) - matching Figma 667:78131\nconst FilterIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clipPath=\"url(#clip0_1029_77637)\">\n <path d=\"M0.882623 3.33334C0.52601 3.33334 0.202485 3.54724 0.0664579 3.87916C-0.0695696 4.21108 0.00763518 4.59094 0.257632 4.84541L4.7061 9.30788V13.6634C4.7061 13.8994 4.79801 14.1244 4.96345 14.2904L7.90458 17.2408C8.15826 17.4952 8.53693 17.569 8.8678 17.4325C9.19868 17.2961 9.41191 16.9678 9.41191 16.6101V9.30419L13.8604 4.84172C14.1141 4.58725 14.1876 4.20739 14.0516 3.87547C13.9155 3.54355 13.592 3.33334 13.2354 3.33334H0.882623ZM6.21343 8.31212L3.01495 5.10357H11.1067L7.90826 8.31212C7.74282 8.47808 7.65091 8.70305 7.65091 8.93908V14.4748L6.47446 13.2946V8.93908C6.47446 8.70305 6.38255 8.47808 6.21711 8.31212H6.21343ZM17.353 3.33334C16.864 3.33334 16.4706 3.72795 16.4706 4.21845C16.4706 4.70896 16.864 5.10357 17.353 5.10357H19.1177C19.6066 5.10357 20 4.70896 20 4.21845C20 3.72795 19.6066 3.33334 19.1177 3.33334H17.353ZM12.6472 9.52916C12.1582 9.52916 11.7648 9.92378 11.7648 10.4143C11.7648 10.9048 12.1582 11.2994 12.6472 11.2994H19.1177C19.6066 11.2994 20 10.9048 20 10.4143C20 9.92378 19.6066 9.52916 19.1177 9.52916H12.6472ZM12.6472 15.725C12.1582 15.725 11.7648 16.1196 11.7648 16.6101C11.7648 17.1006 12.1582 17.4952 12.6472 17.4952H19.1177C19.6066 17.4952 20 17.1006 20 16.6101C20 16.1196 19.6066 15.725 19.1177 15.725H12.6472Z\" fill=\"#1F2937\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1029_77637\">\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Sort icon (20x20) - up/down arrows\nconst SortIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clipPath=\"url(#clip0_1029_63361)\">\n <path d=\"M8.53479 6.02796C8.87132 6.36448 9.41548 6.36448 9.74842 6.02796C10.0814 5.69144 10.0849 5.14727 9.74842 4.81433L6.02877 1.08752C5.69225 0.750995 5.14808 0.750995 4.81514 1.08752L1.08833 4.81075C0.751807 5.14727 0.751807 5.69144 1.08833 6.02438C1.42485 6.35732 1.96902 6.3609 2.30196 6.02438L4.55738 3.76896V18.3075C4.55738 18.7836 4.94044 19.1667 5.41659 19.1667C5.89273 19.1667 6.27579 18.7836 6.27579 18.3075V3.76896L8.53121 6.02438L8.53479 6.02796ZM17.6997 13.9756L15.4442 16.231V1.69254C15.4442 1.2164 15.0612 0.833336 14.585 0.833336C14.1089 0.833336 13.7258 1.2164 13.7258 1.69254V16.231L11.4704 13.9756C11.1339 13.6391 10.5897 13.6391 10.2568 13.9756C9.92384 14.3121 9.92026 14.8563 10.2568 15.1893L13.98 18.9125C14.3165 19.249 14.8607 19.249 15.1936 18.9125L18.9169 15.1893C19.2534 14.8527 19.2534 14.3086 18.9169 13.9756C18.5804 13.6427 18.0362 13.6391 17.7032 13.9756H17.6997Z\" fill=\"#1F2937\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1029_63361\">\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Map icon (20x20) - folded map\nconst MobileMapIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clipPath=\"url(#clip0_1116_37956)\">\n <path d=\"M20 1.875C20 1.55078 19.832 1.25 19.5586 1.07813C19.2852 0.906252 18.9375 0.890627 18.6484 1.03516L13.7695 3.44141L7.03125 1.14844C6.49609 0.964846 5.91016 1 5.39453 1.23828L0.539063 3.52735C0.210938 3.67969 0 4.01172 0 4.375V18.125C0 18.4453 0.164063 18.7461 0.433594 18.918C0.703125 19.0898 1.04297 19.1094 1.33594 18.9727L6.30859 16.6328L12.9766 18.8555C13.5117 19.0352 14.0898 19 14.6016 18.7578L19.4609 16.4727C19.7891 16.3164 20 15.9883 20 15.625V1.875ZM5.625 3.20703V14.8867L1.875 16.6523V4.97266L5.625 3.20703ZM7.5 15.0547V3.29297L12.5 4.99219V16.7227L7.5 15.0547ZM14.375 5.23438L18.125 3.38281V15.0313L14.375 16.7969V5.23438Z\" fill=\"#1F2937\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1116_37956\">\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Location/search icon for desktop search bar\nconst SearchBarIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_915_3305)\">\n <path d=\"M9.75 2.25C11.7391 2.25 13.6468 3.04018 15.0533 4.4467C16.4598 5.85322 17.25 7.76088 17.25 9.75C17.25 11.7391 16.4598 13.6468 15.0533 15.0533C13.6468 16.4598 11.7391 17.25 9.75 17.25C7.76088 17.25 5.85322 16.4598 4.4467 15.0533C3.04018 13.6468 2.25 11.7391 2.25 9.75C2.25 7.76088 3.04018 5.85322 4.4467 4.4467C5.85322 3.04018 7.76088 2.25 9.75 2.25ZM9.75 19.5C12.0375 19.5 14.1422 18.7125 15.8016 17.3953L22.0781 23.6719C22.5187 24.1125 23.2312 24.1125 23.6672 23.6719C24.1031 23.2313 24.1078 22.5188 23.6672 22.0828L17.3953 15.8016C18.7125 14.1422 19.5 12.0375 19.5 9.75C19.5 4.36406 15.1359 0 9.75 0C4.36406 0 0 4.36406 0 9.75C0 15.1359 4.36406 19.5 9.75 19.5ZM13.5 8.25C13.5 6.17812 11.8219 4.5 9.75 4.5C7.67812 4.5 6 6.17812 6 8.25C6 10.5375 8.17969 13.4813 9.21562 14.7469C9.49687 15.0891 10.0031 15.0891 10.2797 14.7469C11.3156 13.4813 13.4953 10.5375 13.4953 8.25H13.5ZM8.25 8.25C8.25 7.85218 8.40804 7.47064 8.68934 7.18934C8.97064 6.90804 9.35217 6.75 9.75 6.75C10.1478 6.75 10.5294 6.90804 10.8107 7.18934C11.092 7.47064 11.25 7.85218 11.25 8.25C11.25 8.64782 11.092 9.02936 10.8107 9.31066C10.5294 9.59196 10.1478 9.75 9.75 9.75C9.35217 9.75 8.97064 9.59196 8.68934 9.31066C8.40804 9.02936 8.25 8.64782 8.25 8.25Z\" fill=\"#4B5563\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_915_3305\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// List calendar icon (hamburger lines) for desktop view toggle\nconst CalendarIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M6.625 0C7.24844 0 7.75 0.501562 7.75 1.125V3H15.25V1.125C15.25 0.501562 15.7516 0 16.375 0C16.9984 0 17.5 0.501562 17.5 1.125V3H19C20.6547 3 22 4.34531 22 6V19.5C22 21.1547 20.6547 22.5 19 22.5H4C2.34531 22.5 1 21.1547 1 19.5V6C1 4.34531 2.34531 3 4 3H5.5V1.125C5.5 0.501562 6.00156 0 6.625 0ZM19 20.25C19.4125 20.25 19.75 19.9125 19.75 19.5V16.5H15.625V20.25H19ZM19.75 14.25V10.5H15.625V14.25H19.75ZM13.375 14.25V10.5H9.625V14.25H13.375ZM7.375 14.25V10.5H3.25V14.25H7.375ZM3.25 16.5V19.5C3.25 19.9125 3.5875 20.25 4 20.25H7.375V16.5H3.25ZM9.625 16.5V20.25H13.375V16.5H9.625ZM6.625 5.25H4C3.5875 5.25 3.25 5.5875 3.25 6V8.25H19.75V6C19.75 5.5875 19.4125 5.25 19 5.25H6.625Z\" fill=\"#4B5563\"/>\n </svg>\n);\n\n// List Guests icon (hamburger lines) for desktop view toggle\nconst GuestsIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M8.25 6C8.25 5.00544 8.64509 4.05161 9.34835 3.34835C10.0516 2.64509 11.0054 2.25 12 2.25C12.9946 2.25 13.9484 2.64509 14.6517 3.34835C15.3549 4.05161 15.75 5.00544 15.75 6C15.75 6.99456 15.3549 7.94839 14.6517 8.65165C13.9484 9.35491 12.9946 9.75 12 9.75C11.0054 9.75 10.0516 9.35491 9.34835 8.65165C8.64509 7.94839 8.25 6.99456 8.25 6ZM18 6C18 4.4087 17.3679 2.88258 16.2426 1.75736C15.1174 0.632141 13.5913 0 12 0C10.4087 0 8.88258 0.632141 7.75736 1.75736C6.63214 2.88258 6 4.4087 6 6C6 7.5913 6.63214 9.11742 7.75736 10.2426C8.88258 11.3679 10.4087 12 12 12C13.5913 12 15.1174 11.3679 16.2426 10.2426C17.3679 9.11742 18 7.5913 18 6ZM3.75 22.5C3.75 19.1859 6.43594 16.5 9.75 16.5H14.25C17.5641 16.5 20.25 19.1859 20.25 22.5V22.875C20.25 23.4984 20.7516 24 21.375 24C21.9984 24 22.5 23.4984 22.5 22.875V22.5C22.5 17.9438 18.8062 14.25 14.25 14.25H9.75C5.19375 14.25 1.5 17.9438 1.5 22.5V22.875C1.5 23.4984 2.00156 24 2.625 24C3.24844 24 3.75 23.4984 3.75 22.875V22.5Z\" fill=\"#4B5563\"/>\n </svg>\n);\n\n// Clear/X icon for clearing fields (16x16)\nconst ClearIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"16\" viewBox=\"0 0 24 16\" fill=\"none\">\n <path d=\"M8.55417 0C7.84583 0 7.16667 0.279167 6.66667 0.779167L0.391667 7.05833C0.141667 7.30833 0 7.64583 0 8C0 8.35417 0.141667 8.69167 0.391667 8.94167L6.66667 15.2208C7.16667 15.7208 7.84583 16 8.55417 16H21.3333C22.8042 16 24 14.8042 24 13.3333V2.66667C24 1.19583 22.8042 0 21.3333 0H8.55417ZM22 2.66667V13.3333C22 13.7 21.7 14 21.3333 14H8.55417C8.37917 14 8.20833 13.9292 8.08333 13.8042L2.275 8L8.07917 2.19583C8.20417 2.07083 8.375 2 8.55 2H21.3333C21.7 2 22 2.3 22 2.66667ZM11.8375 5.17083C11.4458 5.5625 11.4458 6.19583 11.8375 6.58333L13.25 7.99583L11.8375 9.40833C11.4458 9.8 11.4458 10.4333 11.8375 10.8208C12.2292 11.2083 12.8625 11.2125 13.25 10.8208L14.6625 9.40833L16.075 10.8208C16.4667 11.2125 17.1 11.2125 17.4875 10.8208C17.875 10.4292 17.8792 9.79583 17.4875 9.40833L16.075 7.99583L17.4875 6.58333C17.8792 6.19167 17.8792 5.55833 17.4875 5.17083C17.0958 4.78333 16.4625 4.77917 16.075 5.17083L14.6625 6.58333L13.25 5.17083C12.8583 4.77917 12.225 4.77917 11.8375 5.17083Z\" fill=\"#1F2937\"/>\n </svg>\n);\n\n/**\n * SearchControlsBar - Search controls for location, guests, and dates\n *\n * Figma Specs:\n * - Desktop (667:91963): 3 sections with dividers + Search button + List/Map toggle\n * - Mobile (568:45301): Compact summary box (tappable to open modal)\n */\n\nexport type ViewMode = 'list' | 'map';\n\nexport interface SearchControlsBarProps {\n onSearch: (params: SearchParams) => void;\n onGuestChange: (params: GuestCounts) => void;\n onQueryChange?: (query: string) => void;\n onDateRangeChange?: (dateRange: DateRange | null) => void;\n onMonthFilterChange?: (monthFilter: string[] | null) => void;\n /** Called for location autocomplete API calls - inject your API function */\n onAutocomplete?: (query: string) => Promise<LocationSuggestion[]>;\n getGuestsDisplay: () => string;\n getDateDisplay: () => string;\n onMobileClick?: () => void;\n onFilterClick?: () => void;\n onSortClick?: () => void;\n initialQuery?: string;\n initialGuests?: GuestCounts;\n initialPetFilter?: number;\n initialDateRange?: DateRange | null;\n initialMonthFilter?: string[] | null;\n disabled?: boolean;\n viewMode?: ViewMode;\n onViewModeChange?: (mode: ViewMode) => void;\n /** Hide the list/map view toggle (used in fullscreen map view) */\n hideViewToggle?: boolean;\n /** Compact mode - auto width based on content (used in map view header) */\n compact?: boolean;\n}\n\nexport interface SearchParams {\n query: string;\n destinationMode?: string;\n guests: GuestCounts;\n petFilter: number;\n dateRange: DateRange | null;\n monthFilter: string[] | null;\n coordinates?: { lat: number; lng: number } | null; // For \"Near me\" search\n regionsFilter?: string[];\n}\n\nexport const SearchControlsBar: React.FC<SearchControlsBarProps> = ({\n onSearch,\n onGuestChange,\n onQueryChange,\n onDateRangeChange,\n onMonthFilterChange,\n onAutocomplete,\n getGuestsDisplay,\n getDateDisplay,\n onMobileClick,\n onFilterClick,\n onSortClick,\n initialQuery = '',\n initialGuests = { adults: 2, children: 0, childrenAges: [] },\n initialPetFilter = 0,\n initialDateRange = null,\n initialMonthFilter = null,\n disabled = false,\n viewMode = 'list',\n onViewModeChange,\n hideViewToggle = false,\n compact = false,\n}) => {\n const { isDesktop } = useResponsive();\n const { t } = useUIContext();\n\n // Local state for form inputs\n const [query, setQuery] = useState(initialQuery);\n const [guests, setGuests] = useState<GuestCounts>(initialGuests);\n const [petFilter, setPetFilter] = useState<number>(initialPetFilter);\n const [dateRange, setDateRange] = useState<DateRange | null>(initialDateRange);\n const [monthFilter, setMonthFilter] = useState<string[] | null>(initialMonthFilter);\n const [childAgeErrors, setChildAgeErrors] = useState<ChildAgeError[]>([]);\n\n useEffect(() => {\n setGuests(initialGuests);\n setQuery(initialQuery);\n setDateRange(initialDateRange);\n setMonthFilter(initialMonthFilter);\n }, [initialGuests, initialQuery, initialDateRange, initialMonthFilter]);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n // Validate the Guests filter, child age selections\n const validationErrors = validateChildrenAges();\n if (validationErrors.length > 0) {\n setChildAgeErrors(validationErrors);\n return;\n }\n\n onSearch({\n query: query.trim(), // Empty string means \"search all\" - \"Anywhere\" is display-only\n guests,\n petFilter,\n dateRange,\n monthFilter,\n });\n };\n\n const onGuestFilterChange = (guests: GuestCounts) => {\n setGuests(guests);\n };\n\n const validateChildrenAges = (): ChildAgeError[] => {\n const validationErrors: ChildAgeError[] = [];\n\n // Ensure childrenAges is an array\n const childrenAges = Array.isArray(guests.childrenAges) ? guests.childrenAges : [];\n\n // Iterate based on children count, not childrenAges length\n // This handles cases where array is out of sync (fast clicking, URL init)\n for (let index = 0; index < guests.children; index++) {\n const age = childrenAges[index];\n if (age === null || age === undefined) {\n validationErrors.push({\n index,\n message: t('form.age-error')\n });\n }\n }\n\n return validationErrors;\n };\n\n // Format location display\n const getLocationDisplay = () => {\n return query.trim() || t('label.anywhere');\n };\n\n // Clear handlers - also trigger search after clearing\n const handleClearLocation = (e: React.MouseEvent) => {\n e.stopPropagation();\n setQuery('');\n // Trigger search with cleared location\n onSearch({\n query: '',\n guests,\n petFilter,\n dateRange,\n monthFilter,\n });\n };\n\n const handleClearDate = (e: React.MouseEvent) => {\n e.stopPropagation();\n setDateRange(null);\n setMonthFilter(null);\n // Trigger search with cleared dates\n onSearch({\n query: query.trim(),\n guests,\n petFilter,\n dateRange: null,\n monthFilter: null,\n });\n };\n\n const handleClearGuests = (e: React.MouseEvent) => {\n e.stopPropagation();\n const defaultGuests = { adults: 2, children: 0, childrenAges: [] };\n setGuests(defaultGuests);\n // Trigger search with reset guests\n onSearch({\n query: query.trim(),\n guests: defaultGuests,\n petFilter,\n dateRange,\n monthFilter,\n });\n };\n\n const handleQueryChange = (query: string) => {\n setQuery(query);\n // onQueryChange?.(query);\n };\n\n // Auto-submit when date dropdown closes (clicked outside)\n const handleDateDropdownClose = (newDateRange: DateRange | null, newMonthFilter: string[] | null) => {\n // Update local state first\n setDateRange(newDateRange);\n setMonthFilter(newMonthFilter);\n\n // Validate children ages first\n const validationErrors = validateChildrenAges();\n if (validationErrors.length > 0) {\n setChildAgeErrors(validationErrors);\n return;\n }\n\n onSearch({\n query: query.trim(),\n guests,\n petFilter,\n dateRange: newDateRange,\n monthFilter: newMonthFilter,\n });\n };\n\n // Auto-submit when guest dropdown closes (clicked outside)\n const handleGuestDropdownClose = (newGuests: GuestCounts, newPetFilter: number) => {\n // Update local state first\n setGuests(newGuests);\n setPetFilter(newPetFilter);\n\n // Validate children ages with the new guests values\n const childrenAges = Array.isArray(newGuests.childrenAges) ? newGuests.childrenAges : [];\n const validationErrors: ChildAgeError[] = [];\n for (let index = 0; index < newGuests.children; index++) {\n const age = childrenAges[index];\n if (age === null || age === undefined) {\n validationErrors.push({ index, message: t('form.age-error') });\n }\n }\n if (validationErrors.length > 0) {\n setChildAgeErrors(validationErrors);\n return;\n }\n\n onSearch({\n query: query.trim(),\n guests: newGuests,\n petFilter: newPetFilter,\n dateRange,\n monthFilter,\n });\n };\n\n // Check if fields have non-default values\n const hasLocation = query.trim() !== '';\n const hasDateFilter = dateRange !== null || (monthFilter !== null && monthFilter.length > 0);\n const hasNonDefaultGuests = guests.adults !== 2 || guests.children !== 0;\n\n // Mobile: Compact summary view (tappable) + action bar\n if (!isDesktop) {\n return (\n <div className={styles.mobileContainer}>\n {/* Search summary box */}\n <button\n type=\"button\"\n className={styles.mobileSummary}\n onClick={onMobileClick}\n disabled={disabled}\n >\n <span className={styles.mobileSummaryIcon}>\n <SearchIcon />\n </span>\n <div className={styles.mobileSummaryText}>\n <span className={styles.mobileSummaryTitle}>\n {getLocationDisplay()}\n </span>\n <span className={styles.mobileSummarySubtitle}>\n {getDateDisplay()} · {getGuestsDisplay()}\n </span>\n </div>\n </button>\n\n {/* Action bar - Filter/Sort/Map (list view) or Filter/List (map view) */}\n {/* Hidden in fullscreen map view or compact mode (mobile app) */}\n {!hideViewToggle && !compact && (\n <div className={styles.mobileActionBar}>\n {/* Filter button */}\n <button\n type=\"button\"\n className={styles.mobileActionButton}\n onClick={onFilterClick}\n disabled={disabled}\n >\n <FilterIcon />\n <span>{t('label.filter')}</span>\n </button>\n\n <div className={styles.mobileActionDivider} />\n\n {/* Sort button - only in list view */}\n {viewMode === 'list' && (\n <>\n <button\n type=\"button\"\n className={styles.mobileActionButton}\n onClick={onSortClick}\n disabled={disabled}\n >\n <SortIcon />\n <span>{t('label.sort')}</span>\n </button>\n\n <div className={styles.mobileActionDivider} />\n </>\n )}\n\n {/* Map button - opens map view */}\n <button\n type=\"button\"\n className={styles.mobileActionButton}\n onClick={() => onViewModeChange?.('map')}\n disabled={disabled}\n >\n <MobileMapIcon />\n <span>{t('label.map')}</span>\n </button>\n </div>\n )}\n </div>\n );\n }\n\n // Desktop: Full search bar with inputs\n return (\n <form onSubmit={handleSubmit} className={`${styles.container} ${compact ? styles.containerCompact : ''}`}>\n {/* White container with 3 sections */}\n <div className={styles.inputsContainer}>\n {/* Location input - icon and clear button are handled by LocationAutocomplete */}\n <div className={styles.inputWrapper}>\n <LocationAutocomplete\n value={query}\n onChange={handleQueryChange}\n onAutocomplete={onAutocomplete}\n onSubmit={(selectedValue, coordinates, regionId, setQueryValue, destinationMode) => {\n // Trigger search when location is selected from dropdown\n // When coordinates provided (Near me), use empty query for geo-search\n // The selectedValue is just for display in the input field\n onSearch({\n query: !setQueryValue ? '' : selectedValue.trim(),\n guests,\n petFilter,\n dateRange,\n monthFilter,\n coordinates,\n regionsFilter: regionId ? [`region_${regionId}`] : [],\n destinationMode\n });\n }}\n placeholder={t('label.anywhere')}\n disabled={disabled}\n className={styles.input}\n />\n </div>\n\n {/* Divider */}\n <div className={styles.divider} />\n\n {/* Date selector */}\n <div className={styles.controlWrapper}>\n <DateSelector\n initialDateRange={dateRange || { start: null, end: null }}\n initialMonthFilter={monthFilter}\n onChange={(dateRange) => {\n setDateRange(dateRange);\n onDateRangeChange?.(dateRange);\n }}\n onMonthFilterChange={(months) => {\n setMonthFilter(months);\n onMonthFilterChange?.(months);\n }}\n onClose={handleDateDropdownClose}\n disabled={disabled}\n className={styles.control}\n icon={<CalendarIcon />}\n />\n {hasDateFilter && (\n <button\n type=\"button\"\n className={styles.clearButton}\n onClick={handleClearDate}\n aria-label={t('label.clear', 'Clear date')}\n >\n <ClearIcon />\n </button>\n )}\n </div>\n\n {/* Divider */}\n <div className={styles.divider} />\n\n {/* Guest selector */}\n <div className={styles.controlWrapper} data-test='test'>\n <GuestSelector\n initialGuests={guests}\n initialPetValue={petFilter}\n onChange={onGuestFilterChange}\n onPetChange={setPetFilter}\n onClose={handleGuestDropdownClose}\n disabled={disabled}\n className={styles.control}\n icon={<GuestsIcon />}\n childAgeErrors={childAgeErrors as ChildAgeError[]}\n />\n {hasNonDefaultGuests && (\n <button\n type=\"button\"\n className={styles.clearButton}\n onClick={handleClearGuests}\n aria-label={t('label.clear', 'Clear guests')}\n >\n <ClearIcon />\n </button>\n )}\n </div>\n\n {/* Search button - inside the inputs container per Figma */}\n <div className={styles.buttonWrapper}>\n <Button\n variant=\"primary\"\n size=\"small\"\n type=\"submit\"\n disabled={disabled}\n >\n {t('button.search')}\n </Button>\n </div>\n </div>\n </form>\n );\n};\n","import React, { useState, useRef } from 'react';\nimport type { HotelCardImageProps } from './HotelCard.types';\nimport './HotelCard.css';\n\nconst MAX_IMAGES = 5;\nconst SWIPE_THRESHOLD = 50;\n\n// Placeholder for failed images\nconst HOTEL_PLACEHOLDER = 'data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"400\" height=\"300\" fill=\"%23e5e7eb\"%3E%3Crect width=\"400\" height=\"300\" /%3E%3C/svg%3E';\n\n// Building icon for \"New\" badge\nconst BuildingIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <g clipPath=\"url(#clip0_building)\">\n <path d=\"M0.75 0C0.334375 0 0 0.334375 0 0.75C0 1.16562 0.334375 1.5 0.75 1.5H1V14.5H0.75C0.334375 14.5 0 14.8344 0 15.25C0 15.6656 0.334375 16 0.75 16H15.25C15.6656 16 16 15.6656 16 15.25C16 14.8344 15.6656 14.5 15.25 14.5H15V1.5H15.25C15.6656 1.5 16 1.16562 16 0.75C16 0.334375 15.6656 0 15.25 0H0.75ZM13.5 14.5H9V12H10.5C10.775 12 11.0031 11.775 10.9594 11.5031C10.7219 10.0844 9.4875 9 8 9C6.5125 9 5.27813 10.0813 5.04063 11.5031C4.99375 11.775 5.22188 12 5.5 12H7V14.5H2.5V1.5H13.5V14.5ZM4.5 3C4.225 3 4 3.225 4 3.5V4.5C4 4.775 4.225 5 4.5 5H5.5C5.775 5 6 4.775 6 4.5V3.5C6 3.225 5.775 3 5.5 3H4.5ZM7 3.5V4.5C7 4.775 7.225 5 7.5 5H8.5C8.775 5 9 4.775 9 4.5V3.5C9 3.225 8.775 3 8.5 3H7.5C7.225 3 7 3.225 7 3.5ZM10.5 3C10.225 3 10 3.225 10 3.5V4.5C10 4.775 10.225 5 10.5 5H11.5C11.775 5 12 4.775 12 4.5V3.5C12 3.225 11.775 3 11.5 3H10.5ZM4 6.5V7.5C4 7.775 4.225 8 4.5 8H5.5C5.775 8 6 7.775 6 7.5V6.5C6 6.225 5.775 6 5.5 6H4.5C4.225 6 4 6.225 4 6.5ZM7.5 6C7.225 6 7 6.225 7 6.5V7.5C7 7.775 7.225 8 7.5 8H8.5C8.775 8 9 7.775 9 7.5V6.5C9 6.225 8.775 6 8.5 6H7.5ZM10 6.5V7.5C10 7.775 10.225 8 10.5 8H11.5C11.775 8 12 7.775 12 7.5V6.5C12 6.225 11.775 6 11.5 6H10.5C10.225 6 10 6.225 10 6.5Z\" fill=\"white\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_building\">\n <rect width=\"16\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Arrow icons\nconst ArrowLeftIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M12.5 15L7.5 10L12.5 5\" stroke=\"#1F2937\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nconst ArrowRightIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M7.5 15L12.5 10L7.5 5\" stroke=\"#1F2937\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\n// Heart icon\nconst HeartIcon = ({ filled }: { filled: boolean }) => (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={filled ? 'hc-hotel-card__heart-icon--filled' : 'hc-hotel-card__heart-icon'}\n >\n <g clipPath=\"url(#clip0_heart)\">\n <path\n d=\"M12.7031 4.58281C13.875 2.96094 15.7594 2 17.7609 2C21.2062 2 24 4.79375 24 8.23906C24 11.4547 21.9891 14.2812 20.2922 16.3391C18.225 18.8516 15.7313 21.0312 14.0203 22.3344C13.4438 22.775 12.7312 22.9953 12 22.9953C11.2688 22.9953 10.5562 22.775 9.97969 22.3344C8.26875 21.0312 5.775 18.8516 3.70781 16.3438C2.01094 14.2859 0 11.4547 0 8.23906C0 4.79375 2.79375 2 6.23906 2C8.24063 2 10.125 2.96094 11.2969 4.58281L12 5.55313L12.7031 4.58281Z\"\n fill=\"white\"\n />\n <path\n d=\"M17.7609 4.25C16.4812 4.25 15.2766 4.86406 14.5266 5.9L12.9141 8.13125C12.7031 8.42188 12.3656 8.59531 12.0047 8.59531C11.6438 8.59531 11.3062 8.42188 11.0953 8.13125L9.48281 5.9C8.73281 4.86406 7.52813 4.25 6.24844 4.25C4.04531 4.25 2.25938 6.03594 2.25938 8.23906C2.25938 10.5781 3.75938 12.8516 5.45156 14.9094C7.37813 17.2531 9.73594 19.3156 11.3531 20.5484C11.5031 20.6609 11.7234 20.7453 12.0094 20.7453C12.2953 20.7453 12.5156 20.6609 12.6656 20.5484C14.2828 19.3156 16.6406 17.2484 18.5672 14.9094C20.2641 12.8516 21.7594 10.5781 21.7594 8.23906C21.7594 6.03594 19.9734 4.25 17.7703 4.25H17.7609ZM12.7031 4.58281C13.875 2.96094 15.7594 2 17.7609 2C21.2062 2 24 4.79375 24 8.23906C24 11.4547 21.9891 14.2812 20.2922 16.3391C18.225 18.8516 15.7313 21.0312 14.0203 22.3344C13.4438 22.775 12.7312 22.9953 12 22.9953C11.2688 22.9953 10.5562 22.775 9.97969 22.3344C8.26875 21.0312 5.775 18.8516 3.70781 16.3438C2.01094 14.2859 0 11.4547 0 8.23906C0 4.79375 2.79375 2 6.23906 2C8.24063 2 10.125 2.96094 11.2969 4.58281L12 5.55313L12.7031 4.58281Z\"\n fill=\"#4B5563\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_heart\">\n <rect width=\"24\" height=\"24\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n);\n\nexport const HotelCardImage: React.FC<HotelCardImageProps> = ({\n images,\n hotelName,\n badges,\n isFavorite,\n onFavoriteClick,\n}) => {\n // Accessibility labels\n const labels = {\n removeFromFavorites: 'Remove from favorites',\n addToFavorites: 'Add to favorites',\n previousImage: 'Previous image',\n nextImage: 'Next image',\n };\n const displayImages = images.slice(0, MAX_IMAGES);\n const [currentImageIndex, setCurrentImageIndex] = useState(0);\n const [failedImages, setFailedImages] = useState<Set<number>>(new Set());\n const [touchStart, setTouchStart] = useState<number | null>(null);\n const [touchEnd, setTouchEnd] = useState<number | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n const imageRef = useRef<HTMLDivElement>(null);\n\n const handleImageError = (index: number) => {\n setFailedImages(prev => new Set(prev).add(index));\n };\n\n const getImageSrc = (index: number) => {\n if (failedImages.has(index)) return HOTEL_PLACEHOLDER;\n return displayImages[index] || HOTEL_PLACEHOLDER;\n };\n\n const goToPreviousImage = () => {\n setCurrentImageIndex(prev => prev === 0 ? displayImages.length - 1 : prev - 1);\n };\n\n const goToNextImage = () => {\n setCurrentImageIndex(prev => prev === displayImages.length - 1 ? 0 : prev + 1);\n };\n\n const handlePrevImage = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n goToPreviousImage();\n };\n\n const handleNextImage = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n goToNextImage();\n };\n\n // Touch handlers for swipe\n const handleTouchStart = (e: React.TouchEvent) => {\n e.stopPropagation();\n setTouchEnd(null);\n setTouchStart(e.targetTouches[0].clientX);\n setIsDragging(true);\n };\n\n const handleTouchMove = (e: React.TouchEvent) => {\n e.stopPropagation();\n if (!touchStart) return;\n setTouchEnd(e.targetTouches[0].clientX);\n };\n\n const handleTouchEnd = (e: React.TouchEvent) => {\n e.stopPropagation();\n setIsDragging(false);\n if (!touchStart || !touchEnd) return;\n\n const distance = touchStart - touchEnd;\n if (distance > SWIPE_THRESHOLD) goToNextImage();\n else if (distance < -SWIPE_THRESHOLD) goToPreviousImage();\n\n setTouchStart(null);\n setTouchEnd(null);\n };\n\n const handleFavorite = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onFavoriteClick();\n };\n\n return (\n <div\n className=\"hc-hotel-card__image-section\"\n ref={imageRef}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n style={{ cursor: isDragging ? 'grabbing' : 'grab' }}\n >\n <img\n src={getImageSrc(currentImageIndex)}\n alt={`${hotelName} - Image ${currentImageIndex + 1} of ${displayImages.length}`}\n className=\"hc-hotel-card__image\"\n loading=\"lazy\"\n onError={() => handleImageError(currentImageIndex)}\n draggable=\"false\"\n />\n\n <div className=\"hc-hotel-card__image-overlay\" />\n\n <div className=\"hc-hotel-card__top-overlay\">\n <div className=\"hc-hotel-card__badges-column\">\n {badges?.map((badge, index) => (\n <div key={index} className=\"hc-hotel-card__new-badge\">\n <BuildingIcon />\n <span>{badge}</span>\n </div>\n ))}\n </div>\n\n <button\n className=\"hc-hotel-card__favorite-button\"\n onClick={handleFavorite}\n aria-label={isFavorite ? labels.removeFromFavorites : labels.addToFavorites}\n type=\"button\"\n >\n <HeartIcon filled={isFavorite} />\n </button>\n </div>\n\n {displayImages.length > 1 && (\n <>\n <button\n className=\"hc-hotel-card__nav-button hc-hotel-card__nav-button--left\"\n onClick={handlePrevImage}\n aria-label={labels.previousImage}\n type=\"button\"\n >\n <ArrowLeftIcon />\n </button>\n\n <button\n className=\"hc-hotel-card__nav-button hc-hotel-card__nav-button--right\"\n onClick={handleNextImage}\n aria-label={labels.nextImage}\n type=\"button\"\n >\n <ArrowRightIcon />\n </button>\n\n <div className=\"hc-hotel-card__image-indicator\">\n {displayImages.map((_, index) => (\n <span\n key={index}\n className={`hc-hotel-card__indicator-dot ${\n index === currentImageIndex ? 'hc-hotel-card__indicator-dot--active' : ''\n }`}\n />\n ))}\n </div>\n </>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { useUIContext } from '../../context';\nimport type { HotelCardContentProps } from './HotelCard.types';\nimport './HotelCard.css';\n\n// Star icon - 9x9\nconst StarIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\">\n <g clipPath=\"url(#clip0_star)\">\n <path d=\"M4.80018 0.366577C4.93104 0.366577 5.05173 0.440968 5.11135 0.557659L6.18011 2.66102L8.50521 3.03152C8.63462 3.05194 8.74222 3.14383 8.78294 3.26927C8.82365 3.39472 8.79021 3.53183 8.6986 3.62518L7.03366 5.29533L7.40155 7.6277C7.42191 7.75752 7.3681 7.88879 7.26195 7.9661C7.15581 8.04341 7.01476 8.05508 6.89843 7.99528L4.80018 6.92463L2.70192 7.99528C2.58559 8.05508 2.44454 8.04341 2.33839 7.9661C2.23225 7.88879 2.17844 7.75898 2.1988 7.6277L2.56523 5.29533L0.901751 3.62518C0.808689 3.53183 0.776699 3.39472 0.817413 3.26927C0.858128 3.14383 0.964277 3.05194 1.09515 3.03152L3.42024 2.66102L4.49045 0.557659C4.55007 0.440968 4.67076 0.366577 4.80163 0.366577H4.80018Z\" fill=\"#1F2937\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_star\">\n <rect width=\"8\" height=\"8\" fill=\"white\" transform=\"translate(0.800049 0.199951)\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Pin icon\nconst PinIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8 1.5C5.51562 1.5 3.5 3.51562 3.5 6C3.5 9.5 8 14 8 14C8 14 12.5 9.5 12.5 6C12.5 3.51562 10.4844 1.5 8 1.5ZM8 7.75C7.0325 7.75 6.25 6.9675 6.25 6C6.25 5.0325 7.0325 4.25 8 4.25C8.9675 4.25 9.75 5.0325 9.75 6C9.75 6.9675 8.9675 7.75 8 7.75Z\" fill=\"#6B7280\"/>\n </svg>\n);\n\n// Breakfast icon\nconst BreakfastIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <g clipPath=\"url(#clip0_breakfast)\">\n <path d=\"M8 1.5C9.525 1.5 10.9281 2.025 12.0344 2.90313L9.4125 5.525L7.975 1.5H8ZM13.0969 3.96563C13.4656 4.43125 13.7719 4.94687 14.0031 5.5H11.5625L13.0969 3.96563ZM10.0594 7H14.3969C15.1875 7 15.8563 6.23438 15.5656 5.39375C14.4844 2.25625 11.5062 0 8 0C3.58125 0 0 3.58125 0 8C0 11.5062 2.25625 14.4844 5.39375 15.5656C6.23438 15.8563 7 15.1875 7 14.3969V10.0594L7.12187 9.9375L7.39375 10.0531C7.8625 10.2531 8.40938 10.15 8.76875 9.7875L9.80625 8.75C10.1469 8.40938 10.2625 7.9 10.1 7.44688L9.97188 7.0875L10.0625 6.99687L10.0594 7ZM5.6375 9.30313L2.90313 12.0344C2.025 10.925 1.5 9.52188 1.5 8C1.5 7.84375 1.50625 7.69062 1.51562 7.5375L5.63438 9.30313H5.6375ZM3.96563 13.0969L5.5 11.5625V14.0031C4.94375 13.7719 4.42813 13.4656 3.96563 13.0969ZM1.80313 6.02812C2.48438 3.8875 4.24687 2.225 6.45 1.6875L8.63437 7.80625L7.82812 8.6125L1.80313 6.03125V6.02812Z\" fill=\"#006962\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_breakfast\">\n <rect width=\"16\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Free cancellation icon\nconst FreeCancellationIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M0.838695 4.18584L2.62218 6.00458C2.85502 6.24202 3.23153 6.24202 3.4619 6.00458C3.69227 5.76713 3.69474 5.38317 3.4619 5.14825L2.69401 4.36518L3.66406 4.36518C3.9974 4.36518 4.33073 4.36518 4.37346 4.36518C4.66406 4.36518 4.66406 4.36518 4.9974 4.36518L5.22309 4.36518H5.22804H11.5644C11.5644 5.25687 12.2753 5.98184 13.1497 5.98184V8.61902C13.5386 8.66196 13.9151 8.83625 14.2123 9.13938L14.3387 9.26821V4.76682C14.3387 3.87513 13.6278 3.15016 12.7533 3.15016H4.37346H2.69649L3.46438 2.3671C3.69722 2.12965 3.69722 1.74569 3.46438 1.51077C3.23153 1.27585 2.85502 1.27332 2.62218 1.50825L0.838695 3.32699C0.605852 3.56443 0.605852 3.94839 0.838695 4.18331V4.18584ZM1.65612 6.73207V11.2335C1.65612 12.1251 2.36704 12.8501 3.24144 12.8501H13.3008L12.5329 13.6332C12.3 13.8706 12.3 14.2546 12.5329 14.4895C12.7657 14.7244 13.1422 14.727 13.3726 14.4895L15.1561 12.6708C15.3889 12.4333 15.3889 12.0494 15.1561 11.8144L13.3726 9.9957C13.1398 9.75826 12.7633 9.75826 12.5329 9.9957C12.3025 10.2331 12.3 10.6171 12.5329 10.852L13.3008 11.6351L12.3307 11.6351C11.974 11.6351 11.9036 11.6351 11.737 11.6351C11.6641 11.6351 11.6354 11.6351 11.5644 11.6351H4.43043C4.43043 10.7434 3.71952 10.0184 2.84511 10.0184V7.38126C2.45622 7.33832 2.0797 7.16402 1.78245 6.8609L1.65612 6.73207ZM10.3754 8.00014C10.3754 7.35699 10.1248 6.74019 9.67888 6.28541C9.23292 5.83064 8.62807 5.57515 7.9974 5.57515C7.36672 5.57515 6.76187 5.83064 6.31591 6.28541C5.86996 6.74019 5.61942 7.35699 5.61942 8.00014C5.61942 8.64329 5.86996 9.26009 6.31591 9.71486C6.76187 10.1696 7.36672 10.4251 7.9974 10.4251C8.62807 10.4251 9.23292 10.1696 9.67888 9.71486C10.1248 9.26009 10.3754 8.64329 10.3754 8.00014Z\" fill=\"#006962\"/>\n </svg>\n);\n\n// Checkmark icon (default)\nconst CheckmarkIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M13.5 4.5L6 12L2.5 8.5\" stroke=\"#006962\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\n// Rating badge SVG (blue speech bubble)\nconst RatingBadgeSvg = () => (\n <svg width=\"32\" height=\"24\" viewBox=\"0 0 36 38\" fill=\"#478EFA\" className=\"hc-hotel-card__rating-badge-bg\">\n <path d=\"M4 0C1.79086 0 0 1.79086 0 4V32V38L9 32H32C34.2091 32 36 30.2091 36 28V0H4Z\"/>\n </svg>\n);\n\nexport const HotelCardContent: React.FC<HotelCardContentProps> = ({\n name,\n stars,\n isSuperior = false,\n rating,\n location,\n benefits,\n price,\n currency = 'CHF',\n isAvailable = true,\n onClick,\n}) => {\n const { t } = useUIContext();\n\n // Get translations from context\n const labels = {\n ratingExcellent: t('label.rating-excellent', 'Excellent'),\n ratingVeryGood: t('label.rating-very-good', 'Very good'),\n ratingGood: t('label.rating-good', 'Good'),\n ratingFair: t('label.rating-fair', 'Fair'),\n rating: t('label.rating', 'Rating'),\n priceFrom: t('label.per-room-night', 'per room & night from'),\n notAvailable: t('general.unavailable-for-selected-days', 'Not available'),\n swissLodge: 'Swiss Lodge',\n };\n\n const getRatingCategory = (score: number): string => {\n if (score >= 4.4) return labels.ratingExcellent;\n if (score >= 4.1) return labels.ratingVeryGood;\n if (score >= 3.8) return labels.ratingGood;\n if (score >= 3.5) return labels.ratingFair;\n return labels.rating;\n };\n\n const getBenefitIcon = (benefitId: string) => {\n switch (benefitId) {\n case 'free-breakfast':\n return <BreakfastIcon />;\n case 'free-cancellation':\n return <FreeCancellationIcon />;\n default:\n return <CheckmarkIcon />;\n }\n };\n\n const getBenefitLabel = (benefit: { id: string; label: string }) => {\n switch (benefit.id) {\n case 'free-breakfast':\n return t('general.breakfast-included', 'Breakfast included');\n case 'free-cancellation':\n return t('general.free-cancellation', 'Free cancellation');\n default:\n return benefit.label;\n }\n };\n\n const getStarRating = (starRating: number) => {\n if (!starRating || starRating <= 0) return null;\n if (starRating === 6) return <span className=\"hc-hotel-card__swiss-lodge\">{labels.swissLodge}</span>;\n\n const starCount = Math.min(Math.floor(starRating), 5);\n return (\n <>\n {Array.from({ length: starCount }, (_, index) => (\n <StarIcon key={index} />\n ))}\n </>\n );\n };\n\n return (\n <div\n className=\"hc-hotel-card__content\"\n onClick={onClick}\n style={{ cursor: onClick ? 'pointer' : undefined }}\n >\n {/* Star rating and TrustYou rating */}\n <div className=\"hc-hotel-card__header-section\">\n <div className=\"hc-hotel-card__rating-section\">\n <div className=\"hc-hotel-card__stars\">\n {getStarRating(stars)}\n {isSuperior && <span className=\"hc-hotel-card__stars-indicator\">(s)</span>}\n </div>\n\n {rating > 0 && (\n <div className=\"hc-hotel-card__rating-wrapper\">\n <span className=\"hc-hotel-card__rating-text\">{getRatingCategory(rating)}</span>\n <div className=\"hc-hotel-card__rating-badge\">\n <RatingBadgeSvg />\n <span className=\"hc-hotel-card__rating-number\">{rating.toFixed(1)}</span>\n </div>\n </div>\n )}\n </div>\n\n <h3 className=\"hc-hotel-card__hotel-name\">{name}</h3>\n </div>\n\n {/* Location */}\n <div className=\"hc-hotel-card__location-section\">\n <span className=\"hc-hotel-card__pin-icon\"><PinIcon /></span>\n <span className=\"hc-hotel-card__location\">{location}</span>\n </div>\n\n {/* Benefits and Pricing - side by side on desktop */}\n <div className=\"hc-hotel-card__benefits-and-pricing\">\n {/* Benefits */}\n {benefits.length > 0 && (\n <div className=\"hc-hotel-card__benefits-section\">\n {benefits.slice(0, 3).map((benefit, index) => (\n <div key={index} className=\"hc-hotel-card__benefit\">\n <span className=\"hc-hotel-card__benefit-icon\">\n {getBenefitIcon(benefit.id)}\n </span>\n <span className=\"hc-hotel-card__benefit-text\">{getBenefitLabel(benefit)}</span>\n </div>\n ))}\n </div>\n )}\n\n {/* Pricing */}\n <div className=\"hc-hotel-card__pricing-section\">\n {isAvailable && (\n <div className=\"hc-hotel-card__price-label\">{labels.priceFrom}</div>\n )}\n\n {!isAvailable && (\n <div className=\"hc-hotel-card__not-available\">{labels.notAvailable}</div>\n )}\n\n {isAvailable && (\n <div className=\"hc-hotel-card__price-container\">\n <span className=\"hc-hotel-card__current-price\">{`${currency} ${price.current}`}</span>\n {price.original && price.original > price.current && (\n <span className=\"hc-hotel-card__original-price\">{`${currency} ${price.original}`}</span>\n )}\n {price.discount && price.discount > 0 && (\n <span className=\"hc-hotel-card__discount-badge\">-{price.discount} %</span>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { BaseCard } from '../BaseCard';\nimport { HotelCardImage } from './HotelCardImage';\nimport { HotelCardContent } from './HotelCardContent';\nimport type { HotelCardProps } from './HotelCard.types';\nimport './HotelCard.css';\n\n/**\n * HotelCard Component\n *\n * A presentational card component for displaying hotel information in search results.\n * Built on BaseCard for consistent card styling across the app.\n * Platform-agnostic - navigation and auth logic should be handled by consuming apps.\n * Translations handled internally via UIContext.\n *\n * @example\n * ```tsx\n * <HotelCard\n * hotel={hotelData}\n * onFavoriteClick={() => toggleFavorite(hotelData.id)}\n * onContentClick={() => navigate(`/hotel/${hotelData.slug}`)}\n * />\n * ```\n */\nexport const HotelCard: React.FC<HotelCardProps> = ({\n hotel,\n onFavoriteClick,\n onContentClick,\n className,\n}) => {\n return (\n <BaseCard\n hoverable\n borderRadius={24}\n className={`hc-hotel-card ${className || ''}`}\n >\n <HotelCardImage\n images={hotel.images}\n hotelName={hotel.name}\n badges={hotel.badges}\n isFavorite={hotel.isFavorite}\n onFavoriteClick={onFavoriteClick}\n />\n\n {hotel.usp && (\n <div className=\"hc-hotel-card__usp-banner\">{hotel.usp}</div>\n )}\n\n <HotelCardContent\n name={hotel.name}\n stars={hotel.stars}\n isSuperior={hotel.isSuperior}\n rating={hotel.rating}\n location={hotel.location}\n benefits={hotel.benefits}\n price={hotel.price}\n currency={hotel.currency}\n isAvailable={hotel.isAvailable}\n onClick={onContentClick}\n />\n </BaseCard>\n );\n};\n","import React from 'react';\nimport { BaseCardSkeleton } from '../BaseCard';\nimport './HotelCardSkeleton.css';\n\n/**\n * HotelCardSkeleton - Loading placeholder for hotel cards\n *\n * Uses BaseCardSkeleton for the card shell and image,\n * with HotelCard-specific content placeholders.\n */\nexport const HotelCardSkeleton: React.FC = () => {\n return (\n <BaseCardSkeleton className=\"hc-hotel-card-skeleton--horizontal\">\n {/* Rating row */}\n <div className=\"hc-hotel-card-skeleton__rating hc-skeleton\" />\n\n {/* Hotel name */}\n <div className=\"hc-hotel-card-skeleton__name hc-skeleton\" />\n\n {/* Location */}\n <div className=\"hc-hotel-card-skeleton__location hc-skeleton\" />\n\n {/* Benefits and Pricing */}\n <div className=\"hc-hotel-card-skeleton__benefits-pricing\">\n <div className=\"hc-hotel-card-skeleton__benefits\">\n <div className=\"hc-hotel-card-skeleton__benefit hc-skeleton\" />\n </div>\n <div className=\"hc-hotel-card-skeleton__pricing\">\n <div className=\"hc-hotel-card-skeleton__price-label hc-skeleton\" />\n <div className=\"hc-hotel-card-skeleton__price-container\">\n <div className=\"hc-hotel-card-skeleton__badge hc-skeleton\" />\n <div className=\"hc-hotel-card-skeleton__price hc-skeleton\" />\n </div>\n </div>\n </div>\n </BaseCardSkeleton>\n );\n};\n\nHotelCardSkeleton.displayName = 'HotelCardSkeleton';\n","/**\n * Autocomplete API Service\n * Handles location autocomplete API calls\n */\n\nexport interface LocationSuggestion {\n type: 'hotel' | 'city' | 'region' | 'country';\n name: string;\n id?: number;\n slug?: string;\n city?: string;\n region?: string;\n}\n\n/**\n * Fetch location suggestions from the autocomplete API\n *\n * @param query - Search query string (minimum 2 characters)\n * @param apiBaseUrl - Base URL for the API\n * @param locale - Current locale for translations\n * @returns Promise resolving to array of location suggestions\n */\nexport async function autocompleteLocations(\n query: string,\n apiBaseUrl: string,\n locale: string\n): Promise<LocationSuggestion[]> {\n if (!query || query.trim().length < 2) {\n return [];\n }\n\n try {\n const response = await fetch(\n `${apiBaseUrl}/api/search/autocomplete?q=${encodeURIComponent(query)}&lang=${locale}`,\n {\n method: 'GET',\n headers: {\n 'Accept': 'application/json',\n },\n }\n );\n\n if (!response.ok) {\n console.error(`Autocomplete API error: ${response.status}`);\n return [];\n }\n\n const data = await response.json();\n\n if (!data.success || !data.suggestions) {\n return [];\n }\n\n // Map API response to our interface\n return data.suggestions.map((suggestion: {\n text: string;\n type: string;\n id?: number;\n slug?: string;\n city?: string;\n region?: string;\n }) => ({\n type: suggestion.type as LocationSuggestion['type'],\n name: suggestion.text,\n id: suggestion.id,\n slug: suggestion.slug,\n city: suggestion.city,\n region: suggestion.region,\n }));\n } catch (error) {\n console.error('Autocomplete error:', error);\n return [];\n }\n}\n","import React, { useState, useEffect, useRef, useMemo } from 'react';\nimport { useUIContext } from '../../../context';\nimport { autocompleteLocations } from '../../../services/autocomplete';\nimport styles from './LocationSearchContent.module.css';\n\n// SVG Icons matching Figma design (20x20)\n\n// Search/Location icon (24x24) - for the main input field\nconst SearchLocationIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_location_content)\">\n <path d=\"M9.75 2.25C11.7391 2.25 13.6468 3.04018 15.0533 4.4467C16.4598 5.85322 17.25 7.76088 17.25 9.75C17.25 11.7391 16.4598 13.6468 15.0533 15.0533C13.6468 16.4598 11.7391 17.25 9.75 17.25C7.76088 17.25 5.85322 16.4598 4.4467 15.0533C3.04018 13.6468 2.25 11.7391 2.25 9.75C2.25 7.76088 3.04018 5.85322 4.4467 4.4467C5.85322 3.04018 7.76088 2.25 9.75 2.25ZM9.75 19.5C12.0375 19.5 14.1422 18.7125 15.8016 17.3953L22.0781 23.6719C22.5187 24.1125 23.2312 24.1125 23.6672 23.6719C24.1031 23.2313 24.1078 22.5188 23.6672 22.0828L17.3953 15.8016C18.7125 14.1422 19.5 12.0375 19.5 9.75C19.5 4.36406 15.1359 0 9.75 0C4.36406 0 0 4.36406 0 9.75C0 15.1359 4.36406 19.5 9.75 19.5ZM13.5 8.25C13.5 6.17812 11.8219 4.5 9.75 4.5C7.67812 4.5 6 6.17812 6 8.25C6 10.5375 8.17969 13.4813 9.21562 14.7469C9.49687 15.0891 10.0031 15.0891 10.2797 14.7469C11.3156 13.4813 13.4953 10.5375 13.4953 8.25H13.5ZM8.25 8.25C8.25 7.85218 8.40804 7.47064 8.68934 7.18934C8.97064 6.90804 9.35217 6.75 9.75 6.75C10.1478 6.75 10.5294 6.90804 10.8107 7.18934C11.092 7.47064 11.25 7.85218 11.25 8.25C11.25 8.64782 11.092 9.02936 10.8107 9.31066C10.5294 9.59196 10.1478 9.75 9.75 9.75C9.35217 9.75 8.97064 9.59196 8.68934 9.31066C8.40804 9.02936 8.25 8.64782 8.25 8.25Z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_location_content\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Clear/X icon (16x16)\nconst ClearIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"16\" viewBox=\"0 0 24 16\" fill=\"none\">\n <path d=\"M8.55417 0C7.84583 0 7.16667 0.279167 6.66667 0.779167L0.391667 7.05833C0.141667 7.30833 0 7.64583 0 8C0 8.35417 0.141667 8.69167 0.391667 8.94167L6.66667 15.2208C7.16667 15.7208 7.84583 16 8.55417 16H21.3333C22.8042 16 24 14.8042 24 13.3333V2.66667C24 1.19583 22.8042 0 21.3333 0H8.55417ZM22 2.66667V13.3333C22 13.7 21.7 14 21.3333 14H8.55417C8.37917 14 8.20833 13.9292 8.08333 13.8042L2.275 8L8.07917 2.19583C8.20417 2.07083 8.375 2 8.55 2H21.3333C21.7 2 22 2.3 22 2.66667ZM11.8375 5.17083C11.4458 5.5625 11.4458 6.19583 11.8375 6.58333L13.25 7.99583L11.8375 9.40833C11.4458 9.8 11.4458 10.4333 11.8375 10.8208C12.2292 11.2083 12.8625 11.2125 13.25 10.8208L14.6625 9.40833L16.075 10.8208C16.4667 11.2125 17.1 11.2125 17.4875 10.8208C17.875 10.4292 17.8792 9.79583 17.4875 9.40833L16.075 7.99583L17.4875 6.58333C17.8792 6.19167 17.8792 5.55833 17.4875 5.17083C17.0958 4.78333 16.4625 4.77917 16.075 5.17083L14.6625 6.58333L13.25 5.17083C12.8583 4.77917 12.225 4.77917 11.8375 5.17083Z\" fill=\"#1F2937\"/>\n </svg>\n);\n\n// AllDestinationsIcon icon - viewfinder/focus corners with center circle\nconst AllDestinationsIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clipPath=\"url(#clip0_1151_67394_content)\">\n <path d=\"M8.125 1.875C9.7826 1.875 11.3723 2.53348 12.5444 3.70558C13.7165 4.87768 14.375 6.4674 14.375 8.125C14.375 9.7826 13.7165 11.3723 12.5444 12.5444C11.3723 13.7165 9.7826 14.375 8.125 14.375C6.4674 14.375 4.87768 13.7165 3.70558 12.5444C2.53348 11.3723 1.875 9.7826 1.875 8.125C1.875 6.4674 2.53348 4.87768 3.70558 3.70558C4.87768 2.53348 6.4674 1.875 8.125 1.875ZM8.125 16.25C10.0312 16.25 11.7852 15.5937 13.168 14.4961L18.3984 19.7266C18.7656 20.0937 19.3594 20.0937 19.7227 19.7266C20.0859 19.3594 20.0898 18.7656 19.7227 18.4023L14.4961 13.168C15.5937 11.7852 16.25 10.0312 16.25 8.125C16.25 3.63672 12.6133 0 8.125 0C3.63672 0 0 3.63672 0 8.125C0 12.6133 3.63672 16.25 8.125 16.25ZM11.25 6.875C11.25 5.14844 9.85156 3.75 8.125 3.75C6.39844 3.75 5 5.14844 5 6.875C5 8.78125 6.81641 11.2344 7.67969 12.2891C7.91406 12.5742 8.33594 12.5742 8.56641 12.2891C9.42969 11.2344 11.2461 8.78125 11.2461 6.875H11.25ZM6.875 6.875C6.875 6.54348 7.0067 6.22554 7.24112 5.99112C7.47554 5.7567 7.79348 5.625 8.125 5.625C8.45652 5.625 8.77446 5.7567 9.00888 5.99112C9.2433 6.22554 9.375 6.54348 9.375 6.875C9.375 7.20652 9.2433 7.52446 9.00888 7.75888C8.77446 7.9933 8.45652 8.125 8.125 8.125C7.79348 8.125 7.47554 7.9933 7.24112 7.75888C7.0067 7.52446 6.875 7.20652 6.875 6.875Z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1151_67394_content\">\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Nearme icon - person with location beacon rings (matching Figma design)\nconst NearMeIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clipPath=\"url(#clip0_nearme)\">\n <path d=\"M9.0625 2.8125C9.0625 2.56386 9.16127 2.3254 9.33709 2.14959C9.5129 1.97377 9.75136 1.875 10 1.875C10.2486 1.875 10.4871 1.97377 10.6629 2.14959C10.8387 2.3254 10.9375 2.56386 10.9375 2.8125C10.9375 3.06114 10.8387 3.2996 10.6629 3.47541C10.4871 3.65123 10.2486 3.75 10 3.75C9.75136 3.75 9.5129 3.65123 9.33709 3.47541C9.16127 3.2996 9.0625 3.06114 9.0625 2.8125ZM12.8125 2.8125C12.8125 2.06658 12.5162 1.35121 11.9887 0.823762C11.4613 0.296316 10.7459 0 10 0C9.25408 0 8.53871 0.296316 8.01126 0.823762C7.48382 1.35121 7.1875 2.06658 7.1875 2.8125C7.1875 3.55842 7.48382 4.27379 8.01126 4.80124C8.53871 5.32868 9.25408 5.625 10 5.625C10.7459 5.625 11.4613 5.32868 11.9887 4.80124C12.5162 4.27379 12.8125 3.55842 12.8125 2.8125ZM5.625 9.6875V10.7305C5.625 11.3125 5.85547 11.8672 6.26562 12.2773L6.94141 12.9531L7.32812 15.0742C7.51563 16.1133 8.42188 16.8711 9.48047 16.8711H10.5195C11.5781 16.8711 12.4844 16.1133 12.6719 15.0742L13.0586 12.9531L13.7344 12.2773C14.1445 11.8672 14.375 11.3125 14.375 10.7305V9.6875C14.375 7.78906 12.8359 6.25 10.9375 6.25H9.0625C7.16406 6.25 5.625 7.78906 5.625 9.6875ZM9.0625 8.125H10.9375C11.8008 8.125 12.5 8.82422 12.5 9.6875V10.7305C12.5 10.8125 12.4688 10.8945 12.4102 10.9531L11.5234 11.8359C11.3867 11.9688 11.2969 12.1445 11.2656 12.332L10.8281 14.7422C10.8008 14.8906 10.6719 15 10.5195 15H9.48047C9.32812 15 9.19922 14.8906 9.17188 14.7422L8.73438 12.332C8.69922 12.1445 8.60938 11.9727 8.47656 11.8359L7.59375 10.9531C7.53516 10.8945 7.50391 10.8164 7.50391 10.7305V9.6875C7.50391 8.82422 8.20312 8.125 9.06641 8.125H9.0625ZM5.23047 13.457C4.58203 13.5547 3.97266 13.6758 3.42188 13.8203C2.54688 14.0469 1.75781 14.3398 1.16406 14.7305C0.589844 15.1055 0 15.7031 0 16.5664C0 17.4297 0.589844 18.0273 1.16406 18.4023C1.75781 18.7852 2.54688 19.0781 3.42188 19.3047C5.18359 19.7617 7.53516 20 10 20C12.4648 20 14.8164 19.7617 16.5781 19.3047C17.4531 19.0781 18.2422 18.7852 18.8359 18.3945C19.4102 18.0195 20 17.4219 20 16.5586C20 15.6953 19.4102 15.0977 18.8359 14.7227C18.2422 14.3359 17.4492 14.0391 16.5781 13.8125C16.0273 13.6719 15.4219 13.5508 14.7695 13.4492L14.5625 15.3164C15.125 15.4023 15.6445 15.5078 16.1094 15.6289C18.3203 16.1992 18.3203 16.9141 16.1094 17.4844C14.5508 17.8867 12.3672 18.1172 10 18.1172C7.63281 18.1172 5.44922 17.8867 3.89062 17.4844C1.67969 16.9141 1.67969 16.1992 3.89062 15.6289C4.35547 15.5078 4.875 15.4023 5.4375 15.3164L5.23047 13.4492V13.457Z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_nearme\">\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Hotel icon - building with windows\nconst HotelIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clipPath=\"url(#clip0_1151_67415_content)\">\n <path d=\"M0.9375 0C0.417969 0 0 0.417969 0 0.9375C0 1.45703 0.417969 1.875 0.9375 1.875H1.25V18.125H0.9375C0.417969 18.125 0 18.543 0 19.0625C0 19.582 0.417969 20 0.9375 20H19.0625C19.582 20 20 19.582 20 19.0625C20 18.543 19.582 18.125 19.0625 18.125H18.75V1.875H19.0625C19.582 1.875 20 1.45703 20 0.9375C20 0.417969 19.582 0 19.0625 0H0.9375ZM16.875 18.125H11.25V15H13.125C13.4688 15 13.7539 14.7188 13.6992 14.3789C13.4023 12.6055 11.8594 11.25 10 11.25C8.14062 11.25 6.59766 12.6016 6.30078 14.3789C6.24219 14.7188 6.52734 15 6.875 15H8.75V18.125H3.125V1.875H16.875V18.125ZM5.625 3.75C5.28125 3.75 5 4.03125 5 4.375V5.625C5 5.96875 5.28125 6.25 5.625 6.25H6.875C7.21875 6.25 7.5 5.96875 7.5 5.625V4.375C7.5 4.03125 7.21875 3.75 6.875 3.75H5.625ZM8.75 4.375V5.625C8.75 5.96875 9.03125 6.25 9.375 6.25H10.625C10.9688 6.25 11.25 5.96875 11.25 5.625V4.375C11.25 4.03125 10.9688 3.75 10.625 3.75H9.375C9.03125 3.75 8.75 4.03125 8.75 4.375ZM13.125 3.75C12.7812 3.75 12.5 4.03125 12.5 4.375V5.625C12.5 5.96875 12.7812 6.25 13.125 6.25H14.375C14.7188 6.25 15 5.96875 15 5.625V4.375C15 4.03125 14.7188 3.75 14.375 3.75H13.125ZM5 8.125V9.375C5 9.71875 5.28125 10 5.625 10H6.875C7.21875 10 7.5 9.71875 7.5 9.375V8.125C7.5 7.78125 7.21875 7.5 6.875 7.5H5.625C5.28125 7.5 5 7.78125 5 8.125ZM9.375 7.5C9.03125 7.5 8.75 7.78125 8.75 8.125V9.375C8.75 9.71875 9.03125 10 9.375 10H10.625C10.9688 10 11.25 9.71875 11.25 9.375V8.125C11.25 7.78125 10.9688 7.5 10.625 7.5H9.375ZM12.5 8.125V9.375C12.5 9.71875 12.7812 10 13.125 10H14.375C14.7188 10 15 9.71875 15 9.375V8.125C15 7.78125 14.7188 7.5 14.375 7.5H13.125C12.7812 7.5 12.5 7.78125 12.5 8.125Z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1151_67415_content\">\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Location pin icon - for cities\nconst LocationIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 10.8333C11.3807 10.8333 12.5 9.71404 12.5 8.33333C12.5 6.95262 11.3807 5.83333 10 5.83333C8.61929 5.83333 7.5 6.95262 7.5 8.33333C7.5 9.71404 8.61929 10.8333 10 10.8333Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M10 18.3333C10 18.3333 16.6667 13.3333 16.6667 8.33333C16.6667 4.65143 13.6819 1.66667 10 1.66667C6.31811 1.66667 3.33334 4.65143 3.33334 8.33333C3.33334 13.3333 10 18.3333 10 18.3333Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\n// Region icon - map/area\nconst RegionIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7.5 2.5L2.5 5V17.5L7.5 15M7.5 2.5L12.5 5M7.5 2.5V15M12.5 5L17.5 2.5V15L12.5 17.5M12.5 5V17.5M12.5 17.5L7.5 15\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\n// Country icon - globe\nconst CountryIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"10\" cy=\"10\" r=\"8.25\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <path d=\"M2.5 10H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n <path d=\"M10 1.75C10 1.75 6.25 5 6.25 10C6.25 15 10 18.25 10 18.25\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n <path d=\"M10 1.75C10 1.75 13.75 5 13.75 10C13.75 15 10 18.25 10 18.25\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n);\n\nexport interface LocationSuggestion {\n id?: number;\n type: 'hotel' | 'city' | 'region' | 'country';\n name: string;\n city?: string;\n region?: string;\n latitude?: number;\n longitude?: number;\n}\n\nexport interface LocationSearchContentProps {\n /** Current search query */\n value: string;\n /** Called when query changes */\n onChange: (value: string) => void;\n /** Called when a suggestion is selected with value and optional coordinates */\n onSelect: (\n selectedValue: string,\n coordinates?: { lat: number; lng: number },\n regionId?: number,\n destinationMode?: string\n ) => void;\n /** Placeholder text for input */\n placeholder?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Display variant: 'dropdown' for desktop, 'expanded' for mobile modal */\n variant?: 'dropdown' | 'expanded';\n /** Additional class name */\n className?: string;\n /** Show input field (false when used in desktop search bar which has its own input) */\n showInput?: boolean;\n /** Ref to pass to input for external focus control */\n inputRef?: React.RefObject<HTMLInputElement>;\n}\n\n/**\n * LocationSearchContent - Shared location search UI\n *\n * Used in:\n * - Desktop search bar (as dropdown below input)\n * - Mobile search modal (as expanded section)\n * - Map view filter modal\n *\n * Features:\n * - Debounced API calls (300ms)\n * - Keyboard navigation\n * - Shows hotels, cities, and regions grouped by type\n * - Shows \"All destinations\" and \"Nearby\" options\n * - Bold text highlighting for search matches\n */\nexport const LocationSearchContent: React.FC<LocationSearchContentProps> = ({\n value,\n onChange,\n onSelect,\n placeholder,\n disabled = false,\n variant = 'dropdown',\n className = '',\n showInput = true,\n inputRef: externalInputRef,\n}) => {\n const { t, apiBaseUrl, locale } = useUIContext();\n const [suggestions, setSuggestions] = useState<LocationSuggestion[]>([]);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n const [isLoading, setIsLoading] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const [isOpen, setIsOpen] = useState(false);\n\n const internalInputRef = useRef<HTMLInputElement>(null);\n const inputRef = externalInputRef || internalInputRef;\n const debounceRef = useRef<NodeJS.Timeout>();\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Determine if icon should be \"active\" (blue)\n const isIconActive = isFocused || value.trim().length > 0;\n\n // Group suggestions by type\n const groupedSuggestions = useMemo(() => {\n const hotels = suggestions.filter(s => s.type === 'hotel');\n const cities = suggestions.filter(s => s.type === 'city');\n const regions = suggestions.filter(s => s.type === 'region');\n const countries = suggestions.filter(s => s.type === 'country');\n return { hotels, cities, regions, countries };\n }, [suggestions]);\n\n // Calculate total items for keyboard navigation\n // Order: quick options, cities, regions, countries, hotels (per Figma priority)\n const allItems = useMemo(() => {\n const quickOptions = [\n { type: 'anywhere' as const, name: t('label.anywhere') },\n { type: 'nearme' as const, name: t('label.nearby') },\n ];\n return [\n ...quickOptions,\n ...groupedSuggestions.cities,\n ...groupedSuggestions.regions,\n ...groupedSuggestions.countries,\n ...groupedSuggestions.hotels,\n ];\n }, [groupedSuggestions, t]);\n\n // Fetch suggestions from API\n const fetchSuggestions = async (query: string) => {\n if (query.length < 2) {\n setSuggestions([]);\n return;\n }\n\n try {\n setIsLoading(true);\n const results = await autocompleteLocations(query, apiBaseUrl, locale);\n\n setSuggestions(results);\n setSelectedIndex(-1);\n } catch (error) {\n console.error('Autocomplete error:', error);\n setSuggestions([]);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Debounced search\n useEffect(() => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n\n debounceRef.current = setTimeout(() => {\n fetchSuggestions(value);\n }, 300);\n\n return () => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n };\n }, [value]);\n\n // Click outside to close (only in dropdown mode, not in mobile modal)\n useEffect(() => {\n // In expanded mode (mobile modal), the modal handles its own lifecycle\n // Adding click-outside handler can interfere with accordion button clicks\n if (variant === 'expanded') return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node) &&\n inputRef.current &&\n !inputRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [variant]);\n\n // Handle input change\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n setIsOpen(true);\n };\n\n // Handle clear button click\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange('');\n inputRef.current?.focus();\n };\n\n // Handle suggestion selection\n const handleSelectItem = (item: LocationSuggestion | { type: 'anywhere' | 'nearme'; name: string }) => {\n if (item.type === 'anywhere') {\n onChange('');\n setIsOpen(false);\n onSelect('');\n return;\n }\n\n if (item.type === 'nearme') {\n handleNearMe();\n return;\n }\n\n const suggestion = item as LocationSuggestion;\n const displayText = suggestion.name;\n const coordinates = getCoordinates(suggestion);\n const regionId = (suggestion.type === 'region') ? suggestion.id : undefined;\n\n onChange(displayText);\n onSelect(displayText, coordinates, regionId, suggestion.type);\n setIsOpen(false);\n\n };\n\n const getCoordinates = (params: LocationSuggestion): { lat: number; lng: number } | undefined => {\n if (!params?.latitude || !params?.longitude) {\n return undefined;\n }\n\n return {\n lat: params.latitude,\n lng: params.longitude,\n };\n };\n\n // Handle \"Near me\" - request geolocation\n const handleNearMe = () => {\n setIsOpen(false);\n if (!navigator.geolocation) {\n console.warn('Geolocation not supported');\n onChange('');\n onSelect('');\n return;\n }\n\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const coords = {\n lat: position.coords.latitude,\n lng: position.coords.longitude,\n };\n onChange(t('label.nearby'));\n onSelect(t('label.nearby'), coords);\n },\n (error) => {\n console.warn('Geolocation error:', error.message);\n onChange('');\n onSelect('');\n },\n {\n enableHighAccuracy: false,\n timeout: 10000,\n maximumAge: 300000,\n }\n );\n };\n\n // Keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isOpen || allItems.length === 0) {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n setIsOpen(true);\n }\n return;\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n setSelectedIndex((prev) =>\n prev < allItems.length - 1 ? prev + 1 : prev\n );\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : -1));\n break;\n\n case 'Enter':\n e.preventDefault();\n if (selectedIndex >= 0 && selectedIndex < allItems.length) {\n handleSelectItem(allItems[selectedIndex]);\n }\n break;\n\n case 'Escape':\n e.preventDefault();\n setIsOpen(false);\n setSelectedIndex(-1);\n break;\n }\n };\n\n // Get icon component for suggestion type\n const getIcon = (type: string) => {\n switch (type) {\n case 'hotel':\n return <HotelIcon />;\n case 'city':\n return <LocationIcon />;\n case 'region':\n return <RegionIcon />;\n case 'country':\n return <CountryIcon />;\n case 'anywhere':\n return <AllDestinationsIcon />;\n case 'nearme':\n return <NearMeIcon />;\n default:\n return <AllDestinationsIcon />;\n }\n };\n\n // Clean region/city text from debug info (e.g., \"Bern (Region) common 1\" -> \"Bern\")\n const cleanLocationText = (text: string | undefined): string | undefined => {\n if (!text) return undefined;\n // Remove \" (Region)\" suffix and \"common X\" patterns\n return text\n .replace(/\\s*\\(Region\\)\\s*/gi, '')\n .replace(/\\s*common\\s*\\d+\\s*/gi, '')\n .trim();\n };\n\n // Highlight matching text in suggestion name\n const highlightMatch = (text: string, query: string) => {\n if (!query || query.length < 2) {\n return <span>{text}</span>;\n }\n\n const lowerText = text.toLowerCase();\n const lowerQuery = query.toLowerCase();\n const matchIndex = lowerText.indexOf(lowerQuery);\n\n if (matchIndex === -1) {\n return <span>{text}</span>;\n }\n\n const beforeMatch = text.slice(0, matchIndex);\n const match = text.slice(matchIndex, matchIndex + query.length);\n const afterMatch = text.slice(matchIndex + query.length);\n\n return (\n <span>\n {beforeMatch}\n <span className={styles.suggestionNameBold}>{match}</span>\n {afterMatch}\n </span>\n );\n };\n\n // Calculate base index offset for each section\n // Order: quick options (2), cities, regions, countries, hotels (per Figma priority)\n const QUICK_OPTIONS_COUNT = 2;\n const citiesStartIndex = QUICK_OPTIONS_COUNT;\n const regionsStartIndex = citiesStartIndex + groupedSuggestions.cities.length;\n const countriesStartIndex = regionsStartIndex + groupedSuggestions.regions.length;\n const hotelsStartIndex = countriesStartIndex + groupedSuggestions.countries.length;\n\n // Check if we have search results\n const hasSearchResults = suggestions.length > 0;\n const showEmptyState = value.length >= 2 && !hasSearchResults && !isLoading;\n\n const containerClasses = [\n styles.container,\n variant === 'expanded' ? styles.containerExpanded : styles.containerDropdown,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n {/* Input field - shown in expanded variant or when showInput is true */}\n {showInput && (\n <div className={styles.inputWrapper}>\n <span className={`${styles.inputIcon} ${isIconActive ? styles.inputIconActive : ''}`}>\n <SearchLocationIcon />\n </span>\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={() => {\n setIsFocused(true);\n setIsOpen(true);\n }}\n onBlur={() => setIsFocused(false)}\n placeholder={\n // In expanded variant (mobile modal), never show placeholder while active\n // In dropdown variant, only show placeholder when not focused\n variant === 'expanded' || isFocused\n ? ''\n : (placeholder || t('label.anywhere'))\n }\n disabled={disabled}\n className={styles.input}\n aria-label=\"Search location\"\n aria-autocomplete=\"list\"\n autoComplete=\"off\"\n />\n {/* Clear button - inside inputWrapper so it's positioned correctly */}\n {value.trim().length > 0 && (\n <button\n type=\"button\"\n className={styles.clearButton}\n onClick={handleClear}\n aria-label={t('label.clear')}\n >\n <ClearIcon />\n </button>\n )}\n </div>\n )}\n\n {/* Loading indicator */}\n {isLoading && (\n <div className={styles.loadingIndicator}>\n <span>{t('search_form.searching')}</span>\n </div>\n )}\n\n {/* Results content */}\n {isOpen && (\n <div ref={dropdownRef} className={styles.resultsContainer}>\n {/* Dropdown header - only shown when no search query */}\n {!hasSearchResults && !showEmptyState && (\n <div className={styles.dropdownHeader}>\n {t('general.suggested-destinations')}\n </div>\n )}\n\n {/* Quick options - shown when no search query */}\n {!hasSearchResults && !showEmptyState && (\n <div className={styles.section}>\n {/* All destinations option */}\n <button\n type=\"button\"\n className={`${styles.suggestion} ${selectedIndex === 0 ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelectItem({ type: 'anywhere', name: t('label.anywhere') })}\n onMouseEnter={() => setSelectedIndex(0)}\n >\n <span className={styles.suggestionIcon}>{getIcon('anywhere')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {t('label.anywhere')}\n </div>\n </div>\n </button>\n\n {/* Nearby option */}\n <button\n type=\"button\"\n className={`${styles.suggestion} ${selectedIndex === 1 ? styles.suggestionSelected : ''}`}\n onClick={handleNearMe}\n onMouseEnter={() => setSelectedIndex(1)}\n >\n <span className={styles.suggestionIcon}>{getIcon('nearme')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {t('label.nearby')}\n </div>\n </div>\n </button>\n </div>\n )}\n\n {/* Cities section - priority 1 */}\n {groupedSuggestions.cities.length > 0 && (\n <div className={styles.section}>\n <div className={styles.sectionHeader}>\n {t('dropdown.cities')}\n </div>\n <div>\n {groupedSuggestions.cities.map((suggestion, index) => {\n const itemIndex = citiesStartIndex + index;\n return (\n <button\n key={`city-${suggestion.name}-${index}`}\n type=\"button\"\n className={`${styles.suggestion} ${itemIndex === selectedIndex ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelectItem(suggestion)}\n onMouseEnter={() => setSelectedIndex(itemIndex)}\n >\n <span className={styles.suggestionIcon}>{getIcon('city')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {highlightMatch(suggestion.name, value)}\n </div>\n {suggestion.region && cleanLocationText(suggestion.region) && (\n <div className={styles.suggestionMeta}>\n {cleanLocationText(suggestion.region)}\n </div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Regions section - priority 2 */}\n {groupedSuggestions.regions.length > 0 && (\n <div className={styles.section}>\n <div className={styles.sectionHeader}>\n {t('dropdown.regions')}\n </div>\n <div>\n {groupedSuggestions.regions.map((suggestion, index) => {\n const itemIndex = regionsStartIndex + index;\n return (\n <button\n key={`region-${suggestion.name}-${index}`}\n type=\"button\"\n className={`${styles.suggestion} ${itemIndex === selectedIndex ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelectItem(suggestion)}\n onMouseEnter={() => setSelectedIndex(itemIndex)}\n >\n <span className={styles.suggestionIcon}>{getIcon('region')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {highlightMatch(suggestion.name, value)}\n </div>\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Countries section - priority 3 */}\n {groupedSuggestions.countries.length > 0 && (\n <div className={styles.section}>\n <div className={styles.sectionHeader}>\n {t('dropdown.countries')}\n </div>\n <div>\n {groupedSuggestions.countries.map((suggestion, index) => {\n const itemIndex = countriesStartIndex + index;\n return (\n <button\n key={`country-${suggestion.name}-${index}`}\n type=\"button\"\n className={`${styles.suggestion} ${itemIndex === selectedIndex ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelectItem(suggestion)}\n onMouseEnter={() => setSelectedIndex(itemIndex)}\n >\n <span className={styles.suggestionIcon}>{getIcon('country')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {highlightMatch(suggestion.name, value)}\n </div>\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Hotels section - priority 4 */}\n {groupedSuggestions.hotels.length > 0 && (\n <div className={styles.section}>\n <div className={styles.sectionHeader}>\n {t('dropdown.hotels')}\n </div>\n <div>\n {groupedSuggestions.hotels.map((suggestion, index) => {\n const itemIndex = hotelsStartIndex + index;\n return (\n <button\n key={`hotel-${suggestion.name}-${index}`}\n type=\"button\"\n className={`${styles.suggestion} ${itemIndex === selectedIndex ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelectItem(suggestion)}\n onMouseEnter={() => setSelectedIndex(itemIndex)}\n >\n <span className={styles.suggestionIcon}>{getIcon('hotel')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {highlightMatch(suggestion.name, value)}\n </div>\n {suggestion.city && (\n <div className={styles.suggestionMeta}>\n {cleanLocationText(suggestion.city)}\n {suggestion.region && cleanLocationText(suggestion.region) && `, ${cleanLocationText(suggestion.region)}`}\n </div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Empty state */}\n {showEmptyState && (\n <div className={styles.emptyState}>\n {t('dropdown.no-results')}\n </div>\n )}\n </div>\n )}\n\n </div>\n );\n};\n\nexport default LocationSearchContent;\n","import React, {useEffect, useState} from 'react';\nimport { useUIContext } from '../../context';\nimport { WhenContent, type DateRange } from '../DateSelector';\nimport { GuestContent, type ChildAgeError, type GuestCounts } from '../GuestSelector';\nimport { LocationSearchContent } from './LocationSearchContent/LocationSearchContent';\nimport styles from './SearchModal.module.css';\n\nexport interface SearchModalProps {\n isOpen: boolean;\n onClose: () => void;\n onSearch: (params: SearchParams) => void;\n initialQuery?: string;\n initialGuests?: GuestCounts;\n initialPetFilter?: number;\n initialDateRange?: DateRange | null;\n initialMonthFilter?: string[] | null;\n\n // Optional extra props\n onChange?: (guests: GuestCounts) => void;\n onQueryChange?: (query: string) => void;\n disabled?: boolean;\n className?: string;\n icon?: React.ReactNode;\n getGuestsDisplay?: () => string;\n}\n\nexport interface SearchParams {\n query: string;\n destinationMode?: string;\n guests: GuestCounts;\n petFilter: number;\n dateRange: DateRange | null;\n monthFilter: string[] | null;\n coordinates?: Coordinates;\n regionsFilter: string[];\n}\n\ninterface Coordinates {\n lat: number;\n lng: number;\n}\n\n// Props for the content-only component (no overlay)\nexport interface SearchModalContentProps {\n onSearch: (params: SearchParams) => void;\n onClose: () => void;\n initialQuery?: string;\n initialGuests?: GuestCounts;\n initialPetFilter?: number;\n initialDateRange?: DateRange | null;\n initialMonthFilter?: string[] | null;\n onChange?: (guests: GuestCounts) => void;\n onQueryChange?: (query: string) => void;\n getGuestsDisplay?: () => string;\n // Show header with close button - set to false when using IonModal which has its own header\n showHeader?: boolean;\n}\n\n/**\n * SearchModalContent - The content of the search modal without the overlay\n * Use this when you need to wrap the content in a custom modal (e.g., IonModal)\n */\nexport const SearchModalContent: React.FC<SearchModalContentProps> = ({\n onSearch,\n onClose,\n initialQuery = '',\n initialGuests = { adults: 2, children: 0, childrenAges: [] },\n initialPetFilter = 0,\n initialDateRange = null,\n initialMonthFilter = null,\n onChange,\n onQueryChange,\n getGuestsDisplay,\n showHeader = true,\n}) => {\n const { t } = useUIContext();\n\n // Form state\n const [query, setQuery] = useState(initialQuery);\n const [guests, setGuests] = useState<GuestCounts>(initialGuests);\n const [petFilter, setPetFilter] = useState(initialPetFilter);\n const [dateRange, setDateRange] = useState<DateRange | null>(initialDateRange);\n const [monthFilter, setMonthFilter] = useState<string[] | null>(initialMonthFilter);\n const [coordinates, setCoordinates] = useState<Coordinates | undefined>(undefined);\n const [regionsFilter, setRegionsFilter] = useState<string[]>([]);\n const [destinationMode, setDestinationMode] = useState<string | ''>('');\n const [childAgeErrors, setChildAgeErrors] = useState<ChildAgeError[]>([]);\n\n // Accordion state\n const [expandedSection, setExpandedSection] = useState<'where' | 'when' | 'who' | null>('where');\n\n useEffect(() => {\n setGuests(initialGuests);\n setQuery(initialQuery);\n setMonthFilter(initialMonthFilter);\n setDateRange(initialDateRange);\n }, [initialGuests, initialQuery, initialMonthFilter, initialDateRange]);\n\n // Validate children ages\n const validateChildrenAges = (): ChildAgeError[] => {\n const validationErrors: ChildAgeError[] = [];\n const childrenAges = Array.isArray(guests.childrenAges) ? guests.childrenAges : [];\n\n for (let index = 0; index < guests.children; index++) {\n const age = childrenAges[index];\n if (age === null || age === undefined) {\n validationErrors.push({\n index,\n message: t('form.age-error')\n });\n }\n }\n\n return validationErrors;\n };\n\n // Handlers\n const handleSubmit = () => {\n const errors = validateChildrenAges();\n if (errors.length > 0) {\n setChildAgeErrors(errors);\n setExpandedSection('who');\n return;\n }\n\n onSearch({\n query,\n guests,\n petFilter,\n dateRange,\n monthFilter,\n coordinates,\n regionsFilter,\n destinationMode\n });\n onClose();\n };\n\n const handleLocationSelect = (\n selectedValue: string,\n coords?: Coordinates,\n regionId?: number,\n destMode?: string\n ) => {\n setQuery(selectedValue);\n setCoordinates(coords);\n setRegionsFilter(regionId ? [`region_${regionId}`] : []);\n onQueryChange?.(selectedValue);\n setExpandedSection('when')\n setDestinationMode(destMode || '');\n };\n\n const handleGuestChange = (newGuests: GuestCounts) => {\n setGuests(newGuests);\n if (newGuests.children !== guests.children) {\n setChildAgeErrors([]);\n }\n };\n\n const handlePetChange = (value: number) => {\n setPetFilter(value);\n };\n\n const handleErrorClear = (index: number) => {\n setChildAgeErrors(prev => prev.filter(error => error.index !== index));\n };\n\n const formatDate = (date: string) => {\n const d = new Date(date);\n return d.toLocaleDateString('en-GB', {\n day: '2-digit',\n month: 'short',\n });\n };\n\n const getWhenLabel = () => {\n return dateRange?.start && dateRange?.end\n ? `${formatDate(dateRange.start)} - ${formatDate(dateRange.end)}`\n : monthFilter && monthFilter.length > 0\n ? monthFilter.length === 1\n ? monthFilter[0]\n : `${monthFilter.length} ${t('label.months')}`\n : t('label.anytime');\n };\n\n return (\n <div className={styles.modal}>\n {/* Header - only show if not using external header (like IonModal) */}\n {showHeader && (\n <div className={styles.header}>\n <button\n type=\"button\"\n onClick={onClose}\n className={styles.closeButton}\n aria-label={t('modal.close_search')}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\">\n <path d=\"M0.275391 1.59961C-0.0917969 1.23242 -0.0917969 0.638672 0.275391 0.275391C0.642578 -0.0878906 1.23633 -0.0917969 1.59961 0.275391L7.49805 6.17383L13.3965 0.275391C13.7637 -0.0917969 14.3574 -0.0917969 14.7207 0.275391C15.084 0.642578 15.0879 1.23633 14.7207 1.59961L8.82226 7.49805L14.7207 13.3965C15.0879 13.7637 15.0879 14.3574 14.7207 14.7207C14.3535 15.084 13.7598 15.0879 13.3965 14.7207L7.49805 8.82226L1.59961 14.7207C1.23242 15.0879 0.638672 15.0879 0.275391 14.7207C-0.0878906 14.3535 -0.0917969 13.7598 0.275391 13.3965L6.17383 7.49805L0.275391 1.59961Z\" fill=\"#1F2937\"/>\n </svg>\n </button>\n </div>\n )}\n\n {/* Content */}\n <div className={styles.content}>\n {/* Where Section */}\n {expandedSection !== 'where' && (\n <button\n type=\"button\"\n onClick={() => setExpandedSection('where')}\n className={styles.collapsibleSection}\n >\n <span className={styles.collapsibleLabel}>\n {t('label.where')}\n </span>\n <span className={styles.collapsibleValue}>\n {query || t('label.anywhere')}\n </span>\n </button>\n )}\n {expandedSection === 'where' && (\n <div className={styles.expandedContent}>\n <div className={styles.whereSection}>\n <h2 className={styles.sectionTitle}>\n {t('label.where')}\n </h2>\n <LocationSearchContent\n value={query}\n onChange={setQuery}\n onSelect={handleLocationSelect}\n placeholder={t('label.anywhere')}\n showInput={true}\n variant=\"expanded\"\n />\n </div>\n </div>\n )}\n\n {/* When Section */}\n {expandedSection !== 'when' && (\n <button\n type=\"button\"\n onClick={() => setExpandedSection('when')}\n className={styles.collapsibleSection}\n >\n <span className={styles.collapsibleLabel}>\n {t('label.when')}\n </span>\n <span className={styles.collapsibleValue}>{getWhenLabel()}</span>\n </button>\n )}\n {expandedSection === 'when' && (\n <div className={styles.expandedContent}>\n <div className={styles.whenSection}>\n <WhenContent\n initialDateRange={dateRange || { start: null, end: null }}\n initialMonthFilter={monthFilter}\n onChange={(newDateRange) => {\n setDateRange(newDateRange);\n if (newDateRange && newDateRange.start !== null && newDateRange.end !== null) {\n setExpandedSection('who');\n }\n }}\n onMonthFilterChange={(months) => setMonthFilter(months)}\n variant=\"expanded\"\n showApplyButton={false}\n />\n </div>\n </div>\n )}\n\n {/* Who Section */}\n {expandedSection !== 'who' && (\n <button\n type=\"button\"\n onClick={() => setExpandedSection('who')}\n className={styles.collapsibleSection}\n >\n <span className={styles.collapsibleLabel}>\n {t('label.who')}\n </span>\n <span className={styles.collapsibleValue}>{getGuestsDisplay?.() ?? `${guests.adults + guests.children} ${t('form.guests')}`}</span>\n </button>\n )}\n {expandedSection === 'who' && (\n <div className={styles.expandedContent}>\n <div className={styles.whoGuestSection}>\n <h2 className={styles.sectionTitle}>\n {t('label.who')}\n </h2>\n <GuestContent\n guests={guests}\n onChange={handleGuestChange}\n petFilter={petFilter}\n onPetChange={handlePetChange}\n showPetToggle={true}\n childAgeErrors={childAgeErrors}\n onErrorClear={handleErrorClear}\n />\n </div>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className={styles.footer}>\n <button type=\"button\" onClick={handleSubmit} className={styles.searchButton}>\n <span>{t('button.search')}</span>\n </button>\n </div>\n </div>\n );\n};\n\n/**\n * SearchModal - Full modal with overlay (for web)\n * For Ionic apps, use SearchModalContent with IonModal instead\n */\nexport const SearchModal: React.FC<SearchModalProps> = ({\n isOpen,\n onClose,\n onSearch,\n initialQuery = '',\n initialGuests = { adults: 2, children: 0, childrenAges: [] },\n initialPetFilter = 0,\n initialDateRange = null,\n initialMonthFilter = null,\n onChange,\n onQueryChange,\n getGuestsDisplay\n}) => {\n if (!isOpen) return null;\n\n return (\n <div className={styles.overlay}>\n <SearchModalContent\n onSearch={onSearch}\n onClose={onClose}\n initialQuery={initialQuery}\n initialGuests={initialGuests}\n initialPetFilter={initialPetFilter}\n initialDateRange={initialDateRange}\n initialMonthFilter={initialMonthFilter}\n onChange={onChange}\n onQueryChange={onQueryChange}\n getGuestsDisplay={getGuestsDisplay}\n showHeader={true}\n />\n </div>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport styles from './CollapsibleFilterSection.module.css';\n\n/**\n * CollapsibleFilterSection - Wrapper for expandable/collapsible filter sections\n *\n * Figma Spec:\n * - Section header with title + chevron\n * - Collapse/expand animation\n * - Optional \"Show all\" link for long lists\n * - Default collapsed state configurable\n */\n\ninterface CollapsibleFilterSectionProps {\n title: string;\n children: React.ReactNode;\n defaultExpanded?: boolean;\n showAllText?: string;\n showLessText?: string;\n hasShowAll?: boolean;\n initialItemsToShow?: number;\n className?: string;\n}\n\nexport const CollapsibleFilterSection: React.FC<CollapsibleFilterSectionProps> = ({\n title,\n children,\n defaultExpanded = true,\n showAllText = 'Show all',\n showLessText = 'Show less',\n hasShowAll = false,\n initialItemsToShow = 5,\n className = '',\n}) => {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n const [showAll, setShowAll] = useState(false);\n\n // Auto-expand when defaultExpanded becomes true (e.g., filter selected from URL)\n // Don't auto-collapse - let user control that\n useEffect(() => {\n if (defaultExpanded && !isExpanded) {\n setIsExpanded(true);\n }\n }, [defaultExpanded]);\n\n const toggleExpanded = () => {\n setIsExpanded(!isExpanded);\n };\n\n const toggleShowAll = () => {\n setShowAll(!showAll);\n };\n\n // If hasShowAll, we need to limit children display\n const childrenArray = React.Children.toArray(children);\n const shouldShowToggle = hasShowAll && childrenArray.length > initialItemsToShow;\n const displayedChildren = shouldShowToggle && !showAll\n ? childrenArray.slice(0, initialItemsToShow)\n : childrenArray;\n\n return (\n <div className={`${styles.section} ${className}`}>\n <button\n type=\"button\"\n className={styles.header}\n onClick={toggleExpanded}\n aria-expanded={isExpanded}\n >\n <span className={styles.title}>{title}</span>\n <svg\n className={`${styles.chevron} ${isExpanded ? styles.chevronExpanded : ''}`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 9L12 15L18 9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n <div\n className={`${styles.content} ${isExpanded ? styles.contentExpanded : ''}`}\n aria-hidden={!isExpanded}\n >\n <div className={styles.contentInner}>\n {displayedChildren}\n\n {shouldShowToggle && (\n <button\n type=\"button\"\n className={styles.showAllButton}\n onClick={toggleShowAll}\n >\n {showAll ? showLessText : showAllText}\n <svg\n className={`${styles.showAllChevron} ${showAll ? styles.showAllChevronUp : ''}`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 9L12 15L18 9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport styles from './FilterCheckboxItem.module.css';\n\n/**\n * FilterCheckboxItem - Reusable filter checkbox row with proper states\n *\n * Figma Spec (714-8371 - StarsRating/Filtering/Item):\n * - States: :idle, :hover, :active (checked), :focused, :disabled\n * - Idle: white background, unchecked\n * - Hover: gray background (#e5e7eb)\n * - Active: white background, blue checked checkbox\n * - Focused: white background with blue glow ring\n * - Disabled: gray checkbox, muted text\n */\n\nexport interface FilterCheckboxItemProps {\n /** Unique identifier for the checkbox */\n id?: string;\n /** Display label */\n label: React.ReactNode;\n /** Count to display on the right */\n count?: number | string;\n /** Whether the checkbox is checked */\n checked: boolean;\n /** Whether the item is disabled */\n disabled?: boolean;\n /** Change handler */\n onChange: () => void;\n /** Additional class name */\n className?: string;\n /** Analytics tracking name (used for data-track attribute) */\n trackName?: string;\n}\n\nexport const FilterCheckboxItem: React.FC<FilterCheckboxItemProps> = ({\n id,\n label,\n count,\n checked,\n disabled = false,\n onChange,\n className = '',\n trackName,\n}) => {\n return (\n <label\n className={`${styles.filterRow} ${disabled ? styles.filterRowDisabled : ''} ${className}`}\n tabIndex={disabled ? -1 : 0}\n data-track={trackName}\n >\n <div className={styles.checkboxLabel}>\n <div className={styles.checkboxButton}>\n <input\n id={id}\n type=\"checkbox\"\n className={styles.checkbox}\n checked={checked}\n disabled={disabled}\n onChange={onChange}\n />\n <span className={`${styles.checkboxBox} ${disabled ? styles.checkboxBoxDisabled : ''}`}>\n {checked && (\n <svg viewBox=\"0 0 12 10\" fill=\"none\" className={styles.checkIcon}>\n <path\n d=\"M1 5L4.5 8.5L11 1\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n </div>\n\n <span className={`${styles.filterLabel} ${disabled ? styles.filterLabelDisabled : ''}`}>\n {label}\n </span>\n </div>\n\n {count !== undefined && (\n <span className={`${styles.filterCount} ${disabled ? styles.filterCountDisabled : ''}`}>\n {count}\n </span>\n )}\n </label>\n );\n};\n","import React, { useState } from 'react';\nimport { useUIContext } from '../../../context';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport type { ThemeAggregation } from '../FilterPanel';\nimport styles from './CheckboxFilter.module.css';\n\n/**\n * ExperienceFilter - Checkbox list for experience types\n *\n * Figma Spec:\n * - Checkbox list with counts\n * - Options: City trip, Wellness & Spa, Design/Boutique, Water body, Hiking\n * - Expandable with \"Show all\"\n *\n * Uses translated theme names from API when available\n */\n\ninterface ExperienceFilterProps {\n selected: string[];\n /** Theme aggregations from API with pre-translated names */\n themes?: ThemeAggregation[];\n /** Legacy counts format (deprecated - use themes instead) */\n counts?: Record<string, number>;\n onChange: (values: string[]) => void;\n className?: string;\n}\n\nexport const ExperienceFilter: React.FC<ExperienceFilterProps> = ({\n selected,\n themes = [],\n counts = {},\n onChange,\n className = '',\n}) => {\n const { t } = useUIContext();\n const [expanded, setExpanded] = useState(false);\n\n // Use themes from API if available, they come pre-translated\n const visibleThemes = expanded ? themes : themes.slice(0, 5);\n const hasMoreThemes = themes.length > 5;\n\n const handleToggle = (value: string) => {\n if (selected.includes(value)) {\n onChange(selected.filter(v => v !== value));\n } else {\n onChange([...selected, value]);\n }\n };\n\n // Don't render if no themes available\n if (themes.length === 0) {\n return null;\n }\n\n return (\n <div className={`${styles.filterList} ${className}`}>\n {visibleThemes.map((theme) => {\n const themeIdStr = String(theme.id);\n const isDisabled = theme.count === 0 && !selected.includes(themeIdStr);\n return (\n <FilterCheckboxItem\n key={theme.id}\n id={`experience-${theme.id}`}\n label={theme.name}\n count={theme.count > 0 ? theme.count : undefined}\n checked={selected.includes(themeIdStr)}\n disabled={isDisabled}\n onChange={() => handleToggle(themeIdStr)}\n trackName={`filter-experience-${theme.id}`}\n />\n );\n })}\n\n {hasMoreThemes && (\n <button\n type=\"button\"\n className={styles.showMoreBtn}\n onClick={() => setExpanded(!expanded)}\n >\n {expanded\n ? t('filter.show-less', 'Show less')\n : t('filter.show-all', 'Show all')}\n <span\n className={`${styles.arrowIcon} ${expanded ? styles.arrowUp : ''}`}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M9.36927 13.9061C9.71908 14.2535 10.2847 14.2535 10.6308 13.9061L16.4069 8.1803C16.7567 7.83285 16.7567 7.27102 16.4069 6.92727C16.0571 6.58352 15.4915 6.57983 15.1454 6.92727L10.0019 12.0247L4.85845 6.92727C4.50864 6.57983 3.94299 6.57983 3.5969 6.92727C3.25081 7.27472 3.24709 7.83655 3.5969 8.1803L9.37299 13.9061H9.36927Z\" fill=\"#114799\"/>\n </svg>\n </span>\n </button>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { useUIContext } from '../../../context';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport styles from './HotelCategoryFilter.module.css';\n\n/**\n * HotelCategoryFilter - Checkbox list for hotel star ratings\n *\n * Figma Spec:\n * - Checkbox list with star icons and counts\n * - Options: 5★, 4★, 3★, 2★, Swiss Lodge, No category\n * - Footer with HotellerieSuisse link\n */\n\nexport interface CategoryOption {\n value: string;\n stars: number;\n label: string | null;\n}\n\nexport const CATEGORY_OPTIONS: CategoryOption[] = [\n { value: '5', stars: 5, label: null },\n { value: '4', stars: 4, label: null },\n { value: '3', stars: 3, label: null },\n { value: '2', stars: 2, label: null },\n { value: 'swiss_lodge', stars: 0, label: 'Swiss Lodge' },\n { value: 'not_classified', stars: 0, label: 'No category' },\n];\n\ninterface HotelCategoryFilterProps {\n selected: string[];\n counts?: Record<string, number>;\n onChange: (values: string[]) => void;\n className?: string;\n}\n\nexport const HotelCategoryFilter: React.FC<HotelCategoryFilterProps> = ({\n selected,\n counts = {},\n onChange,\n className = '',\n}) => {\n const { t } = useUIContext();\n\n const handleToggle = (value: string) => {\n if (selected.includes(value)) {\n onChange(selected.filter(v => v !== value));\n } else {\n onChange([...selected, value]);\n }\n };\n\n return (\n <div className={className}>\n <div className={styles.filterList}>\n {CATEGORY_OPTIONS.map((option) => {\n const count = counts[option.value];\n const isDisabled = count === 0 && !selected.includes(option.value);\n return (\n <FilterCheckboxItem\n key={option.value}\n id={`category-${option.value}`}\n label={\n option.stars > 0 ? (\n <div className={styles.starsContainer}>\n {Array.from({ length: option.stars }).map((_, i) => (\n <svg key={i} className={styles.starIcon} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 0L14.6942 8.2918H23.4127L16.3593 13.4164L19.0534 21.7082L12 16.5836L4.94658 21.7082L7.64074 13.4164L0.587322 8.2918H9.30583L12 0Z\" />\n </svg>\n ))}\n </div>\n ) : (\n t(`star_rating.${option.value}`, option.label || option.value)\n )\n }\n count={count}\n checked={selected.includes(option.value)}\n disabled={isDisabled}\n onChange={() => handleToggle(option.value)}\n trackName={`filter-category-${option.value}`}\n />\n );\n })}\n </div>\n <div className={styles.footer}>\n <span className={styles.footerText}>\n {t('filter.hotellerie-suisse', 'Classification by HotellerieSuisse')}\n </span>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport type { FilterOption } from '../FilterPanel';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport styles from './CheckboxFilter.module.css';\n\n/**\n * MealsFilter - Checkbox list for meal options\n *\n * Figma Spec:\n * - Checkbox list with counts\n * - Options: Breakfast, Restaurant\n *\n * Options now come from API with pre-translated names\n */\n\ninterface MealsFilterProps {\n selected: string[];\n counts?: Record<string, number>;\n /** Filter options from API with pre-translated names */\n options?: FilterOption[];\n onChange: (values: string[]) => void;\n className?: string;\n}\n\nexport const MealsFilter: React.FC<MealsFilterProps> = ({\n selected,\n counts = {},\n options = [],\n onChange,\n className = '',\n}) => {\n const handleToggle = (value: string) => {\n if (selected.includes(value)) {\n onChange(selected.filter(v => v !== value));\n } else {\n onChange([...selected, value]);\n }\n };\n\n // Don't render if no options available\n if (options.length === 0) {\n return null;\n }\n\n return (\n <div className={`${styles.filterList} ${className}`}>\n {options.map((option) => {\n const count = counts[option.key];\n const isDisabled = count === 0 && !selected.includes(option.key);\n return (\n <FilterCheckboxItem\n key={option.key}\n id={`meal-${option.key}`}\n label={option.name}\n count={count}\n checked={selected.includes(option.key)}\n disabled={isDisabled}\n onChange={() => handleToggle(option.key)}\n trackName={`filter-meals-${option.key}`}\n />\n );\n })}\n </div>\n );\n};\n","import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { useUIContext } from '../../../context';\nimport styles from './PriceRangeFilter.module.css';\n\n// Default histogram data (will be replaced by real data from API)\nconst DEFAULT_HISTOGRAM = [\n 12, 25, 38, 45, 52, 48, 42, 35, 28, 22, 18, 15, 12, 10, 8, 6, 5, 4, 3, 2\n];\n\n// Minimum number of buckets to show a meaningful histogram\nconst MIN_HISTOGRAM_BUCKETS = 5;\n\n/**\n * Normalize histogram to always have a consistent number of buckets (20)\n * This handles cases where API returns very few buckets (e.g., only 2 hotels)\n */\nfunction normalizeHistogram(histogram: number[]): number[] {\n const targetBuckets = 20;\n\n // If histogram is empty or too sparse, return empty to hide it\n if (!histogram || histogram.length === 0) {\n return [];\n }\n\n // If histogram has fewer than minimum buckets, it's not meaningful to display\n if (histogram.length < MIN_HISTOGRAM_BUCKETS) {\n return [];\n }\n\n // If already has target buckets, return as-is\n if (histogram.length === targetBuckets) {\n return histogram;\n }\n\n // If more buckets than target, downsample by combining adjacent buckets\n if (histogram.length > targetBuckets) {\n const result: number[] = [];\n const ratio = histogram.length / targetBuckets;\n for (let i = 0; i < targetBuckets; i++) {\n const start = Math.floor(i * ratio);\n const end = Math.floor((i + 1) * ratio);\n let sum = 0;\n for (let j = start; j < end; j++) {\n sum += histogram[j];\n }\n result.push(sum);\n }\n return result;\n }\n\n // If fewer buckets than target, upsample by distributing values\n // This creates a smoother visualization for sparse data\n const result: number[] = new Array(targetBuckets).fill(0);\n const ratio = targetBuckets / histogram.length;\n for (let i = 0; i < histogram.length; i++) {\n const targetIndex = Math.floor(i * ratio);\n result[targetIndex] += histogram[i];\n }\n return result;\n}\n\nexport interface PriceRangeFilterProps {\n minPrice: number;\n maxPrice: number;\n value: { min: number; max: number };\n onChange: (value: { min: number; max: number }) => void;\n /** New prop: Called only when user finishes selecting (debounced) */\n onApply?: (value: { min: number; max: number }) => void;\n histogram?: number[];\n currency?: string;\n /** Called when user is actively dragging (to prevent apply during drag) */\n onDragStart?: () => void;\n onDragEnd?: () => void;\n /** Show loading skeleton instead of filter */\n isLoading?: boolean;\n /** Debounce delay in milliseconds for onApply */\n debounceDelay?: number;\n}\n\nexport const PriceRangeFilter: React.FC<PriceRangeFilterProps> = ({\n minPrice,\n maxPrice,\n value,\n onChange,\n onApply,\n histogram = DEFAULT_HISTOGRAM,\n currency,\n onDragStart,\n onDragEnd,\n debounceDelay = 500,\n}) => {\n const { t, currency: contextCurrency } = useUIContext();\n const displayCurrency = currency ?? contextCurrency;\n\n const sliderRef = useRef<HTMLDivElement>(null);\n const [isDragging, setIsDragging] = useState<'min' | 'max' | null>(null);\n const [isDraggingExternal, setIsDraggingExternal] = useState(false);\n\n // Store the last value to debounce\n const lastValueRef = useRef(value);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Input state for editable fields\n const [minInputValue, setMinInputValue] = useState('');\n const [maxInputValue, setMaxInputValue] = useState('');\n const [minInputFocused, setMinInputFocused] = useState(false);\n const [maxInputFocused, setMaxInputFocused] = useState(false);\n\n // Calculate percentages for slider positioning\n const range = maxPrice - minPrice;\n const minPercent = range > 0 ? ((value.min - minPrice) / range) * 100 : 0;\n const maxPercent = range > 0 ? ((value.max - minPrice) / range) * 100 : 100;\n\n // Normalize histogram to consistent bucket count, or hide if too sparse\n const normalizedHistogram = normalizeHistogram(histogram);\n const showHistogram = normalizedHistogram.length > 0;\n\n // Normalize histogram values\n const maxHistogramValue = Math.max(...normalizedHistogram, 1);\n\n // Check if histogram bar is in the selected range\n const getBarActive = useCallback((index: number) => {\n const barStartPercent = (index / normalizedHistogram.length) * 100;\n const barEndPercent = ((index + 1) / normalizedHistogram.length) * 100;\n return barStartPercent < maxPercent && barEndPercent > minPercent;\n }, [normalizedHistogram.length, minPercent, maxPercent]);\n\n // Track is inset by 12px (--size-rem-0-75) on each side\n const trackInset = 12; // px value of --size-rem-0-75\n\n // Function to trigger onApply with debounce\n const triggerOnApply = useCallback((newValue: { min: number; max: number }) => {\n if (!onApply) return;\n\n // Clear any existing timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n // Set new timeout\n timeoutRef.current = setTimeout(() => {\n onApply(newValue);\n }, debounceDelay);\n }, [onApply, debounceDelay]);\n\n // Handle slider drag\n const handleDrag = useCallback((clientX: number) => {\n if (!sliderRef.current || !isDragging) return;\n\n const rect = sliderRef.current.getBoundingClientRect();\n // Account for track inset: track starts at trackInset and ends at (width - trackInset)\n const trackWidth = rect.width - (trackInset * 2);\n const trackLeft = rect.left + trackInset;\n const percent = Math.max(0, Math.min(100, ((clientX - trackLeft) / trackWidth) * 100));\n const newValue = Math.round(minPrice + (percent / 100) * range);\n\n let newMin = value.min;\n let newMax = value.max;\n\n if (isDragging === 'min') {\n const clampedValue = Math.min(newValue, value.max - 1);\n newMin = Math.max(minPrice, clampedValue);\n } else {\n const clampedValue = Math.max(newValue, value.min + 1);\n newMax = Math.min(maxPrice, clampedValue);\n }\n\n // Update UI immediately\n const newRange = { min: newMin, max: newMax };\n onChange(newRange);\n\n // Store for debounced apply\n lastValueRef.current = newRange;\n\n // Only trigger onApply if we're not dragging (for keyboard/input changes)\n // During drag, we'll call it in the drag end handler\n if (!isDraggingExternal) {\n triggerOnApply(newRange);\n }\n }, [isDragging, minPrice, maxPrice, range, value, onChange, isDraggingExternal, triggerOnApply]);\n\n // Mouse events for desktop\n const handleMouseDown = (handle: 'min' | 'max') => (e: React.MouseEvent) => {\n e.preventDefault();\n setIsDragging(handle);\n setIsDraggingExternal(true);\n onDragStart?.();\n };\n\n // Touch events for mobile\n // Note: Don't call preventDefault here - React's touch events are passive by default\n // We prevent scrolling in the document-level touchmove handler instead\n const handleTouchStart = (handle: 'min' | 'max') => () => {\n setIsDragging(handle);\n setIsDraggingExternal(true);\n onDragStart?.();\n };\n\n // Handle drag end - trigger onApply immediately\n const handleDragEnd = useCallback(() => {\n if (isDraggingExternal && onApply) {\n // Trigger apply immediately when drag ends\n onApply(lastValueRef.current);\n }\n setIsDragging(null);\n setIsDraggingExternal(false);\n onDragEnd?.();\n }, [isDraggingExternal, onApply, onDragEnd]);\n\n // Global mouse/touch move and up handlers\n useEffect(() => {\n if (!isDragging) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n handleDrag(e.clientX);\n };\n\n const handleTouchMove = (e: TouchEvent) => {\n // Prevent scrolling while dragging the slider\n e.preventDefault();\n if (e.touches.length > 0) {\n handleDrag(e.touches[0].clientX);\n }\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleDragEnd);\n document.addEventListener('touchmove', handleTouchMove, { passive: false });\n document.addEventListener('touchend', handleDragEnd);\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleDragEnd);\n document.removeEventListener('touchmove', handleTouchMove);\n document.removeEventListener('touchend', handleDragEnd);\n\n // Clear timeout on unmount\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isDragging, handleDrag, handleDragEnd]);\n\n // Input handlers\n const handleMinInputFocus = () => {\n setMinInputFocused(true);\n setMinInputValue(value.min.toString());\n };\n\n const handleMaxInputFocus = () => {\n setMaxInputFocused(true);\n setMaxInputValue(value.max.toString());\n };\n\n const handleMinInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value.replace(/[^0-9]/g, '');\n setMinInputValue(val);\n };\n\n const handleMaxInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value.replace(/[^0-9]/g, '');\n setMaxInputValue(val);\n };\n\n const handleMinInputBlur = () => {\n setMinInputFocused(false);\n const numValue = parseInt(minInputValue, 10);\n if (!isNaN(numValue)) {\n const clampedValue = Math.max(minPrice, Math.min(numValue, value.max - 1));\n const newRange = { min: clampedValue, max: value.max };\n onChange(newRange);\n if (onApply) {\n triggerOnApply(newRange);\n }\n }\n };\n\n const handleMaxInputBlur = () => {\n setMaxInputFocused(false);\n const numValue = parseInt(maxInputValue, 10);\n if (!isNaN(numValue)) {\n const clampedValue = Math.min(maxPrice, Math.max(numValue, value.min + 1));\n const newRange = { min: value.min, max: clampedValue };\n onChange(newRange);\n if (onApply) {\n triggerOnApply(newRange);\n }\n }\n };\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n return (\n <div className={styles.priceRangeWrapper}>\n {/* Price Inputs */}\n <div className={styles.priceInputs}>\n <div className={styles.priceInputWrapper}>\n <input\n type=\"text\"\n inputMode=\"numeric\"\n className={styles.priceInput}\n value={minInputFocused ? minInputValue : `${displayCurrency} ${value.min}`}\n onChange={handleMinInputChange}\n onFocus={handleMinInputFocus}\n onBlur={handleMinInputBlur}\n aria-label={t('filter.min-price', 'Minimum price')}\n />\n </div>\n <div className={styles.priceInputDivider}>—</div>\n <div className={styles.priceInputWrapper}>\n <input\n type=\"text\"\n inputMode=\"numeric\"\n className={styles.priceInput}\n value={maxInputFocused ? maxInputValue : `${displayCurrency} ${value.max}`}\n onChange={handleMaxInputChange}\n onFocus={handleMaxInputFocus}\n onBlur={handleMaxInputBlur}\n aria-label={t('filter.max-price', 'Maximum price')}\n />\n </div>\n </div>\n\n {/* Histogram - only show if we have enough data for meaningful visualization */}\n {showHistogram && (\n <div className={styles.histogram}>\n {normalizedHistogram.map((histValue, index) => {\n const height = (histValue / maxHistogramValue) * 100;\n const isActive = getBarActive(index);\n return (\n <div\n key={index}\n className={`${styles.histogramBar} ${isActive ? styles.histogramBarActive : ''}`}\n style={{ height: `${Math.max(height, 10)}%` }}\n />\n );\n })}\n </div>\n )}\n\n {/* Dual Range Slider */}\n <div className={styles.sliderContainer} ref={sliderRef}>\n <div className={styles.sliderTrack} />\n <div\n className={styles.sliderActiveTrack}\n style={{\n left: `calc(var(--size-rem-0-75) + (100% - 2 * var(--size-rem-0-75)) * ${minPercent / 100})`,\n width: `calc((100% - 2 * var(--size-rem-0-75)) * ${(maxPercent - minPercent) / 100})`\n }}\n />\n <div\n className={`${styles.sliderHandle} ${isDragging === 'min' ? styles.sliderHandleActive : ''}`}\n style={{ left: `calc(var(--size-rem-0-75) + (100% - 2 * var(--size-rem-0-75)) * ${minPercent / 100})` }}\n onMouseDown={handleMouseDown('min')}\n onTouchStart={handleTouchStart('min')}\n role=\"slider\"\n aria-label={t('filter.min-price', 'Minimum price')}\n aria-valuenow={value.min}\n aria-valuemin={minPrice}\n aria-valuemax={value.max}\n tabIndex={0}\n />\n <div\n className={`${styles.sliderHandle} ${isDragging === 'max' ? styles.sliderHandleActive : ''}`}\n style={{ left: `calc(var(--size-rem-0-75) + (100% - 2 * var(--size-rem-0-75)) * ${maxPercent / 100})` }}\n onMouseDown={handleMouseDown('max')}\n onTouchStart={handleTouchStart('max')}\n role=\"slider\"\n aria-label={t('filter.max-price', 'Maximum price')}\n aria-valuenow={value.max}\n aria-valuemin={value.min}\n aria-valuemax={maxPrice}\n tabIndex={0}\n />\n </div>\n </div>\n );\n};\n\nexport default PriceRangeFilter;\n","import React, { useState, useEffect, useRef } from 'react';\nimport { useUIContext } from '../../../context';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport styles from './RegionsFilter.module.css';\n\n/**\n * RegionsFilter - Accordion-style destinations filter\n *\n * Figma Spec (632-51682, 702-76591):\n * - Country rows are accordion headers (NO checkbox on country)\n * - Clicking country row expands/collapses accordion (does NOT auto-select)\n * - Country row: 56px height, gray background, 12px border-radius\n * - Count badge: pill shape in country row\n * - Chevron: 20x20px, rotates on expand\n * - Sub-regions appear as checkbox list when country is expanded\n */\n\nexport interface RegionOption {\n value: string;\n label: string;\n count?: number;\n subRegions?: RegionOption[];\n}\n\ninterface RegionsFilterProps {\n regions: RegionOption[];\n selected: string[];\n onChange: (values: string[]) => void;\n className?: string;\n isPlaceSearchActive?: boolean;\n}\n\nexport const RegionsFilter: React.FC<RegionsFilterProps> = ({\n regions,\n selected,\n onChange,\n className = '',\n isPlaceSearchActive = false,\n}) => {\n const { t } = useUIContext();\n\n // Track which countries are expanded (accordion state)\n const [expandedCountries, setExpandedCountries] = useState<Set<string>>(new Set(['country_215']));\n\n // Track if we've done the initial expansion (only expand once on load)\n const hasInitializedRef = useRef(false);\n\n // Auto-expand countries that have selected sub-regions on initial load\n useEffect(() => {\n if (hasInitializedRef.current) return;\n if (regions.length === 0 || selected.length === 0) return;\n\n const countriesWithSelectedRegions = new Set<string>();\n regions.forEach(region => {\n if (region.subRegions?.some(sub => selected.includes(sub.value))) {\n countriesWithSelectedRegions.add(region.value);\n }\n });\n\n if (countriesWithSelectedRegions.size > 0) {\n setExpandedCountries(countriesWithSelectedRegions);\n hasInitializedRef.current = true;\n }\n }, [regions, selected]);\n\n // Toggle country accordion open/close\n const handleCountryToggle = (countryValue: string) => {\n setExpandedCountries(prev => {\n const next = new Set(prev);\n if (next.has(countryValue)) {\n next.delete(countryValue);\n } else {\n next.add(countryValue);\n }\n return next;\n });\n };\n\n // Toggle individual region checkbox\n const handleRegionToggle = (regionValue: string) => {\n if (selected.includes(regionValue)) {\n onChange(selected.filter(r => r !== regionValue));\n } else {\n onChange([...selected, regionValue]);\n }\n };\n\n if (regions.length === 0) {\n return null;\n }\n\n return (\n <div className={`${styles.filterList} ${className}`}>\n {regions.map((region) => {\n const hasSubRegions = region.subRegions && region.subRegions.length > 0;\n const isExpanded = expandedCountries.has(region.value);\n\n return (\n <div key={region.value} className={styles.regionItem}>\n {/* Country row - accordion header (no checkbox) */}\n <button\n type=\"button\"\n className={`${styles.countryRow} ${isExpanded ? styles.countryRowExpanded : ''}`}\n onClick={() => handleCountryToggle(region.value)}\n aria-expanded={isExpanded}\n disabled={isPlaceSearchActive}\n >\n <div className={styles.countryInfo}>\n <span className={styles.countryName}>\n {region.label}\n </span>\n\n {region.count !== undefined && (\n <span className={styles.countBadge}>{region.count}</span>\n )}\n </div>\n\n {hasSubRegions && (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\n className={`${styles.chevron} ${isExpanded ? styles.chevronExpanded : ''}`}\n >\n <path d=\"M9.36927 13.9061C9.71908 14.2535 10.2847 14.2535 10.6308 13.9061L16.4069 8.18027C16.7567 7.83283 16.7567 7.271 16.4069 6.92725C16.0571 6.5835 15.4915 6.5798 15.1454 6.92725L10.0019 12.0247L4.85845 6.92725C4.50864 6.5798 3.94299 6.5798 3.5969 6.92725C3.25081 7.2747 3.24709 7.83652 3.5969 8.18027L9.37299 13.9061H9.36927Z\" fill=\"#6B7280\"/>\n </svg>\n )}\n </button>\n\n {/* Mobile-only Select All / Reset (PLACED HERE — BEFORE sub-regions) */}\n {hasSubRegions && isExpanded && (() => {\n // Check if there are any selectable regions (count > 0)\n const hasSelectableRegions = region.subRegions!.some(\n sr => sr.count === undefined || sr.count > 0\n );\n // Check if any sub-regions of this country are selected\n const subValues = region.subRegions!.map(sr => sr.value);\n const hasSelectedRegions = subValues.some(v => selected.includes(v));\n return (\n <div className={styles.mobileSelectAllActions}>\n <button\n type=\"button\"\n className={styles.selectAllBtn}\n disabled={!hasSelectableRegions}\n onClick={() => {\n // Only select regions with count > 0 (exclude disabled ones)\n const selectableSubValues = region.subRegions!\n .filter(sr => sr.count === undefined || sr.count > 0)\n .map(sr => sr.value);\n const merged = Array.from(new Set([...selected, ...selectableSubValues]));\n onChange(merged);\n }}\n >\n {t('filter.select-all', 'Select all')}\n </button>\n\n <button\n type=\"button\"\n className={styles.resetAllBtn}\n disabled={!hasSelectedRegions}\n onClick={() => {\n onChange(selected.filter(v => !subValues.includes(v)));\n }}\n >\n {t('filter.reset', 'Reset')}\n </button>\n </div>\n );\n })()}\n\n {/* Sub-regions (checkbox list) */}\n {hasSubRegions && isExpanded && (\n <div className={styles.subRegions}>\n {region.subRegions!.map((subRegion) => {\n const isDisabled =\n // Disabled by count\n (subRegion.count === 0 && !selected.includes(subRegion.value)) ||\n\n // Disabled by active place search\n (isPlaceSearchActive && !selected.includes(subRegion.value));\n return (\n <FilterCheckboxItem\n key={subRegion.value}\n id={`region-${subRegion.value}`}\n label={subRegion.label}\n count={subRegion.count}\n checked={selected.includes(subRegion.value)}\n disabled={isDisabled}\n onChange={() => handleRegionToggle(subRegion.value)}\n trackName={`filter-region-${subRegion.value}`}\n />\n );\n })}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n};\n\n// Default regions (placeholder - will be overridden by API data)\nexport const DEFAULT_REGIONS: RegionOption[] = [\n {\n value: 'switzerland',\n label: 'Switzerland',\n subRegions: [\n { value: 'aargau', label: 'Aargau' },\n { value: 'basel', label: 'Basel (region)' },\n { value: 'bern', label: 'Bern (region)' },\n { value: 'graubunden', label: 'Graubünden' },\n { value: 'zurich', label: 'Zürich' },\n ]\n },\n { value: 'germany', label: 'Germany' },\n { value: 'austria', label: 'Austria' },\n { value: 'italy', label: 'Italy' },\n { value: 'france', label: 'France' },\n];\n","import React from 'react';\nimport { useUIContext } from '../../../context';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport styles from './CheckboxFilter.module.css';\nimport reviewStyles from './ReviewsFilter.module.css';\n\n/**\n * ReviewsFilter - Checkbox list for filtering by review rating\n *\n * Figma Spec:\n * - Checkbox list with counts\n * - Options: Excellent (4.4+), Very Good (4.1-4.3), Good (3.8-4.0), Fair (3.5-3.7), No rating\n * - Footer: TrustYou attribution\n */\n\nexport interface ReviewOption {\n value: string;\n labelKey: string;\n range: string;\n}\n\n// Review filter options from Figma - using design-tokens keys\nexport const REVIEW_OPTIONS: ReviewOption[] = [\n { value: 'excellent', labelKey: 'label.rating-excellent', range: '(4.4+)' },\n { value: 'very_good', labelKey: 'label.rating-very-good', range: '(4.1 – 4.3)' },\n { value: 'good', labelKey: 'label.rating-good', range: '(3.8 – 4.0)' },\n { value: 'fair', labelKey: 'label.rating-fair', range: '(3.5 – 3.7)' },\n { value: 'no_rating', labelKey: 'label.rating-none', range: '' },\n];\n\ninterface ReviewsFilterProps {\n selected: string[];\n counts?: Record<string, number>;\n onChange: (values: string[]) => void;\n className?: string;\n isPlaceSearchActive?: boolean;\n}\n\nexport const ReviewsFilter: React.FC<ReviewsFilterProps> = ({\n selected,\n counts = {},\n onChange,\n className = '',\n isPlaceSearchActive = false,\n}) => {\n const { t } = useUIContext();\n\n const handleToggle = (value: string) => {\n if (selected.includes(value)) {\n onChange(selected.filter(v => v !== value));\n } else {\n onChange([...selected, value]);\n }\n };\n\n return (\n <div className={className}>\n <div className={styles.filterList}>\n {REVIEW_OPTIONS.map((option) => {\n const count = counts[option.value];\n const isDisabled =\n !isPlaceSearchActive && count === 0 && !selected.includes(option.value);\n return (\n <FilterCheckboxItem\n key={option.value}\n id={`review-${option.value}`}\n label={\n <>\n {t(option.labelKey, option.value)}\n {option.range && (\n <span className={reviewStyles.filterRange}> {option.range}</span>\n )}\n </>\n }\n count={count}\n checked={selected.includes(option.value)}\n disabled={isDisabled}\n onChange={() => handleToggle(option.value)}\n trackName={`filter-review-${option.value}`}\n />\n );\n })}\n </div>\n <div className={reviewStyles.footer}>\n <span className={reviewStyles.footerText}>\n {t('filter.trustyou', 'Ratings by TrustYou')}\n </span>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { useUIContext } from '../../../context';\nimport { Chip } from '../../Chip';\nimport { Button } from '../../Button';\nimport styles from './SelectedFiltersRow.module.css';\n\n/**\n * SelectedFiltersRow - Shows active filters as removable chips\n *\n * Figma: 746-94121\n *\n * Specs:\n * - Horizontal wrapping flex layout\n * - Each chip uses Chip/Filter component (small size)\n * - \"Clear all\" link at end\n * - Hidden when no filters active\n */\n\nexport interface SelectedFilter {\n id: string;\n label: string;\n type: string; // e.g., 'discount', 'category', 'experience', etc.\n value: string;\n}\n\ninterface SelectedFiltersRowProps {\n filters: SelectedFilter[];\n onRemove: (filter: SelectedFilter) => void;\n onClearAll: () => void;\n className?: string;\n}\n\nexport const SelectedFiltersRow: React.FC<SelectedFiltersRowProps> = ({\n filters,\n onRemove,\n onClearAll,\n className = '',\n}) => {\n const { t } = useUIContext();\n if (filters.length === 0) {\n return null;\n }\n\n return (\n <div className={`${styles.container} ${className}`}>\n <div className={styles.chipsWrapper}>\n {/* Show only once at top */}\n <p className={styles.selectedText}>{t('filter.selected', 'Selected')} </p>\n <div className={styles.chips}>\n {filters.map((filter) => (\n <Chip\n key={filter.id}\n label={filter.label}\n size=\"small\"\n state=\"idle\"\n removable\n onRemove={() => onRemove(filter)}\n />\n ))}\n {onClearAll && (\n <Button\n variant=\"link\"\n className={styles.footerLink}\n onClick={onClearAll}\n >\n {t('filter.clear-all', 'Clear all')}\n </Button>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport type { FilterOption } from '../FilterPanel';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport styles from './CheckboxFilter.module.css';\n\n/**\n * TransportFilter - Checkbox list for transport/parking options\n *\n * Figma Spec:\n * - Checkbox list with counts\n * - Options: Free parking, EV charging station\n *\n * Options now come from API with pre-translated names\n */\n\ninterface TransportFilterProps {\n selected: string[];\n counts?: Record<string, number>;\n /** Filter options from API with pre-translated names */\n options?: FilterOption[];\n onChange: (values: string[]) => void;\n className?: string;\n}\n\nexport const TransportFilter: React.FC<TransportFilterProps> = ({\n selected,\n counts = {},\n options = [],\n onChange,\n className = '',\n}) => {\n const handleToggle = (value: string) => {\n if (selected.includes(value)) {\n onChange(selected.filter(v => v !== value));\n } else {\n onChange([...selected, value]);\n }\n };\n\n // Don't render if no options available\n if (options.length === 0) {\n return null;\n }\n\n return (\n <div className={`${styles.filterList} ${className}`}>\n {options.map((option) => {\n const count = counts[option.key];\n const isDisabled = count === 0 && !selected.includes(option.key);\n return (\n <FilterCheckboxItem\n key={option.key}\n id={`transport-${option.key}`}\n label={option.name}\n count={count}\n checked={selected.includes(option.key)}\n disabled={isDisabled}\n onChange={() => handleToggle(option.key)}\n trackName={`filter-transport-${option.key}`}\n />\n );\n })}\n </div>\n );\n};\n","import React from 'react';\nimport type { FilterOption } from '../FilterPanel';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport styles from './CheckboxFilter.module.css';\n\n/**\n * WellnessFilter - Checkbox list for wellness & spa amenities\n *\n * Figma Spec:\n * - Checkbox list with counts\n * - Options: Indoor pool, Outdoor pool, Sauna/Steam bath, Massage, Cosmetic treatments\n *\n * Options now come from API with pre-translated names\n */\n\ninterface WellnessFilterProps {\n selected: string[];\n counts?: Record<string, number>;\n /** Filter options from API with pre-translated names */\n options?: FilterOption[];\n onChange: (values: string[]) => void;\n className?: string;\n}\n\nexport const WellnessFilter: React.FC<WellnessFilterProps> = ({\n selected,\n counts = {},\n options = [],\n onChange,\n className = '',\n}) => {\n const handleToggle = (value: string) => {\n if (selected.includes(value)) {\n onChange(selected.filter(v => v !== value));\n } else {\n onChange([...selected, value]);\n }\n };\n\n // Don't render if no options available\n if (options.length === 0) {\n return null;\n }\n\n return (\n <div className={`${styles.filterList} ${className}`}>\n {options.map((option) => {\n const count = counts[option.key];\n const isDisabled = count === 0 && !selected.includes(option.key);\n return (\n <FilterCheckboxItem\n key={option.key}\n id={`wellness-${option.key}`}\n label={option.name}\n count={count}\n checked={selected.includes(option.key)}\n disabled={isDisabled}\n onChange={() => handleToggle(option.key)}\n trackName={`filter-wellness-${option.key}`}\n />\n );\n })}\n </div>\n );\n};\n","import React from 'react';\nimport { useUIContext } from '../../../context';\nimport { Button } from '../../Button';\nimport styles from './FilterMinimap.module.css';\n\n/**\n * FilterMinimap - Map preview at top of filter sidebar\n *\n * Figma: Desktop List View (723-97947)\n *\n * Features:\n * - Static map preview showing search area\n * - \"View in a Map\" button to switch to map view\n * - Only shown on desktop (hidden on mobile)\n *\n * Specs:\n * - Height: 200px\n * - Border radius: 12px\n * - Button: small size, no icon\n */\n\nexport interface FilterMinimapProps {\n /** Callback when \"View in a Map\" is clicked */\n onViewMap: () => void;\n /** Optional center coordinates for the map preview */\n center?: { lat: number; lng: number };\n /** Optional zoom level */\n zoom?: number;\n /** Optional class name */\n className?: string;\n}\n\nexport const FilterMinimap: React.FC<FilterMinimapProps> = ({\n onViewMap,\n center,\n zoom = 9,\n className = '',\n}) => {\n const { t } = useUIContext();\n\n // Generate static map URL using OpenStreetMap\n // Default to Switzerland/Alps area\n const getStaticMapUrl = () => {\n const lat = center?.lat ?? 46.8;\n const lng = center?.lng ?? 9.8;\n const z = zoom;\n\n // Calculate tile coordinates\n const x = Math.floor((lng + 180) / 360 * Math.pow(2, z));\n const y = Math.floor((1 - Math.log(Math.tan(lat * Math.PI / 180) + 1 / Math.cos(lat * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, z));\n\n return `https://tile.openstreetmap.org/${z}/${x}/${y}.png`;\n };\n\n return (\n <div className={`${styles.container} ${className}`}>\n <div className={styles.mapPreview}>\n {/* Map background image */}\n <div\n className={styles.mapImage}\n style={{ backgroundImage: `url(${getStaticMapUrl()})` }}\n />\n\n {/* View in Map button */}\n <div className={styles.buttonContainer}>\n <Button\n variant=\"secondary\"\n size=\"small\"\n onClick={onViewMap}\n className={styles.viewMapText}\n >\n {t('filters.view_in_map', 'View in a Map')}\n </Button>\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport styles from './FilterSkeleton.module.css';\n\n/**\n * FilterSkeleton - Loading placeholder for filter sections\n *\n * Displays a shimmer animation while filter data is loading.\n * Shows placeholder items for checkbox-style filters.\n */\ninterface FilterSkeletonProps {\n /** Number of skeleton items to show */\n itemCount?: number;\n /** Show expandable country/region style skeleton */\n isRegionFilter?: boolean;\n /** Show price range slider style skeleton */\n isPriceFilter?: boolean;\n /** Show discount filter (checkbox list with 3 items) skeleton */\n isDiscountFilter?: boolean;\n /** Show category filter (star ratings) skeleton */\n isCategoryFilter?: boolean;\n}\n\nexport const FilterSkeleton: React.FC<FilterSkeletonProps> = ({\n itemCount = 5,\n isRegionFilter = false,\n isPriceFilter = false,\n isDiscountFilter = false,\n isCategoryFilter = false,\n}) => {\n // Price range filter skeleton - histogram + slider + inputs\n if (isPriceFilter) {\n return (\n <div className={styles.priceSkeleton}>\n {/* Histogram bars */}\n <div className={styles.histogramSkeleton}>\n {Array.from({ length: 20 }).map((_, idx) => (\n <div\n key={idx}\n className={`${styles.histogramBar} ${styles.skeleton}`}\n style={{ height: `${20 + Math.random() * 60}%` }}\n />\n ))}\n </div>\n {/* Slider track */}\n <div className={styles.sliderSkeleton}>\n <div className={`${styles.sliderTrack} ${styles.skeleton}`} />\n <div className={`${styles.sliderHandle} ${styles.skeleton}`} style={{ left: '20%' }} />\n <div className={`${styles.sliderHandle} ${styles.skeleton}`} style={{ left: '80%' }} />\n </div>\n {/* Price inputs */}\n <div className={styles.priceInputsSkeleton}>\n <div className={`${styles.priceInputBox} ${styles.skeleton}`} />\n <div className={styles.priceInputDivider}>—</div>\n <div className={`${styles.priceInputBox} ${styles.skeleton}`} />\n </div>\n </div>\n );\n }\n\n // Discount filter skeleton - 3 checkbox items\n if (isDiscountFilter) {\n return (\n <div className={styles.filterSkeleton}>\n {[1, 2, 3].map((idx) => (\n <div key={idx} className={styles.filterRow}>\n <div className={`${styles.checkbox} ${styles.skeleton}`} />\n <div className={`${styles.label} ${styles.skeleton}`} style={{ width: '40px' }} />\n <div className={`${styles.count} ${styles.skeleton}`} />\n </div>\n ))}\n </div>\n );\n }\n\n // Category filter skeleton - 5 star rating rows\n if (isCategoryFilter) {\n return (\n <div className={styles.filterSkeleton}>\n {[5, 4, 3, 2, 1].map((stars) => (\n <div key={stars} className={styles.filterRow}>\n <div className={`${styles.checkbox} ${styles.skeleton}`} />\n <div className={styles.starsRow}>\n {Array.from({ length: stars }).map((_, idx) => (\n <div key={idx} className={`${styles.star} ${styles.skeleton}`} />\n ))}\n </div>\n <div className={`${styles.count} ${styles.skeleton}`} />\n </div>\n ))}\n </div>\n );\n }\n\n if (isRegionFilter) {\n return (\n <div className={styles.regionSkeleton}>\n {/* Country items with sub-regions */}\n {[1, 2, 3].map((countryIdx) => (\n <div key={countryIdx} className={styles.countryGroup}>\n <div className={styles.countryRow}>\n <div className={`${styles.checkbox} ${styles.skeleton}`} />\n <div className={`${styles.countryLabel} ${styles.skeleton}`} />\n <div className={`${styles.count} ${styles.skeleton}`} />\n </div>\n {/* Sub-regions for first country only */}\n {countryIdx === 1 && (\n <div className={styles.subRegions}>\n {[1, 2, 3, 4].map((regionIdx) => (\n <div key={regionIdx} className={styles.regionRow}>\n <div className={`${styles.checkbox} ${styles.skeleton}`} />\n <div className={`${styles.regionLabel} ${styles.skeleton}`} />\n <div className={`${styles.count} ${styles.skeleton}`} />\n </div>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div className={styles.filterSkeleton}>\n {Array.from({ length: itemCount }).map((_, idx) => (\n <div key={idx} className={styles.filterRow}>\n <div className={`${styles.checkbox} ${styles.skeleton}`} />\n <div className={`${styles.label} ${styles.skeleton}`} style={{ width: `${60 + Math.random() * 30}%` }} />\n <div className={`${styles.count} ${styles.skeleton}`} />\n </div>\n ))}\n </div>\n );\n};\n\nexport default FilterSkeleton;\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { useResponsive } from '../../hooks';\nimport { useUIContext } from '../../context';\nimport {\n CollapsibleFilterSection,\n FilterMinimap,\n ExperienceFilter,\n MealsFilter,\n ReviewsFilter,\n TransportFilter,\n WellnessFilter,\n HotelCategoryFilter,\n RegionsFilter,\n FilterSkeleton,\n PriceRangeFilter,\n FilterCheckboxItem,\n CATEGORY_OPTIONS,\n} from './components';\nimport type { RegionOption } from './components';\nimport styles from './FilterPanel.module.css';\n\n/**\n * FilterPanel - Sidebar filters for search results\n *\n * Figma Spec (Desktop):\n * - Width: 280px\n * - Position: Fixed left sidebar\n * - Independent scroll\n * - Filter groups: Selected, Regions, Experience, Price, Discount, Options, Meals, Category, Reviews, Transport, Wellness\n *\n * Figma Spec (Mobile):\n * - Full-screen modal overlay\n * - Opened by \"Filter\" button in search bar\n * - Shows active filter count badge\n */\n\n// Types for filter options from API\nexport interface ThemeAggregation {\n id: number;\n name: string;\n count: number;\n}\n\nexport interface FilterOption {\n id: number;\n key: string;\n name: string;\n}\n\nexport interface FilterOptions {\n meals?: FilterOption[];\n transport?: FilterOption[];\n wellness?: FilterOption[];\n services?: FilterOption[];\n}\n\nexport interface FilterPanelProps {\n onFilterChange?: (filters: FilterState) => void;\n /** Callback when \"View in a Map\" is clicked */\n onViewMap?: () => void;\n className?: string;\n /** Show skeleton loaders while filter data is loading */\n isLoading?: boolean;\n priceHistogram?: number[];\n minPrice?: number;\n maxPrice?: number;\n regions?: RegionOption[];\n discountCounts?: { [key: string]: number };\n optionsCounts?: { [key: string]: number };\n categoryCounts?: { [key: string]: number };\n experienceCounts?: { [key: string]: number };\n /** Theme aggregations with pre-translated names from API */\n themes?: ThemeAggregation[];\n mealsCounts?: { [key: string]: number };\n reviewsCounts?: { [key: string]: number };\n transportCounts?: { [key: string]: number };\n wellnessCounts?: { [key: string]: number };\n servicesCounts?: { [key: string]: number };\n /** Filter options with pre-translated names from database */\n filterOptions?: FilterOptions;\n /** Controlled selected values - synced with external state (e.g., URL params) */\n selectedDiscounts?: string[];\n selectedOptions?: string[];\n selectedExperiences?: string[];\n selectedRegions?: string[];\n selectedCategories?: string[];\n selectedMeals?: string[];\n selectedReviews?: string[];\n selectedTransport?: string[];\n selectedWellness?: string[];\n selectedServices?: string[];\n /** Controlled price range - synced with external state */\n selectedPriceRange?: { min: number; max: number } | null;\n /** Map center coordinates for minimap */\n mapCenter?: { lat: number; lng: number };\n}\n\nexport interface FilterState {\n regions?: string[];\n experiences?: string[];\n priceRange?: { min: number; max: number };\n discounts?: string[];\n options?: string[];\n meals?: string[];\n categories?: string[];\n ratings?: string[];\n transport?: string[];\n wellness?: string[];\n services?: string[];\n}\n\n// No default histogram - show skeleton until real data loads\n\n// Discount filter options - ordered highest to lowest per Figma design\nconst DISCOUNT_OPTIONS = [\n { value: '50', label: '50%' },\n { value: '30', label: '30%' },\n { value: '10', label: '10%' },\n];\n\n// Options filter - per Figma design\nconst OPTIONS_FILTER = [\n { value: 'instant_booking', labelKey: 'filter.instant-booking' },\n];\n\nexport const FilterPanel: React.FC<FilterPanelProps> = ({\n onFilterChange,\n onViewMap,\n className = '',\n isLoading = false,\n priceHistogram,\n minPrice = 50,\n maxPrice = 500,\n regions = [],\n discountCounts = {},\n optionsCounts = {},\n categoryCounts = {},\n experienceCounts = {},\n themes = [],\n mealsCounts = {},\n reviewsCounts = {},\n transportCounts = {},\n wellnessCounts = {},\n servicesCounts = {},\n filterOptions,\n selectedDiscounts: externalDiscounts,\n selectedOptions: externalOptions,\n selectedExperiences: externalExperiences,\n selectedRegions: externalRegions,\n selectedCategories: externalCategories,\n selectedMeals: externalMeals,\n selectedReviews: externalReviews,\n selectedTransport: externalTransport,\n selectedWellness: externalWellness,\n selectedServices: externalServices,\n selectedPriceRange: externalPriceRange,\n mapCenter,\n}) => {\n const { isDesktop } = useResponsive();\n const { t, currency } = useUIContext();\n\n // Track if initial data has been loaded (to avoid showing skeleton on 0 results)\n // Once ANY filter data is loaded, we consider initial load complete\n const hasInitialLoadRef = useRef(false);\n\n // Mark initial load complete when any data arrives\n if (!hasInitialLoadRef.current) {\n if (regions.length > 0 ||\n (priceHistogram && priceHistogram.length > 0) ||\n Object.keys(discountCounts).length > 0 ||\n Object.keys(categoryCounts).length > 0) {\n hasInitialLoadRef.current = true;\n }\n }\n\n // Price range state - initialize from external prop or defaults\n const [priceMin, setPriceMin] = useState(externalPriceRange?.min ?? minPrice);\n const [priceMax, setPriceMax] = useState(externalPriceRange?.max ?? maxPrice);\n\n // Filter states - initialize from external props\n const [selectedRegions, setSelectedRegions] = useState<string[]>(externalRegions ?? []);\n const [selectedDiscounts, setSelectedDiscounts] = useState<string[]>(externalDiscounts ?? []);\n const [selectedOptions, setSelectedOptions] = useState<string[]>(externalOptions ?? []);\n const [selectedCategories, setSelectedCategories] = useState<string[]>(externalCategories ?? []);\n const [selectedExperiences, setSelectedExperiences] = useState<string[]>(externalExperiences ?? []);\n const [selectedMeals, setSelectedMeals] = useState<string[]>(externalMeals ?? []);\n const [selectedReviews, setSelectedReviews] = useState<string[]>(externalReviews ?? []);\n const [selectedTransport, setSelectedTransport] = useState<string[]>(externalTransport ?? []);\n const [selectedWellness, setSelectedWellness] = useState<string[]>(externalWellness ?? []);\n const [selectedServices, setSelectedServices] = useState<string[]>(externalServices ?? []);\n\n // Sync price range when props change (either from external or bounds)\n useEffect(() => {\n if (externalPriceRange) {\n setPriceMin(externalPriceRange.min);\n setPriceMax(externalPriceRange.max);\n } else {\n setPriceMin(minPrice);\n setPriceMax(maxPrice);\n }\n }, [externalPriceRange, minPrice, maxPrice]);\n\n // Sync all external filter states with internal state\n useEffect(() => {\n if (externalDiscounts !== undefined) {\n setSelectedDiscounts(externalDiscounts);\n }\n }, [externalDiscounts]);\n\n useEffect(() => {\n if (externalOptions !== undefined) {\n setSelectedOptions(externalOptions);\n }\n }, [externalOptions]);\n\n useEffect(() => {\n if (externalExperiences !== undefined) {\n setSelectedExperiences(externalExperiences);\n }\n }, [externalExperiences]);\n\n useEffect(() => {\n if (externalRegions !== undefined) {\n setSelectedRegions(externalRegions);\n }\n }, [externalRegions]);\n\n useEffect(() => {\n if (externalCategories !== undefined) {\n setSelectedCategories(externalCategories);\n }\n }, [externalCategories]);\n\n useEffect(() => {\n if (externalMeals !== undefined) {\n setSelectedMeals(externalMeals);\n }\n }, [externalMeals]);\n\n useEffect(() => {\n if (externalReviews !== undefined) {\n setSelectedReviews(externalReviews);\n }\n }, [externalReviews]);\n\n useEffect(() => {\n if (externalTransport !== undefined) {\n setSelectedTransport(externalTransport);\n }\n }, [externalTransport]);\n\n useEffect(() => {\n if (externalWellness !== undefined) {\n setSelectedWellness(externalWellness);\n }\n }, [externalWellness]);\n\n useEffect(() => {\n if (externalServices !== undefined) {\n setSelectedServices(externalServices);\n }\n }, [externalServices]);\n\n // Handle price range change from unified component\n const handlePriceChange = (value: { min: number; max: number }) => {\n setPriceMin(value.min);\n setPriceMax(value.max);\n };\n\n // Handle price apply - PriceRangeFilter already debounces, so we just call onFilterChange directly\n const handlePriceApply = useCallback((range: { min: number; max: number }) => {\n onFilterChange?.({ priceRange: range });\n }, [onFilterChange]);\n\n // Handle filter toggles\n const handleDiscountToggle = (discountValue: string) => {\n setSelectedDiscounts(prev => {\n const newDiscounts = prev.includes(discountValue)\n ? prev.filter(d => d !== discountValue)\n : [...prev, discountValue];\n onFilterChange?.({ discounts: newDiscounts });\n return newDiscounts;\n });\n };\n\n const handleOptionToggle = (optionValue: string) => {\n setSelectedOptions(prev => {\n const newOptions = prev.includes(optionValue)\n ? prev.filter(o => o !== optionValue)\n : [...prev, optionValue];\n onFilterChange?.({ options: newOptions });\n return newOptions;\n });\n };\n\n const handleCategoriesChange = (values: string[]) => {\n setSelectedCategories(values);\n onFilterChange?.({ categories: values });\n };\n\n const handleRegionsChange = (values: string[]) => {\n setSelectedRegions(values);\n onFilterChange?.({ regions: values });\n };\n\n const handleExperienceChange = (values: string[]) => {\n setSelectedExperiences(values);\n onFilterChange?.({ experiences: values });\n };\n\n const handleMealsChange = (values: string[]) => {\n setSelectedMeals(values);\n onFilterChange?.({ meals: values });\n };\n\n const handleReviewsChange = (values: string[]) => {\n setSelectedReviews(values);\n onFilterChange?.({ ratings: values });\n };\n\n const handleServicesChange = (values: string[]) => {\n setSelectedServices(values);\n onFilterChange?.({ services: values });\n };\n\n const handleTransportChange = (values: string[]) => {\n setSelectedTransport(values);\n onFilterChange?.({ transport: values });\n };\n\n const handleWellnessChange = (values: string[]) => {\n setSelectedWellness(values);\n onFilterChange?.({ wellness: values });\n };\n\n return (\n <aside className={`${styles.filterPanel} ${className}`}>\n <div className={styles.content}>\n {/* Minimap Preview - Desktop only */}\n {onViewMap && (\n <FilterMinimap\n onViewMap={onViewMap}\n center={mapCenter}\n />\n )}\n\n {/* Destinations Filter */}\n <CollapsibleFilterSection\n title={t('filter.destination', 'Destination')}\n defaultExpanded={true}\n >\n {/* Show skeleton when regions data is not loaded yet */}\n {regions.length === 0 && !hasInitialLoadRef.current ? (\n <FilterSkeleton isRegionFilter />\n ) : (\n <RegionsFilter\n regions={regions}\n selected={selectedRegions}\n onChange={handleRegionsChange}\n />\n )}\n </CollapsibleFilterSection>\n\n {/* Experience Filter */}\n <CollapsibleFilterSection\n title={t('filter.experience', 'Experience')}\n defaultExpanded={selectedExperiences.length > 0}\n >\n <ExperienceFilter\n selected={selectedExperiences}\n themes={themes}\n counts={experienceCounts}\n onChange={handleExperienceChange}\n />\n </CollapsibleFilterSection>\n\n {/* Price Range Filter */}\n <CollapsibleFilterSection\n title={t('filter.price', 'Price')}\n defaultExpanded={true}\n >\n {/* Show skeleton when price histogram data is not loaded yet */}\n {(!priceHistogram || priceHistogram.length === 0) && !hasInitialLoadRef.current ? (\n <FilterSkeleton isPriceFilter />\n ) : (\n <PriceRangeFilter\n minPrice={minPrice}\n maxPrice={maxPrice}\n value={{ min: priceMin, max: priceMax }}\n onChange={handlePriceChange}\n onApply={handlePriceApply}\n histogram={priceHistogram}\n currency={currency}\n />\n )}\n </CollapsibleFilterSection>\n\n {/* Discount Filter */}\n <CollapsibleFilterSection\n title={t('filter.discount', 'Discount')}\n defaultExpanded={true}\n >\n {/* Show skeleton when discount counts are not loaded yet */}\n {Object.keys(discountCounts).length === 0 && !hasInitialLoadRef.current ? (\n <FilterSkeleton isDiscountFilter />\n ) : (\n <div className={styles.discountList}>\n {DISCOUNT_OPTIONS.map(option => {\n const count = discountCounts[option.value];\n const isDisabled = count === 0 && !selectedDiscounts.includes(option.value);\n return (\n <FilterCheckboxItem\n key={option.value}\n id={`discount-${option.value}`}\n label={option.label}\n count={count}\n checked={selectedDiscounts.includes(option.value)}\n disabled={isDisabled}\n onChange={() => handleDiscountToggle(option.value)}\n />\n );\n })}\n </div>\n )}\n </CollapsibleFilterSection>\n\n {/* Options Filter - combines instant_booking + services per Figma */}\n <CollapsibleFilterSection\n title={t('filter.options', 'Options')}\n defaultExpanded={selectedOptions.length > 0 || selectedServices.length > 0}\n >\n <div className={styles.discountList}>\n {/* Instant booking option */}\n {OPTIONS_FILTER.map(option => {\n const count = optionsCounts[option.value];\n const isDisabled = count === 0 && !selectedOptions.includes(option.value);\n return (\n <FilterCheckboxItem\n key={option.value}\n id={`option-${option.value}`}\n label={t(option.labelKey, 'Instant booking')}\n count={count}\n checked={selectedOptions.includes(option.value)}\n disabled={isDisabled}\n onChange={() => handleOptionToggle(option.value)}\n />\n );\n })}\n {/* Services options (24h front desk, accessible, pets allowed) */}\n {filterOptions?.services?.map(option => {\n const count = servicesCounts[option.key];\n const isDisabled = count === 0 && !selectedServices.includes(option.key);\n return (\n <FilterCheckboxItem\n key={option.key}\n id={`service-${option.key}`}\n label={option.name}\n count={count}\n checked={selectedServices.includes(option.key)}\n disabled={isDisabled}\n onChange={() => handleServicesChange(\n selectedServices.includes(option.key)\n ? selectedServices.filter(v => v !== option.key)\n : [...selectedServices, option.key]\n )}\n />\n );\n })}\n </div>\n </CollapsibleFilterSection>\n\n {/* Meals Filter */}\n {filterOptions?.meals && filterOptions.meals.length > 0 && (\n <CollapsibleFilterSection\n title={t('filter.meals', 'Meals')}\n defaultExpanded={selectedMeals.length > 0}\n >\n <MealsFilter\n selected={selectedMeals}\n counts={mealsCounts}\n options={filterOptions.meals}\n onChange={handleMealsChange}\n />\n </CollapsibleFilterSection>\n )}\n\n {/* Hotel Category Filter */}\n <CollapsibleFilterSection\n title={t('filter.hotel-category', 'Hotel category')}\n defaultExpanded={true}\n >\n {/* Show skeleton when category counts are not loaded yet */}\n {Object.keys(categoryCounts).length === 0 && !hasInitialLoadRef.current ? (\n <FilterSkeleton isCategoryFilter />\n ) : (\n <HotelCategoryFilter\n selected={selectedCategories}\n counts={categoryCounts}\n onChange={handleCategoriesChange}\n />\n )}\n </CollapsibleFilterSection>\n\n {/* Reviews Filter */}\n <CollapsibleFilterSection\n title={t('filter.reviews', 'Reviews')}\n defaultExpanded={selectedReviews.length > 0}\n >\n <ReviewsFilter\n selected={selectedReviews}\n counts={reviewsCounts}\n onChange={handleReviewsChange}\n />\n </CollapsibleFilterSection>\n\n {/* Transport Options Filter */}\n {filterOptions?.transport && filterOptions.transport.length > 0 && (\n <CollapsibleFilterSection\n title={t('filter.mobility', 'Mobility')}\n defaultExpanded={selectedTransport.length > 0}\n >\n <TransportFilter\n selected={selectedTransport}\n counts={transportCounts}\n options={filterOptions.transport}\n onChange={handleTransportChange}\n />\n </CollapsibleFilterSection>\n )}\n\n {/* Wellness & Spa Filter */}\n {filterOptions?.wellness && filterOptions.wellness.length > 0 && (\n <CollapsibleFilterSection\n title={t('filter.wellness-spa', 'Wellness & Spa')}\n defaultExpanded={selectedWellness.length > 0}\n >\n <WellnessFilter\n selected={selectedWellness}\n counts={wellnessCounts}\n options={filterOptions.wellness}\n onChange={handleWellnessChange}\n />\n </CollapsibleFilterSection>\n )}\n\n </div>\n </aside>\n );\n};\n","import React, { useEffect } from 'react';\nimport { useUIContext } from '../../context';\nimport { Button } from '../Button';\nimport { FilterPanel, FilterPanelProps } from '../FilterPanel/FilterPanel';\nimport { SelectedFiltersRow, SelectedFilter } from '../FilterPanel/components/SelectedFiltersRow';\nimport styles from './FilterModal.module.css';\n\n/**\n * FilterModal - Modal wrapper for FilterPanel\n *\n * Used in:\n * - Mobile list view\n * - Map view (both desktop and mobile)\n *\n * This is just a modal container - all filter logic is in FilterPanel\n * Selected filters chips are passed from the parent (same as list view)\n */\n\nexport interface FilterModalProps extends Omit<FilterPanelProps, 'className' | 'onViewMap'> {\n isOpen: boolean;\n onClose: () => void;\n resultCount?: number;\n /** Selected filters to display as chips - passed from parent */\n selectedFilters?: SelectedFilter[];\n /** Handler for removing a single filter chip - passed from parent */\n onRemoveFilter?: (filter: SelectedFilter) => void;\n /** Handler for clearing all filters - passed from parent */\n onClearAllFilters?: () => void;\n}\n\n// Close icon\nconst CloseIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\">\n <path d=\"M0.275391 1.59961C-0.0917969 1.23242 -0.0917969 0.638672 0.275391 0.275391C0.642578 -0.0878906 1.23633 -0.0917969 1.59961 0.275391L7.49805 6.17383L13.3965 0.275391C13.7637 -0.0917969 14.3574 -0.0917969 14.7207 0.275391C15.084 0.642578 15.0879 1.23633 14.7207 1.59961L8.82226 7.49805L14.7207 13.3965C15.0879 13.7637 15.0879 14.3574 14.7207 14.7207C14.3535 15.084 13.7598 15.0879 13.3965 14.7207L7.49805 8.82226L1.59961 14.7207C1.23242 15.0879 0.638672 15.0879 0.275391 14.7207C-0.0878906 14.3535 -0.0917969 13.7598 0.275391 13.3965L6.17383 7.49805L0.275391 1.59961Z\" fill=\"#1F2937\"/>\n </svg>\n);\n\nexport const FilterModal: React.FC<FilterModalProps> = ({\n isOpen,\n onClose,\n resultCount = 0,\n selectedFilters = [],\n onRemoveFilter,\n onClearAllFilters,\n onFilterChange,\n selectedDiscounts = [],\n selectedOptions = [],\n selectedCategories = [],\n selectedExperiences = [],\n selectedRegions = [],\n selectedMeals = [],\n selectedWellness = [],\n selectedServices = [],\n selectedTransport = [],\n selectedReviews = [],\n selectedPriceRange,\n minPrice = 0,\n maxPrice = 500,\n regions = [],\n ...filterPanelProps\n}) => {\n const { t } = useUIContext();\n const hasSelectedFilters = selectedFilters.length > 0;\n\n // Prevent body scroll when modal is open\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = '';\n };\n }\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n return (\n <div className={styles.overlay}>\n <div className={styles.modal}>\n {/* Header */}\n <div className={styles.header}>\n <h2 className={styles.title}>\n {t('filter.filters', 'Filters')}\n </h2>\n <Button\n variant=\"secondary\"\n size=\"small\"\n iconOnly\n onClick={onClose}\n aria-label={t('common.close', 'Close')}\n >\n <CloseIcon />\n </Button>\n </div>\n\n {/* Scrollable Content - FilterPanel */}\n <div className={styles.content}>\n {/* Selected filters chips - below header (reusing same component as list view) */}\n {selectedFilters.length > 0 && onRemoveFilter && onClearAllFilters && (\n <div className={styles.selectedFilters}>\n <SelectedFiltersRow\n filters={selectedFilters}\n onRemove={onRemoveFilter}\n onClearAll={onClearAllFilters}\n />\n </div>\n )}\n <FilterPanel\n {...filterPanelProps}\n onFilterChange={onFilterChange}\n selectedDiscounts={selectedDiscounts}\n selectedOptions={selectedOptions}\n selectedCategories={selectedCategories}\n selectedExperiences={selectedExperiences}\n selectedRegions={selectedRegions}\n selectedMeals={selectedMeals}\n selectedWellness={selectedWellness}\n selectedServices={selectedServices}\n selectedTransport={selectedTransport}\n selectedReviews={selectedReviews}\n selectedPriceRange={selectedPriceRange}\n minPrice={minPrice}\n maxPrice={maxPrice}\n regions={regions}\n className={styles.filterPanel}\n />\n </div>\n\n {/* Footer */}\n <div className={styles.footer}>\n {onClearAllFilters && (\n <Button\n variant=\"link\"\n className={styles.footerLink}\n onClick={onClearAllFilters}\n disabled={!hasSelectedFilters}\n >\n {t('filter.clear-all', 'Clear all')}\n </Button>\n )}\n <Button\n variant=\"primary\"\n size=\"medium\"\n onClick={onClose}\n >\n {t('filters.show_results', { count: resultCount }, `Show ${resultCount} results`)}\n </Button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default FilterModal;\n","import React, { useState, useRef } from 'react';\nimport { useUIContext } from '../../context';\nimport type { BookingCardDetailsProps } from './BookingCard.types';\n\nconst ChevronDownIcon = ({ expanded }: { expanded: boolean }) => (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ transform: expanded ? 'rotate(180deg)' : 'rotate(0deg)', transition: 'transform 0.2s' }}\n >\n <path d=\"M6 9L12 15L18 9\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nfunction formatDate(dateString: string, locale: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(locale, {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n });\n}\n\nfunction formatDateTime(dateString: string, time: string | undefined, locale: string): string {\n const formatted = formatDate(dateString, locale);\n return time ? `${formatted}, ${time}` : formatted;\n}\n\nfunction formatPrice(amount: number, currency: string): string {\n return `${currency} ${amount.toFixed(0)}`;\n}\n\nexport const BookingCardDetails: React.FC<BookingCardDetailsProps> = ({\n booking,\n onCancelBooking,\n}) => {\n const { t, locale } = useUIContext();\n const [isExpanded, setIsExpanded] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n\n const handleToggle = () => {\n const willExpand = !isExpanded;\n setIsExpanded(willExpand);\n\n if (willExpand) {\n setTimeout(() => {\n contentRef.current?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }, 50);\n }\n };\n\n const guestsText = booking.children > 0\n ? `${booking.adults} adults, ${booking.children} children`\n : `${booking.guests} guests`;\n\n return (\n <div className=\"hc-booking-card-details\">\n <button\n type=\"button\"\n className=\"hc-booking-card-details__header\"\n onClick={handleToggle}\n aria-expanded={isExpanded}\n >\n <span className=\"hc-booking-card-details__header-text\">\n {t('booking.card_more_about_booking', 'More about this booking')}\n </span>\n <span className=\"hc-booking-card-details__header-icon\">\n <ChevronDownIcon expanded={isExpanded} />\n </span>\n </button>\n\n {isExpanded && (\n <div className=\"hc-booking-card-details__content\" ref={contentRef}>\n <div className=\"hc-booking-card-details__row\">\n <span className=\"hc-booking-card-details__label\">\n {t('booking.details_check_in', 'Check-in')}\n </span>\n <span className=\"hc-booking-card-details__value\">\n {formatDateTime(booking.checkIn, booking.hotel.checkInTime, locale)}\n </span>\n </div>\n <div className=\"hc-booking-card-details__row\">\n <span className=\"hc-booking-card-details__label\">\n {t('booking.details_check_out', 'Check-out')}\n </span>\n <span className=\"hc-booking-card-details__value\">\n {formatDateTime(booking.checkOut, booking.hotel.checkOutTime, locale)}\n </span>\n </div>\n\n <div className=\"hc-booking-card-details__row\">\n <span className=\"hc-booking-card-details__label\">\n {t('booking.details_guests', 'Guests')}\n </span>\n <span className=\"hc-booking-card-details__value\">{guestsText}</span>\n </div>\n\n <div className=\"hc-booking-card-details__row\">\n <span className=\"hc-booking-card-details__label\">\n {t('booking.details_room', 'Room name')}\n </span>\n <span className=\"hc-booking-card-details__value\">{booking.roomName}</span>\n </div>\n\n {booking.hasBreakfast && (\n <div className=\"hc-booking-card-details__row\">\n <span className=\"hc-booking-card-details__label\">\n {t('booking.details_breakfast', 'Breakfast')}\n </span>\n <span className=\"hc-booking-card-details__value\">\n {booking.breakfastInfo || 'Included'}\n </span>\n </div>\n )}\n\n {booking.cancellationPolicy && (\n <div className=\"hc-booking-card-details__row\">\n <span className=\"hc-booking-card-details__label\">\n {t('booking.details_cancellation', 'Cancellation')}\n </span>\n <span className=\"hc-booking-card-details__value\">\n {booking.cancellationPolicy}\n </span>\n </div>\n )}\n\n {booking.isCancellable && onCancelBooking && (\n <button\n type=\"button\"\n className=\"hc-booking-card-details__cancel-link\"\n onClick={onCancelBooking}\n >\n {t('booking.details_cancel_booking', 'Cancel booking')}\n </button>\n )}\n\n <div className=\"hc-booking-card-details__divider\" />\n\n <div className=\"hc-booking-card-details__row\">\n <span className=\"hc-booking-card-details__label\">\n {t('booking.details_booked', 'Booked')}\n </span>\n <span className=\"hc-booking-card-details__value\">\n {formatDate(booking.bookedAt, locale)}\n </span>\n </div>\n\n <div className=\"hc-booking-card-details__price-section\">\n <div className=\"hc-booking-card-details__row\">\n <span className=\"hc-booking-card-details__label\">\n {t('booking.details_room_price', 'Room price')}\n </span>\n <span className=\"hc-booking-card-details__price-original\">\n {formatPrice(booking.originalPrice, booking.currency)}\n </span>\n </div>\n <div className=\"hc-booking-card-details__row\">\n <span className=\"hc-booking-card-details__label--highlight\">\n {t('booking.details_saved_with_hotelcard', 'Saved with HotelCard')}\n </span>\n <span className=\"hc-booking-card-details__value--savings\">\n -{formatPrice(booking.savings, booking.currency)}\n </span>\n </div>\n <div className=\"hc-booking-card-details__row--total\">\n <span className=\"hc-booking-card-details__label--total\">\n {t('booking.details_total_cost', 'Total cost')}\n </span>\n <span className=\"hc-booking-card-details__value--total\">\n {formatPrice(booking.totalPrice, booking.currency)}\n </span>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nBookingCardDetails.displayName = 'BookingCardDetails';\n","import React, { useState } from 'react';\nimport { useUIContext } from '../../context';\nimport { BaseCard, BaseCardImage, BaseCardContent } from '../BaseCard';\nimport { Button } from '../Button';\nimport { BookingCardDetails } from './BookingCardDetails';\nimport './BookingCard.css';\nimport type { FeaturedBookingCardProps } from './BookingCard.types';\n\nconst LocationIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 1.33334C5.42 1.33334 3.33333 3.42001 3.33333 6.00001C3.33333 9.50001 8 14.6667 8 14.6667C8 14.6667 12.6667 9.50001 12.6667 6.00001C12.6667 3.42001 10.58 1.33334 8 1.33334ZM8 7.66668C7.08 7.66668 6.33333 6.92001 6.33333 6.00001C6.33333 5.08001 7.08 4.33334 8 4.33334C8.92 4.33334 9.66667 5.08001 9.66667 6.00001C9.66667 6.92001 8.92 7.66668 8 7.66668Z\" fill=\"currentColor\"/>\n </svg>\n);\n\nconst PhoneIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14.6667 11.28V13.28C14.6675 13.4657 14.6294 13.6495 14.555 13.8196C14.4806 13.9897 14.3715 14.1424 14.2347 14.2679C14.0979 14.3934 13.9364 14.489 13.7605 14.5485C13.5847 14.608 13.3983 14.6301 13.2133 14.6133C11.1619 14.3904 9.19135 13.6894 7.46 12.5667C5.84926 11.5431 4.48356 10.1774 3.46 8.56668C2.33333 6.82748 1.6322 4.84738 1.41333 2.78668C1.39666 2.60233 1.41852 2.41652 1.47763 2.24115C1.53673 2.06577 1.63175 1.90457 1.75655 1.76793C1.88134 1.63129 2.03323 1.52209 2.20256 1.44728C2.37189 1.37248 2.55491 1.33374 2.74 1.33334H4.74C5.06354 1.33016 5.37723 1.44473 5.6228 1.65569C5.86838 1.86665 6.02963 2.15962 6.07333 2.48001C6.15458 3.12005 6.31363 3.74849 6.54667 4.35334C6.63598 4.59196 6.64916 4.85127 6.58441 5.09719C6.51966 5.34311 6.37987 5.56478 6.18333 5.73334L5.34 6.57668C6.28937 8.25964 7.74037 9.71064 9.42333 10.66L10.2667 9.81668C10.4352 9.62014 10.6569 9.48035 10.9028 9.4156C11.1487 9.35085 11.408 9.36403 11.6467 9.45334C12.2515 9.68638 12.88 9.84543 13.52 9.92668C13.8438 9.97078 14.1396 10.1355 14.3511 10.3857C14.5625 10.6359 14.6748 10.9545 14.6667 11.28Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nconst EmailIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2.66666 2.66666H13.3333C14.0667 2.66666 14.6667 3.26666 14.6667 3.99999V12C14.6667 12.7333 14.0667 13.3333 13.3333 13.3333H2.66666C1.93333 13.3333 1.33333 12.7333 1.33333 12V3.99999C1.33333 3.26666 1.93333 2.66666 2.66666 2.66666Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M14.6667 4L8 8.66667L1.33333 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nconst MapIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.33334 4V13.3333L5.33334 10.6667L10.6667 13.3333L14.6667 10.6667V1.33334L10.6667 4L5.33334 1.33334L1.33334 4Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M5.33334 1.33334V10.6667\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M10.6667 4V13.3333\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nconst MessageIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 10C14 10.3536 13.8595 10.6928 13.6095 10.9428C13.3594 11.1929 13.0203 11.3333 12.6667 11.3333H4.66667L2 14V3.33333C2 2.97971 2.14048 2.64057 2.39052 2.39052C2.64057 2.14048 2.97971 2 3.33333 2H12.6667C13.0203 2 13.3594 2.14048 13.6095 2.39052C13.8595 2.64057 14 2.97971 14 3.33333V10Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nconst ChevronDownIcon = ({ expanded }: { expanded: boolean }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ transform: expanded ? 'rotate(180deg)' : 'rotate(0deg)', transition: 'transform 0.2s' }}\n >\n <path d=\"M6 9L12 15L18 9\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nconst ClockIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <path d=\"M6 3V6L8 7\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n);\n\nfunction getDaysUntil(checkIn: string): number {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const checkInDate = new Date(checkIn);\n checkInDate.setHours(0, 0, 0, 0);\n const diffTime = checkInDate.getTime() - today.getTime();\n return Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n}\n\nfunction formatDateRange(checkIn: string, checkOut: string, locale: string): string {\n const inDate = new Date(checkIn);\n const outDate = new Date(checkOut);\n\n const inDay = inDate.getDate();\n const outDay = outDate.getDate();\n const month = outDate.toLocaleDateString(locale, { month: 'short' });\n const year = outDate.getFullYear();\n\n if (inDate.getMonth() === outDate.getMonth()) {\n return `${inDay}–${outDay} ${month} ${year}`;\n }\n\n const inMonth = inDate.toLocaleDateString(locale, { month: 'short' });\n return `${inDay} ${inMonth} – ${outDay} ${month} ${year}`;\n}\n\nexport const FeaturedBookingCard: React.FC<FeaturedBookingCardProps> = ({\n booking,\n onCancelBooking,\n onAddToCalendar,\n}) => {\n const { t, locale } = useUIContext();\n const [showHotelMessage, setShowHotelMessage] = useState(false);\n\n const fullAddress = `${booking.hotel.address}, ${booking.hotel.postalCode} ${booking.hotel.city}`;\n const daysUntil = getDaysUntil(booking.checkIn);\n\n const handleDirections = () => {\n const encoded = encodeURIComponent(fullAddress);\n const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);\n const url = isIOS\n ? `maps://maps.apple.com/?daddr=${encoded}`\n : `https://www.google.com/maps/dir/?api=1&destination=${encoded}`;\n window.open(url, '_system');\n };\n\n return (\n <div>\n <BaseCard hoverable={false} borderRadius={16}>\n <BaseCardImage\n src={booking.hotel.imageUrl || ''}\n alt={booking.hotel.name}\n aspectRatio=\"16/9\"\n showGradient={true}\n />\n\n <BaseCardContent padding=\"medium\">\n <div className=\"hc-featured-booking-card__content\">\n <div className=\"hc-featured-booking-card__date-row\">\n <span className=\"hc-featured-booking-card__date-range\">\n {formatDateRange(booking.checkIn, booking.checkOut, locale)}\n </span>\n {daysUntil > 0 && (\n <span className=\"hc-featured-booking-card__countdown-badge\">\n <ClockIcon />\n {daysUntil} {t('booking.countdown_days', 'days')}\n </span>\n )}\n </div>\n\n <h2 className=\"hc-featured-booking-card__hotel-name\">\n <span className=\"hc-featured-booking-card__location-icon\"><LocationIcon /></span>\n {booking.hotel.name}\n </h2>\n\n <button\n type=\"button\"\n className=\"hc-featured-booking-card__address-row\"\n onClick={handleDirections}\n aria-label={t('booking.card_directions', 'Directions')}\n >\n <span className=\"hc-featured-booking-card__address\">{fullAddress}</span>\n <span className=\"hc-featured-booking-card__directions-icon\"><MapIcon /></span>\n </button>\n\n <div className=\"hc-featured-booking-card__contact-links\">\n <a href={`tel:${booking.hotel.phone}`} className=\"hc-featured-booking-card__contact-link\">\n <PhoneIcon />\n <span>{booking.hotel.phone}</span>\n </a>\n <a href={`mailto:${booking.hotel.email}`} className=\"hc-featured-booking-card__contact-link\">\n <EmailIcon />\n <span>{booking.hotel.email}</span>\n </a>\n </div>\n\n {booking.hotelMessage && (\n <div className=\"hc-featured-booking-card__message-section\">\n <button\n type=\"button\"\n className=\"hc-featured-booking-card__message-header\"\n onClick={() => setShowHotelMessage(!showHotelMessage)}\n >\n <span className=\"hc-featured-booking-card__message-icon\"><MessageIcon /></span>\n <span className=\"hc-featured-booking-card__message-title\">\n {t('booking.card_message_from_hotel', 'Message from the hotel')}\n </span>\n <span className=\"hc-featured-booking-card__message-chevron\">\n <ChevronDownIcon expanded={showHotelMessage} />\n </span>\n </button>\n {showHotelMessage && (\n <p className=\"hc-featured-booking-card__message-content\">{booking.hotelMessage}</p>\n )}\n </div>\n )}\n\n <BookingCardDetails\n booking={booking}\n onCancelBooking={onCancelBooking}\n />\n\n {onAddToCalendar && (\n <Button\n variant=\"secondary\"\n size=\"small\"\n onClick={onAddToCalendar}\n >\n {t('booking.countdown_add_to_calendar', 'Add to calendar')}\n </Button>\n )}\n </div>\n </BaseCardContent>\n </BaseCard>\n </div>\n );\n};\n\nFeaturedBookingCard.displayName = 'FeaturedBookingCard';\n","import React from 'react';\nimport { useUIContext } from '../../context';\nimport { BaseCard, BaseCardContent } from '../BaseCard';\nimport { Button } from '../Button';\nimport { BookingCardDetails } from './BookingCardDetails';\nimport type { CompactBookingCardProps } from './BookingCard.types';\nimport type { Booking } from '../../types';\nimport './BookingCard.css';\n\nconst LocationIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 1.33334C5.42 1.33334 3.33333 3.42001 3.33333 6.00001C3.33333 9.50001 8 14.6667 8 14.6667C8 14.6667 12.6667 9.50001 12.6667 6.00001C12.6667 3.42001 10.58 1.33334 8 1.33334ZM8 7.66668C7.08 7.66668 6.33333 6.92001 6.33333 6.00001C6.33333 5.08001 7.08 4.33334 8 4.33334C8.92 4.33334 9.66667 5.08001 9.66667 6.00001C9.66667 6.92001 8.92 7.66668 8 7.66668Z\" fill=\"currentColor\"/>\n </svg>\n);\n\nfunction formatDateRange(checkIn: string, checkOut: string, locale: string): string {\n const inDate = new Date(checkIn);\n const outDate = new Date(checkOut);\n\n const inDay = inDate.getDate();\n const outDay = outDate.getDate();\n const month = outDate.toLocaleDateString(locale, { month: 'short' });\n const year = outDate.getFullYear();\n\n if (inDate.getMonth() === outDate.getMonth()) {\n return `${inDay}–${outDay} ${month} ${year}`;\n }\n\n const inMonth = inDate.toLocaleDateString(locale, { month: 'short' });\n return `${inDay} ${inMonth} – ${outDay} ${month} ${year}`;\n}\n\nfunction formatPrice(amount: number, currency: string): string {\n return `${currency} ${amount.toFixed(0)}`;\n}\n\nconst StatusBadge: React.FC<{ status: Booking['status'] }> = ({ status }) => {\n const { t } = useUIContext();\n\n const statusLabels: Record<Booking['status'], string> = {\n confirmed: t('booking.status_confirmed', 'Confirmed'),\n completed: t('booking.status_completed', 'Completed'),\n cancelled: t('booking.status_cancelled', 'Cancelled'),\n };\n\n return (\n <span className={`hc-compact-booking-card__status-badge hc-compact-booking-card__status-badge--${status}`}>\n {statusLabels[status]}\n </span>\n );\n};\n\nexport const CompactBookingCard: React.FC<CompactBookingCardProps> = ({\n booking,\n showBookAgain = true,\n onBookAgain,\n onAddToCalendar,\n}) => {\n const { t, locale } = useUIContext();\n\n const location = `${booking.hotel.city}, ${booking.hotel.country}`;\n\n return (\n <BaseCard hoverable={false} borderRadius={16}>\n <BaseCardContent padding=\"medium\">\n <div className=\"hc-compact-booking-card__content\">\n <div className=\"hc-compact-booking-card__top-row\">\n <div className=\"hc-compact-booking-card__thumbnail\">\n {booking.hotel.imageUrl ? (\n <img\n src={booking.hotel.imageUrl}\n alt={booking.hotel.name}\n className=\"hc-compact-booking-card__thumbnail-image\"\n />\n ) : (\n <div className=\"hc-compact-booking-card__thumbnail-placeholder\" />\n )}\n </div>\n\n <div className=\"hc-compact-booking-card__info\">\n <StatusBadge status={booking.status} />\n\n <h3 className=\"hc-compact-booking-card__hotel-name\">{booking.hotel.name}</h3>\n\n <p className=\"hc-compact-booking-card__location\">\n <LocationIcon />\n <span>{location}</span>\n </p>\n\n <p className=\"hc-compact-booking-card__date-range\">\n {formatDateRange(booking.checkIn, booking.checkOut, locale)}\n </p>\n\n <div className=\"hc-compact-booking-card__price-row\">\n <span className=\"hc-compact-booking-card__price-original\">\n {formatPrice(booking.originalPrice, booking.currency)}\n </span>\n <span className=\"hc-compact-booking-card__price-current\">\n {formatPrice(booking.totalPrice, booking.currency)}\n </span>\n </div>\n </div>\n </div>\n\n {showBookAgain && onBookAgain && (\n <Button\n variant=\"secondary\"\n size=\"small\"\n onClick={onBookAgain}\n >\n {t('booking.card_book_again', 'Book again')}\n </Button>\n )}\n\n {onAddToCalendar && (\n <Button\n variant=\"secondary\"\n size=\"small\"\n onClick={onAddToCalendar}\n >\n {t('booking.countdown_add_to_calendar', 'Add to calendar')}\n </Button>\n )}\n\n <BookingCardDetails booking={booking} />\n </div>\n </BaseCardContent>\n </BaseCard>\n );\n};\n\nCompactBookingCard.displayName = 'CompactBookingCard';\n","import React from 'react';\nimport { BaseCardSkeleton } from '../BaseCard';\nimport './BookingCard.css';\n\nexport const FeaturedBookingCardSkeleton: React.FC = () => {\n return (\n <BaseCardSkeleton imageAspectRatio=\"16/9\">\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__date-range hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__hotel-name hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__address hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__address-short hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__action-row\">\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__action-button hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__action-button hc-skeleton\" />\n </div>\n </BaseCardSkeleton>\n );\n};\n\nFeaturedBookingCardSkeleton.displayName = 'FeaturedBookingCardSkeleton';\n\nexport const CompactBookingCardSkeleton: React.FC = () => {\n return (\n <BaseCardSkeleton imageHeight={0}>\n <div className=\"hc-booking-card-skeleton__compact-content\">\n <div className=\"hc-booking-card-skeleton__compact-top-row\">\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__compact-thumbnail hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__compact-info\">\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__status-badge hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__compact-name hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__location hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__date hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__compact-price-row\">\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__price-original hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__price-current hc-skeleton\" />\n </div>\n </div>\n </div>\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__full-button hc-skeleton\" />\n </div>\n </BaseCardSkeleton>\n );\n};\n\nCompactBookingCardSkeleton.displayName = 'CompactBookingCardSkeleton';\n","interface HeartIconProps {\n filled?: boolean;\n className?: string;\n size?: number;\n}\n\nexport const HeartIcon = ({ filled = false, className = '', size = 24 }: HeartIconProps) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n className={className}\n fill={filled ? 'currentColor' : 'none'}\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z\" />\n </svg>\n);\n\nHeartIcon.displayName = 'HeartIcon';\n","interface StarIconProps {\n filled?: boolean;\n className?: string;\n size?: number;\n}\n\n// Small filled star for hotel category display\nexport const StarIcon = ({ filled = true, className = '', size = 9 }: StarIconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 9 9\"\n fill=\"none\"\n className={className}\n >\n <g clipPath=\"url(#clip0_star_icon)\">\n <path\n d=\"M4.80018 0.366577C4.93104 0.366577 5.05173 0.440968 5.11135 0.557659L6.18011 2.66102L8.50521 3.03152C8.63462 3.05194 8.74222 3.14383 8.78294 3.26927C8.82365 3.39472 8.79021 3.53183 8.6986 3.62518L7.03366 5.29533L7.40155 7.6277C7.42191 7.75752 7.3681 7.88879 7.26195 7.9661C7.15581 8.04341 7.01476 8.05508 6.89843 7.99528L4.80018 6.92463L2.70192 7.99528C2.58559 8.05508 2.44454 8.04341 2.33839 7.9661C2.23225 7.88879 2.17844 7.75898 2.1988 7.6277L2.56523 5.29533L0.901751 3.62518C0.808689 3.53183 0.776699 3.39472 0.817413 3.26927C0.858128 3.14383 0.964277 3.05194 1.09515 3.03152L3.42024 2.66102L4.49045 0.557659C4.55007 0.440968 4.67076 0.366577 4.80163 0.366577H4.80018Z\"\n fill={filled ? '#1F2937' : '#D1D5DB'}\n />\n </g>\n <defs>\n <clipPath id=\"clip0_star_icon\">\n <rect width=\"8\" height=\"8\" fill=\"white\" transform=\"translate(0.800049 0.199951)\" />\n </clipPath>\n </defs>\n </svg>\n);\n\nStarIcon.displayName = 'StarIcon';\n","interface ChevronLeftIconProps {\n className?: string;\n size?: number;\n}\n\nexport const ChevronLeftIcon = ({ className = '', size = 20 }: ChevronLeftIconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n);\n\nChevronLeftIcon.displayName = 'ChevronLeftIcon';\n","interface ChevronRightIconProps {\n className?: string;\n size?: number;\n}\n\nexport const ChevronRightIcon = ({ className = '', size = 20 }: ChevronRightIconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n);\n\nChevronRightIcon.displayName = 'ChevronRightIcon';\n","interface PinIconProps {\n className?: string;\n size?: number;\n}\n\nexport const PinIcon = ({ className = '', size = 16 }: PinIconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n className={className}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 1.5C5.51472 1.5 3.5 3.51472 3.5 6C3.5 7.52671 4.48181 9.28285 5.83073 10.8739C6.48993 11.6504 7.18485 12.3259 7.73205 12.8316C7.8331 12.9249 7.92519 13.0096 8.00599 13.0857C8.08539 13.0108 8.17547 12.9276 8.27398 12.8362C8.81849 12.3312 9.51007 11.656 10.1655 10.8792C11.5093 9.28692 12.5 7.52773 12.5 6C12.5 3.51472 10.4853 1.5 8 1.5ZM8 14C7.57347 14.4982 7.57321 14.498 7.57291 14.4977L7.57178 14.4967L7.56899 14.4942L7.56002 14.4864C7.5525 14.4798 7.54197 14.4706 7.52861 14.4588C7.5019 14.4353 7.46403 14.4016 7.41618 14.3584C7.3205 14.272 7.18745 14.1481 7.02576 13.9917C6.70282 13.6792 6.26632 13.238 5.81302 12.7042C4.89319 11.6202 3 9.61329 3 6C3 3.23858 5.23858 1 8 1C10.7614 1 13 3.23858 13 6C13 9.61229 11.0969 11.6169 10.1732 12.6989C9.71743 13.2324 9.27901 13.6735 8.95477 13.9862C8.79239 14.1428 8.65889 14.267 8.56288 14.3537C8.51486 14.3971 8.47683 14.4309 8.45001 14.4545C8.43659 14.4664 8.42601 14.4757 8.41845 14.4823L8.40942 14.4902L8.40661 14.4927L8.40546 14.4937C8.40517 14.494 8.40492 14.4942 8 14ZM8 14L8.40492 14.4942C8.17766 14.6895 7.84451 14.6919 7.57291 14.4977L8 14Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 4.5C7.17157 4.5 6.5 5.17157 6.5 6C6.5 6.82843 7.17157 7.5 8 7.5C8.82843 7.5 9.5 6.82843 9.5 6C9.5 5.17157 8.82843 4.5 8 4.5ZM6 6C6 4.89543 6.89543 4 8 4C9.10457 4 10 4.89543 10 6C10 7.10457 9.10457 8 8 8C6.89543 8 6 7.10457 6 6Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nPinIcon.displayName = 'PinIcon';\n","export const formatPrice = (\n amount: number,\n currency: string = 'CHF',\n locale: string = 'de-CH'\n): string => {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(amount);\n};\n","/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param argument - The value to convert\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\nexport function toDate(argument) {\n const argStr = Object.prototype.toString.call(argument);\n\n // Clone the date\n if (\n argument instanceof Date ||\n (typeof argument === \"object\" && argStr === \"[object Date]\")\n ) {\n // Prevent the date to lose the milliseconds when passed to new Date() in IE10\n return new argument.constructor(+argument);\n } else if (\n typeof argument === \"number\" ||\n argStr === \"[object Number]\" ||\n typeof argument === \"string\" ||\n argStr === \"[object String]\"\n ) {\n // TODO: Can we get rid of as?\n return new Date(argument);\n } else {\n // TODO: Can we get rid of as?\n return new Date(NaN);\n }\n}\n\n// Fallback for modularized imports:\nexport default toDate;\n","/**\n * @name constructFrom\n * @category Generic Helpers\n * @summary Constructs a date using the reference date and the value\n *\n * @description\n * The function constructs a new date using the constructor from the reference\n * date and the given value. It helps to build generic functions that accept\n * date extensions.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The reference date to take constructor from\n * @param value - The value to create the date\n *\n * @returns Date initialized using the given date and value\n *\n * @example\n * import { constructFrom } from 'date-fns'\n *\n * // A function that clones a date preserving the original type\n * function cloneDate<DateType extends Date(date: DateType): DateType {\n * return constructFrom(\n * date, // Use contrustor from the given date\n * date.getTime() // Use the date value to create a new date\n * )\n * }\n */\nexport function constructFrom(date, value) {\n if (date instanceof Date) {\n return new date.constructor(value);\n } else {\n return new Date(value);\n }\n}\n\n// Fallback for modularized imports:\nexport default constructFrom;\n","/**\n * @module constants\n * @summary Useful constants\n * @description\n * Collection of useful date constants.\n *\n * The constants could be imported from `date-fns/constants`:\n *\n * ```ts\n * import { maxTime, minTime } from \"./constants/date-fns/constants\";\n *\n * function isAllowedTime(time) {\n * return time <= maxTime && time >= minTime;\n * }\n * ```\n */\n\n/**\n * @constant\n * @name daysInWeek\n * @summary Days in 1 week.\n */\nexport const daysInWeek = 7;\n\n/**\n * @constant\n * @name daysInYear\n * @summary Days in 1 year.\n *\n * @description\n * How many days in a year.\n *\n * One years equals 365.2425 days according to the formula:\n *\n * > Leap year occures every 4 years, except for years that are divisable by 100 and not divisable by 400.\n * > 1 mean year = (365+1/4-1/100+1/400) days = 365.2425 days\n */\nexport const daysInYear = 365.2425;\n\n/**\n * @constant\n * @name maxTime\n * @summary Maximum allowed time.\n *\n * @example\n * import { maxTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = 8640000000000001 <= maxTime;\n * //=> false\n *\n * new Date(8640000000000001);\n * //=> Invalid Date\n */\nexport const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;\n\n/**\n * @constant\n * @name minTime\n * @summary Minimum allowed time.\n *\n * @example\n * import { minTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = -8640000000000001 >= minTime;\n * //=> false\n *\n * new Date(-8640000000000001)\n * //=> Invalid Date\n */\nexport const minTime = -maxTime;\n\n/**\n * @constant\n * @name millisecondsInWeek\n * @summary Milliseconds in 1 week.\n */\nexport const millisecondsInWeek = 604800000;\n\n/**\n * @constant\n * @name millisecondsInDay\n * @summary Milliseconds in 1 day.\n */\nexport const millisecondsInDay = 86400000;\n\n/**\n * @constant\n * @name millisecondsInMinute\n * @summary Milliseconds in 1 minute\n */\nexport const millisecondsInMinute = 60000;\n\n/**\n * @constant\n * @name millisecondsInHour\n * @summary Milliseconds in 1 hour\n */\nexport const millisecondsInHour = 3600000;\n\n/**\n * @constant\n * @name millisecondsInSecond\n * @summary Milliseconds in 1 second\n */\nexport const millisecondsInSecond = 1000;\n\n/**\n * @constant\n * @name minutesInYear\n * @summary Minutes in 1 year.\n */\nexport const minutesInYear = 525600;\n\n/**\n * @constant\n * @name minutesInMonth\n * @summary Minutes in 1 month.\n */\nexport const minutesInMonth = 43200;\n\n/**\n * @constant\n * @name minutesInDay\n * @summary Minutes in 1 day.\n */\nexport const minutesInDay = 1440;\n\n/**\n * @constant\n * @name minutesInHour\n * @summary Minutes in 1 hour.\n */\nexport const minutesInHour = 60;\n\n/**\n * @constant\n * @name monthsInQuarter\n * @summary Months in 1 quarter.\n */\nexport const monthsInQuarter = 3;\n\n/**\n * @constant\n * @name monthsInYear\n * @summary Months in 1 year.\n */\nexport const monthsInYear = 12;\n\n/**\n * @constant\n * @name quartersInYear\n * @summary Quarters in 1 year\n */\nexport const quartersInYear = 4;\n\n/**\n * @constant\n * @name secondsInHour\n * @summary Seconds in 1 hour.\n */\nexport const secondsInHour = 3600;\n\n/**\n * @constant\n * @name secondsInMinute\n * @summary Seconds in 1 minute.\n */\nexport const secondsInMinute = 60;\n\n/**\n * @constant\n * @name secondsInDay\n * @summary Seconds in 1 day.\n */\nexport const secondsInDay = secondsInHour * 24;\n\n/**\n * @constant\n * @name secondsInWeek\n * @summary Seconds in 1 week.\n */\nexport const secondsInWeek = secondsInDay * 7;\n\n/**\n * @constant\n * @name secondsInYear\n * @summary Seconds in 1 year.\n */\nexport const secondsInYear = secondsInDay * daysInYear;\n\n/**\n * @constant\n * @name secondsInMonth\n * @summary Seconds in 1 month\n */\nexport const secondsInMonth = secondsInYear / 12;\n\n/**\n * @constant\n * @name secondsInQuarter\n * @summary Seconds in 1 quarter.\n */\nexport const secondsInQuarter = secondsInMonth * 3;\n","let defaultOptions = {};\n\nexport function getDefaultOptions() {\n return defaultOptions;\n}\n\nexport function setDefaultOptions(newOptions) {\n defaultOptions = newOptions;\n}\n","import { toDate } from \"./toDate.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\n\n/**\n * The {@link startOfWeek} function options.\n */\n\n/**\n * @name startOfWeek\n * @category Week Helpers\n * @summary Return the start of a week for the given date.\n *\n * @description\n * Return the start of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week\n *\n * @example\n * // The start of a week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfWeek(date, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const _date = toDate(date);\n const day = _date.getDay();\n const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\n _date.setDate(_date.getDate() - diff);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeek;\n","import { startOfWeek } from \"./startOfWeek.mjs\";\n\n/**\n * @name startOfISOWeek\n * @category ISO Week Helpers\n * @summary Return the start of an ISO week for the given date.\n *\n * @description\n * Return the start of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of an ISO week\n *\n * @example\n * // The start of an ISO week for 2 September 2014 11:55:00:\n * const result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfISOWeek(date) {\n return startOfWeek(date, { weekStartsOn: 1 });\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeek;\n","import { constructFrom } from \"./constructFrom.mjs\";\nimport { startOfISOWeek } from \"./startOfISOWeek.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name getISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the ISO week-numbering year of the given date.\n *\n * @description\n * Get the ISO week-numbering year of the given date,\n * which always starts 3 days before the year's first Thursday.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n *\n * @returns The ISO week-numbering year\n *\n * @example\n * // Which ISO-week numbering year is 2 January 2005?\n * const result = getISOWeekYear(new Date(2005, 0, 2))\n * //=> 2004\n */\nexport function getISOWeekYear(date) {\n const _date = toDate(date);\n const year = _date.getFullYear();\n\n const fourthOfJanuaryOfNextYear = constructFrom(date, 0);\n fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);\n fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);\n\n const fourthOfJanuaryOfThisYear = constructFrom(date, 0);\n fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);\n fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);\n\n if (_date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (_date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getISOWeekYear;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name startOfDay\n * @category Day Helpers\n * @summary Return the start of a day for the given date.\n *\n * @description\n * Return the start of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of a day\n *\n * @example\n * // The start of a day for 2 September 2014 11:55:00:\n * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 00:00:00\n */\nexport function startOfDay(date) {\n const _date = toDate(date);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfDay;\n","import { toDate } from \"../toDate.mjs\";\n\n/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport function getTimezoneOffsetInMilliseconds(date) {\n const _date = toDate(date);\n const utcDate = new Date(\n Date.UTC(\n _date.getFullYear(),\n _date.getMonth(),\n _date.getDate(),\n _date.getHours(),\n _date.getMinutes(),\n _date.getSeconds(),\n _date.getMilliseconds(),\n ),\n );\n utcDate.setUTCFullYear(_date.getFullYear());\n return +date - +utcDate;\n}\n","import { millisecondsInDay } from \"./constants.mjs\";\nimport { startOfDay } from \"./startOfDay.mjs\";\nimport { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.mjs\";\n\n/**\n * @name differenceInCalendarDays\n * @category Day Helpers\n * @summary Get the number of calendar days between the given dates.\n *\n * @description\n * Get the number of calendar days between the given dates. This means that the times are removed\n * from the dates and then the difference in days is calculated.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n *\n * @returns The number of calendar days\n *\n * @example\n * // How many calendar days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInCalendarDays(\n * new Date(2012, 6, 2, 0, 0),\n * new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 366\n * // How many calendar days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInCalendarDays(\n * new Date(2011, 6, 3, 0, 1),\n * new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 1\n */\nexport function differenceInCalendarDays(dateLeft, dateRight) {\n const startOfDayLeft = startOfDay(dateLeft);\n const startOfDayRight = startOfDay(dateRight);\n\n const timestampLeft =\n +startOfDayLeft - getTimezoneOffsetInMilliseconds(startOfDayLeft);\n const timestampRight =\n +startOfDayRight - getTimezoneOffsetInMilliseconds(startOfDayRight);\n\n // Round the number of days to the nearest integer because the number of\n // milliseconds in a day is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round((timestampLeft - timestampRight) / millisecondsInDay);\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarDays;\n","import { getISOWeekYear } from \"./getISOWeekYear.mjs\";\nimport { startOfISOWeek } from \"./startOfISOWeek.mjs\";\nimport { constructFrom } from \"./constructFrom.mjs\";\n\n/**\n * @name startOfISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Return the start of an ISO week-numbering year for the given date.\n *\n * @description\n * Return the start of an ISO week-numbering year,\n * which always starts 3 days before the year's first Thursday.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of an ISO week-numbering year\n *\n * @example\n * // The start of an ISO week-numbering year for 2 July 2005:\n * const result = startOfISOWeekYear(new Date(2005, 6, 2))\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfISOWeekYear(date) {\n const year = getISOWeekYear(date);\n const fourthOfJanuary = constructFrom(date, 0);\n fourthOfJanuary.setFullYear(year, 0, 4);\n fourthOfJanuary.setHours(0, 0, 0, 0);\n return startOfISOWeek(fourthOfJanuary);\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeekYear;\n","/**\n * @name isDate\n * @category Common Helpers\n * @summary Is the given value a date?\n *\n * @description\n * Returns true if the given value is an instance of Date. The function works for dates transferred across iframes.\n *\n * @param value - The value to check\n *\n * @returns True if the given value is a date\n *\n * @example\n * // For a valid date:\n * const result = isDate(new Date())\n * //=> true\n *\n * @example\n * // For an invalid date:\n * const result = isDate(new Date(NaN))\n * //=> true\n *\n * @example\n * // For some value:\n * const result = isDate('2014-02-31')\n * //=> false\n *\n * @example\n * // For an object:\n * const result = isDate({})\n * //=> false\n */\nexport function isDate(value) {\n return (\n value instanceof Date ||\n (typeof value === \"object\" &&\n Object.prototype.toString.call(value) === \"[object Date]\")\n );\n}\n\n// Fallback for modularized imports:\nexport default isDate;\n","import { isDate } from \"./isDate.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name isValid\n * @category Common Helpers\n * @summary Is the given date valid?\n *\n * @description\n * Returns false if argument is Invalid Date and true otherwise.\n * Argument is converted to Date using `toDate`. See [toDate](https://date-fns.org/docs/toDate)\n * Invalid Date is a Date, whose time value is NaN.\n *\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to check\n *\n * @returns The date is valid\n *\n * @example\n * // For the valid date:\n * const result = isValid(new Date(2014, 1, 31))\n * //=> true\n *\n * @example\n * // For the value, convertable into a date:\n * const result = isValid(1393804800000)\n * //=> true\n *\n * @example\n * // For the invalid date:\n * const result = isValid(new Date(''))\n * //=> false\n */\nexport function isValid(date) {\n if (!isDate(date) && typeof date !== \"number\") {\n return false;\n }\n const _date = toDate(date);\n return !isNaN(Number(_date));\n}\n\n// Fallback for modularized imports:\nexport default isValid;\n","import { toDate } from \"./toDate.mjs\";\nimport { constructFrom } from \"./constructFrom.mjs\";\n\n/**\n * @name startOfYear\n * @category Year Helpers\n * @summary Return the start of a year for the given date.\n *\n * @description\n * Return the start of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of a year\n *\n * @example\n * // The start of a year for 2 September 2014 11:55:00:\n * const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Jan 01 2014 00:00:00\n */\nexport function startOfYear(date) {\n const cleanDate = toDate(date);\n const _date = constructFrom(date, 0);\n _date.setFullYear(cleanDate.getFullYear(), 0, 1);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfYear;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"less than a second\",\n other: \"less than {{count}} seconds\",\n },\n\n xSeconds: {\n one: \"1 second\",\n other: \"{{count}} seconds\",\n },\n\n halfAMinute: \"half a minute\",\n\n lessThanXMinutes: {\n one: \"less than a minute\",\n other: \"less than {{count}} minutes\",\n },\n\n xMinutes: {\n one: \"1 minute\",\n other: \"{{count}} minutes\",\n },\n\n aboutXHours: {\n one: \"about 1 hour\",\n other: \"about {{count}} hours\",\n },\n\n xHours: {\n one: \"1 hour\",\n other: \"{{count}} hours\",\n },\n\n xDays: {\n one: \"1 day\",\n other: \"{{count}} days\",\n },\n\n aboutXWeeks: {\n one: \"about 1 week\",\n other: \"about {{count}} weeks\",\n },\n\n xWeeks: {\n one: \"1 week\",\n other: \"{{count}} weeks\",\n },\n\n aboutXMonths: {\n one: \"about 1 month\",\n other: \"about {{count}} months\",\n },\n\n xMonths: {\n one: \"1 month\",\n other: \"{{count}} months\",\n },\n\n aboutXYears: {\n one: \"about 1 year\",\n other: \"about {{count}} years\",\n },\n\n xYears: {\n one: \"1 year\",\n other: \"{{count}} years\",\n },\n\n overXYears: {\n one: \"over 1 year\",\n other: \"over {{count}} years\",\n },\n\n almostXYears: {\n one: \"almost 1 year\",\n other: \"almost {{count}} years\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", count.toString());\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"in \" + result;\n } else {\n return result + \" ago\";\n }\n }\n\n return result;\n};\n","export function buildFormatLongFn(args) {\n return (options = {}) => {\n // TODO: Remove String()\n const width = options.width ? String(options.width) : args.defaultWidth;\n const format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.mjs\";\n\nconst dateFormats = {\n full: \"EEEE, MMMM do, y\",\n long: \"MMMM do, y\",\n medium: \"MMM d, y\",\n short: \"MM/dd/yyyy\",\n};\n\nconst timeFormats = {\n full: \"h:mm:ss a zzzz\",\n long: \"h:mm:ss a z\",\n medium: \"h:mm:ss a\",\n short: \"h:mm a\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'at' {{time}}\",\n long: \"{{date}} 'at' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"'last' eeee 'at' p\",\n yesterday: \"'yesterday at' p\",\n today: \"'today at' p\",\n tomorrow: \"'tomorrow at' p\",\n nextWeek: \"eeee 'at' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","/* eslint-disable no-unused-vars */\n\n/**\n * The localize function argument callback which allows to convert raw value to\n * the actual type.\n *\n * @param value - The value to convert\n *\n * @returns The converted value\n */\n\n/**\n * The map of localized values for each width.\n */\n\n/**\n * The index type of the locale unit value. It types conversion of units of\n * values that don't start at 0 (i.e. quarters).\n */\n\n/**\n * Converts the unit value to the tuple of values.\n */\n\n/**\n * The tuple of localized era values. The first element represents BC,\n * the second element represents AD.\n */\n\n/**\n * The tuple of localized quarter values. The first element represents Q1.\n */\n\n/**\n * The tuple of localized day values. The first element represents Sunday.\n */\n\n/**\n * The tuple of localized month values. The first element represents January.\n */\n\nexport function buildLocalizeFn(args) {\n return (value, options) => {\n const context = options?.context ? String(options.context) : \"standalone\";\n\n let valuesArray;\n if (context === \"formatting\" && args.formattingValues) {\n const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n const width = options?.width ? String(options.width) : defaultWidth;\n\n valuesArray =\n args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n const defaultWidth = args.defaultWidth;\n const width = options?.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[width] || args.values[defaultWidth];\n }\n const index = args.argumentCallback ? args.argumentCallback(value) : value;\n\n // @ts-expect-error - For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n return valuesArray[index];\n };\n}\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.mjs\";\n\nconst eraValues = {\n narrow: [\"B\", \"A\"],\n abbreviated: [\"BC\", \"AD\"],\n wide: [\"Before Christ\", \"Anno Domini\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1st quarter\", \"2nd quarter\", \"3rd quarter\", \"4th quarter\"],\n};\n\n// Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n\n wide: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n short: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n abbreviated: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n wide: [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n const number = Number(dirtyNumber);\n\n // If ordinal numbers depend on context, for example,\n // if they are different for different grammatical genders,\n // use `options.unit`.\n //\n // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n // 'day', 'hour', 'minute', 'second'.\n\n const rem100 = number % 100;\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + \"st\";\n case 2:\n return number + \"nd\";\n case 3:\n return number + \"rd\";\n }\n }\n return number + \"th\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","export function buildMatchFn(args) {\n return (string, options = {}) => {\n const width = options.width;\n\n const matchPattern =\n (width && args.matchPatterns[width]) ||\n args.matchPatterns[args.defaultMatchWidth];\n const matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n const matchedString = matchResult[0];\n\n const parsePatterns =\n (width && args.parsePatterns[width]) ||\n args.parsePatterns[args.defaultParseWidth];\n\n const key = Array.isArray(parsePatterns)\n ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I challange you to fix the type\n findKey(parsePatterns, (pattern) => pattern.test(matchedString));\n\n let value;\n\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I challange you to fix the type\n options.valueCallback(value)\n : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n\nfunction findKey(object, predicate) {\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) &&\n predicate(object[key])\n ) {\n return key;\n }\n }\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (let key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n return undefined;\n}\n","export function buildMatchPatternFn(args) {\n return (string, options = {}) => {\n const matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n const matchedString = matchResult[0];\n\n const parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n let value = args.valueCallback\n ? args.valueCallback(parseResult[0])\n : parseResult[0];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I challange you to fix the type\n value = options.valueCallback ? options.valueCallback(value) : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.mjs\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.mjs\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(b|a)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(before christ|before common era|anno domini|common era)/i,\n};\nconst parseEraPatterns = {\n any: [/^b/i, /^(a|c)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](th|st|nd|rd)? quarter/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ja/i,\n /^f/i,\n /^mar/i,\n /^ap/i,\n /^may/i,\n /^jun/i,\n /^jul/i,\n /^au/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[smtwf]/i,\n short: /^(su|mo|tu|we|th|fr|sa)/i,\n abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i,\n};\nconst parseDayPatterns = {\n narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mi/i,\n noon: /^no/i,\n morning: /morning/i,\n afternoon: /afternoon/i,\n evening: /evening/i,\n night: /night/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./en-US/_lib/formatDistance.mjs\";\nimport { formatLong } from \"./en-US/_lib/formatLong.mjs\";\nimport { formatRelative } from \"./en-US/_lib/formatRelative.mjs\";\nimport { localize } from \"./en-US/_lib/localize.mjs\";\nimport { match } from \"./en-US/_lib/match.mjs\";\n\n/**\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp](https://github.com/kossnocorp)\n * @author Lesha Koss [@leshakoss](https://github.com/leshakoss)\n */\nexport const enUS = {\n code: \"en-US\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default enUS;\n","import { differenceInCalendarDays } from \"./differenceInCalendarDays.mjs\";\nimport { startOfYear } from \"./startOfYear.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name getDayOfYear\n * @category Day Helpers\n * @summary Get the day of the year of the given date.\n *\n * @description\n * Get the day of the year of the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n *\n * @returns The day of year\n *\n * @example\n * // Which day of the year is 2 July 2014?\n * const result = getDayOfYear(new Date(2014, 6, 2))\n * //=> 183\n */\nexport function getDayOfYear(date) {\n const _date = toDate(date);\n const diff = differenceInCalendarDays(_date, startOfYear(_date));\n const dayOfYear = diff + 1;\n return dayOfYear;\n}\n\n// Fallback for modularized imports:\nexport default getDayOfYear;\n","import { millisecondsInWeek } from \"./constants.mjs\";\nimport { startOfISOWeek } from \"./startOfISOWeek.mjs\";\nimport { startOfISOWeekYear } from \"./startOfISOWeekYear.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name getISOWeek\n * @category ISO Week Helpers\n * @summary Get the ISO week of the given date.\n *\n * @description\n * Get the ISO week of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n *\n * @returns The ISO week\n *\n * @example\n * // Which week of the ISO-week numbering year is 2 January 2005?\n * const result = getISOWeek(new Date(2005, 0, 2))\n * //=> 53\n */\nexport function getISOWeek(date) {\n const _date = toDate(date);\n const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getISOWeek;\n","import { constructFrom } from \"./constructFrom.mjs\";\nimport { startOfWeek } from \"./startOfWeek.mjs\";\nimport { toDate } from \"./toDate.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\n\n/**\n * The {@link getWeekYear} function options.\n */\n\n/**\n * @name getWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Get the local week-numbering year of the given date.\n *\n * @description\n * Get the local week-numbering year of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n * @param options - An object with options.\n *\n * @returns The local week-numbering year\n *\n * @example\n * // Which week numbering year is 26 December 2004 with the default settings?\n * const result = getWeekYear(new Date(2004, 11, 26))\n * //=> 2005\n *\n * @example\n * // Which week numbering year is 26 December 2004 if week starts on Saturday?\n * const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })\n * //=> 2004\n *\n * @example\n * // Which week numbering year is 26 December 2004 if the first week contains 4 January?\n * const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })\n * //=> 2004\n */\nexport function getWeekYear(date, options) {\n const _date = toDate(date);\n const year = _date.getFullYear();\n\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const firstWeekOfNextYear = constructFrom(date, 0);\n firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);\n firstWeekOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);\n\n const firstWeekOfThisYear = constructFrom(date, 0);\n firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);\n firstWeekOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);\n\n if (_date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (_date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getWeekYear;\n","import { constructFrom } from \"./constructFrom.mjs\";\nimport { getWeekYear } from \"./getWeekYear.mjs\";\nimport { startOfWeek } from \"./startOfWeek.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\n\n/**\n * The {@link startOfWeekYear} function options.\n */\n\n/**\n * @name startOfWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Return the start of a local week-numbering year for the given date.\n *\n * @description\n * Return the start of a local week-numbering year.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week-numbering year\n *\n * @example\n * // The start of an a week-numbering year for 2 July 2005 with default settings:\n * const result = startOfWeekYear(new Date(2005, 6, 2))\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // The start of a week-numbering year for 2 July 2005\n * // if Monday is the first day of week\n * // and 4 January is always in the first week of the year:\n * const result = startOfWeekYear(new Date(2005, 6, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfWeekYear(date, options) {\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const year = getWeekYear(date, options);\n const firstWeek = constructFrom(date, 0);\n firstWeek.setFullYear(year, 0, firstWeekContainsDate);\n firstWeek.setHours(0, 0, 0, 0);\n const _date = startOfWeek(firstWeek, options);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeekYear;\n","import { millisecondsInWeek } from \"./constants.mjs\";\nimport { startOfWeek } from \"./startOfWeek.mjs\";\nimport { startOfWeekYear } from \"./startOfWeekYear.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * The {@link getWeek} function options.\n */\n\n/**\n * @name getWeek\n * @category Week Helpers\n * @summary Get the local week index of the given date.\n *\n * @description\n * Get the local week index of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The week\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005 with default options?\n * const result = getWeek(new Date(2005, 0, 2))\n * //=> 2\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January?\n * const result = getWeek(new Date(2005, 0, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> 53\n */\n\nexport function getWeek(date, options) {\n const _date = toDate(date);\n const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getWeek;\n","export function addLeadingZeros(number, targetLength) {\n const sign = number < 0 ? \"-\" : \"\";\n const output = Math.abs(number).toString().padStart(targetLength, \"0\");\n return sign + output;\n}\n","import { addLeadingZeros } from \"../addLeadingZeros.mjs\";\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | |\n * | d | Day of month | D | |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | m | Minute | M | Month |\n * | s | Second | S | Fraction of second |\n * | y | Year (abs) | Y | |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n */\n\nexport const lightFormatters = {\n // Year\n y(date, token) {\n // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens\n // | Year | y | yy | yyy | yyyy | yyyyy |\n // |----------|-------|----|-------|-------|-------|\n // | AD 1 | 1 | 01 | 001 | 0001 | 00001 |\n // | AD 12 | 12 | 12 | 012 | 0012 | 00012 |\n // | AD 123 | 123 | 23 | 123 | 0123 | 00123 |\n // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 |\n // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return addLeadingZeros(token === \"yy\" ? year % 100 : year, token.length);\n },\n\n // Month\n M(date, token) {\n const month = date.getMonth();\n return token === \"M\" ? String(month + 1) : addLeadingZeros(month + 1, 2);\n },\n\n // Day of the month\n d(date, token) {\n return addLeadingZeros(date.getDate(), token.length);\n },\n\n // AM or PM\n a(date, token) {\n const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return dayPeriodEnumValue.toUpperCase();\n case \"aaa\":\n return dayPeriodEnumValue;\n case \"aaaaa\":\n return dayPeriodEnumValue[0];\n case \"aaaa\":\n default:\n return dayPeriodEnumValue === \"am\" ? \"a.m.\" : \"p.m.\";\n }\n },\n\n // Hour [1-12]\n h(date, token) {\n return addLeadingZeros(date.getHours() % 12 || 12, token.length);\n },\n\n // Hour [0-23]\n H(date, token) {\n return addLeadingZeros(date.getHours(), token.length);\n },\n\n // Minute\n m(date, token) {\n return addLeadingZeros(date.getMinutes(), token.length);\n },\n\n // Second\n s(date, token) {\n return addLeadingZeros(date.getSeconds(), token.length);\n },\n\n // Fraction of second\n S(date, token) {\n const numberOfDigits = token.length;\n const milliseconds = date.getMilliseconds();\n const fractionalSeconds = Math.trunc(\n milliseconds * Math.pow(10, numberOfDigits - 3),\n );\n return addLeadingZeros(fractionalSeconds, token.length);\n },\n};\n","import { getDayOfYear } from \"../../getDayOfYear.mjs\";\nimport { getISOWeek } from \"../../getISOWeek.mjs\";\nimport { getISOWeekYear } from \"../../getISOWeekYear.mjs\";\nimport { getWeek } from \"../../getWeek.mjs\";\nimport { getWeekYear } from \"../../getWeekYear.mjs\";\nimport { addLeadingZeros } from \"../addLeadingZeros.mjs\";\nimport { lightFormatters } from \"./lightFormatters.mjs\";\n\nconst dayPeriodEnum = {\n am: \"am\",\n pm: \"pm\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n};\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | Milliseconds in day |\n * | b | AM, PM, noon, midnight | B | Flexible day period |\n * | c | Stand-alone local day of week | C* | Localized hour w/ day period |\n * | d | Day of month | D | Day of year |\n * | e | Local day of week | E | Day of week |\n * | f | | F* | Day of week in month |\n * | g* | Modified Julian day | G | Era |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | i! | ISO day of week | I! | ISO week of year |\n * | j* | Localized hour w/ day period | J* | Localized hour w/o day period |\n * | k | Hour [1-24] | K | Hour [0-11] |\n * | l* | (deprecated) | L | Stand-alone month |\n * | m | Minute | M | Month |\n * | n | | N | |\n * | o! | Ordinal number modifier | O | Timezone (GMT) |\n * | p! | Long localized time | P! | Long localized date |\n * | q | Stand-alone quarter | Q | Quarter |\n * | r* | Related Gregorian year | R! | ISO week-numbering year |\n * | s | Second | S | Fraction of second |\n * | t! | Seconds timestamp | T! | Milliseconds timestamp |\n * | u | Extended year | U* | Cyclic year |\n * | v* | Timezone (generic non-locat.) | V* | Timezone (location) |\n * | w | Local week of year | W* | Week of month |\n * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) |\n * | y | Year (abs) | Y | Local week-numbering year |\n * | z | Timezone (specific non-locat.) | Z* | Timezone (aliases) |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `format` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n * i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n * `R` is supposed to be used in conjunction with `I` and `i`\n * for universal ISO week-numbering date, whereas\n * `Y` is supposed to be used in conjunction with `w` and `e`\n * for week-numbering date specific to the locale.\n * - `P` is long localized date format\n * - `p` is long localized time format\n */\n\nexport const formatters = {\n // Era\n G: function (date, token, localize) {\n const era = date.getFullYear() > 0 ? 1 : 0;\n switch (token) {\n // AD, BC\n case \"G\":\n case \"GG\":\n case \"GGG\":\n return localize.era(era, { width: \"abbreviated\" });\n // A, B\n case \"GGGGG\":\n return localize.era(era, { width: \"narrow\" });\n // Anno Domini, Before Christ\n case \"GGGG\":\n default:\n return localize.era(era, { width: \"wide\" });\n }\n },\n\n // Year\n y: function (date, token, localize) {\n // Ordinal number\n if (token === \"yo\") {\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return localize.ordinalNumber(year, { unit: \"year\" });\n }\n\n return lightFormatters.y(date, token);\n },\n\n // Local week-numbering year\n Y: function (date, token, localize, options) {\n const signedWeekYear = getWeekYear(date, options);\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;\n\n // Two digit year\n if (token === \"YY\") {\n const twoDigitYear = weekYear % 100;\n return addLeadingZeros(twoDigitYear, 2);\n }\n\n // Ordinal number\n if (token === \"Yo\") {\n return localize.ordinalNumber(weekYear, { unit: \"year\" });\n }\n\n // Padding\n return addLeadingZeros(weekYear, token.length);\n },\n\n // ISO week-numbering year\n R: function (date, token) {\n const isoWeekYear = getISOWeekYear(date);\n\n // Padding\n return addLeadingZeros(isoWeekYear, token.length);\n },\n\n // Extended year. This is a single number designating the year of this calendar system.\n // The main difference between `y` and `u` localizers are B.C. years:\n // | Year | `y` | `u` |\n // |------|-----|-----|\n // | AC 1 | 1 | 1 |\n // | BC 1 | 1 | 0 |\n // | BC 2 | 2 | -1 |\n // Also `yy` always returns the last two digits of a year,\n // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n u: function (date, token) {\n const year = date.getFullYear();\n return addLeadingZeros(year, token.length);\n },\n\n // Quarter\n Q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"Q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"QQ\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"Qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"QQQ\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"QQQQQ\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"QQQQ\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone quarter\n q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"qq\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"qqq\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"qqqqq\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"qqqq\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // Month\n M: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n case \"M\":\n case \"MM\":\n return lightFormatters.M(date, token);\n // 1st, 2nd, ..., 12th\n case \"Mo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"MMM\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // J, F, ..., D\n case \"MMMMM\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // January, February, ..., December\n case \"MMMM\":\n default:\n return localize.month(month, { width: \"wide\", context: \"formatting\" });\n }\n },\n\n // Stand-alone month\n L: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n // 1, 2, ..., 12\n case \"L\":\n return String(month + 1);\n // 01, 02, ..., 12\n case \"LL\":\n return addLeadingZeros(month + 1, 2);\n // 1st, 2nd, ..., 12th\n case \"Lo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"LLL\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // J, F, ..., D\n case \"LLLLL\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // January, February, ..., December\n case \"LLLL\":\n default:\n return localize.month(month, { width: \"wide\", context: \"standalone\" });\n }\n },\n\n // Local week of year\n w: function (date, token, localize, options) {\n const week = getWeek(date, options);\n\n if (token === \"wo\") {\n return localize.ordinalNumber(week, { unit: \"week\" });\n }\n\n return addLeadingZeros(week, token.length);\n },\n\n // ISO week of year\n I: function (date, token, localize) {\n const isoWeek = getISOWeek(date);\n\n if (token === \"Io\") {\n return localize.ordinalNumber(isoWeek, { unit: \"week\" });\n }\n\n return addLeadingZeros(isoWeek, token.length);\n },\n\n // Day of the month\n d: function (date, token, localize) {\n if (token === \"do\") {\n return localize.ordinalNumber(date.getDate(), { unit: \"date\" });\n }\n\n return lightFormatters.d(date, token);\n },\n\n // Day of year\n D: function (date, token, localize) {\n const dayOfYear = getDayOfYear(date);\n\n if (token === \"Do\") {\n return localize.ordinalNumber(dayOfYear, { unit: \"dayOfYear\" });\n }\n\n return addLeadingZeros(dayOfYear, token.length);\n },\n\n // Day of week\n E: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n switch (token) {\n // Tue\n case \"E\":\n case \"EE\":\n case \"EEE\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"EEEEE\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"EEEEEE\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"EEEE\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Local day of week\n e: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (Nth day of week with current locale or weekStartsOn)\n case \"e\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"ee\":\n return addLeadingZeros(localDayOfWeek, 2);\n // 1st, 2nd, ..., 7th\n case \"eo\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"eee\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"eeeee\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"eeeeee\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"eeee\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone local day of week\n c: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (same as in `e`)\n case \"c\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"cc\":\n return addLeadingZeros(localDayOfWeek, token.length);\n // 1st, 2nd, ..., 7th\n case \"co\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"ccc\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // T\n case \"ccccc\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // Tu\n case \"cccccc\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"standalone\",\n });\n // Tuesday\n case \"cccc\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // ISO day of week\n i: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\n switch (token) {\n // 2\n case \"i\":\n return String(isoDayOfWeek);\n // 02\n case \"ii\":\n return addLeadingZeros(isoDayOfWeek, token.length);\n // 2nd\n case \"io\":\n return localize.ordinalNumber(isoDayOfWeek, { unit: \"day\" });\n // Tue\n case \"iii\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"iiiii\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"iiiiii\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"iiii\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM or PM\n a: function (date, token, localize) {\n const hours = date.getHours();\n const dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"aaa\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"aaaaa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"aaaa\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM, PM, midnight, noon\n b: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours === 12) {\n dayPeriodEnumValue = dayPeriodEnum.noon;\n } else if (hours === 0) {\n dayPeriodEnumValue = dayPeriodEnum.midnight;\n } else {\n dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n }\n\n switch (token) {\n case \"b\":\n case \"bb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"bbb\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"bbbbb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"bbbb\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // in the morning, in the afternoon, in the evening, at night\n B: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours >= 17) {\n dayPeriodEnumValue = dayPeriodEnum.evening;\n } else if (hours >= 12) {\n dayPeriodEnumValue = dayPeriodEnum.afternoon;\n } else if (hours >= 4) {\n dayPeriodEnumValue = dayPeriodEnum.morning;\n } else {\n dayPeriodEnumValue = dayPeriodEnum.night;\n }\n\n switch (token) {\n case \"B\":\n case \"BB\":\n case \"BBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"BBBBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"BBBB\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Hour [1-12]\n h: function (date, token, localize) {\n if (token === \"ho\") {\n let hours = date.getHours() % 12;\n if (hours === 0) hours = 12;\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return lightFormatters.h(date, token);\n },\n\n // Hour [0-23]\n H: function (date, token, localize) {\n if (token === \"Ho\") {\n return localize.ordinalNumber(date.getHours(), { unit: \"hour\" });\n }\n\n return lightFormatters.H(date, token);\n },\n\n // Hour [0-11]\n K: function (date, token, localize) {\n const hours = date.getHours() % 12;\n\n if (token === \"Ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Hour [1-24]\n k: function (date, token, localize) {\n let hours = date.getHours();\n if (hours === 0) hours = 24;\n\n if (token === \"ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Minute\n m: function (date, token, localize) {\n if (token === \"mo\") {\n return localize.ordinalNumber(date.getMinutes(), { unit: \"minute\" });\n }\n\n return lightFormatters.m(date, token);\n },\n\n // Second\n s: function (date, token, localize) {\n if (token === \"so\") {\n return localize.ordinalNumber(date.getSeconds(), { unit: \"second\" });\n }\n\n return lightFormatters.s(date, token);\n },\n\n // Fraction of second\n S: function (date, token) {\n return lightFormatters.S(date, token);\n },\n\n // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n X: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n if (timezoneOffset === 0) {\n return \"Z\";\n }\n\n switch (token) {\n // Hours and optional minutes\n case \"X\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XX`\n case \"XXXX\":\n case \"XX\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XXX`\n case \"XXXXX\":\n case \"XXX\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n x: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Hours and optional minutes\n case \"x\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xx`\n case \"xxxx\":\n case \"xx\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xxx`\n case \"xxxxx\":\n case \"xxx\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (GMT)\n O: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"O\":\n case \"OO\":\n case \"OOO\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"OOOO\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (specific non-location)\n z: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"z\":\n case \"zz\":\n case \"zzz\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"zzzz\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Seconds timestamp\n t: function (date, token, _localize) {\n const timestamp = Math.trunc(date.getTime() / 1000);\n return addLeadingZeros(timestamp, token.length);\n },\n\n // Milliseconds timestamp\n T: function (date, token, _localize) {\n const timestamp = date.getTime();\n return addLeadingZeros(timestamp, token.length);\n },\n};\n\nfunction formatTimezoneShort(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = Math.trunc(absOffset / 60);\n const minutes = absOffset % 60;\n if (minutes === 0) {\n return sign + String(hours);\n }\n return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);\n}\n\nfunction formatTimezoneWithOptionalMinutes(offset, delimiter) {\n if (offset % 60 === 0) {\n const sign = offset > 0 ? \"-\" : \"+\";\n return sign + addLeadingZeros(Math.abs(offset) / 60, 2);\n }\n return formatTimezone(offset, delimiter);\n}\n\nfunction formatTimezone(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);\n const minutes = addLeadingZeros(absOffset % 60, 2);\n return sign + hours + delimiter + minutes;\n}\n","const dateLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"P\":\n return formatLong.date({ width: \"short\" });\n case \"PP\":\n return formatLong.date({ width: \"medium\" });\n case \"PPP\":\n return formatLong.date({ width: \"long\" });\n case \"PPPP\":\n default:\n return formatLong.date({ width: \"full\" });\n }\n};\n\nconst timeLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"p\":\n return formatLong.time({ width: \"short\" });\n case \"pp\":\n return formatLong.time({ width: \"medium\" });\n case \"ppp\":\n return formatLong.time({ width: \"long\" });\n case \"pppp\":\n default:\n return formatLong.time({ width: \"full\" });\n }\n};\n\nconst dateTimeLongFormatter = (pattern, formatLong) => {\n const matchResult = pattern.match(/(P+)(p+)?/) || [];\n const datePattern = matchResult[1];\n const timePattern = matchResult[2];\n\n if (!timePattern) {\n return dateLongFormatter(pattern, formatLong);\n }\n\n let dateTimeFormat;\n\n switch (datePattern) {\n case \"P\":\n dateTimeFormat = formatLong.dateTime({ width: \"short\" });\n break;\n case \"PP\":\n dateTimeFormat = formatLong.dateTime({ width: \"medium\" });\n break;\n case \"PPP\":\n dateTimeFormat = formatLong.dateTime({ width: \"long\" });\n break;\n case \"PPPP\":\n default:\n dateTimeFormat = formatLong.dateTime({ width: \"full\" });\n break;\n }\n\n return dateTimeFormat\n .replace(\"{{date}}\", dateLongFormatter(datePattern, formatLong))\n .replace(\"{{time}}\", timeLongFormatter(timePattern, formatLong));\n};\n\nexport const longFormatters = {\n p: timeLongFormatter,\n P: dateTimeLongFormatter,\n};\n","const dayOfYearTokenRE = /^D+$/;\nconst weekYearTokenRE = /^Y+$/;\n\nconst throwTokens = [\"D\", \"DD\", \"YY\", \"YYYY\"];\n\nexport function isProtectedDayOfYearToken(token) {\n return dayOfYearTokenRE.test(token);\n}\n\nexport function isProtectedWeekYearToken(token) {\n return weekYearTokenRE.test(token);\n}\n\nexport function warnOrThrowProtectedError(token, format, input) {\n const _message = message(token, format, input);\n console.warn(_message);\n if (throwTokens.includes(token)) throw new RangeError(_message);\n}\n\nfunction message(token, format, input) {\n const subject = token[0] === \"Y\" ? \"years\" : \"days of the month\";\n return `Use \\`${token.toLowerCase()}\\` instead of \\`${token}\\` (in \\`${format}\\`) for formatting ${subject} to the input \\`${input}\\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;\n}\n","import { defaultLocale } from \"./_lib/defaultLocale.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\nimport { formatters } from \"./_lib/format/formatters.mjs\";\nimport { longFormatters } from \"./_lib/format/longFormatters.mjs\";\nimport {\n isProtectedDayOfYearToken,\n isProtectedWeekYearToken,\n warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.mjs\";\nimport { isValid } from \"./isValid.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { formatters, longFormatters };\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n// (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n// except a single quote symbol, which ends the sequence.\n// Two quote characters do not end the sequence.\n// If there is no matching single quote\n// then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\nexport { format as formatDate };\n\n/**\n * The {@link format} function options.\n */\n\n/**\n * @name format\n * @alias formatDate\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format. The result may vary by locale.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n * (see the last example)\n *\n * Format of the string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 7 below the table).\n *\n * Accepted patterns:\n * | Unit | Pattern | Result examples | Notes |\n * |---------------------------------|---------|-----------------------------------|-------|\n * | Era | G..GGG | AD, BC | |\n * | | GGGG | Anno Domini, Before Christ | 2 |\n * | | GGGGG | A, B | |\n * | Calendar year | y | 44, 1, 1900, 2017 | 5 |\n * | | yo | 44th, 1st, 0th, 17th | 5,7 |\n * | | yy | 44, 01, 00, 17 | 5 |\n * | | yyy | 044, 001, 1900, 2017 | 5 |\n * | | yyyy | 0044, 0001, 1900, 2017 | 5 |\n * | | yyyyy | ... | 3,5 |\n * | Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |\n * | | Yo | 44th, 1st, 1900th, 2017th | 5,7 |\n * | | YY | 44, 01, 00, 17 | 5,8 |\n * | | YYY | 044, 001, 1900, 2017 | 5 |\n * | | YYYY | 0044, 0001, 1900, 2017 | 5,8 |\n * | | YYYYY | ... | 3,5 |\n * | ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |\n * | | RR | -43, 00, 01, 1900, 2017 | 5,7 |\n * | | RRR | -043, 000, 001, 1900, 2017 | 5,7 |\n * | | RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |\n * | | RRRRR | ... | 3,5,7 |\n * | Extended year | u | -43, 0, 1, 1900, 2017 | 5 |\n * | | uu | -43, 01, 1900, 2017 | 5 |\n * | | uuu | -043, 001, 1900, 2017 | 5 |\n * | | uuuu | -0043, 0001, 1900, 2017 | 5 |\n * | | uuuuu | ... | 3,5 |\n * | Quarter (formatting) | Q | 1, 2, 3, 4 | |\n * | | Qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | QQ | 01, 02, 03, 04 | |\n * | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | q | 1, 2, 3, 4 | |\n * | | qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | qq | 01, 02, 03, 04 | |\n * | | qqq | Q1, Q2, Q3, Q4 | |\n * | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | qqqqq | 1, 2, 3, 4 | 4 |\n * | Month (formatting) | M | 1, 2, ..., 12 | |\n * | | Mo | 1st, 2nd, ..., 12th | 7 |\n * | | MM | 01, 02, ..., 12 | |\n * | | MMM | Jan, Feb, ..., Dec | |\n * | | MMMM | January, February, ..., December | 2 |\n * | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | L | 1, 2, ..., 12 | |\n * | | Lo | 1st, 2nd, ..., 12th | 7 |\n * | | LL | 01, 02, ..., 12 | |\n * | | LLL | Jan, Feb, ..., Dec | |\n * | | LLLL | January, February, ..., December | 2 |\n * | | LLLLL | J, F, ..., D | |\n * | Local week of year | w | 1, 2, ..., 53 | |\n * | | wo | 1st, 2nd, ..., 53th | 7 |\n * | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | I | 1, 2, ..., 53 | 7 |\n * | | Io | 1st, 2nd, ..., 53th | 7 |\n * | | II | 01, 02, ..., 53 | 7 |\n * | Day of month | d | 1, 2, ..., 31 | |\n * | | do | 1st, 2nd, ..., 31st | 7 |\n * | | dd | 01, 02, ..., 31 | |\n * | Day of year | D | 1, 2, ..., 365, 366 | 9 |\n * | | Do | 1st, 2nd, ..., 365th, 366th | 7 |\n * | | DD | 01, 02, ..., 365, 366 | 9 |\n * | | DDD | 001, 002, ..., 365, 366 | |\n * | | DDDD | ... | 3 |\n * | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | |\n * | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | EEEEE | M, T, W, T, F, S, S | |\n * | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |\n * | | io | 1st, 2nd, ..., 7th | 7 |\n * | | ii | 01, 02, ..., 07 | 7 |\n * | | iii | Mon, Tue, Wed, ..., Sun | 7 |\n * | | iiii | Monday, Tuesday, ..., Sunday | 2,7 |\n * | | iiiii | M, T, W, T, F, S, S | 7 |\n * | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 |\n * | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |\n * | | eo | 2nd, 3rd, ..., 1st | 7 |\n * | | ee | 02, 03, ..., 01 | |\n * | | eee | Mon, Tue, Wed, ..., Sun | |\n * | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | eeeee | M, T, W, T, F, S, S | |\n * | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |\n * | | co | 2nd, 3rd, ..., 1st | 7 |\n * | | cc | 02, 03, ..., 01 | |\n * | | ccc | Mon, Tue, Wed, ..., Sun | |\n * | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | ccccc | M, T, W, T, F, S, S | |\n * | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | AM, PM | a..aa | AM, PM | |\n * | | aaa | am, pm | |\n * | | aaaa | a.m., p.m. | 2 |\n * | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | |\n * | | bbb | am, pm, noon, midnight | |\n * | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | bbbbb | a, p, n, mi | |\n * | Flexible day period | B..BBB | at night, in the morning, ... | |\n * | | BBBB | at night, in the morning, ... | 2 |\n * | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | h | 1, 2, ..., 11, 12 | |\n * | | ho | 1st, 2nd, ..., 11th, 12th | 7 |\n * | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | H | 0, 1, 2, ..., 23 | |\n * | | Ho | 0th, 1st, 2nd, ..., 23rd | 7 |\n * | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | K | 1, 2, ..., 11, 0 | |\n * | | Ko | 1st, 2nd, ..., 11th, 0th | 7 |\n * | | KK | 01, 02, ..., 11, 00 | |\n * | Hour [1-24] | k | 24, 1, 2, ..., 23 | |\n * | | ko | 24th, 1st, 2nd, ..., 23rd | 7 |\n * | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | m | 0, 1, ..., 59 | |\n * | | mo | 0th, 1st, ..., 59th | 7 |\n * | | mm | 00, 01, ..., 59 | |\n * | Second | s | 0, 1, ..., 59 | |\n * | | so | 0th, 1st, ..., 59th | 7 |\n * | | ss | 00, 01, ..., 59 | |\n * | Fraction of second | S | 0, 1, ..., 9 | |\n * | | SS | 00, 01, ..., 99 | |\n * | | SSS | 000, 001, ..., 999 | |\n * | | SSSS | ... | 3 |\n * | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |\n * | | XX | -0800, +0530, Z | |\n * | | XXX | -08:00, +05:30, Z | |\n * | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |\n * | | xx | -0800, +0530, +0000 | |\n * | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |\n * | | OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |\n * | Timezone (specific non-locat.) | z...zzz | GMT-8, GMT+5:30, GMT+0 | 6 |\n * | | zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | 2,6 |\n * | Seconds timestamp | t | 512969520 | 7 |\n * | | tt | ... | 3,7 |\n * | Milliseconds timestamp | T | 512969520900 | 7 |\n * | | TT | ... | 3,7 |\n * | Long localized date | P | 04/29/1453 | 7 |\n * | | PP | Apr 29, 1453 | 7 |\n * | | PPP | April 29th, 1453 | 7 |\n * | | PPPP | Friday, April 29th, 1453 | 2,7 |\n * | Long localized time | p | 12:00 AM | 7 |\n * | | pp | 12:00:00 AM | 7 |\n * | | ppp | 12:00:00 AM GMT+2 | 7 |\n * | | pppp | 12:00:00 AM GMT+02:00 | 2,7 |\n * | Combination of date and time | Pp | 04/29/1453, 12:00 AM | 7 |\n * | | PPpp | Apr 29, 1453, 12:00:00 AM | 7 |\n * | | PPPppp | April 29th, 1453 at ... | 7 |\n * | | PPPPpppp| Friday, April 29th, 1453 at ... | 2,7 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n * the output will be the same as default pattern for this unit, usually\n * the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n * are marked with \"2\" in the last column of the table.\n *\n * `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n *\n * `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n *\n * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n * The output will be padded with zeros to match the length of the pattern.\n *\n * `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n *\n * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 5. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` always returns the last two digits of a year,\n * while `uu` pads single digit years to 2 characters and returns other years unchanged:\n *\n * | Year | `yy` | `uu` |\n * |------|------|------|\n * | 1 | 01 | 01 |\n * | 14 | 14 | 14 |\n * | 376 | 76 | 376 |\n * | 1453 | 53 | 1453 |\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [getISOWeekYear](https://date-fns.org/docs/getISOWeekYear)\n * and [getWeekYear](https://date-fns.org/docs/getWeekYear)).\n *\n * 6. Specific non-location timezones are currently unavailable in `date-fns`,\n * so right now these tokens fall back to GMT timezones.\n *\n * 7. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `t`: seconds timestamp\n * - `T`: milliseconds timestamp\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n * @param format - The string of tokens\n * @param options - An object with options\n *\n * @returns The formatted date string\n *\n * @throws `date` must not be Invalid Date\n * @throws `options.locale` must contain `localize` property\n * @throws `options.locale` must contain `formatLong` property\n * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = format(new Date(2014, 6, 2), \"do 'de' MMMM yyyy\", {\n * locale: eoLocale\n * })\n * //=> '2-a de julio 2014'\n *\n * @example\n * // Escape string by single quote characters:\n * const result = format(new Date(2014, 6, 2, 15), \"h 'o''clock'\")\n * //=> \"3 o'clock\"\n */\nexport function format(date, formatStr, options) {\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const originalDate = toDate(date);\n\n if (!isValid(originalDate)) {\n throw new RangeError(\"Invalid time value\");\n }\n\n let parts = formatStr\n .match(longFormattingTokensRegExp)\n .map((substring) => {\n const firstCharacter = substring[0];\n if (firstCharacter === \"p\" || firstCharacter === \"P\") {\n const longFormatter = longFormatters[firstCharacter];\n return longFormatter(substring, locale.formatLong);\n }\n return substring;\n })\n .join(\"\")\n .match(formattingTokensRegExp)\n .map((substring) => {\n // Replace two single quote characters with one single quote character\n if (substring === \"''\") {\n return { isToken: false, value: \"'\" };\n }\n\n const firstCharacter = substring[0];\n if (firstCharacter === \"'\") {\n return { isToken: false, value: cleanEscapedString(substring) };\n }\n\n if (formatters[firstCharacter]) {\n return { isToken: true, value: substring };\n }\n\n if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n throw new RangeError(\n \"Format string contains an unescaped latin alphabet character `\" +\n firstCharacter +\n \"`\",\n );\n }\n\n return { isToken: false, value: substring };\n });\n\n // invoke localize preprocessor (only for french locales at the moment)\n if (locale.localize.preprocessor) {\n parts = locale.localize.preprocessor(originalDate, parts);\n }\n\n const formatterOptions = {\n firstWeekContainsDate,\n weekStartsOn,\n locale,\n };\n\n return parts\n .map((part) => {\n if (!part.isToken) return part.value;\n\n const token = part.value;\n\n if (\n (!options?.useAdditionalWeekYearTokens &&\n isProtectedWeekYearToken(token)) ||\n (!options?.useAdditionalDayOfYearTokens &&\n isProtectedDayOfYearToken(token))\n ) {\n warnOrThrowProtectedError(token, formatStr, String(date));\n }\n\n const formatter = formatters[token[0]];\n return formatter(originalDate, token, locale.localize, formatterOptions);\n })\n .join(\"\");\n}\n\nfunction cleanEscapedString(input) {\n const matched = input.match(escapedStringRegExp);\n\n if (!matched) {\n return input;\n }\n\n return matched[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default format;\n","import { startOfWeek } from \"./startOfWeek.mjs\";\n\n/**\n * The {@link isSameWeek} function options.\n */\n\n/**\n * @name isSameWeek\n * @category Week Helpers\n * @summary Are the given dates in the same week (and month and year)?\n *\n * @description\n * Are the given dates in the same week (and month and year)?\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The first date to check\n * @param dateRight - The second date to check\n * @param options - An object with options\n *\n * @returns The dates are in the same week (and month and year)\n *\n * @example\n * // Are 31 August 2014 and 4 September 2014 in the same week?\n * const result = isSameWeek(new Date(2014, 7, 31), new Date(2014, 8, 4))\n * //=> true\n *\n * @example\n * // If week starts with Monday,\n * // are 31 August 2014 and 4 September 2014 in the same week?\n * const result = isSameWeek(new Date(2014, 7, 31), new Date(2014, 8, 4), {\n * weekStartsOn: 1\n * })\n * //=> false\n *\n * @example\n * // Are 1 January 2014 and 1 January 2015 in the same week?\n * const result = isSameWeek(new Date(2014, 0, 1), new Date(2015, 0, 1))\n * //=> false\n */\nexport function isSameWeek(dateLeft, dateRight, options) {\n const dateLeftStartOfWeek = startOfWeek(dateLeft, options);\n const dateRightStartOfWeek = startOfWeek(dateRight, options);\n\n return +dateLeftStartOfWeek === +dateRightStartOfWeek;\n}\n\n// Fallback for modularized imports:\nexport default isSameWeek;\n","import { millisecondsInHour, millisecondsInMinute } from \"./constants.mjs\";\n\n/**\n * The {@link parseISO} function options.\n */\n\n/**\n * @name parseISO\n * @category Common Helpers\n * @summary Parse ISO string\n *\n * @description\n * Parse the given string in ISO 8601 format and return an instance of Date.\n *\n * Function accepts complete ISO 8601 formats as well as partial implementations.\n * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601\n *\n * If the argument isn't a string, the function cannot parse the string or\n * the values are invalid, it returns Invalid Date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param argument - The value to convert\n * @param options - An object with options\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Convert string '2014-02-11T11:30:30' to date:\n * const result = parseISO('2014-02-11T11:30:30')\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert string '+02014101' to date,\n * // if the additional number of digits in the extended year format is 1:\n * const result = parseISO('+02014101', { additionalDigits: 1 })\n * //=> Fri Apr 11 2014 00:00:00\n */\nexport function parseISO(argument, options) {\n const additionalDigits = options?.additionalDigits ?? 2;\n const dateStrings = splitDateString(argument);\n\n let date;\n if (dateStrings.date) {\n const parseYearResult = parseYear(dateStrings.date, additionalDigits);\n date = parseDate(parseYearResult.restDateString, parseYearResult.year);\n }\n\n if (!date || isNaN(date.getTime())) {\n return new Date(NaN);\n }\n\n const timestamp = date.getTime();\n let time = 0;\n let offset;\n\n if (dateStrings.time) {\n time = parseTime(dateStrings.time);\n if (isNaN(time)) {\n return new Date(NaN);\n }\n }\n\n if (dateStrings.timezone) {\n offset = parseTimezone(dateStrings.timezone);\n if (isNaN(offset)) {\n return new Date(NaN);\n }\n } else {\n const dirtyDate = new Date(timestamp + time);\n // JS parsed string assuming it's in UTC timezone\n // but we need it to be parsed in our timezone\n // so we use utc values to build date in our timezone.\n // Year values from 0 to 99 map to the years 1900 to 1999\n // so set year explicitly with setFullYear.\n const result = new Date(0);\n result.setFullYear(\n dirtyDate.getUTCFullYear(),\n dirtyDate.getUTCMonth(),\n dirtyDate.getUTCDate(),\n );\n result.setHours(\n dirtyDate.getUTCHours(),\n dirtyDate.getUTCMinutes(),\n dirtyDate.getUTCSeconds(),\n dirtyDate.getUTCMilliseconds(),\n );\n return result;\n }\n\n return new Date(timestamp + time + offset);\n}\n\nconst patterns = {\n dateTimeDelimiter: /[T ]/,\n timeZoneDelimiter: /[Z ]/i,\n timezone: /([Z+-].*)$/,\n};\n\nconst dateRegex =\n /^-?(?:(\\d{3})|(\\d{2})(?:-?(\\d{2}))?|W(\\d{2})(?:-?(\\d{1}))?|)$/;\nconst timeRegex =\n /^(\\d{2}(?:[.,]\\d*)?)(?::?(\\d{2}(?:[.,]\\d*)?))?(?::?(\\d{2}(?:[.,]\\d*)?))?$/;\nconst timezoneRegex = /^([+-])(\\d{2})(?::?(\\d{2}))?$/;\n\nfunction splitDateString(dateString) {\n const dateStrings = {};\n const array = dateString.split(patterns.dateTimeDelimiter);\n let timeString;\n\n // The regex match should only return at maximum two array elements.\n // [date], [time], or [date, time].\n if (array.length > 2) {\n return dateStrings;\n }\n\n if (/:/.test(array[0])) {\n timeString = array[0];\n } else {\n dateStrings.date = array[0];\n timeString = array[1];\n if (patterns.timeZoneDelimiter.test(dateStrings.date)) {\n dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0];\n timeString = dateString.substr(\n dateStrings.date.length,\n dateString.length,\n );\n }\n }\n\n if (timeString) {\n const token = patterns.timezone.exec(timeString);\n if (token) {\n dateStrings.time = timeString.replace(token[1], \"\");\n dateStrings.timezone = token[1];\n } else {\n dateStrings.time = timeString;\n }\n }\n\n return dateStrings;\n}\n\nfunction parseYear(dateString, additionalDigits) {\n const regex = new RegExp(\n \"^(?:(\\\\d{4}|[+-]\\\\d{\" +\n (4 + additionalDigits) +\n \"})|(\\\\d{2}|[+-]\\\\d{\" +\n (2 + additionalDigits) +\n \"})$)\",\n );\n\n const captures = dateString.match(regex);\n // Invalid ISO-formatted year\n if (!captures) return { year: NaN, restDateString: \"\" };\n\n const year = captures[1] ? parseInt(captures[1]) : null;\n const century = captures[2] ? parseInt(captures[2]) : null;\n\n // either year or century is null, not both\n return {\n year: century === null ? year : century * 100,\n restDateString: dateString.slice((captures[1] || captures[2]).length),\n };\n}\n\nfunction parseDate(dateString, year) {\n // Invalid ISO-formatted year\n if (year === null) return new Date(NaN);\n\n const captures = dateString.match(dateRegex);\n // Invalid ISO-formatted string\n if (!captures) return new Date(NaN);\n\n const isWeekDate = !!captures[4];\n const dayOfYear = parseDateUnit(captures[1]);\n const month = parseDateUnit(captures[2]) - 1;\n const day = parseDateUnit(captures[3]);\n const week = parseDateUnit(captures[4]);\n const dayOfWeek = parseDateUnit(captures[5]) - 1;\n\n if (isWeekDate) {\n if (!validateWeekDate(year, week, dayOfWeek)) {\n return new Date(NaN);\n }\n return dayOfISOWeekYear(year, week, dayOfWeek);\n } else {\n const date = new Date(0);\n if (\n !validateDate(year, month, day) ||\n !validateDayOfYearDate(year, dayOfYear)\n ) {\n return new Date(NaN);\n }\n date.setUTCFullYear(year, month, Math.max(dayOfYear, day));\n return date;\n }\n}\n\nfunction parseDateUnit(value) {\n return value ? parseInt(value) : 1;\n}\n\nfunction parseTime(timeString) {\n const captures = timeString.match(timeRegex);\n if (!captures) return NaN; // Invalid ISO-formatted time\n\n const hours = parseTimeUnit(captures[1]);\n const minutes = parseTimeUnit(captures[2]);\n const seconds = parseTimeUnit(captures[3]);\n\n if (!validateTime(hours, minutes, seconds)) {\n return NaN;\n }\n\n return (\n hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1000\n );\n}\n\nfunction parseTimeUnit(value) {\n return (value && parseFloat(value.replace(\",\", \".\"))) || 0;\n}\n\nfunction parseTimezone(timezoneString) {\n if (timezoneString === \"Z\") return 0;\n\n const captures = timezoneString.match(timezoneRegex);\n if (!captures) return 0;\n\n const sign = captures[1] === \"+\" ? -1 : 1;\n const hours = parseInt(captures[2]);\n const minutes = (captures[3] && parseInt(captures[3])) || 0;\n\n if (!validateTimezone(hours, minutes)) {\n return NaN;\n }\n\n return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute);\n}\n\nfunction dayOfISOWeekYear(isoWeekYear, week, day) {\n const date = new Date(0);\n date.setUTCFullYear(isoWeekYear, 0, 4);\n const fourthOfJanuaryDay = date.getUTCDay() || 7;\n const diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay;\n date.setUTCDate(date.getUTCDate() + diff);\n return date;\n}\n\n// Validation functions\n\n// February is null to handle the leap year (using ||)\nconst daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nfunction isLeapYearIndex(year) {\n return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);\n}\n\nfunction validateDate(year, month, date) {\n return (\n month >= 0 &&\n month <= 11 &&\n date >= 1 &&\n date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28))\n );\n}\n\nfunction validateDayOfYearDate(year, dayOfYear) {\n return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365);\n}\n\nfunction validateWeekDate(_year, week, day) {\n return week >= 1 && week <= 53 && day >= 0 && day <= 6;\n}\n\nfunction validateTime(hours, minutes, seconds) {\n if (hours === 24) {\n return minutes === 0 && seconds === 0;\n }\n\n return (\n seconds >= 0 &&\n seconds < 60 &&\n minutes >= 0 &&\n minutes < 60 &&\n hours >= 0 &&\n hours < 25\n );\n}\n\nfunction validateTimezone(_hours, minutes) {\n return minutes >= 0 && minutes <= 59;\n}\n\n// Fallback for modularized imports:\nexport default parseISO;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n standalone: {\n one: \"weniger als 1 Sekunde\",\n other: \"weniger als {{count}} Sekunden\",\n },\n withPreposition: {\n one: \"weniger als 1 Sekunde\",\n other: \"weniger als {{count}} Sekunden\",\n },\n },\n\n xSeconds: {\n standalone: {\n one: \"1 Sekunde\",\n other: \"{{count}} Sekunden\",\n },\n withPreposition: {\n one: \"1 Sekunde\",\n other: \"{{count}} Sekunden\",\n },\n },\n\n halfAMinute: {\n standalone: \"eine halbe Minute\",\n withPreposition: \"einer halben Minute\",\n },\n\n lessThanXMinutes: {\n standalone: {\n one: \"weniger als 1 Minute\",\n other: \"weniger als {{count}} Minuten\",\n },\n withPreposition: {\n one: \"weniger als 1 Minute\",\n other: \"weniger als {{count}} Minuten\",\n },\n },\n\n xMinutes: {\n standalone: {\n one: \"1 Minute\",\n other: \"{{count}} Minuten\",\n },\n withPreposition: {\n one: \"1 Minute\",\n other: \"{{count}} Minuten\",\n },\n },\n\n aboutXHours: {\n standalone: {\n one: \"etwa 1 Stunde\",\n other: \"etwa {{count}} Stunden\",\n },\n withPreposition: {\n one: \"etwa 1 Stunde\",\n other: \"etwa {{count}} Stunden\",\n },\n },\n\n xHours: {\n standalone: {\n one: \"1 Stunde\",\n other: \"{{count}} Stunden\",\n },\n withPreposition: {\n one: \"1 Stunde\",\n other: \"{{count}} Stunden\",\n },\n },\n\n xDays: {\n standalone: {\n one: \"1 Tag\",\n other: \"{{count}} Tage\",\n },\n withPreposition: {\n one: \"1 Tag\",\n other: \"{{count}} Tagen\",\n },\n },\n\n aboutXWeeks: {\n standalone: {\n one: \"etwa 1 Woche\",\n other: \"etwa {{count}} Wochen\",\n },\n withPreposition: {\n one: \"etwa 1 Woche\",\n other: \"etwa {{count}} Wochen\",\n },\n },\n\n xWeeks: {\n standalone: {\n one: \"1 Woche\",\n other: \"{{count}} Wochen\",\n },\n withPreposition: {\n one: \"1 Woche\",\n other: \"{{count}} Wochen\",\n },\n },\n\n aboutXMonths: {\n standalone: {\n one: \"etwa 1 Monat\",\n other: \"etwa {{count}} Monate\",\n },\n withPreposition: {\n one: \"etwa 1 Monat\",\n other: \"etwa {{count}} Monaten\",\n },\n },\n\n xMonths: {\n standalone: {\n one: \"1 Monat\",\n other: \"{{count}} Monate\",\n },\n withPreposition: {\n one: \"1 Monat\",\n other: \"{{count}} Monaten\",\n },\n },\n\n aboutXYears: {\n standalone: {\n one: \"etwa 1 Jahr\",\n other: \"etwa {{count}} Jahre\",\n },\n withPreposition: {\n one: \"etwa 1 Jahr\",\n other: \"etwa {{count}} Jahren\",\n },\n },\n\n xYears: {\n standalone: {\n one: \"1 Jahr\",\n other: \"{{count}} Jahre\",\n },\n withPreposition: {\n one: \"1 Jahr\",\n other: \"{{count}} Jahren\",\n },\n },\n\n overXYears: {\n standalone: {\n one: \"mehr als 1 Jahr\",\n other: \"mehr als {{count}} Jahre\",\n },\n withPreposition: {\n one: \"mehr als 1 Jahr\",\n other: \"mehr als {{count}} Jahren\",\n },\n },\n\n almostXYears: {\n standalone: {\n one: \"fast 1 Jahr\",\n other: \"fast {{count}} Jahre\",\n },\n withPreposition: {\n one: \"fast 1 Jahr\",\n other: \"fast {{count}} Jahren\",\n },\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = options?.addSuffix\n ? formatDistanceLocale[token].withPreposition\n : formatDistanceLocale[token].standalone;\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", String(count));\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"in \" + result;\n } else {\n return \"vor \" + result;\n }\n }\n\n return result;\n};\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.mjs\";\n\n// DIN 5008: https://de.wikipedia.org/wiki/Datumsformat#DIN_5008\nconst dateFormats = {\n full: \"EEEE, do MMMM y\", // Montag, 7. Januar 2018\n long: \"do MMMM y\", // 7. Januar 2018\n medium: \"do MMM y\", // 7. Jan. 2018\n short: \"dd.MM.y\", // 07.01.2018\n};\n\nconst timeFormats = {\n full: \"HH:mm:ss zzzz\",\n long: \"HH:mm:ss z\",\n medium: \"HH:mm:ss\",\n short: \"HH:mm\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'um' {{time}}\",\n long: \"{{date}} 'um' {{time}}\",\n medium: \"{{date}} {{time}}\",\n short: \"{{date}} {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"'letzten' eeee 'um' p\",\n yesterday: \"'gestern um' p\",\n today: \"'heute um' p\",\n tomorrow: \"'morgen um' p\",\n nextWeek: \"eeee 'um' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.mjs\";\n\nconst eraValues = {\n narrow: [\"v.Chr.\", \"n.Chr.\"],\n abbreviated: [\"v.Chr.\", \"n.Chr.\"],\n wide: [\"vor Christus\", \"nach Christus\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1. Quartal\", \"2. Quartal\", \"3. Quartal\", \"4. Quartal\"],\n};\n\n// Note: in German, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"Jan\",\n \"Feb\",\n \"Mär\",\n \"Apr\",\n \"Mai\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Okt\",\n \"Nov\",\n \"Dez\",\n ],\n\n wide: [\n \"Januar\",\n \"Februar\",\n \"März\",\n \"April\",\n \"Mai\",\n \"Juni\",\n \"Juli\",\n \"August\",\n \"September\",\n \"Oktober\",\n \"November\",\n \"Dezember\",\n ],\n};\n\n// https://st.unicode.org/cldr-apps/v#/de/Gregorian/\nconst formattingMonthValues = {\n narrow: monthValues.narrow,\n abbreviated: [\n \"Jan.\",\n \"Feb.\",\n \"März\",\n \"Apr.\",\n \"Mai\",\n \"Juni\",\n \"Juli\",\n \"Aug.\",\n \"Sep.\",\n \"Okt.\",\n \"Nov.\",\n \"Dez.\",\n ],\n\n wide: monthValues.wide,\n};\n\nconst dayValues = {\n narrow: [\"S\", \"M\", \"D\", \"M\", \"D\", \"F\", \"S\"],\n short: [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"],\n abbreviated: [\"So.\", \"Mo.\", \"Di.\", \"Mi.\", \"Do.\", \"Fr.\", \"Sa.\"],\n wide: [\n \"Sonntag\",\n \"Montag\",\n \"Dienstag\",\n \"Mittwoch\",\n \"Donnerstag\",\n \"Freitag\",\n \"Samstag\",\n ],\n};\n\n// https://www.unicode.org/cldr/charts/32/summary/de.html#1881\nconst dayPeriodValues = {\n narrow: {\n am: \"vm.\",\n pm: \"nm.\",\n midnight: \"Mitternacht\",\n noon: \"Mittag\",\n morning: \"Morgen\",\n afternoon: \"Nachm.\",\n evening: \"Abend\",\n night: \"Nacht\",\n },\n abbreviated: {\n am: \"vorm.\",\n pm: \"nachm.\",\n midnight: \"Mitternacht\",\n noon: \"Mittag\",\n morning: \"Morgen\",\n afternoon: \"Nachmittag\",\n evening: \"Abend\",\n night: \"Nacht\",\n },\n wide: {\n am: \"vormittags\",\n pm: \"nachmittags\",\n midnight: \"Mitternacht\",\n noon: \"Mittag\",\n morning: \"Morgen\",\n afternoon: \"Nachmittag\",\n evening: \"Abend\",\n night: \"Nacht\",\n },\n};\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"vm.\",\n pm: \"nm.\",\n midnight: \"Mitternacht\",\n noon: \"Mittag\",\n morning: \"morgens\",\n afternoon: \"nachm.\",\n evening: \"abends\",\n night: \"nachts\",\n },\n abbreviated: {\n am: \"vorm.\",\n pm: \"nachm.\",\n midnight: \"Mitternacht\",\n noon: \"Mittag\",\n morning: \"morgens\",\n afternoon: \"nachmittags\",\n evening: \"abends\",\n night: \"nachts\",\n },\n wide: {\n am: \"vormittags\",\n pm: \"nachmittags\",\n midnight: \"Mitternacht\",\n noon: \"Mittag\",\n morning: \"morgens\",\n afternoon: \"nachmittags\",\n evening: \"abends\",\n night: \"nachts\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber) => {\n const number = Number(dirtyNumber);\n\n return number + \".\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n formattingValues: formattingMonthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.mjs\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.mjs\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(\\.)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(v\\.? ?Chr\\.?|n\\.? ?Chr\\.?)/i,\n abbreviated: /^(v\\.? ?Chr\\.?|n\\.? ?Chr\\.?)/i,\n wide: /^(vor Christus|vor unserer Zeitrechnung|nach Christus|unserer Zeitrechnung)/i,\n};\nconst parseEraPatterns = {\n any: [/^v/i, /^n/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](\\.)? Quartal/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated:\n /^(j[aä]n|feb|mär[z]?|apr|mai|jun[i]?|jul[i]?|aug|sep|okt|nov|dez)\\.?/i,\n wide: /^(januar|februar|märz|april|mai|juni|juli|august|september|oktober|november|dezember)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^j[aä]/i,\n /^f/i,\n /^mär/i,\n /^ap/i,\n /^mai/i,\n /^jun/i,\n /^jul/i,\n /^au/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[smdmf]/i,\n short: /^(so|mo|di|mi|do|fr|sa)/i,\n abbreviated: /^(son?|mon?|die?|mit?|don?|fre?|sam?)\\.?/i,\n wide: /^(sonntag|montag|dienstag|mittwoch|donnerstag|freitag|samstag)/i,\n};\nconst parseDayPatterns = {\n any: [/^so/i, /^mo/i, /^di/i, /^mi/i, /^do/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(vm\\.?|nm\\.?|Mitternacht|Mittag|morgens|nachm\\.?|abends|nachts)/i,\n abbreviated:\n /^(vorm\\.?|nachm\\.?|Mitternacht|Mittag|morgens|nachm\\.?|abends|nachts)/i,\n wide: /^(vormittags|nachmittags|Mitternacht|Mittag|morgens|nachmittags|abends|nachts)/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^v/i,\n pm: /^n/i,\n midnight: /^Mitte/i,\n noon: /^Mitta/i,\n morning: /morgens/i,\n afternoon: /nachmittags/i, // will never be matched. Afternoon is matched by `pm`\n evening: /abends/i,\n night: /nachts/i, // will never be matched. Night is matched by `pm`\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./de/_lib/formatDistance.mjs\";\nimport { formatLong } from \"./de/_lib/formatLong.mjs\";\nimport { formatRelative } from \"./de/_lib/formatRelative.mjs\";\nimport { localize } from \"./de/_lib/localize.mjs\";\nimport { match } from \"./de/_lib/match.mjs\";\n\n/**\n * @category Locales\n * @summary German locale.\n * @language German\n * @iso-639-2 deu\n * @author Thomas Eilmsteiner [@DeMuu](https://github.com/DeMuu)\n * @author Asia [@asia-t](https://github.com/asia-t)\n * @author Van Vuong Ngo [@vanvuongngo](https://github.com/vanvuongngo)\n * @author RomanErnst [@pex](https://github.com/pex)\n * @author Philipp Keck [@Philipp91](https://github.com/Philipp91)\n */\nexport const de = {\n code: \"de\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 1 /* Monday */,\n firstWeekContainsDate: 4,\n },\n};\n\n// Fallback for modularized imports:\nexport default de;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"moins d’une seconde\",\n other: \"moins de {{count}} secondes\",\n },\n\n xSeconds: {\n one: \"1 seconde\",\n other: \"{{count}} secondes\",\n },\n\n halfAMinute: \"30 secondes\",\n\n lessThanXMinutes: {\n one: \"moins d’une minute\",\n other: \"moins de {{count}} minutes\",\n },\n\n xMinutes: {\n one: \"1 minute\",\n other: \"{{count}} minutes\",\n },\n\n aboutXHours: {\n one: \"environ 1 heure\",\n other: \"environ {{count}} heures\",\n },\n\n xHours: {\n one: \"1 heure\",\n other: \"{{count}} heures\",\n },\n\n xDays: {\n one: \"1 jour\",\n other: \"{{count}} jours\",\n },\n\n aboutXWeeks: {\n one: \"environ 1 semaine\",\n other: \"environ {{count}} semaines\",\n },\n\n xWeeks: {\n one: \"1 semaine\",\n other: \"{{count}} semaines\",\n },\n\n aboutXMonths: {\n one: \"environ 1 mois\",\n other: \"environ {{count}} mois\",\n },\n\n xMonths: {\n one: \"1 mois\",\n other: \"{{count}} mois\",\n },\n\n aboutXYears: {\n one: \"environ 1 an\",\n other: \"environ {{count}} ans\",\n },\n\n xYears: {\n one: \"1 an\",\n other: \"{{count}} ans\",\n },\n\n overXYears: {\n one: \"plus d’un an\",\n other: \"plus de {{count}} ans\",\n },\n\n almostXYears: {\n one: \"presqu’un an\",\n other: \"presque {{count}} ans\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n const form = formatDistanceLocale[token];\n if (typeof form === \"string\") {\n result = form;\n } else if (count === 1) {\n result = form.one;\n } else {\n result = form.other.replace(\"{{count}}\", String(count));\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"dans \" + result;\n } else {\n return \"il y a \" + result;\n }\n }\n\n return result;\n};\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.mjs\";\n\nconst dateFormats = {\n full: \"EEEE d MMMM y\",\n long: \"d MMMM y\",\n medium: \"d MMM y\",\n short: \"dd/MM/y\",\n};\n\nconst timeFormats = {\n full: \"HH:mm:ss zzzz\",\n long: \"HH:mm:ss z\",\n medium: \"HH:mm:ss\",\n short: \"HH:mm\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'à' {{time}}\",\n long: \"{{date}} 'à' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"eeee 'dernier à' p\",\n yesterday: \"'hier à' p\",\n today: \"'aujourd’hui à' p\",\n tomorrow: \"'demain à' p'\",\n nextWeek: \"eeee 'prochain à' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.mjs\";\n\nconst eraValues = {\n narrow: [\"av. J.-C\", \"ap. J.-C\"],\n abbreviated: [\"av. J.-C\", \"ap. J.-C\"],\n wide: [\"avant Jésus-Christ\", \"après Jésus-Christ\"],\n};\n\nconst quarterValues = {\n narrow: [\"T1\", \"T2\", \"T3\", \"T4\"],\n abbreviated: [\"1er trim.\", \"2ème trim.\", \"3ème trim.\", \"4ème trim.\"],\n wide: [\"1er trimestre\", \"2ème trimestre\", \"3ème trimestre\", \"4ème trimestre\"],\n};\n\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"janv.\",\n \"févr.\",\n \"mars\",\n \"avr.\",\n \"mai\",\n \"juin\",\n \"juil.\",\n \"août\",\n \"sept.\",\n \"oct.\",\n \"nov.\",\n \"déc.\",\n ],\n\n wide: [\n \"janvier\",\n \"février\",\n \"mars\",\n \"avril\",\n \"mai\",\n \"juin\",\n \"juillet\",\n \"août\",\n \"septembre\",\n \"octobre\",\n \"novembre\",\n \"décembre\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"D\", \"L\", \"M\", \"M\", \"J\", \"V\", \"S\"],\n short: [\"di\", \"lu\", \"ma\", \"me\", \"je\", \"ve\", \"sa\"],\n abbreviated: [\"dim.\", \"lun.\", \"mar.\", \"mer.\", \"jeu.\", \"ven.\", \"sam.\"],\n\n wide: [\n \"dimanche\",\n \"lundi\",\n \"mardi\",\n \"mercredi\",\n \"jeudi\",\n \"vendredi\",\n \"samedi\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"minuit\",\n noon: \"midi\",\n morning: \"mat.\",\n afternoon: \"ap.m.\",\n evening: \"soir\",\n night: \"mat.\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"minuit\",\n noon: \"midi\",\n morning: \"matin\",\n afternoon: \"après-midi\",\n evening: \"soir\",\n night: \"matin\",\n },\n wide: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"minuit\",\n noon: \"midi\",\n morning: \"du matin\",\n afternoon: \"de l’après-midi\",\n evening: \"du soir\",\n night: \"du matin\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, options) => {\n const number = Number(dirtyNumber);\n const unit = options?.unit;\n\n if (number === 0) return \"0\";\n\n const feminineUnits = [\"year\", \"week\", \"hour\", \"minute\", \"second\"];\n let suffix;\n\n if (number === 1) {\n suffix = unit && feminineUnits.includes(unit) ? \"ère\" : \"er\";\n } else {\n suffix = \"ème\";\n }\n\n return number + suffix;\n};\n\nconst LONG_MONTHS_TOKENS = [\"MMM\", \"MMMM\"];\n\nexport const localize = {\n preprocessor: (date, parts) => {\n // Replaces the `do` tokens with `d` when used with long month tokens and the day of the month is greater than one.\n // Use case \"do MMMM\" => 1er août, 29 août\n // see https://github.com/date-fns/date-fns/issues/1391\n\n if (date.getDate() === 1) return parts;\n\n const hasLongMonthToken = parts.some(\n (part) => part.isToken && LONG_MONTHS_TOKENS.includes(part.value),\n );\n\n if (!hasLongMonthToken) return parts;\n\n return parts.map((part) =>\n part.isToken && part.value === \"do\"\n ? { isToken: true, value: \"d\" }\n : part,\n );\n },\n\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n }),\n};\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.mjs\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.mjs\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(ième|ère|ème|er|e)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(av\\.J\\.C|ap\\.J\\.C|ap\\.J\\.-C)/i,\n abbreviated: /^(av\\.J\\.-C|av\\.J-C|apr\\.J\\.-C|apr\\.J-C|ap\\.J-C)/i,\n wide: /^(avant Jésus-Christ|après Jésus-Christ)/i,\n};\nconst parseEraPatterns = {\n any: [/^av/i, /^ap/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^T?[1234]/i,\n abbreviated: /^[1234](er|ème|e)? trim\\.?/i,\n wide: /^[1234](er|ème|e)? trimestre/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated:\n /^(janv|févr|mars|avr|mai|juin|juill|juil|août|sept|oct|nov|déc)\\.?/i,\n wide: /^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ja/i,\n /^f/i,\n /^mar/i,\n /^av/i,\n /^ma/i,\n /^juin/i,\n /^juil/i,\n /^ao/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[lmjvsd]/i,\n short: /^(di|lu|ma|me|je|ve|sa)/i,\n abbreviated: /^(dim|lun|mar|mer|jeu|ven|sam)\\.?/i,\n wide: /^(dimanche|lundi|mardi|mercredi|jeudi|vendredi|samedi)/i,\n};\nconst parseDayPatterns = {\n narrow: [/^d/i, /^l/i, /^m/i, /^m/i, /^j/i, /^v/i, /^s/i],\n any: [/^di/i, /^lu/i, /^ma/i, /^me/i, /^je/i, /^ve/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(a|p|minuit|midi|mat\\.?|ap\\.?m\\.?|soir|nuit)/i,\n any: /^([ap]\\.?\\s?m\\.?|du matin|de l'après[-\\s]midi|du soir|de la nuit)/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^min/i,\n noon: /^mid/i,\n morning: /mat/i,\n afternoon: /ap/i,\n evening: /soir/i,\n night: /nuit/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./fr/_lib/formatDistance.mjs\";\nimport { formatLong } from \"./fr/_lib/formatLong.mjs\";\nimport { formatRelative } from \"./fr/_lib/formatRelative.mjs\";\nimport { localize } from \"./fr/_lib/localize.mjs\";\nimport { match } from \"./fr/_lib/match.mjs\";\n\n/**\n * @category Locales\n * @summary French locale.\n * @language French\n * @iso-639-2 fra\n * @author Jean Dupouy [@izeau](https://github.com/izeau)\n * @author François B [@fbonzon](https://github.com/fbonzon)\n */\nexport const fr = {\n code: \"fr\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 1 /* Monday */,\n firstWeekContainsDate: 4,\n },\n};\n\n// Fallback for modularized imports:\nexport default fr;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"meno di un secondo\",\n other: \"meno di {{count}} secondi\",\n },\n\n xSeconds: {\n one: \"un secondo\",\n other: \"{{count}} secondi\",\n },\n\n halfAMinute: \"alcuni secondi\",\n\n lessThanXMinutes: {\n one: \"meno di un minuto\",\n other: \"meno di {{count}} minuti\",\n },\n\n xMinutes: {\n one: \"un minuto\",\n other: \"{{count}} minuti\",\n },\n\n aboutXHours: {\n one: \"circa un'ora\",\n other: \"circa {{count}} ore\",\n },\n\n xHours: {\n one: \"un'ora\",\n other: \"{{count}} ore\",\n },\n\n xDays: {\n one: \"un giorno\",\n other: \"{{count}} giorni\",\n },\n\n aboutXWeeks: {\n one: \"circa una settimana\",\n other: \"circa {{count}} settimane\",\n },\n\n xWeeks: {\n one: \"una settimana\",\n other: \"{{count}} settimane\",\n },\n\n aboutXMonths: {\n one: \"circa un mese\",\n other: \"circa {{count}} mesi\",\n },\n\n xMonths: {\n one: \"un mese\",\n other: \"{{count}} mesi\",\n },\n\n aboutXYears: {\n one: \"circa un anno\",\n other: \"circa {{count}} anni\",\n },\n\n xYears: {\n one: \"un anno\",\n other: \"{{count}} anni\",\n },\n\n overXYears: {\n one: \"più di un anno\",\n other: \"più di {{count}} anni\",\n },\n\n almostXYears: {\n one: \"quasi un anno\",\n other: \"quasi {{count}} anni\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", count.toString());\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"tra \" + result;\n } else {\n return result + \" fa\";\n }\n }\n\n return result;\n};\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.mjs\";\n\nconst dateFormats = {\n full: \"EEEE d MMMM y\",\n long: \"d MMMM y\",\n medium: \"d MMM y\",\n short: \"dd/MM/y\",\n};\n\nconst timeFormats = {\n full: \"HH:mm:ss zzzz\",\n long: \"HH:mm:ss z\",\n medium: \"HH:mm:ss\",\n short: \"HH:mm\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} {{time}}\",\n long: \"{{date}} {{time}}\",\n medium: \"{{date}} {{time}}\",\n short: \"{{date}} {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","import { isSameWeek } from \"../../../isSameWeek.mjs\";\n\nconst weekdays = [\n \"domenica\",\n \"lunedì\",\n \"martedì\",\n \"mercoledì\",\n \"giovedì\",\n \"venerdì\",\n \"sabato\",\n];\n\nfunction lastWeek(day) {\n switch (day) {\n case 0:\n return \"'domenica scorsa alle' p\";\n default:\n return \"'\" + weekdays[day] + \" scorso alle' p\";\n }\n}\n\nfunction thisWeek(day) {\n return \"'\" + weekdays[day] + \" alle' p\";\n}\n\nfunction nextWeek(day) {\n switch (day) {\n case 0:\n return \"'domenica prossima alle' p\";\n default:\n return \"'\" + weekdays[day] + \" prossimo alle' p\";\n }\n}\n\nconst formatRelativeLocale = {\n lastWeek: (date, baseDate, options) => {\n const day = date.getDay();\n if (isSameWeek(date, baseDate, options)) {\n return thisWeek(day);\n } else {\n return lastWeek(day);\n }\n },\n yesterday: \"'ieri alle' p\",\n today: \"'oggi alle' p\",\n tomorrow: \"'domani alle' p\",\n nextWeek: (date, baseDate, options) => {\n const day = date.getDay();\n if (isSameWeek(date, baseDate, options)) {\n return thisWeek(day);\n } else {\n return nextWeek(day);\n }\n },\n other: \"P\",\n};\n\nexport const formatRelative = (token, date, baseDate, options) => {\n const format = formatRelativeLocale[token];\n\n if (typeof format === \"function\") {\n return format(date, baseDate, options);\n }\n\n return format;\n};\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.mjs\";\n\nconst eraValues = {\n narrow: [\"aC\", \"dC\"],\n abbreviated: [\"a.C.\", \"d.C.\"],\n wide: [\"avanti Cristo\", \"dopo Cristo\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"T1\", \"T2\", \"T3\", \"T4\"],\n wide: [\"1º trimestre\", \"2º trimestre\", \"3º trimestre\", \"4º trimestre\"],\n};\n\nconst monthValues = {\n narrow: [\"G\", \"F\", \"M\", \"A\", \"M\", \"G\", \"L\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"gen\",\n \"feb\",\n \"mar\",\n \"apr\",\n \"mag\",\n \"giu\",\n \"lug\",\n \"ago\",\n \"set\",\n \"ott\",\n \"nov\",\n \"dic\",\n ],\n\n wide: [\n \"gennaio\",\n \"febbraio\",\n \"marzo\",\n \"aprile\",\n \"maggio\",\n \"giugno\",\n \"luglio\",\n \"agosto\",\n \"settembre\",\n \"ottobre\",\n \"novembre\",\n \"dicembre\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"D\", \"L\", \"M\", \"M\", \"G\", \"V\", \"S\"],\n short: [\"dom\", \"lun\", \"mar\", \"mer\", \"gio\", \"ven\", \"sab\"],\n abbreviated: [\"dom\", \"lun\", \"mar\", \"mer\", \"gio\", \"ven\", \"sab\"],\n wide: [\n \"domenica\",\n \"lunedì\",\n \"martedì\",\n \"mercoledì\",\n \"giovedì\",\n \"venerdì\",\n \"sabato\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"m.\",\n pm: \"p.\",\n midnight: \"mezzanotte\",\n noon: \"mezzogiorno\",\n morning: \"mattina\",\n afternoon: \"pomeriggio\",\n evening: \"sera\",\n night: \"notte\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"mezzanotte\",\n noon: \"mezzogiorno\",\n morning: \"mattina\",\n afternoon: \"pomeriggio\",\n evening: \"sera\",\n night: \"notte\",\n },\n wide: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"mezzanotte\",\n noon: \"mezzogiorno\",\n morning: \"mattina\",\n afternoon: \"pomeriggio\",\n evening: \"sera\",\n night: \"notte\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"m.\",\n pm: \"p.\",\n midnight: \"mezzanotte\",\n noon: \"mezzogiorno\",\n morning: \"di mattina\",\n afternoon: \"del pomeriggio\",\n evening: \"di sera\",\n night: \"di notte\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"mezzanotte\",\n noon: \"mezzogiorno\",\n morning: \"di mattina\",\n afternoon: \"del pomeriggio\",\n evening: \"di sera\",\n night: \"di notte\",\n },\n wide: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"mezzanotte\",\n noon: \"mezzogiorno\",\n morning: \"di mattina\",\n afternoon: \"del pomeriggio\",\n evening: \"di sera\",\n night: \"di notte\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n const number = Number(dirtyNumber);\n return String(number);\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.mjs\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.mjs\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(º)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(aC|dC)/i,\n abbreviated: /^(a\\.?\\s?C\\.?|a\\.?\\s?e\\.?\\s?v\\.?|d\\.?\\s?C\\.?|e\\.?\\s?v\\.?)/i,\n wide: /^(avanti Cristo|avanti Era Volgare|dopo Cristo|Era Volgare)/i,\n};\nconst parseEraPatterns = {\n any: [/^a/i, /^(d|e)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^t[1234]/i,\n wide: /^[1234](º)? trimestre/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[gfmalsond]/i,\n abbreviated: /^(gen|feb|mar|apr|mag|giu|lug|ago|set|ott|nov|dic)/i,\n wide: /^(gennaio|febbraio|marzo|aprile|maggio|giugno|luglio|agosto|settembre|ottobre|novembre|dicembre)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^g/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^g/i,\n /^l/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ge/i,\n /^f/i,\n /^mar/i,\n /^ap/i,\n /^mag/i,\n /^gi/i,\n /^l/i,\n /^ag/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[dlmgvs]/i,\n short: /^(do|lu|ma|me|gi|ve|sa)/i,\n abbreviated: /^(dom|lun|mar|mer|gio|ven|sab)/i,\n wide: /^(domenica|luned[i|ì]|marted[i|ì]|mercoled[i|ì]|gioved[i|ì]|venerd[i|ì]|sabato)/i,\n};\nconst parseDayPatterns = {\n narrow: [/^d/i, /^l/i, /^m/i, /^m/i, /^g/i, /^v/i, /^s/i],\n any: [/^d/i, /^l/i, /^ma/i, /^me/i, /^g/i, /^v/i, /^s/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow:\n /^(a|m\\.|p|mezzanotte|mezzogiorno|(di|del) (mattina|pomeriggio|sera|notte))/i,\n any: /^([ap]\\.?\\s?m\\.?|mezzanotte|mezzogiorno|(di|del) (mattina|pomeriggio|sera|notte))/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mezza/i,\n noon: /^mezzo/i,\n morning: /mattina/i,\n afternoon: /pomeriggio/i,\n evening: /sera/i,\n night: /notte/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./it/_lib/formatDistance.mjs\";\nimport { formatLong } from \"./it/_lib/formatLong.mjs\";\nimport { formatRelative } from \"./it/_lib/formatRelative.mjs\";\nimport { localize } from \"./it/_lib/localize.mjs\";\nimport { match } from \"./it/_lib/match.mjs\";\n\n/**\n * @category Locales\n * @summary Italian locale.\n * @language Italian\n * @iso-639-2 ita\n * @author Alberto Restifo [@albertorestifo](https://github.com/albertorestifo)\n * @author Giovanni Polimeni [@giofilo](https://github.com/giofilo)\n * @author Vincenzo Carrese [@vin-car](https://github.com/vin-car)\n */\nexport const it = {\n code: \"it\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 1 /* Monday */,\n firstWeekContainsDate: 4,\n },\n};\n\n// Fallback for modularized imports:\nexport default it;\n","import { format, parseISO, type Locale } from 'date-fns';\nimport { de, enUS, fr, it } from 'date-fns/locale';\n\nconst locales: Record<string, Locale> = { de, en: enUS, fr, it };\n\nexport const formatDate = (\n date: string | Date,\n formatStr: string = 'dd. MMM yyyy',\n locale: string = 'de'\n): string => {\n const d = typeof date === 'string' ? parseISO(date) : date;\n return format(d, formatStr, { locale: locales[locale] || de });\n};\n\nexport const formatDateRange = (\n checkIn: string | Date,\n checkOut: string | Date,\n locale: string = 'de'\n): string => {\n const start = formatDate(checkIn, 'dd.', locale);\n const end = formatDate(checkOut, 'dd. MMM yyyy', locale);\n return `${start} - ${end}`;\n};\n","export const calculateDiscount = (\n originalPrice: number,\n discountedPrice: number\n): number => {\n if (originalPrice <= 0) return 0;\n return Math.round(((originalPrice - discountedPrice) / originalPrice) * 100);\n};\n"],"names":["translations","de","en","fr","it","getNestedValue","obj","path","keys","current","key","interpolate","str","options","_","value","createTranslateFunction","locale","localeTranslations","optionsOrFallback","fallback","isOptions","result","defaultT","defaultValue","UIContext","createContext","HotelCardUIProvider","currency","isDesktop","apiBaseUrl","customT","children","t","useMemo","jsx","useUIContext","useContext","cx","className","Button","forwardRef","variant","size","leftIcon","rightIcon","disabled","iconOnly","style","props","ref","getButtonClasses","classes","jsxs","Fragment","Badge","color","icon","colorStyleKey","badgeClasses","iconClasses","textClasses","StarIcon","HalfStarIcon","EmptyStarIcon","Rating","maxValue","showValue","name","date","quote","clampedValue","fullStars","hasHalfStar","emptyStars","renderStars","starClasses","stars","i","containerClasses","Divider","label","orientation","isHorizontal","lineClass","containerClass","CloseIcon","Chip","count","state","removable","onClick","onRemove","effectiveState","chipClasses","labelClasses","countBadgeClasses","handleClick","handleKeyDown","e","Checkbox","checked","defaultChecked","onChange","error","id","localChecked","setLocalChecked","useState","isFocused","setIsFocused","actualChecked","handleChange","newChecked","wrapperClasses","boxClasses","inputClasses","checkmarkClasses","RadioButton","autoComplete","event","outerCircleClasses","innerDotClasses","ChevronRightIcon","SectionHeader","title","showAllLabel","onShowAllClick","headerClasses","Modal","isOpen","onClose","width","showCloseButton","disableBackdropClick","modalRef","useRef","useEffect","handleEscape","handleBackdropClick","modalClasses","modalContent","createPortal","CommentIcon","PLACEHOLDER","repeat","n","renderFn","Card","image","imageAlt","price","isSuperior","badge","hasRating","withPadding","withHeight","ratingInfo","context","swissLodgeLabel","starsRowClasses","priceClasses","displayImage","renderRatingInfo","DEFAULT_PLACEHOLDER","BaseCard","hoverable","borderRadius","classNames","BaseCardImage","src","alt","height","aspectRatio","topLeftSlot","topRightSlot","bottomSlot","centerSlot","showGradient","placeholder","imageSrc","setImageSrc","hasError","setHasError","handleError","React","containerStyle","hasTopRow","BaseCardContent","padding","BaseCardSkeleton","imageHeight","imageAspectRatio","imageStyle","ChevronIcon","Dropdown","localValue","setLocalValue","setIsOpen","dropdownRef","actualValue","selectedLabel","_a","o","handleClickOutside","handleSelect","selectedValue","buttonClasses","chevronClasses","listClasses","option","opt","Input","helper","onFocus","onBlur","type","prefix","inputClassName","wrapperClassName","required","autoFocus","readOnly","inputProps","inputRef","newValue","handleFocus","handleBlur","helperClasses","Block","visual","description","showArrow","iconContainerClass","ReviewCard","rating","FAQ","items","defaultOpenIndex","allowMultiple","openIndices","setOpenIndices","toggleItem","index","prev","newSet","item","answerClasses","Benefits","subtitle","benefits","contactTitle","contactDescription","contactButtonText","onContactClick","sectionClasses","benefit","HeartIcon","HomeIcon","Pin","viewed","showFavorite","styleVariant","pinClasses","formattedPrice","EmptyState","action","useDebounce","delay","debouncedValue","setDebouncedValue","timer","useResponsive","setWidth","handleResize","useWindowData","useTranslation","namespace","i18nT","i18n","useI18nTranslation","actualFallback","resultStr","DualCalendar","startDate","endDate","onDateSelect","minDate","currentMonth","setCurrentMonth","isStartDate","dateStr","isEndDate","isMidDate","endOfMonth","getDaysInMonth","getFirstDayOfMonth","day","formatMonthYear","weekDays","days","baseDate","isDateDisabled","today","oneYearFromToday","dateParts","minParts","min","generateCalendar","monthOffset","daysInMonth","firstDay","styles","start","end","inRange","dayCellClasses","handlePrevMonth","handleNextMonth","prevMonth","isPrevDisabled","maxMonth","nextMonth","isNextDisabled","isNextDisabledMobile","PrevArrowIcon","NextArrowIcon","calendarsContainerClasses","getDateLocale","WhenContent","initialDateRange","initialMonthFilter","onMonthFilterChange","showApplyButton","onApply","dateLocale","dateRange","setDateRange","mode","setMode","selectedMonths","isAnytimeSelected","months","now","handleAnytimeClick","handleMonthToggle","monthValue","newSelectedMonths","m","handleApply","handleModeSwitch","newMode","getTodayDate","getNextDate","dateString","handleDateSelect","newRange","nextDate","monthGridClasses","contentClasses","month","CalendarIcon","DateSelector","setSelectedMonths","next","handlePointerDown","newDateRange","newMonthFilter","formatDateDisplay","format","d","handleDateRangeChange","range","handleMonthFilterChange","dropdownClasses","v","MinusIcon","PlusIcon","DropdownIcon","GuestContent","guests","petFilter","onPetChange","showPetToggle","childAgeErrors","onErrorClear","labels","childrenAges","handleIncrement","newChildrenAges","handleDecrement","handleAgeChange","currentAge","errorMessage","age","PersonIcon","GuestSelector","initialGuests","initialPetValue","setGuests","setPetFilter","errors","setErrors","totalGuests","handleGuestChange","newGuests","handlePetChange","handleErrorClear","SearchLocationIcon","ClearIcon","AllDestinationsIcon","NearMeIcon","HotelIcon","LocationIcon","RegionIcon","CountryIcon","LocationAutocomplete","onSelect","onSubmit","onAutocomplete","suggestions","setSuggestions","selectedIndex","setSelectedIndex","isLoading","setIsLoading","debounceRef","isIconActive","groupedSuggestions","hotels","s","cities","regions","countries","allItems","fetchSuggestions","query","results","handleInputChange","handleClear","suggestion","position","coordinates","displayText","getCoordinates","regionId","params","getIcon","highlightMatch","text","lowerText","lowerQuery","matchIndex","beforeMatch","match","afterMatch","citiesStartIndex","regionsStartIndex","countriesStartIndex","hotelsStartIndex","hasSearchResults","showEmptyState","itemIndex","MobileSortModal","sortOptions","SearchIcon","FilterIcon","SortIcon","MobileMapIcon","GuestsIcon","SearchControlsBar","onSearch","onGuestChange","onQueryChange","onDateRangeChange","getGuestsDisplay","getDateDisplay","onMobileClick","onFilterClick","onSortClick","initialQuery","initialPetFilter","viewMode","onViewModeChange","hideViewToggle","compact","setQuery","monthFilter","setMonthFilter","setChildAgeErrors","handleSubmit","validationErrors","validateChildrenAges","onGuestFilterChange","getLocationDisplay","handleClearDate","handleClearGuests","defaultGuests","handleQueryChange","handleDateDropdownClose","handleGuestDropdownClose","newPetFilter","hasDateFilter","hasNonDefaultGuests","setQueryValue","destinationMode","MAX_IMAGES","SWIPE_THRESHOLD","HOTEL_PLACEHOLDER","BuildingIcon","ArrowLeftIcon","ArrowRightIcon","filled","HotelCardImage","images","hotelName","badges","isFavorite","onFavoriteClick","displayImages","currentImageIndex","setCurrentImageIndex","failedImages","setFailedImages","touchStart","setTouchStart","touchEnd","setTouchEnd","isDragging","setIsDragging","imageRef","handleImageError","getImageSrc","goToPreviousImage","goToNextImage","handlePrevImage","handleNextImage","handleTouchStart","handleTouchMove","handleTouchEnd","distance","handleFavorite","PinIcon","BreakfastIcon","FreeCancellationIcon","CheckmarkIcon","RatingBadgeSvg","HotelCardContent","location","isAvailable","getRatingCategory","score","getBenefitIcon","benefitId","getBenefitLabel","getStarRating","starRating","starCount","HotelCard","hotel","onContentClick","HotelCardSkeleton","autocompleteLocations","response","data","LocationSearchContent","showInput","externalInputRef","internalInputRef","handleSelectItem","handleNearMe","coords","cleanLocationText","SearchModalContent","showHeader","setCoordinates","regionsFilter","setRegionsFilter","setDestinationMode","expandedSection","setExpandedSection","handleLocationSelect","destMode","formatDate","getWhenLabel","SearchModal","CollapsibleFilterSection","defaultExpanded","showAllText","showLessText","hasShowAll","initialItemsToShow","isExpanded","setIsExpanded","showAll","setShowAll","toggleExpanded","toggleShowAll","childrenArray","shouldShowToggle","displayedChildren","FilterCheckboxItem","trackName","ExperienceFilter","selected","themes","counts","expanded","setExpanded","visibleThemes","hasMoreThemes","handleToggle","theme","themeIdStr","isDisabled","CATEGORY_OPTIONS","HotelCategoryFilter","MealsFilter","DEFAULT_HISTOGRAM","MIN_HISTOGRAM_BUCKETS","normalizeHistogram","histogram","ratio","sum","j","targetIndex","PriceRangeFilter","minPrice","maxPrice","onDragStart","onDragEnd","debounceDelay","contextCurrency","displayCurrency","sliderRef","isDraggingExternal","setIsDraggingExternal","lastValueRef","timeoutRef","minInputValue","setMinInputValue","maxInputValue","setMaxInputValue","minInputFocused","setMinInputFocused","maxInputFocused","setMaxInputFocused","minPercent","maxPercent","normalizedHistogram","showHistogram","maxHistogramValue","getBarActive","useCallback","barStartPercent","barEndPercent","trackInset","triggerOnApply","handleDrag","clientX","rect","trackWidth","trackLeft","percent","newMin","newMax","handleMouseDown","handle","handleDragEnd","handleMouseMove","handleMinInputFocus","handleMaxInputFocus","handleMinInputChange","val","handleMaxInputChange","handleMinInputBlur","numValue","handleMaxInputBlur","histValue","isActive","RegionsFilter","isPlaceSearchActive","expandedCountries","setExpandedCountries","hasInitializedRef","countriesWithSelectedRegions","region","sub","handleCountryToggle","countryValue","handleRegionToggle","regionValue","r","hasSubRegions","hasSelectableRegions","sr","subValues","hasSelectedRegions","selectableSubValues","merged","subRegion","REVIEW_OPTIONS","ReviewsFilter","reviewStyles","SelectedFiltersRow","filters","onClearAll","filter","TransportFilter","WellnessFilter","FilterMinimap","onViewMap","center","zoom","getStaticMapUrl","lat","lng","z","x","y","FilterSkeleton","itemCount","isRegionFilter","isPriceFilter","isDiscountFilter","isCategoryFilter","idx","countryIdx","regionIdx","DISCOUNT_OPTIONS","OPTIONS_FILTER","FilterPanel","onFilterChange","priceHistogram","discountCounts","optionsCounts","categoryCounts","experienceCounts","mealsCounts","reviewsCounts","transportCounts","wellnessCounts","servicesCounts","filterOptions","externalDiscounts","externalOptions","externalExperiences","externalRegions","externalCategories","externalMeals","externalReviews","externalTransport","externalWellness","externalServices","externalPriceRange","mapCenter","hasInitialLoadRef","priceMin","setPriceMin","priceMax","setPriceMax","selectedRegions","setSelectedRegions","selectedDiscounts","setSelectedDiscounts","selectedOptions","setSelectedOptions","selectedCategories","setSelectedCategories","selectedExperiences","setSelectedExperiences","selectedMeals","setSelectedMeals","selectedReviews","setSelectedReviews","selectedTransport","setSelectedTransport","selectedWellness","setSelectedWellness","selectedServices","setSelectedServices","handlePriceChange","handlePriceApply","handleDiscountToggle","discountValue","newDiscounts","handleOptionToggle","optionValue","newOptions","handleCategoriesChange","values","handleRegionsChange","handleExperienceChange","handleMealsChange","handleReviewsChange","handleServicesChange","handleTransportChange","handleWellnessChange","FilterModal","resultCount","selectedFilters","onRemoveFilter","onClearAllFilters","selectedPriceRange","filterPanelProps","hasSelectedFilters","ChevronDownIcon","formatDateTime","time","formatted","formatPrice","amount","BookingCardDetails","booking","onCancelBooking","contentRef","willExpand","guestsText","PhoneIcon","EmailIcon","MapIcon","MessageIcon","ClockIcon","getDaysUntil","checkIn","checkInDate","diffTime","formatDateRange","checkOut","inDate","outDate","inDay","outDay","year","inMonth","FeaturedBookingCard","onAddToCalendar","showHotelMessage","setShowHotelMessage","fullAddress","daysUntil","handleDirections","encoded","url","StatusBadge","status","statusLabels","CompactBookingCard","showBookAgain","onBookAgain","FeaturedBookingCardSkeleton","CompactBookingCardSkeleton","ChevronLeftIcon","toDate","argument","argStr","constructFrom","millisecondsInWeek","millisecondsInDay","millisecondsInMinute","millisecondsInHour","defaultOptions","getDefaultOptions","startOfWeek","weekStartsOn","_b","_d","_c","_date","diff","startOfISOWeek","getISOWeekYear","fourthOfJanuaryOfNextYear","startOfNextYear","fourthOfJanuaryOfThisYear","startOfThisYear","startOfDay","getTimezoneOffsetInMilliseconds","utcDate","differenceInCalendarDays","dateLeft","dateRight","startOfDayLeft","startOfDayRight","timestampLeft","timestampRight","startOfISOWeekYear","fourthOfJanuary","isDate","isValid","startOfYear","cleanDate","formatDistanceLocale","formatDistance","token","tokenValue","buildFormatLongFn","args","dateFormats","timeFormats","dateTimeFormats","formatLong","formatRelativeLocale","formatRelative","_baseDate","_options","buildLocalizeFn","valuesArray","defaultWidth","eraValues","quarterValues","monthValues","dayValues","dayPeriodValues","formattingDayPeriodValues","ordinalNumber","dirtyNumber","number","rem100","localize","quarter","buildMatchFn","string","matchPattern","matchResult","matchedString","parsePatterns","findIndex","pattern","findKey","rest","object","predicate","array","buildMatchPatternFn","parseResult","matchOrdinalNumberPattern","parseOrdinalNumberPattern","matchEraPatterns","parseEraPatterns","matchQuarterPatterns","parseQuarterPatterns","matchMonthPatterns","parseMonthPatterns","matchDayPatterns","parseDayPatterns","matchDayPeriodPatterns","parseDayPeriodPatterns","enUS","getDayOfYear","getISOWeek","getWeekYear","firstWeekContainsDate","firstWeekOfNextYear","firstWeekOfThisYear","startOfWeekYear","firstWeek","getWeek","addLeadingZeros","targetLength","sign","output","lightFormatters","signedYear","dayPeriodEnumValue","numberOfDigits","milliseconds","fractionalSeconds","dayPeriodEnum","formatters","era","signedWeekYear","weekYear","twoDigitYear","isoWeekYear","week","isoWeek","dayOfYear","dayOfWeek","localDayOfWeek","isoDayOfWeek","hours","_localize","timezoneOffset","formatTimezoneWithOptionalMinutes","formatTimezone","formatTimezoneShort","timestamp","offset","delimiter","absOffset","minutes","dateLongFormatter","timeLongFormatter","dateTimeLongFormatter","datePattern","timePattern","dateTimeFormat","longFormatters","dayOfYearTokenRE","weekYearTokenRE","throwTokens","isProtectedDayOfYearToken","isProtectedWeekYearToken","warnOrThrowProtectedError","input","_message","message","subject","formattingTokensRegExp","longFormattingTokensRegExp","escapedStringRegExp","doubleQuoteRegExp","unescapedLatinCharacterRegExp","formatStr","defaultLocale","_f","_e","_h","_g","originalDate","parts","substring","firstCharacter","longFormatter","cleanEscapedString","formatterOptions","part","formatter","matched","isSameWeek","dateLeftStartOfWeek","dateRightStartOfWeek","parseISO","dateStrings","splitDateString","parseYearResult","parseYear","parseDate","parseTime","parseTimezone","dirtyDate","patterns","dateRegex","timeRegex","timezoneRegex","timeString","additionalDigits","regex","captures","century","isWeekDate","parseDateUnit","validateWeekDate","dayOfISOWeekYear","validateDate","validateDayOfYearDate","parseTimeUnit","seconds","validateTime","timezoneString","validateTimezone","fourthOfJanuaryDay","daysInMonths","isLeapYearIndex","_year","_hours","formattingMonthValues","form","unit","feminineUnits","suffix","LONG_MONTHS_TOKENS","weekdays","lastWeek","thisWeek","nextWeek","locales","calculateDiscount","originalPrice","discountedPrice"],"mappings":"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","x_google_ignoreList":[66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120]}
1
+ {"version":3,"file":"index.cjs","sources":["../src/locales/index.ts","../src/context/UIContext.tsx","../src/components/Button/Button.tsx","../src/components/Badge/Badge.tsx","../src/components/Rating/Rating.tsx","../src/components/Divider/Divider.tsx","../src/components/Chip/Chip.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/RadioButton/RadioButton.tsx","../src/components/SectionHeader/SectionHeader.tsx","../src/components/Modal/Modal.tsx","../src/components/Card/Card.tsx","../src/components/BaseCard/BaseCard.tsx","../src/components/BaseCard/BaseCardSkeleton.tsx","../src/components/Dropdown/Dropdown.tsx","../src/components/Input/Input.tsx","../src/components/Block/Block.tsx","../src/components/ReviewCard/ReviewCard.tsx","../src/components/FAQ/FAQ.tsx","../src/components/Benefits/Benefits.tsx","../src/components/Pin/Pin.tsx","../src/components/EmptyState/EmptyState.tsx","../src/hooks/useDebounce.ts","../src/hooks/useResponsive.ts","../src/hooks/useWindowData.ts","../src/hooks/useTranslation.ts","../src/components/DateSelector/DualCalendar.tsx","../src/components/DateSelector/WhenContent.tsx","../src/components/DateSelector/DateSelector.tsx","../src/components/GuestSelector/GuestContent.tsx","../src/components/GuestSelector/GuestSelector.tsx","../src/components/LocationAutocomplete/LocationAutocomplete.tsx","../src/components/MobileSortModal/MobileSortModal.tsx","../src/components/SearchControlsBar/SearchControlsBar.tsx","../src/components/HotelCard/HotelCardImage.tsx","../src/components/HotelCard/HotelCardContent.tsx","../src/components/HotelCard/HotelCard.tsx","../src/components/HotelCard/HotelCardSkeleton.tsx","../src/services/autocomplete.ts","../src/components/SearchModal/LocationSearchContent/LocationSearchContent.tsx","../src/components/SearchModal/SearchModal.tsx","../src/components/FilterPanel/components/CollapsibleFilterSection.tsx","../src/components/FilterPanel/components/FilterCheckboxItem.tsx","../src/components/FilterPanel/components/ExperienceFilter.tsx","../src/components/FilterPanel/components/HotelCategoryFilter.tsx","../src/components/FilterPanel/components/MealsFilter.tsx","../src/components/FilterPanel/components/PriceRangeFilter.tsx","../src/components/FilterPanel/components/RegionsFilter.tsx","../src/components/FilterPanel/components/ReviewsFilter.tsx","../src/components/FilterPanel/components/SelectedFiltersRow.tsx","../src/components/FilterPanel/components/TransportFilter.tsx","../src/components/FilterPanel/components/WellnessFilter.tsx","../src/components/FilterPanel/components/FilterMinimap.tsx","../src/components/FilterPanel/components/FilterSkeleton/FilterSkeleton.tsx","../src/components/FilterPanel/FilterPanel.tsx","../src/components/FilterModal/FilterModal.tsx","../src/components/BookingCard/BookingCardDetails.tsx","../src/components/BookingCard/FeaturedBookingCard.tsx","../src/components/BookingCard/CompactBookingCard.tsx","../src/components/BookingCard/BookingCardSkeleton.tsx","../src/components/icons/HeartIcon.tsx","../src/components/icons/StarIcon.tsx","../src/components/icons/ChevronLeftIcon.tsx","../src/components/icons/ChevronRightIcon.tsx","../src/components/icons/PinIcon.tsx","../src/utils/formatPrice.ts","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/toDate.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/constructFrom.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/constants.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/_lib/defaultOptions.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/startOfWeek.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/startOfISOWeek.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/getISOWeekYear.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/startOfDay.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/differenceInCalendarDays.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/startOfISOWeekYear.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/isDate.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/isValid.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/startOfYear.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-US/_lib/formatDistance.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/_lib/buildFormatLongFn.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-US/_lib/formatLong.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-US/_lib/formatRelative.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/_lib/buildLocalizeFn.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-US/_lib/localize.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/_lib/buildMatchFn.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/_lib/buildMatchPatternFn.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-US/_lib/match.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/en-US.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/getDayOfYear.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/getISOWeek.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/getWeekYear.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/startOfWeekYear.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/getWeek.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/_lib/addLeadingZeros.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/_lib/format/lightFormatters.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/_lib/format/formatters.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/_lib/format/longFormatters.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/_lib/protectedTokens.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/format.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/isSameWeek.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/parseISO.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/de/_lib/formatDistance.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/de/_lib/formatLong.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/de/_lib/formatRelative.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/de/_lib/localize.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/de/_lib/match.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/de.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/fr/_lib/formatDistance.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/fr/_lib/formatLong.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/fr/_lib/formatRelative.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/fr/_lib/localize.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/fr/_lib/match.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/fr.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/it/_lib/formatDistance.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/it/_lib/formatLong.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/it/_lib/formatRelative.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/it/_lib/localize.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/it/_lib/match.mjs","../../../node_modules/.pnpm/date-fns@3.6.0/node_modules/date-fns/locale/it.mjs","../src/utils/formatDate.ts","../src/utils/calculateDiscount.ts","../src/components/MembershipCard/MembershipCard.tsx"],"sourcesContent":["import de from './de.json';\nimport en from './en.json';\nimport fr from './fr.json';\nimport it from './it.json';\n\nexport const translations = { de, en, fr, it } as const;\n\nexport type Locale = keyof typeof translations;\nexport type TranslationKeys = typeof en;\n","import React, { createContext, useContext, ReactNode, useMemo } from 'react';\nimport { translations, type Locale } from '../locales';\n\n/** Translation options for interpolation */\nexport interface TranslateOptions {\n [key: string]: string | number;\n}\n\n/** Translation function type */\nexport type TranslateFunction = (key: string, optionsOrFallback?: TranslateOptions | string, fallback?: string) => string;\n\nexport interface UIContextValue {\n /** Current locale (e.g., 'de', 'en', 'fr', 'it') */\n locale: Locale;\n /** Currency code (e.g., 'CHF', 'EUR') */\n currency: string;\n /** Whether the app is running on desktop (default: false for mobile-first) */\n isDesktop: boolean;\n /** Base URL for API calls (e.g., 'https://hotelcard.ch') */\n apiBaseUrl: string;\n /** Translation function - looks up keys from internal translations */\n t: TranslateFunction;\n}\n\n/**\n * Get nested value from object using dot notation\n * e.g., getNestedValue({ a: { b: 'value' } }, 'a.b') => 'value'\n */\nfunction getNestedValue(obj: Record<string, unknown>, path: string): string | undefined {\n const keys = path.split('.');\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n\n return typeof current === 'string' ? current : undefined;\n}\n\n/**\n * Interpolate variables in a translation string\n * Replaces {{variable}} with the value from options\n */\nfunction interpolate(str: string, options: TranslateOptions): string {\n return str.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => {\n const value = options[key];\n return value !== undefined ? String(value) : `{{${key}}}`;\n });\n}\n\n/**\n * Create translation function for a given locale\n */\nfunction createTranslateFunction(locale: Locale): TranslateFunction {\n const localeTranslations = translations[locale] || translations.en;\n\n return (key: string, optionsOrFallback?: TranslateOptions | string, fallback?: string): string => {\n const value = getNestedValue(localeTranslations as Record<string, unknown>, key);\n\n // Determine if second param is options object or fallback string\n const isOptions = optionsOrFallback && typeof optionsOrFallback === 'object';\n const options = isOptions ? optionsOrFallback : undefined;\n const fallbackStr = isOptions ? fallback : (optionsOrFallback as string | undefined);\n\n const result = value ?? fallbackStr ?? key;\n\n // Apply interpolation if options provided\n return options ? interpolate(result, options) : result;\n };\n}\n\nconst defaultT = createTranslateFunction('de');\n\nconst defaultValue: UIContextValue = {\n locale: 'de',\n currency: 'CHF',\n isDesktop: false,\n apiBaseUrl: '',\n t: defaultT,\n};\n\nconst UIContext = createContext<UIContextValue>(defaultValue);\n\nexport interface HotelCardUIProviderProps {\n /** Current locale */\n locale?: Locale;\n /** Currency code */\n currency?: string;\n /** Whether running on desktop */\n isDesktop?: boolean;\n /** Base URL for API calls (e.g., 'https://hotelcard.ch') */\n apiBaseUrl?: string;\n /** Optional custom translation function (overrides internal translations) */\n t?: TranslateFunction;\n children: ReactNode;\n}\n\n/**\n * HotelCardUIProvider - Configure shared UI components\n *\n * Wrap your app with this provider to configure locale, currency, and responsive mode\n * for all @hotelcard/ui components.\n *\n * @example\n * ```tsx\n * import { HotelCardUIProvider } from '@hotelcard/ui';\n *\n * <HotelCardUIProvider locale=\"de\" currency=\"CHF\">\n * <App />\n * </HotelCardUIProvider>\n * ```\n */\nexport const HotelCardUIProvider: React.FC<HotelCardUIProviderProps> = ({\n locale = 'de',\n currency = 'CHF',\n isDesktop = false,\n apiBaseUrl = '',\n t: customT,\n children,\n}) => {\n // Create translation function based on locale, or use custom one\n const t = useMemo(\n () => customT ?? createTranslateFunction(locale),\n [locale, customT]\n );\n\n const value: UIContextValue = useMemo(\n () => ({ locale, currency, isDesktop, apiBaseUrl, t }),\n [locale, currency, isDesktop, apiBaseUrl, t]\n );\n\n return (\n <UIContext.Provider value={value}>\n {children}\n </UIContext.Provider>\n );\n};\n\n/**\n * Hook to access UI context values\n * Returns locale, currency, and isDesktop\n */\nexport const useUIContext = (): UIContextValue => {\n return useContext(UIContext);\n};\n\nexport { UIContext };\n","import { forwardRef } from 'react';\nimport { ButtonProps } from \"./Button.types\";\nimport './Button.css';\n\n// CSS class prefix to avoid conflicts\nconst cx = (className: string) => `hc-btn-${className}`;\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(({\n variant = 'primary',\n size = 'medium',\n leftIcon,\n rightIcon,\n children,\n className = '',\n disabled,\n iconOnly = false,\n style,\n ...props\n}, ref) => {\n\n // Build className based on variant, size, and state\n const getButtonClasses = () => {\n const classes: string[] = [cx('button')];\n\n // Link variant\n if (variant === 'link') {\n classes.push(cx('link'));\n classes.push(cx(size));\n return classes.join(' ');\n }\n\n // Icon-only variant\n if (iconOnly) {\n classes.push(cx('icon-only'));\n classes.push(cx(size));\n classes.push(cx(variant));\n return classes.join(' ');\n }\n\n // Standard button\n classes.push(cx('standard'));\n classes.push(cx(size));\n classes.push(cx(variant));\n\n return classes.join(' ');\n };\n\n return (\n <button\n ref={ref}\n style={style}\n className={`${getButtonClasses()} ${className}`}\n disabled={disabled}\n {...props}\n >\n {iconOnly ? (\n children\n ) : (\n <>\n {leftIcon && (\n <span className={cx('icon-wrapper')}>\n {leftIcon}\n </span>\n )}\n <span className={cx('text-wrapper')}>{children}</span>\n {rightIcon && (\n <span className={cx('icon-wrapper')}>\n {rightIcon}\n </span>\n )}\n </>\n )}\n </button>\n );\n});\n\nButton.displayName = 'Button';\n\nexport { Button };\n","import { BadgeProps } from './Badge.types';\nimport './Badge.css';\n\n// CSS class prefix to avoid conflicts\nconst cx = (className: string) => `hc-badge-${className}`;\n\nconst Badge: React.FC<BadgeProps> = ({\n color = 'primary',\n size = 'large',\n style = 'heavy',\n icon = false,\n children,\n className = ''\n}) => {\n // Build color-style variant class name\n const colorStyleKey = `${color}${style.charAt(0).toUpperCase()}${style.slice(1)}`;\n\n // Build badge classes\n const badgeClasses = [\n cx('badge'),\n cx(`badge--${size}`),\n cx(`badge--${colorStyleKey}`),\n className\n ].filter(Boolean).join(' ');\n\n // Build icon classes\n const iconClasses = [\n cx('icon'),\n cx(`icon--${size}`)\n ].join(' ');\n\n // Build text classes\n const textClasses = [\n cx('text'),\n size === 'large' && icon ? cx('text--largeWithIcon') : ''\n ].filter(Boolean).join(' ');\n\n return (\n <div className={badgeClasses}>\n {icon && (\n <div className={iconClasses}>\n {/* Icon implementation would go here */}\n </div>\n )}\n\n <div className={textClasses}>\n {children}\n </div>\n </div>\n );\n};\n\nBadge.displayName = 'Badge';\n\nexport { Badge };\n","import { RatingProps } from './Rating.types';\nimport './Rating.css';\n\n// CSS class prefix to avoid conflicts\nconst cx = (className: string) => `hc-rating-${className}`;\n\n// Full star icon (filled)\nconst StarIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_full)\">\n <path d=\"M12.0004 0.5C12.393 0.5 12.7551 0.723172 12.9339 1.07325L16.1402 7.38333L23.1155 8.49482C23.5037 8.55608 23.8265 8.83176 23.9487 9.20809C24.0708 9.58442 23.9705 9.99576 23.6957 10.2758L18.7008 15.2863L19.8045 22.2834C19.8656 22.6728 19.7042 23.0667 19.3857 23.2986C19.0673 23.5305 18.6441 23.5655 18.2951 23.3861L12.0004 20.1742L5.70561 23.3861C5.35663 23.5655 4.93349 23.5305 4.61504 23.2986C4.29659 23.0667 4.13519 22.6772 4.19626 22.2834L5.29555 15.2863L0.305106 10.2758C0.0259198 9.99576 -0.0700504 9.58442 0.0520935 9.20809C0.174237 8.83176 0.492684 8.55608 0.885289 8.49482L7.86058 7.38333L11.0712 1.07325C11.2501 0.723172 11.6121 0.5 12.0047 0.5H12.0004Z\" fill=\"#FBB041\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_full\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Half star icon\nconst HalfStarIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <defs>\n <clipPath id=\"half\">\n <rect x=\"0\" y=\"0\" width=\"12\" height=\"24\" />\n </clipPath>\n </defs>\n <path\n clipPath=\"url(#half)\"\n d=\"M12.0004 0.5C12.393 0.5 12.7551 0.723172 12.9339 1.07325L16.1402 7.38333L23.1155 8.49482C23.5037 8.55608 23.8265 8.83176 23.9487 9.20809C24.0708 9.58442 23.9705 9.99576 23.6957 10.2758L18.7008 15.2863L19.8045 22.2834C19.8656 22.6728 19.7042 23.0667 19.3857 23.2986C19.0673 23.5305 18.6441 23.5655 18.2951 23.3861L12.0004 20.1742L5.70561 23.3861C5.35663 23.5655 4.93349 23.5305 4.61504 23.2986C4.29659 23.0667 4.13519 22.6772 4.19626 22.2834L5.29555 15.2863L0.305106 10.2758C0.0259198 9.99576 -0.0700504 9.58442 0.0520935 9.20809C0.174237 8.83176 0.492684 8.55608 0.885289 8.49482L7.86058 7.38333L11.0712 1.07325C11.2501 0.723172 11.6121 0.5 12.0047 0.5H12.0004Z\"\n fill=\"#FBB041\"\n />\n <path\n d=\"M12.0004 0.5C12.393 0.5 12.7551 0.723172 12.9339 1.07325L16.1402 7.38333L23.1155 8.49482C23.5037 8.55608 23.8265 8.83176 23.9487 9.20809C24.0708 9.58442 23.9705 9.99576 23.6957 10.2758L18.7008 15.2863L19.8045 22.2834C19.8656 22.6728 19.7042 23.0667 19.3857 23.2986C19.0673 23.5305 18.6441 23.5655 18.2951 23.3861L12.0004 20.1742L5.70561 23.3861C5.35663 23.5655 4.93349 23.5305 4.61504 23.2986C4.29659 23.0667 4.13519 22.6772 4.19626 22.2834L5.29555 15.2863L0.305106 10.2758C0.0259198 9.99576 -0.0700504 9.58442 0.0520935 9.20809C0.174237 8.83176 0.492684 8.55608 0.885289 8.49482L7.86058 7.38333L11.0712 1.07325C11.2501 0.723172 11.6121 0.5 12.0047 0.5H12.0004ZM12.0004 3.86071L9.47898 8.81426C9.3263 9.11182 9.04275 9.32187 8.71122 9.37438L3.23656 10.2496L7.15389 14.1835C7.38945 14.4198 7.49851 14.7568 7.44616 15.0893L6.58243 20.5811L11.5249 18.0606C11.8215 17.9074 12.1749 17.9074 12.4759 18.0606L17.4183 20.5811L16.5546 15.0893C16.5023 14.7568 16.6113 14.4198 16.8469 14.1835L20.7642 10.2496L15.2895 9.37438C14.958 9.32187 14.6745 9.11182 14.5218 8.81426L12.0004 3.86071Z\"\n fill=\"#9A5A00\"\n />\n </svg>\n);\n\n// Empty star icon (outline only)\nconst EmptyStarIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_empty)\">\n <path d=\"M12.0004 0.5C12.393 0.5 12.7551 0.723172 12.9339 1.07325L16.1402 7.38333L23.1155 8.49482C23.5037 8.55608 23.8265 8.83176 23.9487 9.20809C24.0708 9.58442 23.9705 9.99576 23.6957 10.2758L18.7008 15.2863L19.8045 22.2834C19.8656 22.6728 19.7042 23.0667 19.3857 23.2986C19.0673 23.5305 18.6441 23.5655 18.2951 23.3861L12.0004 20.1742L5.70561 23.3861C5.35663 23.5655 4.93349 23.5305 4.61504 23.2986C4.29659 23.0667 4.13519 22.6772 4.19626 22.2834L5.29555 15.2863L0.305106 10.2758C0.0259198 9.99576 -0.0700504 9.58442 0.0520935 9.20809C0.174237 8.83176 0.492684 8.55608 0.885289 8.49482L7.86058 7.38333L11.0712 1.07325C11.2501 0.723172 11.6121 0.5 12.0047 0.5H12.0004ZM12.0004 3.86071L9.47898 8.81426C9.3263 9.11182 9.04275 9.32187 8.71122 9.37438L3.23656 10.2496L7.15389 14.1835C7.38945 14.4198 7.49851 14.7568 7.44616 15.0893L6.58243 20.5811L11.5249 18.0606C11.8215 17.9074 12.1749 17.9074 12.4759 18.0606L17.4183 20.5811L16.5546 15.0893C16.5023 14.7568 16.6113 14.4198 16.8469 14.1835L20.7642 10.2496L15.2895 9.37438C14.958 9.32187 14.6745 9.11182 14.5218 8.81426L12.0004 3.86071Z\" fill=\"#9A5A00\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_empty\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\nconst Rating: React.FC<RatingProps> = ({\n variant = 'stars',\n value,\n maxValue = 5,\n showValue = false,\n name,\n date,\n quote,\n size = 'medium',\n className = ''\n}) => {\n // Ensure value is between 0 and maxValue\n const clampedValue = Math.min(Math.max(0, value), maxValue);\n\n // Calculate full, half, and empty stars\n const fullStars = Math.floor(clampedValue);\n const hasHalfStar = clampedValue % 1 >= 0.5;\n const emptyStars = maxValue - fullStars - (hasHalfStar ? 1 : 0);\n\n const renderStars = () => {\n const starClasses = [\n cx('star'),\n cx(`star--${size}`)\n ].filter(Boolean).join(' ');\n\n const stars = [];\n\n // Full stars\n for (let i = 0; i < fullStars; i++) {\n stars.push(\n <span key={`full-${i}`} className={starClasses}>\n <StarIcon />\n </span>\n );\n }\n\n // Half star\n if (hasHalfStar) {\n stars.push(\n <span key=\"half\" className={starClasses}>\n <HalfStarIcon />\n </span>\n );\n }\n\n // Empty stars\n for (let i = 0; i < emptyStars; i++) {\n stars.push(\n <span key={`empty-${i}`} className={starClasses}>\n <EmptyStarIcon />\n </span>\n );\n }\n\n return stars;\n };\n\n // Stars only variant\n if (variant === 'stars') {\n const containerClasses = [cx('starsContainer'), className].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n <div className={cx('starContainer')}>\n {renderStars()}\n </div>\n {showValue && (\n <span className={cx('valueDisplay')}>\n {clampedValue.toLocaleString('de-CH')}\n </span>\n )}\n </div>\n );\n }\n\n // Result variant - single character display\n if (variant === 'result') {\n const containerClasses = [cx('resultContainer'), className].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n <span className={cx('resultChar')}>N</span>\n <div>\n {renderStars()}\n </div>\n </div>\n );\n }\n\n // Block variant - full review block\n const containerClasses = [cx('blockContainer'), className].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n <div className={cx('blockHeader')}>\n <div className={cx('blockHeaderLeft')}>\n {name && <span className={cx('blockName')}>{name}</span>}\n <div>\n {renderStars()}\n </div>\n </div>\n {date && <span className={cx('blockDate')}>{date}</span>}\n </div>\n {quote && <p className={cx('blockQuote')}>{quote}</p>}\n </div>\n );\n};\n\nRating.displayName = 'Rating';\n\nexport { Rating };\n","import { DividerProps } from './Divider.types';\nimport './Divider.css';\n\n// CSS class prefix\nconst cx = (className: string) => `hc-divider-${className}`;\n\nconst Divider: React.FC<DividerProps> = ({\n label,\n orientation = 'horizontal',\n className = ''\n}) => {\n const isHorizontal = orientation === 'horizontal';\n\n if (!label) {\n // Clean variant - just the line\n const lineClass = isHorizontal\n ? cx('lineStandalone--horizontal')\n : cx('lineStandalone--vertical');\n\n return (\n <div\n className={[lineClass, className].filter(Boolean).join(' ')}\n role=\"separator\"\n aria-orientation={orientation}\n />\n );\n }\n\n // Label variant - line with text in the middle\n const containerClass = isHorizontal\n ? cx('container--horizontal')\n : cx('container--vertical');\n\n const lineClass = isHorizontal\n ? cx('line--horizontal')\n : cx('line--vertical');\n\n const containerClasses = [\n cx('container'),\n containerClass,\n className\n ].filter(Boolean).join(' ');\n\n return (\n <div\n className={containerClasses}\n role=\"separator\"\n aria-orientation={orientation}\n aria-label={typeof label === 'string' ? label : undefined}\n >\n <div className={lineClass} />\n <span className={cx('label')}>{label}</span>\n <div className={lineClass} />\n </div>\n );\n};\n\nDivider.displayName = 'Divider';\n\nexport { Divider };\n","import { ChipProps } from './Chip.types';\nimport './Chip.css';\n\n// CSS class prefix\nconst cx = (className: string) => `hc-chip-${className}`;\n\n// Close icon SVG\nconst CloseIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_chip_close)\">\n <path d=\"M12 2.25C14.5859 2.25 17.0658 3.27723 18.8943 5.10571C20.7228 6.93419 21.75 9.41414 21.75 12C21.75 14.5859 20.7228 17.0658 18.8943 18.8943C17.0658 20.7228 14.5859 21.75 12 21.75C9.41414 21.75 6.93419 20.7228 5.10571 18.8943C3.27723 17.0658 2.25 14.5859 2.25 12C2.25 9.41414 3.27723 6.93419 5.10571 5.10571C6.93419 3.27723 9.41414 2.25 12 2.25ZM12 24C15.1826 24 18.2348 22.7357 20.4853 20.4853C22.7357 18.2348 24 15.1826 24 12C24 8.8174 22.7357 5.76516 20.4853 3.51472C18.2348 1.26428 15.1826 0 12 0C8.8174 0 5.76516 1.26428 3.51472 3.51472C1.26428 5.76516 0 8.8174 0 12C0 15.1826 1.26428 18.2348 3.51472 20.4853C5.76516 22.7357 8.8174 24 12 24ZM7.82812 7.82812C7.3875 8.26875 7.3875 8.98125 7.82812 9.41719L10.4062 11.9953L7.82812 14.5734C7.3875 15.0141 7.3875 15.7266 7.82812 16.1625C8.26875 16.5984 8.98125 16.6031 9.41719 16.1625L11.9953 13.5844L14.5734 16.1625C15.0141 16.6031 15.7266 16.6031 16.1625 16.1625C16.5984 15.7219 16.6031 15.0094 16.1625 14.5734L13.5844 11.9953L16.1625 9.41719C16.6031 8.97656 16.6031 8.26406 16.1625 7.82812C15.7219 7.39219 15.0094 7.3875 14.5734 7.82812L11.9953 10.4062L9.41719 7.82812C8.97656 7.3875 8.26406 7.3875 7.82812 7.82812Z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_chip_close\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\nconst Chip: React.FC<ChipProps> = ({\n label,\n count,\n size = 'small',\n state = 'idle',\n removable = true,\n onClick,\n onRemove,\n className = '',\n disabled = false,\n}) => {\n // Determine effective state\n const effectiveState = disabled ? 'disabled' : state;\n\n // Build chip classes\n const chipClasses = [\n cx('chip'),\n cx(`chip--${size}`),\n cx(`chip--${effectiveState}`),\n className,\n ].filter(Boolean).join(' ');\n\n // Build label classes\n const labelClasses = [cx('label'), cx(`label--${size}`)].join(' ');\n\n // Build count badge classes\n const countBadgeClasses = [cx('countBadge'), cx(`countBadge--${size}`)].join(' ');\n\n const handleClick = () => {\n if (disabled) return;\n\n if (removable && onRemove) {\n onRemove();\n } else if (onClick) {\n onClick();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) return;\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (removable && onRemove) {\n onRemove();\n } else if (onClick) {\n onClick();\n }\n }\n };\n\n return (\n <button\n type=\"button\"\n className={chipClasses}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n aria-label={removable ? `Remove filter: ${label}` : label}\n >\n <span className={labelClasses}>{label}</span>\n\n {count !== undefined && <span className={countBadgeClasses}>{count}</span>}\n\n {removable && (\n <span className={cx('closeIcon')} aria-hidden=\"true\">\n <CloseIcon />\n </span>\n )}\n </button>\n );\n};\n\nChip.displayName = 'Chip';\n\nexport { Chip };\n","import { useState } from 'react';\nimport { CheckboxProps } from './Checkbox.types';\nimport './Checkbox.css';\n\n// CSS class prefix\nconst cx = (className: string) => `hc-checkbox-${className}`;\n\nconst Checkbox: React.FC<CheckboxProps> = ({\n label,\n checked,\n defaultChecked = false,\n onChange,\n disabled = false,\n error = false,\n name,\n id,\n className = '',\n size = 'medium',\n}) => {\n const [localChecked, setLocalChecked] = useState(defaultChecked);\n const [isFocused, setIsFocused] = useState(false);\n\n const actualChecked = checked !== undefined ? checked : localChecked;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newChecked = e.target.checked;\n if (checked === undefined) {\n setLocalChecked(newChecked);\n }\n onChange?.(newChecked);\n };\n\n // Build container classes\n const containerClasses = [\n cx('container'),\n disabled && cx('container--disabled'),\n className,\n ].filter(Boolean).join(' ');\n\n // Build checkbox wrapper classes\n const wrapperClasses = [\n cx('wrapper'),\n cx(`wrapper--${size}`),\n ].filter(Boolean).join(' ');\n\n // Build checkbox box classes\n const boxClasses = [\n cx('box'),\n cx(`box--${size}`),\n actualChecked && cx('box--checked'),\n disabled && cx('box--disabled'),\n error && !actualChecked && cx('box--error'),\n isFocused && cx('box--focused'),\n ].filter(Boolean).join(' ');\n\n // Build input classes\n const inputClasses = [\n cx('input'),\n disabled && cx('input--disabled'),\n ].filter(Boolean).join(' ');\n\n // Build checkmark classes\n const checkmarkClasses = [\n cx('checkmark'),\n cx(`checkmark--${size}`),\n actualChecked && cx('checkmark--checked'),\n ].filter(Boolean).join(' ');\n\n // Build label classes\n const labelClasses = [\n cx('label'),\n disabled && cx('label--disabled'),\n error && !disabled && cx('label--error'),\n ].filter(Boolean).join(' ');\n\n return (\n <label className={containerClasses}>\n <div className={wrapperClasses}>\n <div className={boxClasses} />\n <input\n type=\"checkbox\"\n id={id}\n name={name}\n checked={actualChecked}\n onChange={handleChange}\n disabled={disabled}\n className={inputClasses}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n aria-invalid={error}\n />\n <svg\n className={checkmarkClasses}\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M2.5 6L5 8.5L9.5 3.5\"\n stroke=\"var(--content-action-highlight-inverse-idle, #ffffff)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n {label && <span className={labelClasses}>{label}</span>}\n </label>\n );\n};\n\nCheckbox.displayName = 'Checkbox';\n\nexport { Checkbox };\n","import React from 'react';\nimport { RadioButtonProps } from './RadioButton.types';\nimport './RadioButton.css';\n\n// CSS class prefix\nconst cx = (className: string) => `hc-radio-${className}`;\n\nconst RadioButton: React.FC<RadioButtonProps> = ({\n id,\n checked,\n onChange,\n name,\n value,\n disabled = false,\n className = '',\n label,\n autoComplete,\n}) => {\n const handleClick = () => {\n if (!disabled && !checked) {\n onChange(true);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (!disabled && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n if (!checked) {\n onChange(true);\n }\n }\n };\n\n // Build container classes\n const containerClasses = [\n cx('container'),\n disabled && cx('container--disabled'),\n className,\n ].filter(Boolean).join(' ');\n\n // Build outer circle classes\n const outerCircleClasses = [\n cx('outerCircle'),\n checked && cx('outerCircle--checked'),\n disabled && cx('outerCircle--disabled'),\n ].filter(Boolean).join(' ');\n\n // Build inner dot classes\n const innerDotClasses = [\n cx('innerDot'),\n checked && cx('innerDot--checked'),\n ].filter(Boolean).join(' ');\n\n return (\n <div\n role=\"radio\"\n aria-checked={checked}\n tabIndex={disabled ? -1 : 0}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={containerClasses}\n aria-disabled={disabled}\n >\n {/* Radio button visual wrapper */}\n <div className={cx('wrapper')}>\n {/* Hidden input for form submission */}\n <input\n id={id}\n type=\"radio\"\n name={name}\n value={value}\n checked={checked}\n disabled={disabled}\n autoComplete={autoComplete}\n onChange={() => {}} // Controlled by parent onClick\n className={cx('hiddenInput')}\n />\n\n {/* Outer circle */}\n <div className={outerCircleClasses} />\n\n {/* Inner dot - only visible when checked */}\n <div className={innerDotClasses} />\n </div>\n\n {label && (\n <label htmlFor={id} className={cx('label')}>\n {label}\n </label>\n )}\n </div>\n );\n};\n\nRadioButton.displayName = 'RadioButton';\n\nexport { RadioButton };\n","import { SectionHeaderProps } from './SectionHeader.types';\nimport './SectionHeader.css';\n\n// CSS class prefix\nconst cx = (className: string) => `hc-section-${className}`;\n\n// Chevron right icon\nconst ChevronRightIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n);\n\nconst SectionHeader: React.FC<SectionHeaderProps> = ({\n title,\n showAllLabel,\n onShowAllClick,\n className = '',\n}) => {\n const headerClasses = [cx('header'), className].filter(Boolean).join(' ');\n\n return (\n <div className={headerClasses}>\n <h2 className={cx('title')}>{title}</h2>\n {showAllLabel && onShowAllClick && (\n <button className={cx('showAllButton')} onClick={onShowAllClick}>\n <span>{showAllLabel}</span>\n <ChevronRightIcon />\n </button>\n )}\n </div>\n );\n};\n\nSectionHeader.displayName = 'SectionHeader';\n\nexport { SectionHeader };\n","import React, { useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { ModalProps } from './Modal.types';\nimport './Modal.css';\n\n// CSS class prefix\nconst cx = (className: string) => `hc-modal-${className}`;\n\n// Close icon SVG\nconst CloseIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\">\n <path\n d=\"M0.330469 1.91953C-0.110156 1.47891 -0.110156 0.766406 0.330469 0.330469C0.771094 -0.105469 1.48359 -0.110156 1.91953 0.330469L8.99766 7.40859L16.0758 0.330469C16.5164 -0.110156 17.2289 -0.110156 17.6648 0.330469C18.1008 0.771094 18.1055 1.48359 17.6648 1.91953L10.5867 8.99766L17.6648 16.0758C18.1055 16.5164 18.1055 17.2289 17.6648 17.6648C17.2242 18.1008 16.5117 18.1055 16.0758 17.6648L8.99766 10.5867L1.91953 17.6648C1.47891 18.1055 0.766406 18.1055 0.330469 17.6648C-0.105469 17.2242 -0.110156 16.5117 0.330469 16.0758L7.40859 8.99766L0.330469 1.91953Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nconst Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n children,\n width = 'var(--grid-tablet-device-width, 600px)',\n className = '',\n showCloseButton = true,\n disableBackdropClick = false,\n}) => {\n const modalRef = useRef<HTMLDivElement>(null);\n\n // Handle escape key\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.body.style.overflow = '';\n };\n }, [isOpen, onClose]);\n\n // Handle click outside\n const handleBackdropClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget && !disableBackdropClick) {\n onClose();\n }\n };\n\n if (!isOpen) return null;\n\n const modalClasses = [cx('content'), className].filter(Boolean).join(' ');\n\n const modalContent = (\n <div className={cx('backdrop')} onClick={handleBackdropClick}>\n <div\n ref={modalRef}\n className={modalClasses}\n style={{ maxWidth: width }}\n >\n {showCloseButton && (\n <button\n className={cx('closeButton')}\n onClick={onClose}\n aria-label=\"Close modal\"\n >\n <CloseIcon />\n </button>\n )}\n {children}\n </div>\n </div>\n );\n\n // Check if we're in a browser environment\n if (typeof document !== 'undefined') {\n return createPortal(modalContent, document.body);\n }\n\n return modalContent;\n};\n\nModal.displayName = 'Modal';\n\nexport { Modal };\n","import React from 'react';\nimport { CardProps } from './Card.types';\nimport { Badge } from '../Badge';\nimport './Card.css';\n\n// CSS class prefix\nconst cx = (className: string) => `hc-card-${className}`;\n\n// Star icon - 9x9\nconst StarIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\">\n <g clipPath=\"url(#clip0_card_star)\">\n <path\n d=\"M4.80018 0.366577C4.93104 0.366577 5.05173 0.440968 5.11135 0.557659L6.18011 2.66102L8.50521 3.03152C8.63462 3.05194 8.74222 3.14383 8.78294 3.26927C8.82365 3.39472 8.79021 3.53183 8.6986 3.62518L7.03366 5.29533L7.40155 7.6277C7.42191 7.75752 7.3681 7.88879 7.26195 7.9661C7.15581 8.04341 7.01476 8.05508 6.89843 7.99528L4.80018 6.92463L2.70192 7.99528C2.58559 8.05508 2.44454 8.04341 2.33839 7.9661C2.23225 7.88879 2.17844 7.75898 2.1988 7.6277L2.56523 5.29533L0.901751 3.62518C0.808689 3.53183 0.776699 3.39472 0.817413 3.26927C0.858128 3.14383 0.964277 3.05194 1.09515 3.03152L3.42024 2.66102L4.49045 0.557659C4.55007 0.440968 4.67076 0.366577 4.80163 0.366577H4.80018Z\"\n fill=\"#1F2937\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_card_star\">\n <rect width=\"8\" height=\"8\" fill=\"white\" transform=\"translate(0.800049 0.199951)\" />\n </clipPath>\n </defs>\n </svg>\n);\n\n// Comment bubble icon for rating info\nconst CommentIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 36 38\" fill=\"#478EFA\" className={cx('ratingSvg')}>\n <path d=\"M4 0C1.79086 0 0 1.79086 0 4V32V38L9 32H32C34.2091 32 36 30.2091 36 28V0H4Z\" />\n </svg>\n);\n\n// Default placeholder image\nconst PLACEHOLDER =\n 'data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"100\" fill=\"%23e5e7eb\"%3E%3Crect width=\"100\" height=\"100\" /%3E%3C/svg%3E';\n\n// Helper to repeat elements\nconst repeat = (n: number, renderFn: (i: number) => React.ReactNode) =>\n Array.from({ length: n }, (_, i) => renderFn(i));\n\nconst Card: React.FC<CardProps> = ({\n image,\n imageAlt = '',\n label,\n price,\n stars,\n isSuperior = false,\n badge,\n onClick,\n className = '',\n variant = 'mobile',\n hasRating,\n withPadding = false,\n withHeight = false,\n ratingInfo,\n context,\n swissLodgeLabel = 'Swiss Lodge',\n}) => {\n const isDesktop = variant === 'desktop';\n\n // Build dynamic class names\n const containerClasses = [\n cx('card'),\n cx(`card--${variant}`),\n onClick && cx('card--clickable'),\n withPadding && cx('card--withPadding'),\n withHeight && cx('card--withHeight'),\n className,\n ].filter(Boolean).join(' ');\n\n const starsRowClasses = [\n cx('starsRow'),\n context === 'hotel-deals' && cx('starsRow--fixed'),\n ].filter(Boolean).join(' ');\n\n const labelClasses = [\n cx('label'),\n isDesktop ? cx('label--desktop') : cx('label--mobile'),\n context === 'hotel-deals' && cx('label--hotelDeals'),\n !isDesktop && context !== 'hotel-deals' && cx('label--mobileOverflow'),\n !hasRating && cx('label--noRating'),\n ].filter(Boolean).join(' ');\n\n const priceClasses = [\n cx('price'),\n context === 'hotel-deals' && hasRating && cx('price--hotelDealsWithRating'),\n context === 'hotel-deals' && !hasRating && cx('price--hotelDealsNoRating'),\n context !== 'hotel-deals' && !hasRating && cx('price--noRating'),\n context !== 'hotel-deals' && hasRating && cx('price--regularWithRating'),\n ].filter(Boolean).join(' ');\n\n const displayImage = image || PLACEHOLDER;\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (onClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick();\n }\n };\n\n // Render rating info section\n const renderRatingInfo = () => {\n if (!ratingInfo) return null;\n return (\n <span className={cx('ratingInfo')}>\n <CommentIcon />\n <span className={cx('ratingLabel')}>{ratingInfo.label}</span>\n <span className={cx('ratingValue')}>{ratingInfo.value}</span>\n </span>\n );\n };\n\n return (\n <div\n className={containerClasses}\n onClick={onClick}\n onKeyDown={handleKeyDown}\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n <div className={cx('imageContainer')}>\n <img\n src={displayImage}\n alt={imageAlt}\n className={cx('image')}\n loading=\"lazy\"\n />\n <div className={cx('shadowOverlay')} />\n {badge && (\n <div className={cx('badgeWrapper')}>\n <Badge\n color={badge.variant || 'primary'}\n size={isDesktop ? 'large' : 'small'}\n >\n {badge.text}\n </Badge>\n </div>\n )}\n </div>\n\n <div className={cx('textContainer')}>\n {/* Stars row */}\n <div className={starsRowClasses}>\n {stars !== undefined && stars > 0 ? (\n <>\n {/* Swiss Lodge (rating = 6) */}\n {stars === 6 ? (\n <span className={cx('swissLodge')}>{swissLodgeLabel}</span>\n ) : (\n <>\n {isDesktop ? (\n <>\n <div className={cx('starsContainer')}>\n {repeat(Math.floor(stars), (i) => (\n <StarIcon key={i} />\n ))}\n {isSuperior && (\n <span className={cx('superiorBadge')}>(s)</span>\n )}\n </div>\n <div>{renderRatingInfo()}</div>\n </>\n ) : (\n <>\n <div className={cx('starsContainer')}>\n {repeat(Math.floor(stars), (i) => (\n <StarIcon key={i} />\n ))}\n </div>\n {isSuperior && (\n <span className={cx('superiorBadge')}>(s)</span>\n )}\n {renderRatingInfo()}\n </>\n )}\n </>\n )}\n </>\n ) : (\n <div className={cx('starsPlaceholder')}>&nbsp;</div>\n )}\n </div>\n {label && <div className={labelClasses}>{label}</div>}\n {price && <div className={priceClasses}>{price}</div>}\n </div>\n </div>\n );\n};\n\nCard.displayName = 'Card';\n\nexport { Card };\n","import React, { useState } from 'react';\nimport type { BaseCardProps, BaseCardImageProps, BaseCardContentProps } from './BaseCard.types';\nimport './BaseCard.css';\n\n// Default placeholder for failed images\nconst DEFAULT_PLACEHOLDER = 'data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"400\" height=\"300\" fill=\"%23e5e7eb\"%3E%3Crect width=\"400\" height=\"300\" /%3E%3C/svg%3E';\n\n/**\n * BaseCard - Container component\n *\n * A composable card container that provides consistent styling.\n * Use with BaseCardImage and BaseCardContent for complete cards.\n *\n * @example\n * ```tsx\n * <BaseCard hoverable onClick={handleClick}>\n * <BaseCardImage src={imageUrl} alt=\"Hotel\" topRightSlot={<FavoriteButton />} />\n * <BaseCardContent padding=\"large\">\n * <h3>Hotel Name</h3>\n * <p>Location</p>\n * </BaseCardContent>\n * </BaseCard>\n * ```\n */\nexport const BaseCard: React.FC<BaseCardProps> = ({\n children,\n className = '',\n onClick,\n hoverable = true,\n borderRadius,\n}) => {\n const classNames = [\n 'hc-base-card',\n hoverable && 'hc-base-card--hoverable',\n onClick && 'hc-base-card--clickable',\n className,\n ].filter(Boolean).join(' ');\n\n const style = borderRadius\n ? { '--hc-base-card-radius': typeof borderRadius === 'number' ? `${borderRadius}px` : borderRadius } as React.CSSProperties\n : undefined;\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (onClick && (e.key === 'Enter' || e.key === ' ')) {\n e.preventDefault();\n onClick();\n }\n };\n\n return (\n <div\n className={classNames}\n onClick={onClick}\n onKeyDown={onClick ? handleKeyDown : undefined}\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n style={style}\n >\n {children}\n </div>\n );\n};\n\n/**\n * BaseCardImage - Image container with overlay slots\n *\n * Provides consistent image styling with support for overlays\n * like badges, favorite buttons, and indicators.\n */\nexport const BaseCardImage: React.FC<BaseCardImageProps> = ({\n src,\n alt,\n height,\n aspectRatio,\n topLeftSlot,\n topRightSlot,\n bottomSlot,\n centerSlot,\n showGradient = true,\n onClick,\n style,\n className = '',\n placeholder = DEFAULT_PLACEHOLDER,\n borderRadius,\n}) => {\n const [imageSrc, setImageSrc] = useState(src);\n const [hasError, setHasError] = useState(false);\n\n const handleError = () => {\n if (!hasError) {\n setHasError(true);\n setImageSrc(placeholder);\n }\n };\n\n // Update src when prop changes\n React.useEffect(() => {\n setImageSrc(src);\n setHasError(false);\n }, [src]);\n\n const containerClass = [\n 'hc-base-card__image-container',\n aspectRatio ? 'hc-base-card__image-container--ratio' : 'hc-base-card__image-container--fixed',\n className,\n ].filter(Boolean).join(' ');\n\n const containerStyle: React.CSSProperties = {\n ...style,\n ...(height && { '--hc-base-card-image-height': typeof height === 'number' ? `${height}px` : height }),\n ...(aspectRatio && { '--hc-base-card-aspect-ratio': aspectRatio }),\n ...(borderRadius && { borderRadius }),\n } as React.CSSProperties;\n\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n e.stopPropagation();\n onClick();\n }\n };\n\n // Check if we have both top-left and top-right slots (use row layout)\n const hasTopRow = topLeftSlot && topRightSlot;\n\n return (\n <div\n className={containerClass}\n style={containerStyle}\n onClick={onClick ? handleClick : undefined}\n >\n <img\n src={imageSrc}\n alt={alt}\n className=\"hc-base-card__image\"\n loading=\"lazy\"\n onError={handleError}\n draggable=\"false\"\n />\n\n {showGradient && <div className=\"hc-base-card__image-gradient\" />}\n\n {/* Top row layout when both slots are present */}\n {hasTopRow && (\n <div className=\"hc-base-card__overlay hc-base-card__overlay--top-row\">\n <div>{topLeftSlot}</div>\n <div>{topRightSlot}</div>\n </div>\n )}\n\n {/* Individual slots when only one is present */}\n {!hasTopRow && topLeftSlot && (\n <div className=\"hc-base-card__overlay hc-base-card__overlay--top-left\">\n {topLeftSlot}\n </div>\n )}\n\n {!hasTopRow && topRightSlot && (\n <div className=\"hc-base-card__overlay hc-base-card__overlay--top-right\">\n {topRightSlot}\n </div>\n )}\n\n {centerSlot && (\n <div className=\"hc-base-card__overlay hc-base-card__overlay--center\">\n {centerSlot}\n </div>\n )}\n\n {bottomSlot && (\n <div className=\"hc-base-card__overlay hc-base-card__overlay--bottom\">\n {bottomSlot}\n </div>\n )}\n </div>\n );\n};\n\n/**\n * BaseCardContent - Content container with configurable padding\n *\n * Wraps card content with consistent spacing.\n */\nexport const BaseCardContent: React.FC<BaseCardContentProps> = ({\n children,\n padding = 'large',\n className = '',\n style,\n onClick,\n}) => {\n const classNames = [\n 'hc-base-card__content',\n `hc-base-card__content--padding-${padding}`,\n onClick && 'hc-base-card__content--clickable',\n className,\n ].filter(Boolean).join(' ');\n\n const handleClick = (e: React.MouseEvent) => {\n if (onClick) {\n e.stopPropagation();\n onClick();\n }\n };\n\n return (\n <div\n className={classNames}\n style={style}\n onClick={onClick ? handleClick : undefined}\n >\n {children}\n </div>\n );\n};\n\nBaseCard.displayName = 'BaseCard';\nBaseCardImage.displayName = 'BaseCardImage';\nBaseCardContent.displayName = 'BaseCardContent';\n","import React from 'react';\nimport './BaseCardSkeleton.css';\n\nexport interface BaseCardSkeletonProps {\n /** Content placeholders to render below image */\n children: React.ReactNode;\n /** Image section height (default: 268.5px for mobile) */\n imageHeight?: number | string;\n /** Aspect ratio for image (alternative to fixed height) */\n imageAspectRatio?: string;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * BaseCardSkeleton - Base loading placeholder for card components\n *\n * Provides the shared card shell with image skeleton.\n * Children should be skeleton placeholders for specific content.\n *\n * @example\n * ```tsx\n * <BaseCardSkeleton>\n * <div className=\"skeleton\" style={{ height: 20, width: '60%' }} />\n * <div className=\"skeleton\" style={{ height: 16, width: '40%' }} />\n * </BaseCardSkeleton>\n * ```\n */\nexport const BaseCardSkeleton: React.FC<BaseCardSkeletonProps> = ({\n children,\n imageHeight,\n imageAspectRatio,\n className = '',\n}) => {\n const imageStyle: React.CSSProperties = {};\n\n if (imageAspectRatio) {\n imageStyle.aspectRatio = imageAspectRatio;\n } else if (imageHeight) {\n imageStyle.height = typeof imageHeight === 'number' ? `${imageHeight}px` : imageHeight;\n }\n\n return (\n <div className={`hc-base-card-skeleton ${className}`}>\n <div\n className=\"hc-base-card-skeleton__image hc-skeleton\"\n style={imageStyle}\n />\n <div className=\"hc-base-card-skeleton__content\">\n {children}\n </div>\n </div>\n );\n};\n\nBaseCardSkeleton.displayName = 'BaseCardSkeleton';\n","import React, { useState, useRef, useEffect } from 'react';\nimport { DropdownProps } from './Dropdown.types';\nimport './Dropdown.css';\n\n// CSS class prefix\nconst cx = (className: string) => `hc-dropdown-${className}`;\n\n// Chevron icon\nconst ChevronIcon = () => (\n <svg width=\"12\" height=\"8\" viewBox=\"0 0 12 8\" fill=\"none\">\n <path\n d=\"M1 1L6 6L11 1\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst Dropdown: React.FC<DropdownProps> = ({\n options = [],\n disabled = false,\n error = false,\n defaultValue,\n value,\n onChange,\n className = '',\n name,\n id,\n placeholder = 'Select...',\n}) => {\n const [localValue, setLocalValue] = useState(defaultValue || '');\n const [isOpen, setIsOpen] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const actualValue = value !== undefined ? value : localValue;\n const selectedLabel = options.find((o) => o.value === actualValue)?.label || placeholder;\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const handleSelect = (selectedValue: string) => {\n if (value === undefined) {\n setLocalValue(selectedValue);\n }\n onChange?.(selectedValue);\n setIsOpen(false);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (disabled) return;\n\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n setIsOpen(!isOpen);\n } else if (event.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n // Build container classes\n const containerClasses = [\n cx('container'),\n disabled && cx('container--disabled'),\n className,\n ].filter(Boolean).join(' ');\n\n // Build button classes\n const buttonClasses = [\n cx('button'),\n error && cx('button--error'),\n isFocused && !error && cx('button--focus'),\n disabled && cx('button--disabled'),\n isOpen && cx('button--open'),\n ].filter(Boolean).join(' ');\n\n // Build chevron classes\n const chevronClasses = [\n cx('chevron'),\n isOpen && cx('chevron--open'),\n ].filter(Boolean).join(' ');\n\n // Build dropdown list classes\n const listClasses = [\n cx('list'),\n isOpen && cx('list--open'),\n ].filter(Boolean).join(' ');\n\n return (\n <div ref={dropdownRef} className={containerClasses}>\n <div\n className={buttonClasses}\n tabIndex={disabled ? -1 : 0}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n onKeyDown={handleKeyDown}\n onFocus={() => !disabled && setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-disabled={disabled}\n >\n <span>{selectedLabel}</span>\n <span className={chevronClasses}>\n <ChevronIcon />\n </span>\n </div>\n\n <ul role=\"listbox\" className={listClasses}>\n {options.map((option) => (\n <li\n key={option.value}\n role=\"option\"\n aria-selected={actualValue === option.value}\n onClick={() => handleSelect(option.value)}\n className={`${cx('option')} ${\n actualValue === option.value ? cx('option--selected') : ''\n }`}\n >\n {option.label}\n </li>\n ))}\n </ul>\n\n {/* Hidden native select for form compatibility */}\n <select\n id={id}\n name={name}\n value={actualValue}\n onChange={(e) => handleSelect(e.target.value)}\n disabled={disabled}\n className={cx('hiddenSelect')}\n >\n {!actualValue && <option value=\"\">{placeholder}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n );\n};\n\nDropdown.displayName = 'Dropdown';\n\nexport { Dropdown };\n","import React, { useState, useRef } from 'react';\nimport { InputProps } from './Input.types';\nimport './Input.css';\n\n// CSS class prefix\nconst cx = (className: string) => `hc-input-${className}`;\n\nconst Input: React.FC<InputProps> = ({\n label,\n placeholder = 'Placeholder',\n helper,\n value,\n defaultValue = '',\n onChange,\n onFocus,\n onBlur,\n type = 'text',\n error = false,\n disabled = false,\n leftIcon,\n rightIcon,\n prefix,\n className = '',\n inputClassName = '',\n wrapperClassName = '',\n name,\n id,\n required = false,\n autoComplete,\n autoFocus = false,\n readOnly = false,\n inputProps,\n}) => {\n const [localValue, setLocalValue] = useState(defaultValue);\n const [isFocused, setIsFocused] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const actualValue = value !== undefined ? value : localValue;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n if (value === undefined) {\n setLocalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n const handleFocus = () => {\n setIsFocused(true);\n onFocus?.();\n };\n\n const handleBlur = () => {\n setIsFocused(false);\n onBlur?.();\n };\n\n // Build container classes\n const containerClasses = [cx('container'), className].filter(Boolean).join(' ');\n\n // Build label classes\n const labelClasses = [\n cx('label'),\n (disabled || readOnly) && cx('label--disabled'),\n ].filter(Boolean).join(' ');\n\n // Build wrapper classes\n const wrapperClasses = [\n cx('wrapper'),\n isFocused && cx('wrapper--focus'),\n error && cx('wrapper--error'),\n (disabled || readOnly) && cx('wrapper--disabled'),\n wrapperClassName,\n ].filter(Boolean).join(' ');\n\n // Build input classes\n const inputClasses = [\n cx('input'),\n (disabled || readOnly) && cx('input--disabled'),\n inputClassName,\n ].filter(Boolean).join(' ');\n\n // Build helper classes\n const helperClasses = [\n cx('helper'),\n error && cx('helper--error'),\n (disabled || readOnly) && cx('helper--disabled'),\n ].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n {label && (\n <label htmlFor={id} className={labelClasses}>\n {label}\n </label>\n )}\n\n <div\n className={wrapperClasses}\n onClick={() => !disabled && !readOnly && inputRef.current?.focus()}\n >\n {leftIcon && <div className={cx('icon')}>{leftIcon}</div>}\n\n {prefix && <div className={cx('prefix')}>{prefix}</div>}\n\n <input\n ref={inputRef}\n type={type}\n id={id}\n name={name}\n value={actualValue}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n autoComplete={autoComplete}\n autoFocus={autoFocus}\n readOnly={readOnly}\n className={inputClasses}\n {...inputProps}\n />\n\n {rightIcon && rightIcon}\n </div>\n\n {helper && <div className={helperClasses}>{helper}</div>}\n </div>\n );\n};\n\nInput.displayName = 'Input';\n\nexport { Input };\n","import { ReactNode } from 'react';\nimport './Block.css';\n\nconst cx = (className: string) => `hc-block-${className}`;\n\nexport interface BlockProps {\n /** Type of block to render */\n variant?: 'icon' | 'image';\n /** Icon or image to display */\n visual?: ReactNode;\n /** Label/title text */\n label: string;\n /** Description text (for icon variant) */\n description?: string;\n /** Style variant for icon blocks */\n style?: 'primary' | 'secondary';\n /** Click handler */\n onClick?: () => void;\n /** Whether to show arrow (for image variant) */\n showArrow?: boolean;\n /** Additional CSS class names */\n className?: string;\n}\n\nconst Block: React.FC<BlockProps> = ({\n variant = 'icon',\n visual,\n label,\n description,\n style = 'primary',\n onClick,\n showArrow = true,\n className = ''\n}) => {\n if (variant === 'icon') {\n const containerClasses = [\n cx('icon'),\n onClick && cx('icon--clickable'),\n className\n ].filter(Boolean).join(' ');\n\n const iconContainerClass = style === 'primary'\n ? cx('icon-container--primary')\n : cx('icon-container--secondary');\n\n return (\n <div\n className={containerClasses}\n onClick={onClick}\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n <div className={iconContainerClass}>\n {visual}\n </div>\n <div className={cx('text-container')}>\n <div className={cx('icon-label')}>{label}</div>\n {description && <div className={cx('icon-description')}>{description}</div>}\n </div>\n </div>\n );\n }\n\n // Image Block variant\n const containerClasses = [\n cx('image'),\n onClick && cx('image--clickable'),\n className\n ].filter(Boolean).join(' ');\n\n return (\n <div\n className={containerClasses}\n onClick={onClick}\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n >\n <div className={cx('image-container')}>\n {visual}\n </div>\n <div className={cx('footer')}>\n <span className={cx('image-label')}>{label}</span>\n {showArrow && (\n <span className={cx('arrow')}>→</span>\n )}\n </div>\n </div>\n );\n};\n\nBlock.displayName = 'Block';\n\nexport { Block };\n","import { Rating } from '../Rating';\nimport './ReviewCard.css';\n\nconst cx = (className: string) => `hc-review-${className}`;\n\nexport interface ReviewCardProps {\n /** Reviewer's name */\n name: string;\n /** Review date */\n date: string;\n /** Rating value (1-5) */\n rating: number;\n /** Review text/quote */\n quote: string;\n /** Additional CSS classes */\n className?: string;\n}\n\nconst ReviewCard: React.FC<ReviewCardProps> = ({\n name,\n date,\n rating,\n quote,\n className\n}) => {\n const containerClasses = [cx('container'), className].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n <div className={cx('name')}>{name}</div>\n <div className={cx('frame')}>\n <div className={cx('stars')}>\n <Rating variant=\"stars\" value={rating} size=\"medium\" />\n </div>\n <div className={cx('quote')}>{quote}</div>\n </div>\n <div className={cx('date')}>{date}</div>\n </div>\n );\n};\n\nReviewCard.displayName = 'ReviewCard';\n\nexport { ReviewCard };\n","import { useState } from 'react';\nimport { Button } from '../Button';\nimport './FAQ.css';\n\nconst cx = (className: string) => `hc-faq-${className}`;\n\nexport interface FAQItem {\n question: string;\n answer: string;\n}\n\nexport interface FAQProps {\n items: FAQItem[];\n defaultOpenIndex?: number | null;\n allowMultiple?: boolean;\n className?: string;\n}\n\nconst ChevronIcon = ({ isOpen }: { isOpen: boolean }) => {\n const iconClasses = [\n cx('chevron'),\n isOpen && cx('chevron--open')\n ].filter(Boolean).join(' ');\n\n return (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={iconClasses}\n >\n <path\n d=\"M6 9L12 15L18 9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n};\n\nconst FAQ: React.FC<FAQProps> = ({\n items,\n defaultOpenIndex = null,\n allowMultiple = false,\n className\n}) => {\n const [openIndices, setOpenIndices] = useState<Set<number>>(\n defaultOpenIndex !== null ? new Set([defaultOpenIndex]) : new Set()\n );\n\n const toggleItem = (index: number) => {\n setOpenIndices(prev => {\n const newSet = new Set(prev);\n if (newSet.has(index)) {\n newSet.delete(index);\n } else {\n if (!allowMultiple) {\n newSet.clear();\n }\n newSet.add(index);\n }\n return newSet;\n });\n };\n\n const containerClasses = [cx('container'), className].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n {items.map((item, index) => {\n const isOpen = openIndices.has(index);\n const answerClasses = isOpen\n ? cx('answer--open')\n : cx('answer');\n\n return (\n <div key={index} className={cx('item')}>\n <Button\n variant=\"link\"\n size=\"medium\"\n className={cx('question-btn')}\n onClick={() => toggleItem(index)}\n aria-expanded={isOpen}\n aria-controls={`faq-answer-${index}`}\n rightIcon={\n <div className={cx('icon-container')}>\n <ChevronIcon isOpen={isOpen} />\n </div>\n }\n >\n <span className={cx('question-text')}>{item.question}</span>\n </Button>\n <div id={`faq-answer-${index}`} className={answerClasses}>\n <p className={cx('answer-text')}>{item.answer}</p>\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n\nFAQ.displayName = 'FAQ';\n\nexport { FAQ };\n","import { Button } from '../Button';\nimport './Benefits.css';\n\nconst cx = (className: string) => `hc-benefits-${className}`;\n\nexport interface BenefitItem {\n icon?: string;\n title: string;\n description?: string;\n}\n\nexport interface BenefitsProps {\n title?: string;\n subtitle?: string;\n benefits?: BenefitItem[];\n contactTitle?: string;\n contactDescription?: string;\n contactButtonText?: string;\n onContactClick?: () => void;\n className?: string;\n}\n\nconst Benefits: React.FC<BenefitsProps> = ({\n title = 'Ihre Vorteile mit HotelCard',\n subtitle = 'Mit HotelCard sparen Sie bei jedem Aufenthalt',\n benefits = [\n {\n title: 'Über 500 Hotels',\n description: 'Grosse Auswahl in der ganzen Schweiz'\n },\n {\n title: 'Bis zu 50% Rabatt',\n description: 'Exklusive Mitglieder-Preise'\n },\n {\n title: 'Kein Buchungszwang',\n description: 'Buchen Sie, wann Sie möchten'\n },\n {\n title: 'Kostenlose Stornierung',\n description: 'Flexible Buchungsbedingungen'\n }\n ],\n contactTitle = 'Haben Sie Fragen?',\n contactDescription = 'Unser Kundenservice hilft Ihnen gerne weiter',\n contactButtonText = 'Kontakt aufnehmen',\n onContactClick,\n className\n}) => {\n const sectionClasses = [cx('section'), className].filter(Boolean).join(' ');\n\n return (\n <section className={sectionClasses}>\n <div className={cx('container')}>\n <div className={cx('header')}>\n <h2 className={cx('title')}>{title}</h2>\n {subtitle && <p className={cx('subtitle')}>{subtitle}</p>}\n </div>\n\n <div className={cx('grid')}>\n {benefits.map((benefit, index) => (\n <div key={index} className={cx('item')}>\n <h3 className={cx('item-title')}>{benefit.title}</h3>\n {benefit.description && (\n <p className={cx('item-description')}>{benefit.description}</p>\n )}\n </div>\n ))}\n </div>\n\n {contactTitle && (\n <div className={cx('contact-card')}>\n <h3 className={cx('contact-title')}>{contactTitle}</h3>\n {contactDescription && (\n <p className={cx('contact-description')}>{contactDescription}</p>\n )}\n {contactButtonText && (\n <Button\n variant=\"secondary\"\n size=\"medium\"\n onClick={onContactClick}\n className={cx('contact-btn')}\n >\n {contactButtonText}\n </Button>\n )}\n </div>\n )}\n </div>\n </section>\n );\n};\n\nBenefits.displayName = 'Benefits';\n\nexport { Benefits };\n","import React, { forwardRef } from 'react';\nimport './Pin.css';\n\nconst cx = (className: string) => `hc-pin-${className}`;\n\nexport interface PinProps {\n /** Pin variant - 'price' shows currency/price, 'hotel' shows house icon */\n variant?: 'price' | 'hotel';\n /** Whether the hotel has been viewed (secondary style) */\n viewed?: boolean;\n /** Currency code to display */\n currency?: string;\n /** Price to display */\n price?: number | string;\n /** Whether to show the favorite (heart) icon */\n showFavorite?: boolean;\n /** Whether the pin is disabled */\n disabled?: boolean;\n /** Click handler */\n onClick?: () => void;\n /** Additional class name */\n className?: string;\n}\n\n// Heart filled icon for favorites\nconst HeartIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M8 14.2333L6.96667 13.2933C3.6 10.24 1.33333 8.18667 1.33333 5.66667C1.33333 3.61333 2.94667 2 5 2C6.16 2 7.27333 2.54 8 3.39333C8.72667 2.54 9.84 2 11 2C13.0533 2 14.6667 3.61333 14.6667 5.66667C14.6667 8.18667 12.4 10.24 9.03333 13.2933L8 14.2333Z\" />\n </svg>\n);\n\n// Home/Hotel icon for hotel variant\nconst HomeIcon: React.FC<{ className?: string }> = ({ className }) => (\n <svg\n className={className}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M6.66667 13.3333V9.33333H9.33333V13.3333H12.6667V8H14.6667L8 2L1.33333 8H3.33333V13.3333H6.66667Z\" />\n </svg>\n);\n\n/**\n * Pin Component\n *\n * Map marker pin with price or hotel icon variants.\n * Used for displaying hotel markers on maps.\n *\n * @example\n * // Price pin (default)\n * <Pin price={150} currency=\"CHF\" showFavorite />\n *\n * // Viewed price pin (secondary style)\n * <Pin price={150} viewed showFavorite />\n *\n * // Hotel pin (for clusters)\n * <Pin variant=\"hotel\" />\n */\nconst Pin = forwardRef<HTMLButtonElement, PinProps>(\n (\n {\n variant = 'price',\n viewed = false,\n currency = 'CHF',\n price = 0,\n showFavorite = false,\n disabled = false,\n onClick,\n className = '',\n },\n ref\n ) => {\n // Determine style variant based on viewed state\n const styleVariant = viewed ? 'secondary' : 'primary';\n\n // Build class names\n const pinClasses = [\n cx('pin'),\n cx(styleVariant),\n variant === 'hotel' && cx('hotel'),\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // Format price for display\n const formattedPrice =\n typeof price === 'number' ? Math.round(price).toString() : price;\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={pinClasses}\n disabled={disabled}\n onClick={onClick}\n >\n {/* Main body pill */}\n <div className={cx('body')}>\n {variant === 'price' ? (\n <>\n <span className={cx('currency')}>{currency}</span>\n <span className={cx('price')}>{formattedPrice}</span>\n {showFavorite && (\n <div className={cx('favorite-container')}>\n <HeartIcon className={cx('favorite-icon')} />\n </div>\n )}\n </>\n ) : (\n <HomeIcon className={cx('hotel-icon')} />\n )}\n </div>\n\n {/* Pointer arrow at bottom */}\n <div className={cx('pointer')}>\n <div className={cx('pointer-inner')} />\n </div>\n </button>\n );\n }\n);\n\nPin.displayName = 'Pin';\n\nexport { Pin };\n","import React from 'react';\nimport { Button } from '../Button';\nimport './EmptyState.css';\n\nexport interface EmptyStateProps {\n /** Image URL or React node (icon/illustration) */\n image?: string | React.ReactNode;\n /** Main heading */\n title: string;\n /** Description - can include line breaks or be multiple sentences */\n description: string;\n /** Optional action button */\n action?: {\n label: string;\n onClick: () => void;\n variant?: 'primary' | 'secondary';\n };\n /** Additional class name */\n className?: string;\n}\n\n/**\n * EmptyState - Generic empty state component\n *\n * Use for: no bookings, no favourites, no search results, etc.\n */\nexport const EmptyState: React.FC<EmptyStateProps> = ({\n image,\n title,\n description,\n action,\n className,\n}) => {\n return (\n <div className={`hc-empty-state ${className || ''}`}>\n {image && (\n <div className=\"hc-empty-state__icon-wrapper\">\n {typeof image === 'string' ? (\n <img src={image} alt=\"\" aria-hidden=\"true\" />\n ) : (\n image\n )}\n </div>\n )}\n <h2 className=\"hc-empty-state__title\">{title}</h2>\n <p className=\"hc-empty-state__description\">{description}</p>\n {action && (\n <div className=\"hc-empty-state__action\">\n <Button\n variant={action.variant || 'secondary'}\n size=\"medium\"\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n </div>\n )}\n </div>\n );\n};\n\nEmptyState.displayName = 'EmptyState';\n","import { useState, useEffect } from 'react';\n\nexport const useDebounce = <T>(value: T, delay: number): T => {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n};\n","import { useState, useEffect } from 'react';\n\n/**\n * useResponsive - Detect responsive breakpoints\n *\n * Automatically detects screen size and updates when window resizes.\n * Works without HotelCardUIProvider - uses window.innerWidth detection.\n *\n * Breakpoints:\n * - Desktop: >= 1024px\n * - Mobile: < 1024px\n *\n * @example\n * ```tsx\n * const { isDesktop } = useResponsive();\n *\n * return isDesktop ? <DesktopView /> : <MobileView />;\n * ```\n */\nexport const useResponsive = () => {\n const [width, setWidth] = useState<number>(\n typeof window !== 'undefined' ? window.innerWidth : 1024\n );\n\n useEffect(() => {\n const handleResize = () => {\n setWidth(window.innerWidth);\n };\n\n handleResize();\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return {\n isDesktop: width >= 1024,\n };\n};\n","import { useUIContext } from '../context';\n\n/**\n * useWindowData - Get locale and currency from UI context\n *\n * Returns locale and currency from the HotelCardUIProvider context.\n * Defaults: locale='de', currency='CHF'\n *\n * @example\n * ```tsx\n * const { locale, currency } = useWindowData();\n * ```\n */\nexport const useWindowData = () => {\n const { locale, currency } = useUIContext();\n return { locale, currency };\n};\n","import { useTranslation as useI18nTranslation } from 'react-i18next';\n\ntype TranslateFunction = (key: string, optionsOrFallback?: string | Record<string, unknown>, fallback?: string) => string;\n\n/**\n * useTranslation - Wrapper around react-i18next useTranslation\n *\n * Provides translation function for UI components.\n * Consuming apps must have react-i18next configured.\n *\n * Supports multiple call signatures:\n * - t('key') - just the key\n * - t('key', 'fallback') - key with fallback string\n * - t('key', { count: 2 }) - key with options\n * - t('key', { count: 2 }, 'fallback') - key with options and fallback\n *\n * @example\n * ```tsx\n * const { t } = useTranslation();\n * return <span>{t('search:label.dates')}</span>;\n * ```\n */\nexport const useTranslation = (namespace?: string | string[]) => {\n const { t: i18nT, i18n } = useI18nTranslation(namespace);\n\n // Simple wrapper that converts to string and supports fallback\n // Using 'as unknown as string' to work around react-i18next's complex type signature\n const t: TranslateFunction = (key, optionsOrFallback, fallback) => {\n // Handle multiple call signatures:\n // t('key', 'fallback') - second arg is string fallback\n // t('key', { options }) - second arg is options object\n // t('key', { options }, 'fallback') - both options and fallback\n let options: Record<string, unknown> | undefined;\n let actualFallback: string | undefined;\n\n if (typeof optionsOrFallback === 'string') {\n actualFallback = optionsOrFallback;\n } else if (optionsOrFallback) {\n options = optionsOrFallback;\n actualFallback = fallback;\n } else {\n actualFallback = fallback;\n }\n\n const result = (i18nT as (k: string, opts?: object) => unknown)(key, options ?? {});\n const resultStr = String(result);\n\n // If translation returns the key itself, use fallback if provided\n if (resultStr === key && actualFallback !== undefined) {\n return actualFallback;\n }\n return resultStr;\n };\n\n return { t, i18n };\n};\n","import React, { useState } from 'react';\nimport { useResponsive } from '../../hooks';\nimport styles from './DualCalendar.module.css';\n\ninterface DualCalendarProps {\n startDate: string | null;\n endDate: string | null;\n onDateSelect: (date: string) => void;\n minDate?: string;\n locale?: string;\n}\n\nconst DualCalendar: React.FC<DualCalendarProps> = ({\n startDate,\n endDate,\n onDateSelect,\n minDate,\n locale = 'de-CH',\n}) => {\n const { isDesktop } = useResponsive();\n const [currentMonth, setCurrentMonth] = useState(new Date());\n const isStartDate = (dateStr: string) => startDate === dateStr;\n const isEndDate = (dateStr: string) => endDate === dateStr;\n\n const isMidDate = (dateStr: string) => {\n if (!startDate || !endDate) return false;\n return dateStr > startDate && dateStr < endDate;\n };\n const endOfMonth = (date: Date) => new Date(date.getFullYear(), date.getMonth() + 1, 0);\n\n const getDaysInMonth = (date: Date) => {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n };\n\n const getFirstDayOfMonth = (date: Date) => {\n // getDay() returns 0=Sunday, 1=Monday, etc.\n // Calendar starts with Monday, so convert: Monday=0, Tuesday=1, ..., Sunday=6\n const day = new Date(date.getFullYear(), date.getMonth(), 1).getDay();\n return day === 0 ? 6 : day - 1;\n };\n\n const formatMonthYear = (date: Date) => {\n return date.toLocaleDateString(locale, { month: 'long', year: 'numeric' });\n };\n\n // Generate localized weekday names (starting from Monday)\n const getWeekDays = () => {\n const days = [];\n // Start from Monday (Jan 6, 2020 was a Monday)\n const baseDate = new Date(2020, 0, 6);\n for (let i = 0; i < 7; i++) {\n const date = new Date(baseDate);\n date.setDate(baseDate.getDate() + i);\n days.push(date.toLocaleDateString(locale, { weekday: 'short' }).slice(0, 2));\n }\n return days;\n };\n\n const weekDays = getWeekDays();\n\nconst isDateDisabled = (dateStr: string) => {\n const today = new Date();\n const oneYearFromToday = new Date(today.getFullYear() + 1, today.getMonth(), today.getDate());\n\n const dateParts = dateStr.split('-').map(Number); // [YYYY, MM, DD]\n const date = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]);\n\n // Disable if before minDate\n if (minDate) {\n const minParts = minDate.split('-').map(Number);\n const min = new Date(minParts[0], minParts[1] - 1, minParts[2]);\n if (date < min) return true;\n }\n\n // Disable if after one year from today\n if (date > oneYearFromToday) return true;\n\n return false;\n };\n\n\n const generateCalendar = (monthOffset: number) => {\n const date = new Date(currentMonth.getFullYear(), currentMonth.getMonth() + monthOffset, 1);\n const daysInMonth = getDaysInMonth(date);\n const firstDay = getFirstDayOfMonth(date);\n const days = [];\n\n // Add empty cells for days before month starts\n for (let i = 0; i < firstDay; i++) {\n days.push(<div key={`empty-${i}`} className={styles.dayCell} />);\n }\n\n // Add day cells\n for (let day = 1; day <= daysInMonth; day++) {\n const dateStr = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n const disabled = isDateDisabled(dateStr);\n const start = isStartDate(dateStr);\n const end = isEndDate(dateStr);\n const inRange = isMidDate(dateStr);\n\n const dayCellClasses = [\n styles.dayCell,\n styles.dayButton,\n disabled && styles['dayButton--disabled'],\n start && styles['dayButton--start'],\n end && styles['dayButton--end'],\n inRange && styles['dayButton--inRange'],\n ].filter(Boolean).join(' ');\n\n\n days.push(\n <button\n key={day}\n type=\"button\"\n className={dayCellClasses}\n onClick={() => !disabled && onDateSelect(dateStr)}\n disabled={disabled}\n >\n {day}\n </button>\n );\n }\n\n return days;\n };\n\n const handlePrevMonth = () => {\n setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1, 1));\n };\n\n const handleNextMonth = () => {\n setCurrentMonth(new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1, 1));\n };\n\n const prevMonth = new Date(currentMonth.getFullYear(), currentMonth.getMonth() - 1, 1);\n // ✅ New: Enable/disable previous button based on minDate\n const isPrevDisabled = minDate ? endOfMonth(prevMonth) < new Date(minDate) : false;\n const today = new Date();\n const maxMonth = new Date(today.getFullYear() + 1, today.getMonth(), 1);\n\n // Next month date (the month that would be shown if we click Next)\n const nextMonth = new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1, 1);\n\n // Disable Next button if nextMonth exceeds one year from today\n const isNextDisabled = nextMonth >= maxMonth;\n const isNextDisabledMobile = nextMonth > maxMonth;\n\n const PrevArrowIcon = () => {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className={styles.positionAbs}>\n <path d=\"M6.09652 9.36666C5.74908 9.71647 5.74908 10.2821 6.09652 10.6282L11.8223 16.4043C12.1698 16.7541 12.7316 16.7541 13.0754 16.4043C13.4191 16.0545 13.4228 15.4888 13.0754 15.1428L7.97791 9.9993L13.0754 4.85584C13.4228 4.50603 13.4228 3.94038 13.0754 3.59429C12.7279 3.2482 12.1661 3.24448 11.8223 3.59429L6.09652 9.36666Z\" fill=\"#1F2937\"/>\n </svg>\n );\n };\n\n const NextArrowIcon = () => {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" className={styles.positionAbs}>\n <path d=\"M13.9035 9.36666C14.2509 9.71647 14.2509 10.2821 13.9035 10.6282L8.17767 16.4043C7.83023 16.7541 7.2684 16.7541 6.92465 16.4043C6.5809 16.0545 6.5772 15.4888 6.92465 15.1428L12.0221 9.9993L6.92465 4.85584C6.5772 4.50603 6.5772 3.94038 6.92465 3.59429C7.27209 3.2482 7.83392 3.24448 8.17767 3.59429L13.9035 9.37039V9.36666Z\" fill=\"#1F2937\"/>\n </svg>\n );\n };\n\n const containerClasses = [\n styles.container,\n !isDesktop && styles.containerMobile\n ].filter(Boolean).join(' ');\n\n const calendarsContainerClasses = [\n styles.calendarsContainer,\n !isDesktop && styles.calendarsContainerMobile\n ].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n {/* Mobile: Navigation row at top */}\n {!isDesktop && (\n <div className={styles.navigation}>\n <button\n type=\"button\"\n className={[\n styles.navButton,\n styles.prevIconButton,\n isPrevDisabled && styles.navButtonDisabled\n ].filter(Boolean).join(' ')}\n onClick={handlePrevMonth}\n disabled={isPrevDisabled}\n >\n <PrevArrowIcon />\n </button>\n <h3 className={styles.monthTitleMobile}>{formatMonthYear(currentMonth)}</h3>\n <button\n type=\"button\"\n className={[\n styles.navButton, \n styles.nextIconButton, \n isNextDisabledMobile && styles.navButtonDisabled].filter(Boolean).join(' ')\n }\n onClick={handleNextMonth}\n disabled={isNextDisabledMobile}\n >\n <NextArrowIcon />\n </button>\n </div>\n )}\n\n {/* Desktop: Nav arrows on outer edges with calendars in between */}\n {isDesktop ? (\n <div className={styles.desktopLayout}>\n <button\n type=\"button\"\n className={[\n styles.navButton,\n styles.prevIconButton,\n isPrevDisabled && styles.navButtonDisabled\n ].filter(Boolean).join(' ')}\n onClick={handlePrevMonth} \n disabled={isPrevDisabled}\n >\n <PrevArrowIcon />\n </button>\n\n <div className={calendarsContainerClasses}>\n {/* First Calendar */}\n <div className={styles.calendar}>\n <h3 className={styles.monthTitle}>{formatMonthYear(currentMonth)}</h3>\n <div className={styles.weekDaysRow}>\n {weekDays.map((day, index) => (\n <div\n key={day}\n className={`${styles.weekDay} ${index >= 5 ? styles.weekDayWeekend : ''}`}\n >\n {day}\n </div>\n ))}\n </div>\n <div className={styles.daysGrid}>\n {generateCalendar(0)}\n </div>\n </div>\n\n {/* Second Calendar */}\n <div className={styles.calendar}>\n <h3 className={styles.monthTitle}>{formatMonthYear(nextMonth)}</h3>\n <div className={styles.weekDaysRow}>\n {weekDays.map((day, index) => (\n <div\n key={day}\n className={`${styles.weekDay} ${index >= 5 ? styles.weekDayWeekend : ''}`}\n >\n {day}\n </div>\n ))}\n </div>\n <div className={styles.daysGrid}>\n {generateCalendar(1)}\n </div>\n </div>\n </div>\n\n <button\n type=\"button\"\n className={[\n styles.navButton, \n styles.nextIconButton, \n isNextDisabled && styles.navButtonDisabled].filter(Boolean).join(' ')\n }\n onClick={handleNextMonth}\n disabled={isNextDisabled}\n >\n <NextArrowIcon />\n </button>\n </div>\n ) : (\n /* Mobile: Single calendar below navigation */\n <div className={calendarsContainerClasses}>\n <div className={styles.calendar}>\n <div className={styles.weekDaysRow}>\n {weekDays.map((day, index) => (\n <div\n key={day}\n className={`${styles.weekDay} ${index >= 5 ? styles.weekDayWeekend : ''}`}\n >\n {day}\n </div>\n ))}\n </div>\n <div className={styles.daysGrid}>\n {generateCalendar(0)}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default DualCalendar;\n","import React, { useState, useEffect } from 'react';\nimport { useWindowData, useResponsive } from '../../hooks';\nimport { useUIContext } from '../../context/UIContext';\nimport styles from './WhenContent.module.css';\nimport DualCalendar from './DualCalendar';\nimport { Button } from '../Button';\n\n// Map app locale to BCP 47 locale tag for Intl API\nconst getDateLocale = (locale: string): string => {\n const localeMap: Record<string, string> = {\n de: 'de-CH',\n en: 'en-GB',\n fr: 'fr-CH',\n it: 'it-CH',\n };\n return localeMap[locale] || 'de-CH';\n};\n\nexport interface DateRange {\n start: string | null;\n end: string | null;\n}\n\nexport interface WhenContentProps {\n /** Initial date range */\n initialDateRange?: DateRange;\n /** Initial month filter selection */\n initialMonthFilter?: string[] | null;\n /** Called when date range changes */\n onChange?: (dateRange: DateRange | null) => void;\n /** Called when month filter changes */\n onMonthFilterChange?: (months: string[] | null) => void;\n /** Display variant: 'dropdown' for desktop, 'expanded' for mobile modal */\n variant?: 'dropdown' | 'expanded';\n /** Show apply button (desktop dropdown) */\n showApplyButton?: boolean;\n /** Called when apply is clicked */\n onApply?: () => void;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * WhenContent - Shared date/time selection UI\n *\n * Used in:\n * - Desktop search bar (as dropdown below input)\n * - Mobile search modal (as expanded section)\n *\n * Features:\n * - Segmented control (Dates/Flexible tabs)\n * - Calendar view for specific date range selection\n * - Month chips grid for flexible month selection\n * - \"Anytime\" option for no date filter\n */\nexport const WhenContent: React.FC<WhenContentProps> = ({\n initialDateRange = { start: null, end: null },\n initialMonthFilter = null,\n onChange,\n onMonthFilterChange,\n variant = 'dropdown',\n showApplyButton = true,\n onApply,\n className = '',\n}) => {\n const { t } = useUIContext();\n const { locale } = useWindowData();\n const { isDesktop } = useResponsive();\n const dateLocale = getDateLocale(locale);\n\n const [dateRange, setDateRange] = useState<DateRange>(initialDateRange);\n const [mode, setMode] = useState<'anytime' | 'dates'>(\n initialDateRange.start ? 'dates' : 'anytime'\n );\n // Derive selected months from prop - parent is the source of truth\n const selectedMonths = initialMonthFilter || [];\n const isAnytimeSelected = selectedMonths.length === 0;\n\n // Sync date range and mode when parent changes filters\n useEffect(() => {\n if (initialDateRange.start || initialDateRange.end) {\n setDateRange(initialDateRange);\n setMode('dates');\n } else {\n setDateRange(initialDateRange);\n if (initialMonthFilter && initialMonthFilter.length > 0) {\n setMode('anytime');\n }\n }\n }, [initialDateRange, initialMonthFilter]);\n\n // Generate 12 months starting from current month\n const generateMonths = () => {\n const months = [];\n const now = new Date();\n\n for (let i = 0; i < 12; i++) {\n const date = new Date(now.getFullYear(), now.getMonth() + i, 1);\n months.push({\n label: date.toLocaleDateString(dateLocale, { month: 'long' }),\n year: date.getFullYear(),\n value: `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`,\n disabled: false,\n });\n }\n\n return months;\n };\n\n const months = generateMonths();\n\n const handleAnytimeClick = () => {\n setDateRange({ start: null, end: null });\n onChange?.(null);\n onMonthFilterChange?.(null);\n };\n\n const handleMonthToggle = (monthValue: string) => {\n const newSelectedMonths = selectedMonths.includes(monthValue)\n ? selectedMonths.filter((m) => m !== monthValue)\n : [...selectedMonths, monthValue];\n\n setDateRange({ start: null, end: null });\n onChange?.(null);\n\n if (newSelectedMonths.length === 0) {\n onMonthFilterChange?.(null);\n } else {\n onMonthFilterChange?.(newSelectedMonths);\n }\n };\n\n const handleApply = () => {\n if (mode === 'anytime') {\n if (selectedMonths.length === 0) {\n onChange?.(null);\n }\n } else {\n if (dateRange.start && dateRange.end) {\n onChange?.(dateRange);\n }\n }\n onApply?.();\n };\n\n const handleModeSwitch = (newMode: 'anytime' | 'dates') => {\n setMode(newMode);\n if (newMode === 'anytime') {\n setDateRange({ start: null, end: null });\n onChange?.(null);\n onMonthFilterChange?.(null);\n } else {\n onMonthFilterChange?.(null);\n }\n };\n\n const getTodayDate = () => {\n const today = new Date();\n return today.toISOString().split('T')[0];\n };\n\n const getNextDate = (dateString: string): string => {\n const date = new Date(dateString);\n date.setDate(date.getDate() + 1);\n return date.toISOString().split('T')[0];\n };\n\n const handleDateSelect = (date: string) => {\n if (!dateRange.start || (dateRange.start && dateRange.end)) {\n const newRange = { start: date, end: null };\n setDateRange(newRange);\n onChange?.(newRange);\n } else if (date === dateRange.start) {\n const nextDate = getNextDate(date);\n const newRange = { start: dateRange.start, end: nextDate };\n setDateRange(newRange);\n onChange?.(newRange);\n } else if (date > dateRange.start) {\n const newRange = { start: dateRange.start, end: date };\n setDateRange(newRange);\n onChange?.(newRange);\n } else {\n const newRange = { start: date, end: null };\n setDateRange(newRange);\n onChange?.(newRange);\n }\n };\n\n const containerClasses = [\n styles.container,\n variant === 'expanded' ? styles.containerExpanded : styles.containerDropdown,\n className,\n ].filter(Boolean).join(' ');\n\n const monthGridClasses = [\n styles.monthGrid,\n !isDesktop && styles.monthGridMobile,\n ].filter(Boolean).join(' ');\n\n const contentClasses = [\n styles.content,\n mode === 'dates' && styles.contentDatesActive,\n ].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n {/* Section title - only in expanded variant (mobile modal) */}\n {variant === 'expanded' && (\n <h2 className={styles.sectionTitle}>{t('label.when')}</h2>\n )}\n\n {/* Header with tabs and apply button */}\n <div className={styles.header}>\n <div className={styles.tabs}>\n <button\n type=\"button\"\n className={`${styles.tab} ${mode === 'dates' ? styles.tabActive : ''}`}\n onClick={() => handleModeSwitch('dates')}\n >\n {t('label.dates')}\n </button>\n <button\n type=\"button\"\n className={`${styles.tab} ${mode === 'anytime' ? styles.tabActive : ''}`}\n onClick={() => handleModeSwitch('anytime')}\n >\n {t('label.flexible')}\n </button>\n </div>\n {showApplyButton && (\n <div className={styles.applyButtonContainer}>\n <Button variant=\"secondary\" size=\"medium\" onClick={handleApply}>\n {t('date_selector.apply')}\n </Button>\n </div>\n )}\n </div>\n\n {/* Content */}\n <div className={contentClasses}>\n {mode === 'anytime' ? (\n <div className={styles.flexibleContent}>\n <h3 className={styles.contentHeading}>{t('general.when-months')}</h3>\n <div className={monthGridClasses}>\n {/* Anytime button - first option */}\n <button\n type=\"button\"\n className={`${styles.monthButton} ${styles.anytimeButton} ${\n isAnytimeSelected ? styles.monthButtonSelected : ''\n }`}\n onClick={handleAnytimeClick}\n >\n <span className={styles.monthLabel}>{t('label.anytime')}</span>\n </button>\n {/* Month buttons */}\n {months.map((month) => (\n <button\n key={month.value}\n type=\"button\"\n className={`${styles.monthButton} ${\n selectedMonths.includes(month.value) ? styles.monthButtonSelected : ''\n } ${month.disabled ? styles.monthButtonDisabled : ''}`}\n onClick={() => !month.disabled && handleMonthToggle(month.value)}\n disabled={month.disabled}\n >\n <span className={styles.monthLabel}>{month.label}</span>\n <span className={styles.monthYear}>{month.year}</span>\n </button>\n ))}\n </div>\n </div>\n ) : (\n <div className={styles.datesContent}>\n <DualCalendar\n startDate={dateRange.start}\n endDate={dateRange.end}\n locale={dateLocale}\n onDateSelect={handleDateSelect}\n minDate={getTodayDate()}\n />\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default WhenContent;\n","import React, { useState, useRef, useEffect, useMemo } from 'react';\nimport { useWindowData, useResponsive } from '../../hooks';\nimport { useUIContext } from '../../context/UIContext';\nimport styles from './DateSelector.module.css';\nimport { WhenContent } from './WhenContent';\nimport type { DateRange } from './WhenContent';\n\n// Map app locale to BCP 47 locale tag for Intl API\nconst getDateLocale = (locale: string): string => {\n const localeMap: Record<string, string> = {\n de: 'de-CH',\n en: 'en-GB',\n fr: 'fr-CH',\n it: 'it-CH',\n };\n return localeMap[locale] || 'de-CH';\n};\n\nexport interface DateSelectorProps {\n initialDateRange?: DateRange;\n initialMonthFilter?: string[] | null;\n onChange?: (dateRange: DateRange | null) => void;\n onMonthFilterChange?: (months: string[] | null) => void;\n /** Called when dropdown closes - receives current values for immediate use */\n onClose?: (dateRange: DateRange | null, monthFilter: string[] | null) => void;\n disabled?: boolean;\n className?: string;\n icon?: React.ReactNode;\n}\n\nconst CalendarIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M19 4H18V2H16V4H8V2H6V4H5C3.9 4 3 4.9 3 6V20C3 21.1 3.9 22 5 22H19C20.1 22 21 21.1 21 20V6C21 4.9 20.1 4 19 4ZM19 20H5V9H19V20Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nconst DateSelector: React.FC<DateSelectorProps> = ({\n initialDateRange = { start: null, end: null },\n initialMonthFilter = null,\n onChange,\n onMonthFilterChange,\n onClose,\n disabled = false,\n className,\n icon,\n}) => {\n const { t } = useUIContext();\n const { locale } = useWindowData();\n const { isDesktop } = useResponsive();\n const dateLocale = getDateLocale(locale);\n const [dateRange, setDateRange] = useState<DateRange>(initialDateRange);\n const [isOpen, setIsOpen] = useState(false);\n const [selectedMonths, setSelectedMonths] = useState<string[]>(initialMonthFilter || []);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Sync internal state when parent changes filters\n useEffect(() => {\n setDateRange((prev) => {\n if (\n prev.start === initialDateRange.start &&\n prev.end === initialDateRange.end\n ) {\n return prev;\n }\n return initialDateRange;\n });\n\n setSelectedMonths((prev) => {\n const next = initialMonthFilter || [];\n if (\n prev.length === next.length &&\n prev.every((m, i) => m === next[i])\n ) {\n return prev;\n }\n return next;\n });\n }, [initialDateRange.start, initialDateRange.end, initialMonthFilter]);\n\n // Close dropdown when clicking outside - auto-apply changes\n useEffect(() => {\n if (!isOpen) return;\n\n const handlePointerDown = (event: PointerEvent) => {\n if (!dropdownRef.current) return;\n\n if (!dropdownRef.current.contains(event.target as Node)) {\n // Apply changes before closing (same as clicking \"Anwenden\")\n const newDateRange = (dateRange.start && dateRange.end) ? dateRange : null;\n const newMonthFilter = selectedMonths.length ? selectedMonths : null;\n\n onChange?.(newDateRange);\n onMonthFilterChange?.(newMonthFilter);\n\n setIsOpen(false);\n // Pass values directly for auto-submit (state might not be updated yet)\n onClose?.(newDateRange, newMonthFilter);\n }\n };\n\n document.addEventListener('pointerdown', handlePointerDown);\n return () => {\n document.removeEventListener('pointerdown', handlePointerDown);\n };\n }, [isOpen, dateRange, selectedMonths, onChange, onMonthFilterChange, onClose]);\n\n\n /* -----------------------------\n Memoized months (performance)\n ------------------------------ */\n const months = useMemo(() => {\n const now = new Date();\n return Array.from({ length: 12 }, (_, i) => {\n const date = new Date(now.getFullYear(), now.getMonth() + i, 1);\n return {\n label: date.toLocaleDateString(dateLocale, { month: 'long' }),\n year: date.getFullYear(),\n value: `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}`,\n };\n });\n }, [dateLocale]);\n\n /* -----------------------------\n Display label\n ------------------------------ */\n const formatDateDisplay = () => {\n if (dateRange.start && dateRange.end) {\n const format = (d: string) =>\n new Date(d).toLocaleDateString(dateLocale, { month: 'short', day: 'numeric' });\n\n return `${format(dateRange.start)} - ${format(dateRange.end)}`;\n }\n\n if (selectedMonths.length === 1) {\n const month = months.find((m) => m.value === selectedMonths[0]);\n return month ? `${month.label} ${month.year}` : t('label.flexible');\n }\n\n if (selectedMonths.length > 1) {\n return `${selectedMonths.length} ${t('label.months')}`;\n }\n\n return t('label.flexible');\n };\n\n /* -----------------------------\n Local-only handlers\n ------------------------------ */\n const handleDateRangeChange = (range: DateRange | null) => {\n setDateRange(range ?? { start: null, end: null });\n };\n\n const handleMonthFilterChange = (months: string[] | null) => {\n setSelectedMonths(months || []);\n };\n\n /* -----------------------------\n Apply (commit to parent)\n ------------------------------ */\n const handleApply = () => {\n if (dateRange.start && dateRange.end) {\n onChange?.(dateRange);\n } else {\n onChange?.(null);\n }\n\n onMonthFilterChange?.(selectedMonths.length ? selectedMonths : null);\n setIsOpen(false);\n };\n\n const buttonClasses = [\n styles.button,\n disabled && styles['button--disabled'],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const dropdownClasses = [\n styles.dropdown,\n isOpen && styles['dropdown--open'],\n !isDesktop && styles.dropdownMobile,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div ref={dropdownRef} className={styles.container}>\n <button\n type=\"button\"\n className={buttonClasses}\n onClick={() => !disabled && setIsOpen((v) => !v)}\n disabled={disabled}\n >\n <span className={styles.icon}>{icon || <CalendarIcon />}</span>\n <span className={styles.label}>{formatDateDisplay()}</span>\n </button>\n\n {/* Backdrop */}\n {isOpen && (\n <div\n className={styles.backdrop}\n onClick={() => {\n // Apply changes before closing (same as clicking \"Anwenden\")\n const newDateRange = (dateRange.start && dateRange.end) ? dateRange : null;\n const newMonthFilter = selectedMonths.length ? selectedMonths : null;\n\n onChange?.(newDateRange);\n onMonthFilterChange?.(newMonthFilter);\n setIsOpen(false);\n onClose?.(newDateRange, newMonthFilter);\n }}\n aria-hidden=\"true\"\n />\n )}\n\n <div className={dropdownClasses}>\n <WhenContent\n initialDateRange={dateRange}\n initialMonthFilter={selectedMonths.length ? selectedMonths : null}\n onChange={handleDateRangeChange}\n onMonthFilterChange={handleMonthFilterChange}\n variant=\"dropdown\"\n showApplyButton\n onApply={handleApply}\n />\n </div>\n </div>\n );\n};\n\nexport default DateSelector;\n","import React from 'react';\nimport { useUIContext } from '../../context';\nimport './GuestContent.css';\n\n// Icons\nconst MinusIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M0 10C0 9.48047 0.477679 9.0625 1.07143 9.0625H18.9286C19.5223 9.0625 20 9.48047 20 10C20 10.5195 19.5223 10.9375 18.9286 10.9375H1.07143C0.477679 10.9375 0 10.5195 0 10Z\" fill=\"currentColor\"/>\n </svg>\n);\n\nconst PlusIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M11.0714 2.1875C11.0714 1.66797 10.5938 1.25 10 1.25C9.40625 1.25 8.92857 1.66797 8.92857 2.1875V9.0625H1.07143C0.477679 9.0625 0 9.48047 0 10C0 10.5195 0.477679 10.9375 1.07143 10.9375H8.92857V17.8125C8.92857 18.332 9.40625 18.75 10 18.75C10.5938 18.75 11.0714 18.332 11.0714 17.8125V10.9375H18.9286C19.5223 10.9375 20 10.5195 20 10C20 9.48047 19.5223 9.0625 18.9286 9.0625H11.0714V2.1875Z\" fill=\"currentColor\"/>\n </svg>\n);\n\nconst DropdownIcon = () => (\n <svg\n className=\"hc-guest-content__select-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n d=\"M11.24 16.6873C11.6598 17.1042 12.3386 17.1042 12.7539 16.6873L19.6852 9.81633C20.1049 9.39939 20.1049 8.7252 19.6852 8.3127C19.2654 7.9002 18.5866 7.89577 18.1713 8.3127L11.9992 14.4296L5.82701 8.3127C5.40724 7.89577 4.72846 7.89577 4.31316 8.3127C3.89785 8.72964 3.89338 9.40383 4.31316 9.81633L11.2445 16.6873H11.24Z\"\n fill=\"#6B7280\"\n />\n </svg>\n);\n\n/**\n * Guest counts object\n */\nexport interface GuestCounts {\n adults: number;\n children: number;\n childrenAges: Array<number | null>;\n}\n\nexport interface ChildAgeError {\n index: number;\n message: string;\n}\n\nexport interface GuestContentProps {\n /** Current guest counts */\n guests: GuestCounts;\n /** Called when guests change */\n onChange: (guests: GuestCounts) => void;\n /** Current pet filter value (0 or 1) */\n petFilter?: number;\n /** Called when pet filter changes */\n onPetChange?: (value: number) => void;\n /** Show pet toggle */\n showPetToggle?: boolean;\n /** Additional class name for container */\n className?: string;\n /** Validation errors for child ages */\n childAgeErrors?: ChildAgeError[];\n /** Called when an error is cleared (user selects an age) */\n onErrorClear?: (index: number) => void;\n}\n\n/**\n * GuestContent - Shared guest selection UI\n *\n * Used by both desktop GuestSelector dropdown and mobile SearchModal.\n * Contains adults counter, children counter with age dropdowns, and optional pet toggle.\n * Translations handled internally via UIContext.\n */\nexport const GuestContent: React.FC<GuestContentProps> = ({\n guests,\n onChange,\n petFilter = 0,\n onPetChange,\n showPetToggle = true,\n className = '',\n childAgeErrors = [],\n onErrorClear,\n}) => {\n const { t } = useUIContext();\n\n // Get translations from context\n const labels = {\n adults: t('form.adults', 'Adults'),\n children: t('form.children', 'Children'),\n pet: t('form.pet', 'Pet'),\n ageOfChild: t('form.age-of-child', 'Age of child'),\n age: t('form.age', 'Age'),\n decreaseAdults: 'Decrease adults',\n increaseAdults: 'Increase adults',\n decreaseChildren: 'Decrease children',\n increaseChildren: 'Increase children',\n togglePets: 'Toggle pets',\n };\n\n // Ensure childrenAges is always an array\n const childrenAges = Array.isArray(guests.childrenAges) ? guests.childrenAges : [];\n\n const handleIncrement = (type: 'adults' | 'children') => {\n if (type === 'children' && guests.children >= 6) return;\n if (type === 'adults' && guests.adults >= 10) return;\n\n const newChildrenAges = type === 'children'\n ? [...childrenAges, null]\n : childrenAges;\n\n onChange({\n ...guests,\n [type]: guests[type] + 1,\n childrenAges: newChildrenAges,\n });\n };\n\n const handleDecrement = (type: 'adults' | 'children') => {\n if (type === 'adults' && guests.adults <= 1) return;\n if (type === 'children' && guests.children <= 0) return;\n\n const newChildrenAges = type === 'children'\n ? childrenAges.slice(0, -1)\n : childrenAges;\n\n onChange({\n ...guests,\n [type]: guests[type] - 1,\n childrenAges: newChildrenAges,\n });\n };\n\n const handleAgeChange = (index: number, value: string) => {\n const newChildrenAges = [...childrenAges];\n newChildrenAges[index] = value === '' ? null : parseInt(value, 10);\n onChange({\n ...guests,\n childrenAges: newChildrenAges,\n });\n // Clear error for this index when user selects an age\n onErrorClear?.(index);\n };\n\n const containerClasses = ['hc-guest-content', className].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n {/* Adults Row */}\n <div className=\"hc-guest-content__row\">\n <div className=\"hc-guest-content__label\">\n <span className=\"hc-guest-content__name\">{labels.adults}</span>\n </div>\n <div className=\"hc-guest-content__counter\">\n <button\n type=\"button\"\n className=\"hc-guest-content__counter-button\"\n onClick={() => handleDecrement('adults')}\n disabled={guests.adults <= 1}\n aria-label={labels.decreaseAdults}\n >\n <MinusIcon />\n </button>\n <span className=\"hc-guest-content__counter-value\">{guests.adults}</span>\n <button\n type=\"button\"\n className=\"hc-guest-content__counter-button\"\n onClick={() => handleIncrement('adults')}\n disabled={guests.adults >= 10}\n aria-label={labels.increaseAdults}\n >\n <PlusIcon />\n </button>\n </div>\n </div>\n\n {/* Children Row */}\n <div className=\"hc-guest-content__row hc-guest-content__row--children\">\n <div className=\"hc-guest-content__row-header\">\n <div className=\"hc-guest-content__label\">\n <span className=\"hc-guest-content__name\">{labels.children}</span>\n </div>\n <div className=\"hc-guest-content__counter\">\n <button\n type=\"button\"\n className=\"hc-guest-content__counter-button\"\n onClick={() => handleDecrement('children')}\n disabled={guests.children <= 0}\n aria-label={labels.decreaseChildren}\n >\n <MinusIcon />\n </button>\n <span className=\"hc-guest-content__counter-value\">{guests.children}</span>\n <button\n type=\"button\"\n className=\"hc-guest-content__counter-button\"\n onClick={() => handleIncrement('children')}\n disabled={guests.children >= 6}\n aria-label={labels.increaseChildren}\n >\n <PlusIcon />\n </button>\n </div>\n </div>\n\n {/* Children Age Dropdowns */}\n {guests.children > 0 && (\n <div\n className=\"hc-guest-content__children-dropdowns\"\n style={{\n gridTemplateColumns: guests.children === 1 ? '1fr' : 'repeat(2, 1fr)',\n }}\n >\n {Array.from({ length: guests.children }).map((_, index) => {\n const currentAge = childrenAges[index];\n const hasError = childAgeErrors.some(error => error.index === index);\n const errorMessage = childAgeErrors.find(error => error.index === index)?.message;\n\n return (\n <div key={index} className=\"hc-guest-content__child-dropdown\">\n <label htmlFor={`child-age-${index}`}>\n {labels.ageOfChild}\n </label>\n <div className=\"hc-guest-content__select-wrapper\">\n <select\n id={`child-age-${index}`}\n value={currentAge === null || currentAge === undefined ? '' : currentAge}\n onChange={(e) => handleAgeChange(index, e.target.value)}\n className={`hc-guest-content__select ${hasError ? 'hc-guest-content__select--error' : ''}`}\n aria-invalid={hasError}\n aria-describedby={hasError ? `error-${index}` : undefined}\n >\n <option value=\"\">{labels.age}</option>\n {Array.from({ length: 18 }, (_, age) => (\n <option key={age} value={age}>\n {age}\n </option>\n ))}\n </select>\n <DropdownIcon />\n </div>\n {hasError && (\n <span id={`error-${index}`} className=\"hc-guest-content__error-text\">\n {errorMessage}\n </span>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n\n {/* Pet Toggle */}\n {showPetToggle && (\n <div className=\"hc-guest-content__row\">\n <div className=\"hc-guest-content__label\">\n <span className=\"hc-guest-content__name\">{labels.pet}</span>\n </div>\n <div className=\"hc-guest-content__toggle-wrapper\">\n <label className=\"hc-guest-content__toggle\">\n <input\n type=\"checkbox\"\n checked={petFilter === 1}\n onChange={(e) => onPetChange?.(e.target.checked ? 1 : 0)}\n aria-label={labels.togglePets}\n />\n <span className=\"hc-guest-content__slider\" />\n </label>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport default GuestContent;\n","import React, { useState, useRef, useEffect } from 'react';\nimport { useUIContext } from '../../context/UIContext';\nimport { GuestContent, type GuestCounts, type ChildAgeError } from './GuestContent';\nimport styles from './GuestSelector.module.css';\n\ninterface GuestSelectorProps {\n initialGuests?: GuestCounts;\n initialPetValue?: number;\n onChange?: (guests: GuestCounts) => void;\n onPetChange?: (pet: number) => void;\n /** Called when dropdown closes - receives current values for immediate use */\n onClose?: (guests: GuestCounts, petFilter: number) => void;\n disabled?: boolean;\n className?: string;\n icon?: React.ReactNode;\n childAgeErrors?: ChildAgeError[];\n}\n\n// Default person icon\nconst PersonIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M12 12C14.21 12 16 10.21 16 8C16 5.79 14.21 4 12 4C9.79 4 8 5.79 8 8C8 10.21 9.79 12 12 12ZM12 14C9.33 14 4 15.34 4 18V20H20V18C20 15.34 14.67 14 12 14Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\n/**\n * GuestSelector - Dropdown wrapper for GuestContent\n *\n * Features:\n * - Button trigger showing current guest count\n * - Dropdown with GuestContent\n * - Auto-submit on close (click outside)\n */\nconst GuestSelector: React.FC<GuestSelectorProps> = ({\n initialGuests = { adults: 2, children: 0, childrenAges: [] },\n initialPetValue = 0,\n onChange,\n onPetChange,\n onClose,\n disabled = false,\n className,\n icon,\n childAgeErrors = []\n}) => {\n const { t } = useUIContext();\n const [guests, setGuests] = useState<GuestCounts>(initialGuests);\n const [petFilter, setPetFilter] = useState<number>(initialPetValue);\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const [errors, setErrors] = useState<ChildAgeError[]>([]);\n\n const totalGuests = guests.adults + guests.children;\n\n // Sync internal state when parent resets the guests\n useEffect(() => {\n setGuests(initialGuests);\n }, [initialGuests]);\n\n useEffect(() => {\n if (childAgeErrors.length > 0) {\n setErrors(childAgeErrors);\n setIsOpen(true);\n }\n }, [childAgeErrors]);\n\n // Close dropdown when clicking outside - trigger auto-submit\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n // Pass current values directly for auto-submit (state might not be updated yet)\n onClose?.(guests, petFilter);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen, guests, petFilter, onClose]);\n\n const handleGuestChange = (newGuests: GuestCounts) => {\n setGuests(newGuests);\n onChange?.(newGuests);\n // Clear errors when children count changes\n if (newGuests.children !== guests.children) {\n setErrors([]);\n }\n };\n\n const handlePetChange = (value: number) => {\n setPetFilter(value);\n onPetChange?.(value);\n };\n\n const handleErrorClear = (index: number) => {\n setErrors(prev => prev.filter(error => error.index !== index));\n };\n\n const buttonClasses = [\n styles.button,\n disabled && styles['button--disabled'],\n className\n ].filter(Boolean).join(' ');\n\n const dropdownClasses = [\n styles.dropdown,\n isOpen && styles['dropdown--open']\n ].filter(Boolean).join(' ');\n\n return (\n <div ref={dropdownRef} className={styles.container}>\n <button\n type=\"button\"\n className={buttonClasses}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n >\n <span className={styles.icon}>\n {icon || <PersonIcon />}\n </span>\n <span className={styles.label}>\n {totalGuests} {totalGuests === 1 ? t('form.guest') : t('form.guests')}\n </span>\n </button>\n\n <div className={dropdownClasses}>\n <GuestContent\n guests={guests}\n onChange={handleGuestChange}\n petFilter={petFilter}\n onPetChange={handlePetChange}\n showPetToggle={true}\n childAgeErrors={errors}\n onErrorClear={handleErrorClear}\n />\n </div>\n </div>\n );\n};\n\nexport { GuestSelector };\nexport type { GuestSelectorProps };\n","import React, { useState, useEffect, useRef, useMemo } from 'react';\nimport { useTranslation, useWindowData } from '../../hooks';\nimport styles from './LocationAutocomplete.module.css';\n\n// SVG Icons matching Figma design\n\nconst SearchLocationIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_location)\">\n <path d=\"M9.75 2.25C11.7391 2.25 13.6468 3.04018 15.0533 4.4467C16.4598 5.85322 17.25 7.76088 17.25 9.75C17.25 11.7391 16.4598 13.6468 15.0533 15.0533C13.6468 16.4598 11.7391 17.25 9.75 17.25C7.76088 17.25 5.85322 16.4598 4.4467 15.0533C3.04018 13.6468 2.25 11.7391 2.25 9.75C2.25 7.76088 3.04018 5.85322 4.4467 4.4467C5.85322 3.04018 7.76088 2.25 9.75 2.25ZM9.75 19.5C12.0375 19.5 14.1422 18.7125 15.8016 17.3953L22.0781 23.6719C22.5187 24.1125 23.2312 24.1125 23.6672 23.6719C24.1031 23.2313 24.1078 22.5188 23.6672 22.0828L17.3953 15.8016C18.7125 14.1422 19.5 12.0375 19.5 9.75C19.5 4.36406 15.1359 0 9.75 0C4.36406 0 0 4.36406 0 9.75C0 15.1359 4.36406 19.5 9.75 19.5ZM13.5 8.25C13.5 6.17812 11.8219 4.5 9.75 4.5C7.67812 4.5 6 6.17812 6 8.25C6 10.5375 8.17969 13.4813 9.21562 14.7469C9.49687 15.0891 10.0031 15.0891 10.2797 14.7469C11.3156 13.4813 13.4953 10.5375 13.4953 8.25H13.5ZM8.25 8.25C8.25 7.85218 8.40804 7.47064 8.68934 7.18934C8.97064 6.90804 9.35217 6.75 9.75 6.75C10.1478 6.75 10.5294 6.90804 10.8107 7.18934C11.092 7.47064 11.25 7.85218 11.25 8.25C11.25 8.64782 11.092 9.02936 10.8107 9.31066C10.5294 9.59196 10.1478 9.75 9.75 9.75C9.35217 9.75 8.97064 9.59196 8.68934 9.31066C8.40804 9.02936 8.25 8.64782 8.25 8.25Z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_location\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\nconst ClearIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"16\" viewBox=\"0 0 24 16\" fill=\"none\">\n <path d=\"M8.55417 0C7.84583 0 7.16667 0.279167 6.66667 0.779167L0.391667 7.05833C0.141667 7.30833 0 7.64583 0 8C0 8.35417 0.141667 8.69167 0.391667 8.94167L6.66667 15.2208C7.16667 15.7208 7.84583 16 8.55417 16H21.3333C22.8042 16 24 14.8042 24 13.3333V2.66667C24 1.19583 22.8042 0 21.3333 0H8.55417ZM22 2.66667V13.3333C22 13.7 21.7 14 21.3333 14H8.55417C8.37917 14 8.20833 13.9292 8.08333 13.8042L2.275 8L8.07917 2.19583C8.20417 2.07083 8.375 2 8.55 2H21.3333C21.7 2 22 2.3 22 2.66667ZM11.8375 5.17083C11.4458 5.5625 11.4458 6.19583 11.8375 6.58333L13.25 7.99583L11.8375 9.40833C11.4458 9.8 11.4458 10.4333 11.8375 10.8208C12.2292 11.2083 12.8625 11.2125 13.25 10.8208L14.6625 9.40833L16.075 10.8208C16.4667 11.2125 17.1 11.2125 17.4875 10.8208C17.875 10.4292 17.8792 9.79583 17.4875 9.40833L16.075 7.99583L17.4875 6.58333C17.8792 6.19167 17.8792 5.55833 17.4875 5.17083C17.0958 4.78333 16.4625 4.77917 16.075 5.17083L14.6625 6.58333L13.25 5.17083C12.8583 4.77917 12.225 4.77917 11.8375 5.17083Z\" fill=\"#1F2937\"/>\n </svg>\n);\n\nconst AllDestinationsIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clipPath=\"url(#clip0_1151_67394)\">\n <path d=\"M8.125 1.875C9.7826 1.875 11.3723 2.53348 12.5444 3.70558C13.7165 4.87768 14.375 6.4674 14.375 8.125C14.375 9.7826 13.7165 11.3723 12.5444 12.5444C11.3723 13.7165 9.7826 14.375 8.125 14.375C6.4674 14.375 4.87768 13.7165 3.70558 12.5444C2.53348 11.3723 1.875 9.7826 1.875 8.125C1.875 6.4674 2.53348 4.87768 3.70558 3.70558C4.87768 2.53348 6.4674 1.875 8.125 1.875ZM8.125 16.25C10.0312 16.25 11.7852 15.5937 13.168 14.4961L18.3984 19.7266C18.7656 20.0937 19.3594 20.0937 19.7227 19.7266C20.0859 19.3594 20.0898 18.7656 19.7227 18.4023L14.4961 13.168C15.5937 11.7852 16.25 10.0312 16.25 8.125C16.25 3.63672 12.6133 0 8.125 0C3.63672 0 0 3.63672 0 8.125C0 12.6133 3.63672 16.25 8.125 16.25ZM11.25 6.875C11.25 5.14844 9.85156 3.75 8.125 3.75C6.39844 3.75 5 5.14844 5 6.875C5 8.78125 6.81641 11.2344 7.67969 12.2891C7.91406 12.5742 8.33594 12.5742 8.56641 12.2891C9.42969 11.2344 11.2461 8.78125 11.2461 6.875H11.25ZM6.875 6.875C6.875 6.54348 7.0067 6.22554 7.24112 5.99112C7.47554 5.7567 7.79348 5.625 8.125 5.625C8.45652 5.625 8.77446 5.7567 9.00888 5.99112C9.2433 6.22554 9.375 6.54348 9.375 6.875C9.375 7.20652 9.2433 7.52446 9.00888 7.75888C8.77446 7.9933 8.45652 8.125 8.125 8.125C7.79348 8.125 7.47554 7.9933 7.24112 7.75888C7.0067 7.52446 6.875 7.20652 6.875 6.875Z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1151_67394\">\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\nconst NearMeIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clipPath=\"url(#clip0_nearme_desktop)\">\n <path d=\"M9.0625 2.8125C9.0625 2.56386 9.16127 2.3254 9.33709 2.14959C9.5129 1.97377 9.75136 1.875 10 1.875C10.2486 1.875 10.4871 1.97377 10.6629 2.14959C10.8387 2.3254 10.9375 2.56386 10.9375 2.8125C10.9375 3.06114 10.8387 3.2996 10.6629 3.47541C10.4871 3.65123 10.2486 3.75 10 3.75C9.75136 3.75 9.5129 3.65123 9.33709 3.47541C9.16127 3.2996 9.0625 3.06114 9.0625 2.8125ZM12.8125 2.8125C12.8125 2.06658 12.5162 1.35121 11.9887 0.823762C11.4613 0.296316 10.7459 0 10 0C9.25408 0 8.53871 0.296316 8.01126 0.823762C7.48382 1.35121 7.1875 2.06658 7.1875 2.8125C7.1875 3.55842 7.48382 4.27379 8.01126 4.80124C8.53871 5.32868 9.25408 5.625 10 5.625C10.7459 5.625 11.4613 5.32868 11.9887 4.80124C12.5162 4.27379 12.8125 3.55842 12.8125 2.8125ZM5.625 9.6875V10.7305C5.625 11.3125 5.85547 11.8672 6.26562 12.2773L6.94141 12.9531L7.32812 15.0742C7.51563 16.1133 8.42188 16.8711 9.48047 16.8711H10.5195C11.5781 16.8711 12.4844 16.1133 12.6719 15.0742L13.0586 12.9531L13.7344 12.2773C14.1445 11.8672 14.375 11.3125 14.375 10.7305V9.6875C14.375 7.78906 12.8359 6.25 10.9375 6.25H9.0625C7.16406 6.25 5.625 7.78906 5.625 9.6875ZM9.0625 8.125H10.9375C11.8008 8.125 12.5 8.82422 12.5 9.6875V10.7305C12.5 10.8125 12.4688 10.8945 12.4102 10.9531L11.5234 11.8359C11.3867 11.9688 11.2969 12.1445 11.2656 12.332L10.8281 14.7422C10.8008 14.8906 10.6719 15 10.5195 15H9.48047C9.32812 15 9.19922 14.8906 9.17188 14.7422L8.73438 12.332C8.69922 12.1445 8.60938 11.9727 8.47656 11.8359L7.59375 10.9531C7.53516 10.8945 7.50391 10.8164 7.50391 10.7305V9.6875C7.50391 8.82422 8.20312 8.125 9.06641 8.125H9.0625ZM5.23047 13.457C4.58203 13.5547 3.97266 13.6758 3.42188 13.8203C2.54688 14.0469 1.75781 14.3398 1.16406 14.7305C0.589844 15.1055 0 15.7031 0 16.5664C0 17.4297 0.589844 18.0273 1.16406 18.4023C1.75781 18.7852 2.54688 19.0781 3.42188 19.3047C5.18359 19.7617 7.53516 20 10 20C12.4648 20 14.8164 19.7617 16.5781 19.3047C17.4531 19.0781 18.2422 18.7852 18.8359 18.3945C19.4102 18.0195 20 17.4219 20 16.5586C20 15.6953 19.4102 15.0977 18.8359 14.7227C18.2422 14.3359 17.4492 14.0391 16.5781 13.8125C16.0273 13.6719 15.4219 13.5508 14.7695 13.4492L14.5625 15.3164C15.125 15.4023 15.6445 15.5078 16.1094 15.6289C18.3203 16.1992 18.3203 16.9141 16.1094 17.4844C14.5508 17.8867 12.3672 18.1172 10 18.1172C7.63281 18.1172 5.44922 17.8867 3.89062 17.4844C1.67969 16.9141 1.67969 16.1992 3.89062 15.6289C4.35547 15.5078 4.875 15.4023 5.4375 15.3164L5.23047 13.4492V13.457Z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_nearme_desktop\">\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\nconst HotelIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clipPath=\"url(#clip0_1151_67415)\">\n <path d=\"M0.9375 0C0.417969 0 0 0.417969 0 0.9375C0 1.45703 0.417969 1.875 0.9375 1.875H1.25V18.125H0.9375C0.417969 18.125 0 18.543 0 19.0625C0 19.582 0.417969 20 0.9375 20H19.0625C19.582 20 20 19.582 20 19.0625C20 18.543 19.582 18.125 19.0625 18.125H18.75V1.875H19.0625C19.582 1.875 20 1.45703 20 0.9375C20 0.417969 19.582 0 19.0625 0H0.9375ZM16.875 18.125H11.25V15H13.125C13.4688 15 13.7539 14.7188 13.6992 14.3789C13.4023 12.6055 11.8594 11.25 10 11.25C8.14062 11.25 6.59766 12.6016 6.30078 14.3789C6.24219 14.7188 6.52734 15 6.875 15H8.75V18.125H3.125V1.875H16.875V18.125ZM5.625 3.75C5.28125 3.75 5 4.03125 5 4.375V5.625C5 5.96875 5.28125 6.25 5.625 6.25H6.875C7.21875 6.25 7.5 5.96875 7.5 5.625V4.375C7.5 4.03125 7.21875 3.75 6.875 3.75H5.625ZM8.75 4.375V5.625C8.75 5.96875 9.03125 6.25 9.375 6.25H10.625C10.9688 6.25 11.25 5.96875 11.25 5.625V4.375C11.25 4.03125 10.9688 3.75 10.625 3.75H9.375C9.03125 3.75 8.75 4.03125 8.75 4.375ZM13.125 3.75C12.7812 3.75 12.5 4.03125 12.5 4.375V5.625C12.5 5.96875 12.7812 6.25 13.125 6.25H14.375C14.7188 6.25 15 5.96875 15 5.625V4.375C15 4.03125 14.7188 3.75 14.375 3.75H13.125ZM5 8.125V9.375C5 9.71875 5.28125 10 5.625 10H6.875C7.21875 10 7.5 9.71875 7.5 9.375V8.125C7.5 7.78125 7.21875 7.5 6.875 7.5H5.625C5.28125 7.5 5 7.78125 5 8.125ZM9.375 7.5C9.03125 7.5 8.75 7.78125 8.75 8.125V9.375C8.75 9.71875 9.03125 10 9.375 10H10.625C10.9688 10 11.25 9.71875 11.25 9.375V8.125C11.25 7.78125 10.9688 7.5 10.625 7.5H9.375ZM12.5 8.125V9.375C12.5 9.71875 12.7812 10 13.125 10H14.375C14.7188 10 15 9.71875 15 9.375V8.125C15 7.78125 14.7188 7.5 14.375 7.5H13.125C12.7812 7.5 12.5 7.78125 12.5 8.125Z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1151_67415\">\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\nconst LocationIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 10.8333C11.3807 10.8333 12.5 9.71404 12.5 8.33333C12.5 6.95262 11.3807 5.83333 10 5.83333C8.61929 5.83333 7.5 6.95262 7.5 8.33333C7.5 9.71404 8.61929 10.8333 10 10.8333Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M10 18.3333C10 18.3333 16.6667 13.3333 16.6667 8.33333C16.6667 4.65143 13.6819 1.66667 10 1.66667C6.31811 1.66667 3.33334 4.65143 3.33334 8.33333C3.33334 13.3333 10 18.3333 10 18.3333Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nconst RegionIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7.5 2.5L2.5 5V17.5L7.5 15M7.5 2.5L12.5 5M7.5 2.5V15M12.5 5L17.5 2.5V15L12.5 17.5M12.5 5V17.5M12.5 17.5L7.5 15\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nconst CountryIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"10\" cy=\"10\" r=\"8.25\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <path d=\"M2.5 10H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n <path d=\"M10 1.75C10 1.75 6.25 5 6.25 10C6.25 15 10 18.25 10 18.25\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n <path d=\"M10 1.75C10 1.75 13.75 5 13.75 10C13.75 15 10 18.25 10 18.25\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n);\n\nexport interface LocationSuggestion {\n type: 'hotel' | 'city' | 'region' | 'country';\n name: string;\n id?: number;\n slug?: string;\n city?: string;\n region?: string;\n latitude?: number;\n longitude?: number;\n}\n\nexport interface LocationAutocompleteProps {\n value: string;\n onChange: (value: string) => void;\n onClose: () => void;\n onSelect?: (suggestion: LocationSuggestion) => void;\n onSubmit?: (\n selectedValue: string,\n coordinates?: { lat: number; lng: number } | null,\n regionId?: number | null,\n setQueryValue?: boolean,\n destinationMode?: string\n ) => void;\n /** Function to fetch autocomplete suggestions - provided by consuming app */\n onAutocomplete?: (query: string) => Promise<LocationSuggestion[]>;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n}\n\n/**\n * LocationAutocomplete - Input with autocomplete suggestions\n *\n * Features:\n * - Debounced API calls (300ms)\n * - Keyboard navigation (up/down arrows, enter, escape)\n * - Click outside to close\n * - Shows hotels, cities, and regions grouped by type\n * - Shows \"All destinations\" and \"Nearby\" options when no query\n */\nexport const LocationAutocomplete: React.FC<LocationAutocompleteProps> = ({\n value,\n onChange,\n onClose,\n onSelect,\n onSubmit,\n onAutocomplete,\n placeholder = 'Enter location',\n disabled = false,\n className = '',\n}) => {\n const { t } = useTranslation();\n const { locale } = useWindowData();\n const [suggestions, setSuggestions] = useState<LocationSuggestion[]>([]);\n const [isOpen, setIsOpen] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n const [isLoading, setIsLoading] = useState(false);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const debounceRef = useRef<NodeJS.Timeout>();\n\n const isIconActive = isFocused || value.trim().length > 0;\n\n // Group suggestions by type\n const groupedSuggestions = useMemo(() => {\n const hotels = suggestions.filter(s => s.type === 'hotel');\n const cities = suggestions.filter(s => s.type === 'city');\n const regions = suggestions.filter(s => s.type === 'region');\n const countries = suggestions.filter(s => s.type === 'country');\n return { hotels, cities, regions, countries };\n }, [suggestions]);\n\n // Calculate total items for keyboard navigation\n const allItems = useMemo(() => {\n const quickOptions = [\n { type: 'anywhere' as const, name: t('search:label.anywhere', 'All destinations') },\n { type: 'nearme' as const, name: t('search:label.nearby', 'Near me') },\n ];\n return [\n ...quickOptions,\n ...groupedSuggestions.cities,\n ...groupedSuggestions.regions,\n ...groupedSuggestions.countries,\n ...groupedSuggestions.hotels,\n ];\n }, [groupedSuggestions, t]);\n\n // Fetch suggestions from API\n const fetchSuggestions = async (query: string) => {\n if (query.length < 3 || !onAutocomplete) {\n setSuggestions([]);\n return;\n }\n\n try {\n setIsLoading(true);\n const results = await onAutocomplete(query);\n setSuggestions(results);\n setSelectedIndex(-1);\n } catch (error) {\n console.error('Autocomplete error:', error);\n setSuggestions([]);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Debounced search\n useEffect(() => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n\n debounceRef.current = setTimeout(() => {\n fetchSuggestions(value);\n }, 300);\n\n return () => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n };\n }, [value]);\n\n // Click outside to close\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node) &&\n inputRef.current &&\n !inputRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n setIsOpen(true);\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange('');\n inputRef.current?.focus();\n onClose();\n };\n\n const handleSelect = (suggestion: LocationSuggestion | { type: 'anywhere' | 'nearme'; name: string }) => {\n if (suggestion.type === 'anywhere') {\n onChange('');\n setIsOpen(false);\n setTimeout(() => onSubmit?.('', null, null, false), 0);\n return;\n }\n\n if (suggestion.type === 'nearme') {\n if ('geolocation' in navigator) {\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const coordinates = {\n lat: position.coords.latitude,\n lng: position.coords.longitude,\n };\n onChange(t('search:label.nearby', 'Near me'));\n setIsOpen(false);\n setTimeout(() => onSubmit?.(t('search:label.nearby', 'Near me'), coordinates, null, false), 0);\n },\n () => {\n onChange('');\n setIsOpen(false);\n setTimeout(() => onSubmit?.('', null, null, false), 0);\n },\n { enableHighAccuracy: false, timeout: 10000, maximumAge: 300000 }\n );\n } else {\n onChange('');\n setIsOpen(false);\n setTimeout(() => onSubmit?.('', null, null, false), 0);\n }\n return;\n }\n\n const displayText = suggestion.name;\n const coordinates = getCoordinates(suggestion as LocationSuggestion);\n const regionId = (suggestion.type === 'region') ? (suggestion as LocationSuggestion).id : null;\n\n onChange(displayText);\n setIsOpen(false);\n\n if (onSelect && 'city' in suggestion) {\n onSelect(suggestion as LocationSuggestion);\n }\n\n setTimeout(() => onSubmit?.(displayText, coordinates, regionId, true, suggestion.type), 0);\n };\n\n const getCoordinates = (params: LocationSuggestion) => {\n if (!params?.latitude || !params?.longitude) {\n return null;\n }\n return {\n lat: params.latitude,\n lng: params.longitude,\n };\n };\n\n // Keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isOpen || allItems.length === 0) {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n setIsOpen(true);\n }\n return;\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n setSelectedIndex((prev) => prev < allItems.length - 1 ? prev + 1 : prev);\n break;\n case 'ArrowUp':\n e.preventDefault();\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : -1));\n break;\n case 'Enter':\n e.preventDefault();\n if (selectedIndex >= 0 && selectedIndex < allItems.length) {\n handleSelect(allItems[selectedIndex]);\n }\n break;\n case 'Escape':\n e.preventDefault();\n setIsOpen(false);\n setSelectedIndex(-1);\n break;\n }\n };\n\n const getIcon = (type: string) => {\n switch (type) {\n case 'hotel': return <HotelIcon />;\n case 'city': return <LocationIcon />;\n case 'region': return <RegionIcon />;\n case 'country': return <CountryIcon />;\n case 'anywhere': return <AllDestinationsIcon />;\n case 'nearme': return <NearMeIcon />;\n default: return <AllDestinationsIcon />;\n }\n };\n\n const highlightMatch = (text: string, query: string) => {\n if (!query || query.length < 3) {\n return <span>{text}</span>;\n }\n\n const lowerText = text.toLowerCase();\n const lowerQuery = query.toLowerCase();\n const matchIndex = lowerText.indexOf(lowerQuery);\n\n if (matchIndex === -1) {\n return <span>{text}</span>;\n }\n\n const beforeMatch = text.slice(0, matchIndex);\n const match = text.slice(matchIndex, matchIndex + query.length);\n const afterMatch = text.slice(matchIndex + query.length);\n\n return (\n <span>\n {beforeMatch}\n <span className={styles.suggestionNameBold}>{match}</span>\n {afterMatch}\n </span>\n );\n };\n\n const QUICK_OPTIONS_COUNT = 2;\n const citiesStartIndex = QUICK_OPTIONS_COUNT;\n const regionsStartIndex = citiesStartIndex + groupedSuggestions.cities.length;\n const countriesStartIndex = regionsStartIndex + groupedSuggestions.regions.length;\n const hotelsStartIndex = countriesStartIndex + groupedSuggestions.countries.length;\n\n const hasSearchResults = suggestions.length > 0;\n const showEmptyState = value.length >= 2 && !hasSearchResults && !isLoading;\n\n return (\n <div className={styles.container}>\n <span className={`${styles.iconWrapper} ${isIconActive ? styles.iconWrapperActive : ''}`}>\n <SearchLocationIcon />\n </span>\n\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={() => {\n setIsFocused(true);\n setIsOpen(true);\n }}\n onBlur={() => setIsFocused(false)}\n placeholder={isFocused ? '' : placeholder}\n disabled={disabled}\n className={`${styles.input} ${className}`}\n aria-label=\"Search location\"\n aria-autocomplete=\"list\"\n aria-expanded={isOpen}\n autoComplete=\"off\"\n />\n\n {value.trim().length > 0 && (\n <button\n type=\"button\"\n className={styles.clearButton}\n onClick={handleClear}\n aria-label={t('search:label.clear', 'Clear')}\n >\n <ClearIcon />\n </button>\n )}\n\n {isLoading && (\n <div className={styles.loadingIndicator}>\n <span>...</span>\n </div>\n )}\n\n {isOpen && (\n <div ref={dropdownRef} className={styles.dropdown}>\n {!hasSearchResults && !showEmptyState && (\n <div className={styles.dropdownHeader}>\n {t('search:general.suggested-destinations', 'Suggested destinations')}\n </div>\n )}\n\n {!hasSearchResults && !showEmptyState && (\n <div className={styles.section}>\n <button\n type=\"button\"\n className={`${styles.suggestion} ${selectedIndex === 0 ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelect({ type: 'anywhere', name: t('search:label.anywhere', 'All destinations') })}\n onMouseEnter={() => setSelectedIndex(0)}\n >\n <span className={styles.icon}>{getIcon('anywhere')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {t('search:label.anywhere', 'All destinations')}\n </div>\n </div>\n </button>\n\n <button\n type=\"button\"\n className={`${styles.suggestion} ${selectedIndex === 1 ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelect({ type: 'nearme', name: t('search:label.nearby', 'Near me') })}\n onMouseEnter={() => setSelectedIndex(1)}\n >\n <span className={styles.icon}>{getIcon('nearme')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {t('search:label.nearby', 'Near me')}\n </div>\n </div>\n </button>\n </div>\n )}\n\n {groupedSuggestions.cities.length > 0 && (\n <div className={styles.section}>\n <div className={styles.sectionHeader}>\n {t('search:dropdown.cities', 'Cities')}\n </div>\n <div>\n {groupedSuggestions.cities.map((suggestion, index) => {\n const itemIndex = citiesStartIndex + index;\n return (\n <button\n key={`city-${suggestion.name}-${index}`}\n type=\"button\"\n className={`${styles.suggestion} ${itemIndex === selectedIndex ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelect(suggestion)}\n onMouseEnter={() => setSelectedIndex(itemIndex)}\n >\n <span className={styles.icon}>{getIcon('city')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {highlightMatch(suggestion.name, value)}\n </div>\n {suggestion.region && (\n <div className={styles.suggestionMeta}>{suggestion.region}</div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {groupedSuggestions.regions.length > 0 && (\n <div className={styles.section}>\n <div className={styles.sectionHeader}>\n {t('search:dropdown.regions', 'Regions')}\n </div>\n <div>\n {groupedSuggestions.regions.map((suggestion, index) => {\n const itemIndex = regionsStartIndex + index;\n return (\n <button\n key={`region-${suggestion.name}-${index}`}\n type=\"button\"\n className={`${styles.suggestion} ${itemIndex === selectedIndex ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelect(suggestion)}\n onMouseEnter={() => setSelectedIndex(itemIndex)}\n >\n <span className={styles.icon}>{getIcon('region')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {highlightMatch(suggestion.name, value)}\n </div>\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {groupedSuggestions.countries.length > 0 && (\n <div className={styles.section}>\n <div className={styles.sectionHeader}>\n {t('search:dropdown.countries', 'Countries')}\n </div>\n <div>\n {groupedSuggestions.countries.map((suggestion, index) => {\n const itemIndex = countriesStartIndex + index;\n return (\n <button\n key={`country-${suggestion.name}-${index}`}\n type=\"button\"\n className={`${styles.suggestion} ${itemIndex === selectedIndex ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelect(suggestion)}\n onMouseEnter={() => setSelectedIndex(itemIndex)}\n >\n <span className={styles.icon}>{getIcon('country')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {highlightMatch(suggestion.name, value)}\n </div>\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {groupedSuggestions.hotels.length > 0 && (\n <div className={styles.section}>\n <div className={styles.sectionHeader}>\n {t('search:dropdown.hotels', 'Hotels')}\n </div>\n <div>\n {groupedSuggestions.hotels.map((suggestion, index) => {\n const itemIndex = hotelsStartIndex + index;\n return (\n <button\n key={`hotel-${suggestion.name}-${index}`}\n type=\"button\"\n className={`${styles.suggestion} ${itemIndex === selectedIndex ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelect(suggestion)}\n onMouseEnter={() => setSelectedIndex(itemIndex)}\n >\n <span className={styles.icon}>{getIcon('hotel')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {highlightMatch(suggestion.name, value)}\n </div>\n {suggestion.city && (\n <div className={styles.suggestionMeta}>\n {suggestion.city}\n {suggestion.region && `, ${suggestion.region}`}\n </div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {showEmptyState && (\n <div className={styles.emptyState}>\n {t('search:dropdown.no-results', 'No results found')}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { useUIContext } from '../../context';\nimport { Button } from '../Button';\nimport styles from './MobileSortModal.module.css';\n\n// Close icon\nconst CloseIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M2.77539 4.09961C2.4082 3.73242 2.4082 3.13867 2.77539 2.77539C3.14258 2.41211 3.73633 2.4082 4.09961 2.77539L9.99805 8.67383L15.8965 2.77539C16.2637 2.4082 16.8574 2.4082 17.2207 2.77539C17.584 3.14258 17.5879 3.73633 17.2207 4.09961L11.3223 9.99805L17.2207 15.8965C17.5879 16.2637 17.5879 16.8574 17.2207 17.2207C16.8535 17.584 16.2598 17.5879 15.8965 17.2207L9.99805 11.3223L4.09961 17.2207C3.73242 17.5879 3.13867 17.5879 2.77539 17.2207C2.41211 16.8535 2.4082 16.2598 2.77539 15.8965L8.67383 9.99805L2.77539 4.09961Z\" fill=\"#1F2937\"/>\n </svg>\n);\n\nexport type SortOption = 'relevance' | 'price_asc' | 'price_desc' | 'rating';\n\ninterface SortOptionItem {\n value: SortOption;\n labelKey: string;\n defaultLabel: string;\n}\n\nexport interface MobileSortModalProps {\n isOpen: boolean;\n onClose: () => void;\n value: SortOption;\n onChange: (sort: SortOption) => void;\n}\n\n/**\n * MobileSortModal - Bottom sheet for sort options on mobile\n *\n * Figma: 451:31579\n *\n * Features:\n * - Slides up from bottom with native feel\n * - Dark backdrop overlay\n * - Radio button list for sort options\n */\nexport const MobileSortModal: React.FC<MobileSortModalProps> = ({\n isOpen,\n onClose,\n value,\n onChange,\n}) => {\n const { t } = useUIContext();\n\n const sortOptions: SortOptionItem[] = [\n { value: 'relevance', labelKey: 'filter.relevance', defaultLabel: 'Relevance' },\n { value: 'price_asc', labelKey: 'filter.price-low-high', defaultLabel: 'Price low to high' },\n { value: 'price_desc', labelKey: 'filter.price-high-low', defaultLabel: 'Price high to low' },\n { value: 'rating', labelKey: 'filter.best-rating', defaultLabel: 'Best guest rating' },\n ];\n\n const handleSelect = (option: SortOption) => {\n onChange(option);\n onClose();\n };\n\n // Prevent body scroll when modal is open\n React.useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = '';\n };\n }\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n return (\n <div className={styles.overlay} onClick={onClose}>\n <div\n className={styles.sheet}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className={styles.header}>\n <h2 className={styles.title}>\n {t('subheadline.sort-by', 'Sort by')}\n </h2>\n <Button\n variant=\"secondary\"\n size=\"small\"\n iconOnly\n onClick={onClose}\n aria-label={t('aria.close', 'Close')}\n >\n <CloseIcon />\n </Button>\n </div>\n\n {/* Options list */}\n <div className={styles.optionsList}>\n {sortOptions.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n className={styles.optionItem}\n onClick={() => handleSelect(option.value)}\n role=\"radio\"\n aria-checked={value === option.value}\n >\n <span className={`${styles.radio} ${value === option.value ? styles.radioActive : ''}`}>\n {value === option.value && <span className={styles.radioInner} />}\n </span>\n <span className={styles.optionLabel}>\n {t(option.labelKey, option.defaultLabel)}\n </span>\n </button>\n ))}\n </div>\n </div>\n </div>\n );\n};\n","import React, { useEffect, useState } from 'react';\nimport { useResponsive } from '../../hooks';\nimport { useUIContext } from '../../context/UIContext';\nimport { Button } from '../Button';\nimport { DateSelector, type DateRange } from '../DateSelector';\nimport { LocationAutocomplete, type LocationSuggestion } from '../LocationAutocomplete';\nimport { GuestSelector, type GuestCounts, type ChildAgeError } from '../GuestSelector';\nimport styles from './SearchControlsBar.module.css';\n\n// SVG Icons matching Figma design (24x24, color inherited from CSS)\nconst SearchIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_1029_77629)\">\n <path d=\"M17.25 9.75C17.25 7.76088 16.4598 5.85322 15.0533 4.4467C13.6468 3.04018 11.7391 2.25 9.75 2.25C7.76088 2.25 5.85322 3.04018 4.4467 4.4467C3.04018 5.85322 2.25 7.76088 2.25 9.75C2.25 11.7391 3.04018 13.6468 4.4467 15.0533C5.85322 16.4598 7.76088 17.25 9.75 17.25C11.7391 17.25 13.6468 16.4598 15.0533 15.0533C16.4598 13.6468 17.25 11.7391 17.25 9.75ZM15.8016 17.3953C14.1422 18.7125 12.0375 19.5 9.75 19.5C4.36406 19.5 0 15.1359 0 9.75C0 4.36406 4.36406 0 9.75 0C15.1359 0 19.5 4.36406 19.5 9.75C19.5 12.0375 18.7125 14.1422 17.3953 15.8016L23.6719 22.0781C24.1125 22.5187 24.1125 23.2312 23.6719 23.6672C23.2313 24.1031 22.5188 24.1078 22.0828 23.6672L15.8016 17.3953Z\" fill=\"#4B5563\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1029_77629\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Filter icon (20x20) - matching Figma 667:78131\nconst FilterIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clipPath=\"url(#clip0_1029_77637)\">\n <path d=\"M0.882623 3.33334C0.52601 3.33334 0.202485 3.54724 0.0664579 3.87916C-0.0695696 4.21108 0.00763518 4.59094 0.257632 4.84541L4.7061 9.30788V13.6634C4.7061 13.8994 4.79801 14.1244 4.96345 14.2904L7.90458 17.2408C8.15826 17.4952 8.53693 17.569 8.8678 17.4325C9.19868 17.2961 9.41191 16.9678 9.41191 16.6101V9.30419L13.8604 4.84172C14.1141 4.58725 14.1876 4.20739 14.0516 3.87547C13.9155 3.54355 13.592 3.33334 13.2354 3.33334H0.882623ZM6.21343 8.31212L3.01495 5.10357H11.1067L7.90826 8.31212C7.74282 8.47808 7.65091 8.70305 7.65091 8.93908V14.4748L6.47446 13.2946V8.93908C6.47446 8.70305 6.38255 8.47808 6.21711 8.31212H6.21343ZM17.353 3.33334C16.864 3.33334 16.4706 3.72795 16.4706 4.21845C16.4706 4.70896 16.864 5.10357 17.353 5.10357H19.1177C19.6066 5.10357 20 4.70896 20 4.21845C20 3.72795 19.6066 3.33334 19.1177 3.33334H17.353ZM12.6472 9.52916C12.1582 9.52916 11.7648 9.92378 11.7648 10.4143C11.7648 10.9048 12.1582 11.2994 12.6472 11.2994H19.1177C19.6066 11.2994 20 10.9048 20 10.4143C20 9.92378 19.6066 9.52916 19.1177 9.52916H12.6472ZM12.6472 15.725C12.1582 15.725 11.7648 16.1196 11.7648 16.6101C11.7648 17.1006 12.1582 17.4952 12.6472 17.4952H19.1177C19.6066 17.4952 20 17.1006 20 16.6101C20 16.1196 19.6066 15.725 19.1177 15.725H12.6472Z\" fill=\"#1F2937\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1029_77637\">\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Sort icon (20x20) - up/down arrows\nconst SortIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clipPath=\"url(#clip0_1029_63361)\">\n <path d=\"M8.53479 6.02796C8.87132 6.36448 9.41548 6.36448 9.74842 6.02796C10.0814 5.69144 10.0849 5.14727 9.74842 4.81433L6.02877 1.08752C5.69225 0.750995 5.14808 0.750995 4.81514 1.08752L1.08833 4.81075C0.751807 5.14727 0.751807 5.69144 1.08833 6.02438C1.42485 6.35732 1.96902 6.3609 2.30196 6.02438L4.55738 3.76896V18.3075C4.55738 18.7836 4.94044 19.1667 5.41659 19.1667C5.89273 19.1667 6.27579 18.7836 6.27579 18.3075V3.76896L8.53121 6.02438L8.53479 6.02796ZM17.6997 13.9756L15.4442 16.231V1.69254C15.4442 1.2164 15.0612 0.833336 14.585 0.833336C14.1089 0.833336 13.7258 1.2164 13.7258 1.69254V16.231L11.4704 13.9756C11.1339 13.6391 10.5897 13.6391 10.2568 13.9756C9.92384 14.3121 9.92026 14.8563 10.2568 15.1893L13.98 18.9125C14.3165 19.249 14.8607 19.249 15.1936 18.9125L18.9169 15.1893C19.2534 14.8527 19.2534 14.3086 18.9169 13.9756C18.5804 13.6427 18.0362 13.6391 17.7032 13.9756H17.6997Z\" fill=\"#1F2937\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1029_63361\">\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Map icon (20x20) - folded map\nconst MobileMapIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clipPath=\"url(#clip0_1116_37956)\">\n <path d=\"M20 1.875C20 1.55078 19.832 1.25 19.5586 1.07813C19.2852 0.906252 18.9375 0.890627 18.6484 1.03516L13.7695 3.44141L7.03125 1.14844C6.49609 0.964846 5.91016 1 5.39453 1.23828L0.539063 3.52735C0.210938 3.67969 0 4.01172 0 4.375V18.125C0 18.4453 0.164063 18.7461 0.433594 18.918C0.703125 19.0898 1.04297 19.1094 1.33594 18.9727L6.30859 16.6328L12.9766 18.8555C13.5117 19.0352 14.0898 19 14.6016 18.7578L19.4609 16.4727C19.7891 16.3164 20 15.9883 20 15.625V1.875ZM5.625 3.20703V14.8867L1.875 16.6523V4.97266L5.625 3.20703ZM7.5 15.0547V3.29297L12.5 4.99219V16.7227L7.5 15.0547ZM14.375 5.23438L18.125 3.38281V15.0313L14.375 16.7969V5.23438Z\" fill=\"#1F2937\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1116_37956\">\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Location/search icon for desktop search bar\nconst SearchBarIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_915_3305)\">\n <path d=\"M9.75 2.25C11.7391 2.25 13.6468 3.04018 15.0533 4.4467C16.4598 5.85322 17.25 7.76088 17.25 9.75C17.25 11.7391 16.4598 13.6468 15.0533 15.0533C13.6468 16.4598 11.7391 17.25 9.75 17.25C7.76088 17.25 5.85322 16.4598 4.4467 15.0533C3.04018 13.6468 2.25 11.7391 2.25 9.75C2.25 7.76088 3.04018 5.85322 4.4467 4.4467C5.85322 3.04018 7.76088 2.25 9.75 2.25ZM9.75 19.5C12.0375 19.5 14.1422 18.7125 15.8016 17.3953L22.0781 23.6719C22.5187 24.1125 23.2312 24.1125 23.6672 23.6719C24.1031 23.2313 24.1078 22.5188 23.6672 22.0828L17.3953 15.8016C18.7125 14.1422 19.5 12.0375 19.5 9.75C19.5 4.36406 15.1359 0 9.75 0C4.36406 0 0 4.36406 0 9.75C0 15.1359 4.36406 19.5 9.75 19.5ZM13.5 8.25C13.5 6.17812 11.8219 4.5 9.75 4.5C7.67812 4.5 6 6.17812 6 8.25C6 10.5375 8.17969 13.4813 9.21562 14.7469C9.49687 15.0891 10.0031 15.0891 10.2797 14.7469C11.3156 13.4813 13.4953 10.5375 13.4953 8.25H13.5ZM8.25 8.25C8.25 7.85218 8.40804 7.47064 8.68934 7.18934C8.97064 6.90804 9.35217 6.75 9.75 6.75C10.1478 6.75 10.5294 6.90804 10.8107 7.18934C11.092 7.47064 11.25 7.85218 11.25 8.25C11.25 8.64782 11.092 9.02936 10.8107 9.31066C10.5294 9.59196 10.1478 9.75 9.75 9.75C9.35217 9.75 8.97064 9.59196 8.68934 9.31066C8.40804 9.02936 8.25 8.64782 8.25 8.25Z\" fill=\"#4B5563\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_915_3305\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// List calendar icon (hamburger lines) for desktop view toggle\nconst CalendarIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M6.625 0C7.24844 0 7.75 0.501562 7.75 1.125V3H15.25V1.125C15.25 0.501562 15.7516 0 16.375 0C16.9984 0 17.5 0.501562 17.5 1.125V3H19C20.6547 3 22 4.34531 22 6V19.5C22 21.1547 20.6547 22.5 19 22.5H4C2.34531 22.5 1 21.1547 1 19.5V6C1 4.34531 2.34531 3 4 3H5.5V1.125C5.5 0.501562 6.00156 0 6.625 0ZM19 20.25C19.4125 20.25 19.75 19.9125 19.75 19.5V16.5H15.625V20.25H19ZM19.75 14.25V10.5H15.625V14.25H19.75ZM13.375 14.25V10.5H9.625V14.25H13.375ZM7.375 14.25V10.5H3.25V14.25H7.375ZM3.25 16.5V19.5C3.25 19.9125 3.5875 20.25 4 20.25H7.375V16.5H3.25ZM9.625 16.5V20.25H13.375V16.5H9.625ZM6.625 5.25H4C3.5875 5.25 3.25 5.5875 3.25 6V8.25H19.75V6C19.75 5.5875 19.4125 5.25 19 5.25H6.625Z\" fill=\"#4B5563\"/>\n </svg>\n);\n\n// List Guests icon (hamburger lines) for desktop view toggle\nconst GuestsIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M8.25 6C8.25 5.00544 8.64509 4.05161 9.34835 3.34835C10.0516 2.64509 11.0054 2.25 12 2.25C12.9946 2.25 13.9484 2.64509 14.6517 3.34835C15.3549 4.05161 15.75 5.00544 15.75 6C15.75 6.99456 15.3549 7.94839 14.6517 8.65165C13.9484 9.35491 12.9946 9.75 12 9.75C11.0054 9.75 10.0516 9.35491 9.34835 8.65165C8.64509 7.94839 8.25 6.99456 8.25 6ZM18 6C18 4.4087 17.3679 2.88258 16.2426 1.75736C15.1174 0.632141 13.5913 0 12 0C10.4087 0 8.88258 0.632141 7.75736 1.75736C6.63214 2.88258 6 4.4087 6 6C6 7.5913 6.63214 9.11742 7.75736 10.2426C8.88258 11.3679 10.4087 12 12 12C13.5913 12 15.1174 11.3679 16.2426 10.2426C17.3679 9.11742 18 7.5913 18 6ZM3.75 22.5C3.75 19.1859 6.43594 16.5 9.75 16.5H14.25C17.5641 16.5 20.25 19.1859 20.25 22.5V22.875C20.25 23.4984 20.7516 24 21.375 24C21.9984 24 22.5 23.4984 22.5 22.875V22.5C22.5 17.9438 18.8062 14.25 14.25 14.25H9.75C5.19375 14.25 1.5 17.9438 1.5 22.5V22.875C1.5 23.4984 2.00156 24 2.625 24C3.24844 24 3.75 23.4984 3.75 22.875V22.5Z\" fill=\"#4B5563\"/>\n </svg>\n);\n\n// Clear/X icon for clearing fields (16x16)\nconst ClearIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"16\" viewBox=\"0 0 24 16\" fill=\"none\">\n <path d=\"M8.55417 0C7.84583 0 7.16667 0.279167 6.66667 0.779167L0.391667 7.05833C0.141667 7.30833 0 7.64583 0 8C0 8.35417 0.141667 8.69167 0.391667 8.94167L6.66667 15.2208C7.16667 15.7208 7.84583 16 8.55417 16H21.3333C22.8042 16 24 14.8042 24 13.3333V2.66667C24 1.19583 22.8042 0 21.3333 0H8.55417ZM22 2.66667V13.3333C22 13.7 21.7 14 21.3333 14H8.55417C8.37917 14 8.20833 13.9292 8.08333 13.8042L2.275 8L8.07917 2.19583C8.20417 2.07083 8.375 2 8.55 2H21.3333C21.7 2 22 2.3 22 2.66667ZM11.8375 5.17083C11.4458 5.5625 11.4458 6.19583 11.8375 6.58333L13.25 7.99583L11.8375 9.40833C11.4458 9.8 11.4458 10.4333 11.8375 10.8208C12.2292 11.2083 12.8625 11.2125 13.25 10.8208L14.6625 9.40833L16.075 10.8208C16.4667 11.2125 17.1 11.2125 17.4875 10.8208C17.875 10.4292 17.8792 9.79583 17.4875 9.40833L16.075 7.99583L17.4875 6.58333C17.8792 6.19167 17.8792 5.55833 17.4875 5.17083C17.0958 4.78333 16.4625 4.77917 16.075 5.17083L14.6625 6.58333L13.25 5.17083C12.8583 4.77917 12.225 4.77917 11.8375 5.17083Z\" fill=\"#1F2937\"/>\n </svg>\n);\n\n/**\n * SearchControlsBar - Search controls for location, guests, and dates\n *\n * Figma Specs:\n * - Desktop (667:91963): 3 sections with dividers + Search button + List/Map toggle\n * - Mobile (568:45301): Compact summary box (tappable to open modal)\n */\n\ninterface Coordinates {\n lat: number;\n lng: number;\n}\n\n\nexport type ViewMode = 'list' | 'map';\n\nexport interface SearchControlsBarProps {\n onSearch: (params: SearchParams) => void;\n onGuestChange: (params: GuestCounts) => void;\n onQueryChange?: (query: string) => void;\n onDateRangeChange?: (dateRange: DateRange) => void;\n onMonthFilterChange?: (monthFilter: string[]) => void;\n onDestinationModeChange?: (mode: string) => void;\n onRegionsFilterChange?: (regions: string[]) => void;\n onCoordinatesChange?: (coords: Coordinates) => void;\n /** Called for location autocomplete API calls - inject your API function */\n onAutocomplete?: (query: string) => Promise<LocationSuggestion[]>;\n getGuestsDisplay: () => string;\n getDateDisplay: () => string;\n onMobileClick?: () => void;\n onFilterClick?: () => void;\n onSortClick?: () => void;\n initialQuery?: string;\n initialGuests?: GuestCounts;\n initialPetFilter?: number;\n initialDateRange?: DateRange | null;\n initialMonthFilter?: string[] | null;\n initialDestinationMode?: string;\n initialRegionsFilter?: string[];\n initialCoordinates?: Coordinates | undefined;\n disabled?: boolean;\n viewMode?: ViewMode;\n onViewModeChange?: (mode: ViewMode) => void;\n /** Hide the list/map view toggle (used in fullscreen map view) */\n hideViewToggle?: boolean;\n /** Compact mode - auto width based on content (used in map view header) */\n compact?: boolean;\n}\n\nexport interface SearchParams {\n query: string;\n destinationMode?: string;\n guests: GuestCounts;\n petFilter: number;\n dateRange: DateRange | null;\n monthFilter: string[] | null;\n coordinates?: { lat: number; lng: number } | null; // For \"Near me\" search\n regionsFilter?: string[];\n}\n\nexport const SearchControlsBar: React.FC<SearchControlsBarProps> = ({\n onSearch,\n onGuestChange,\n onQueryChange,\n onDateRangeChange,\n onMonthFilterChange,\n onAutocomplete,\n onDestinationModeChange,\n onRegionsFilterChange,\n onCoordinatesChange,\n getGuestsDisplay,\n getDateDisplay,\n onMobileClick,\n onFilterClick,\n onSortClick,\n initialQuery = '',\n initialGuests = { adults: 2, children: 0, childrenAges: [] },\n initialPetFilter = 0,\n initialDateRange = null,\n initialMonthFilter = null,\n initialDestinationMode = '',\n initialRegionsFilter = [],\n initialCoordinates,\n disabled = false,\n viewMode = 'list',\n onViewModeChange,\n hideViewToggle = false,\n compact = false,\n}) => {\n const { isDesktop } = useResponsive();\n const { t } = useUIContext();\n\n // Local state for form inputs\n const [query, setQuery] = useState(initialQuery);\n const [guests, setGuests] = useState<GuestCounts>(initialGuests);\n const [petFilter, setPetFilter] = useState<number>(initialPetFilter);\n const [dateRange, setDateRange] = useState<DateRange | null>(initialDateRange);\n const [monthFilter, setMonthFilter] = useState<string[] | null>(initialMonthFilter);\n const [destinationMode, setDestinationMode] = useState(initialDestinationMode);\n const [regionsFilter, setRegionsFilter] = useState<string[]>(initialRegionsFilter);\n const [childAgeErrors, setChildAgeErrors] = useState<ChildAgeError[]>([]);\n const [coordinates, setCoordinates] = useState<Coordinates | undefined>(initialCoordinates);\n\n useEffect(() => {\n setGuests(initialGuests);\n setQuery(initialQuery);\n setDateRange(initialDateRange);\n setMonthFilter(initialMonthFilter);\n setDestinationMode(initialDestinationMode);\n setRegionsFilter(initialRegionsFilter);\n setCoordinates(initialCoordinates);\n }, [initialGuests, initialQuery, initialDateRange, initialMonthFilter, initialDestinationMode, initialRegionsFilter, initialCoordinates]);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n\n // Validate the Guests filter, child age selections\n const validationErrors = validateChildrenAges();\n if (validationErrors.length > 0) {\n setChildAgeErrors(validationErrors);\n return;\n }\n\n onSearch({\n query: query.trim(), // Empty string means \"search all\" - \"Anywhere\" is display-only\n guests,\n petFilter,\n dateRange,\n monthFilter,\n coordinates,\n regionsFilter,\n destinationMode\n });\n };\n\n const onGuestFilterChange = (guests: GuestCounts) => {\n setGuests(guests);\n };\n\n const validateChildrenAges = (): ChildAgeError[] => {\n const validationErrors: ChildAgeError[] = [];\n\n // Ensure childrenAges is an array\n const childrenAges = Array.isArray(guests.childrenAges) ? guests.childrenAges : [];\n\n // Iterate based on children count, not childrenAges length\n // This handles cases where array is out of sync (fast clicking, URL init)\n for (let index = 0; index < guests.children; index++) {\n const age = childrenAges[index];\n if (age === null || age === undefined) {\n validationErrors.push({\n index,\n message: t('form.age-error')\n });\n }\n }\n\n return validationErrors;\n };\n\n // Format location display\n const getLocationDisplay = () => {\n return query.trim() || t('label.anywhere');\n };\n\n // Clear handlers - also trigger search after clearing\n const handleClearLocation = () => {\n setQuery('');\n setDestinationMode('');\n setRegionsFilter([]);\n setCoordinates(undefined);\n };\n\n const handleClearDate = (e: React.MouseEvent) => {\n e.stopPropagation();\n setDateRange(null);\n setMonthFilter(null);\n // Trigger search with cleared dates\n onSearch({\n query: query.trim(),\n guests,\n petFilter,\n dateRange: null,\n monthFilter: null,\n coordinates,\n regionsFilter,\n destinationMode\n });\n };\n\n const handleClearGuests = (e: React.MouseEvent) => {\n e.stopPropagation();\n const defaultGuests = { adults: 2, children: 0, childrenAges: [] };\n setGuests(defaultGuests);\n // Trigger search with reset guests\n onSearch({\n query: query.trim(),\n guests: defaultGuests,\n petFilter,\n dateRange,\n monthFilter,\n coordinates,\n regionsFilter,\n destinationMode\n });\n };\n\n const handleQueryChange = (query: string) => {\n setQuery(query);\n // onQueryChange?.(query);\n };\n\n // Auto-submit when date dropdown closes (clicked outside)\n const handleDateDropdownClose = (newDateRange: DateRange | null, newMonthFilter: string[] | null) => {\n // Update local state first\n setDateRange(newDateRange);\n setMonthFilter(newMonthFilter);\n\n // Validate children ages first\n const validationErrors = validateChildrenAges();\n if (validationErrors.length > 0) {\n setChildAgeErrors(validationErrors);\n return;\n }\n\n onSearch({\n query: query.trim(),\n guests,\n petFilter,\n dateRange: newDateRange,\n monthFilter: newMonthFilter,\n coordinates,\n regionsFilter,\n destinationMode\n });\n };\n\n // Auto-submit when guest dropdown closes (clicked outside)\n const handleGuestDropdownClose = (newGuests: GuestCounts, newPetFilter: number) => {\n // Update local state first\n setGuests(newGuests);\n setPetFilter(newPetFilter);\n\n // Validate children ages with the new guests values\n const childrenAges = Array.isArray(newGuests.childrenAges) ? newGuests.childrenAges : [];\n const validationErrors: ChildAgeError[] = [];\n for (let index = 0; index < newGuests.children; index++) {\n const age = childrenAges[index];\n if (age === null || age === undefined) {\n validationErrors.push({ index, message: t('form.age-error') });\n }\n }\n if (validationErrors.length > 0) {\n setChildAgeErrors(validationErrors);\n return;\n }\n\n onSearch({\n query: query.trim(),\n guests: newGuests,\n petFilter: newPetFilter,\n dateRange,\n monthFilter,\n coordinates,\n regionsFilter,\n destinationMode\n });\n };\n\n // Check if fields have non-default values\n const hasLocation = query.trim() !== '';\n const hasDateFilter = dateRange !== null || (monthFilter !== null && monthFilter.length > 0);\n const hasNonDefaultGuests = guests.adults !== 2 || guests.children !== 0;\n\n // Mobile: Compact summary view (tappable) + action bar\n if (!isDesktop) {\n return (\n <div className={styles.mobileContainer}>\n {/* Search summary box */}\n <button\n type=\"button\"\n className={styles.mobileSummary}\n onClick={onMobileClick}\n disabled={disabled}\n >\n <span className={styles.mobileSummaryIcon}>\n <SearchIcon />\n </span>\n <div className={styles.mobileSummaryText}>\n <span className={styles.mobileSummaryTitle}>\n {getLocationDisplay()}\n </span>\n <span className={styles.mobileSummarySubtitle}>\n {getDateDisplay()} · {getGuestsDisplay()}\n </span>\n </div>\n </button>\n\n {/* Action bar - Filter/Sort/Map (list view) or Filter/List (map view) */}\n {/* Hidden in fullscreen map view or compact mode (mobile app) */}\n {!hideViewToggle && !compact && (\n <div className={styles.mobileActionBar}>\n {/* Filter button */}\n <button\n type=\"button\"\n className={styles.mobileActionButton}\n onClick={onFilterClick}\n disabled={disabled}\n >\n <FilterIcon />\n <span>{t('label.filter')}</span>\n </button>\n\n <div className={styles.mobileActionDivider} />\n\n {/* Sort button - only in list view */}\n {viewMode === 'list' && (\n <>\n <button\n type=\"button\"\n className={styles.mobileActionButton}\n onClick={onSortClick}\n disabled={disabled}\n >\n <SortIcon />\n <span>{t('label.sort')}</span>\n </button>\n\n <div className={styles.mobileActionDivider} />\n </>\n )}\n\n {/* Map button - opens map view */}\n <button\n type=\"button\"\n className={styles.mobileActionButton}\n onClick={() => onViewModeChange?.('map')}\n disabled={disabled}\n >\n <MobileMapIcon />\n <span>{t('label.map')}</span>\n </button>\n </div>\n )}\n </div>\n );\n }\n\n // Desktop: Full search bar with inputs\n return (\n <form onSubmit={handleSubmit} className={`${styles.container} ${compact ? styles.containerCompact : ''}`}>\n {/* White container with 3 sections */}\n <div className={styles.inputsContainer}>\n {/* Location input - icon and clear button are handled by LocationAutocomplete */}\n <div className={styles.inputWrapper}>\n <LocationAutocomplete\n value={query}\n onChange={handleQueryChange}\n onAutocomplete={onAutocomplete}\n onClose={handleClearLocation}\n onSubmit={(selectedValue, coordinate, regionId, setQueryValue, destination) => {\n // Trigger search when location is selected from dropdown\n // When coordinates provided (Near me), use empty query for geo-search\n // The selectedValue is just for display in the input field\n let regionFilter = regionId ? [`region_${regionId}`] : [];\n setRegionsFilter(regionFilter);\n setDestinationMode(destination || '');\n setCoordinates(coordinate ?? undefined);\n if (destination) onDestinationModeChange?.(destination);\n onRegionsFilterChange?.(regionFilter);\n if (coordinate) onCoordinatesChange?.(coordinate);\n onSearch({\n query: !setQueryValue ? '' : selectedValue.trim(),\n guests,\n petFilter,\n dateRange,\n monthFilter,\n coordinates: coordinate,\n regionsFilter: regionFilter,\n destinationMode: destination\n });\n }}\n placeholder={t('label.anywhere')}\n disabled={disabled}\n className={styles.input}\n />\n </div>\n\n {/* Divider */}\n <div className={styles.divider} />\n\n {/* Date selector */}\n <div className={styles.controlWrapper}>\n <DateSelector\n initialDateRange={dateRange || { start: null, end: null }}\n initialMonthFilter={monthFilter}\n onChange={(dateRange) => {\n setDateRange(dateRange);\n if (dateRange) onDateRangeChange?.(dateRange);\n }}\n onMonthFilterChange={(months) => {\n setMonthFilter(months);\n if (months) onMonthFilterChange?.(months);\n }}\n onClose={handleDateDropdownClose}\n disabled={disabled}\n className={styles.control}\n icon={<CalendarIcon />}\n />\n {hasDateFilter && (\n <button\n type=\"button\"\n className={styles.clearButton}\n onClick={handleClearDate}\n aria-label={t('label.clear', 'Clear date')}\n >\n <ClearIcon />\n </button>\n )}\n </div>\n\n {/* Divider */}\n <div className={styles.divider} />\n\n {/* Guest selector */}\n <div className={styles.controlWrapper} data-test='test'>\n <GuestSelector\n initialGuests={guests}\n initialPetValue={petFilter}\n onChange={onGuestFilterChange}\n onPetChange={setPetFilter}\n onClose={handleGuestDropdownClose}\n disabled={disabled}\n className={styles.control}\n icon={<GuestsIcon />}\n childAgeErrors={childAgeErrors as ChildAgeError[]}\n />\n {hasNonDefaultGuests && (\n <button\n type=\"button\"\n className={styles.clearButton}\n onClick={handleClearGuests}\n aria-label={t('label.clear', 'Clear guests')}\n >\n <ClearIcon />\n </button>\n )}\n </div>\n\n {/* Search button - inside the inputs container per Figma */}\n <div className={styles.buttonWrapper}>\n <Button\n variant=\"primary\"\n size=\"small\"\n type=\"submit\"\n disabled={disabled}\n >\n {t('button.search')}\n </Button>\n </div>\n </div>\n </form>\n );\n};\n","import React, { useState, useRef } from 'react';\nimport type { HotelCardImageProps } from './HotelCard.types';\nimport './HotelCard.css';\n\nconst MAX_IMAGES = 5;\nconst SWIPE_THRESHOLD = 50;\n\n// Placeholder for failed images\nconst HOTEL_PLACEHOLDER = 'data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"400\" height=\"300\" fill=\"%23e5e7eb\"%3E%3Crect width=\"400\" height=\"300\" /%3E%3C/svg%3E';\n\n// Building icon for \"New\" badge\nconst BuildingIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <g clipPath=\"url(#clip0_building)\">\n <path d=\"M0.75 0C0.334375 0 0 0.334375 0 0.75C0 1.16562 0.334375 1.5 0.75 1.5H1V14.5H0.75C0.334375 14.5 0 14.8344 0 15.25C0 15.6656 0.334375 16 0.75 16H15.25C15.6656 16 16 15.6656 16 15.25C16 14.8344 15.6656 14.5 15.25 14.5H15V1.5H15.25C15.6656 1.5 16 1.16562 16 0.75C16 0.334375 15.6656 0 15.25 0H0.75ZM13.5 14.5H9V12H10.5C10.775 12 11.0031 11.775 10.9594 11.5031C10.7219 10.0844 9.4875 9 8 9C6.5125 9 5.27813 10.0813 5.04063 11.5031C4.99375 11.775 5.22188 12 5.5 12H7V14.5H2.5V1.5H13.5V14.5ZM4.5 3C4.225 3 4 3.225 4 3.5V4.5C4 4.775 4.225 5 4.5 5H5.5C5.775 5 6 4.775 6 4.5V3.5C6 3.225 5.775 3 5.5 3H4.5ZM7 3.5V4.5C7 4.775 7.225 5 7.5 5H8.5C8.775 5 9 4.775 9 4.5V3.5C9 3.225 8.775 3 8.5 3H7.5C7.225 3 7 3.225 7 3.5ZM10.5 3C10.225 3 10 3.225 10 3.5V4.5C10 4.775 10.225 5 10.5 5H11.5C11.775 5 12 4.775 12 4.5V3.5C12 3.225 11.775 3 11.5 3H10.5ZM4 6.5V7.5C4 7.775 4.225 8 4.5 8H5.5C5.775 8 6 7.775 6 7.5V6.5C6 6.225 5.775 6 5.5 6H4.5C4.225 6 4 6.225 4 6.5ZM7.5 6C7.225 6 7 6.225 7 6.5V7.5C7 7.775 7.225 8 7.5 8H8.5C8.775 8 9 7.775 9 7.5V6.5C9 6.225 8.775 6 8.5 6H7.5ZM10 6.5V7.5C10 7.775 10.225 8 10.5 8H11.5C11.775 8 12 7.775 12 7.5V6.5C12 6.225 11.775 6 11.5 6H10.5C10.225 6 10 6.225 10 6.5Z\" fill=\"white\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_building\">\n <rect width=\"16\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Arrow icons\nconst ArrowLeftIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M12.5 15L7.5 10L12.5 5\" stroke=\"#1F2937\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nconst ArrowRightIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M7.5 15L12.5 10L7.5 5\" stroke=\"#1F2937\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\n// Heart icon\nconst HeartIcon = ({ filled }: { filled: boolean }) => (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={filled ? 'hc-hotel-card__heart-icon--filled' : 'hc-hotel-card__heart-icon'}\n >\n <g clipPath=\"url(#clip0_heart)\">\n <path\n d=\"M12.7031 4.58281C13.875 2.96094 15.7594 2 17.7609 2C21.2062 2 24 4.79375 24 8.23906C24 11.4547 21.9891 14.2812 20.2922 16.3391C18.225 18.8516 15.7313 21.0312 14.0203 22.3344C13.4438 22.775 12.7312 22.9953 12 22.9953C11.2688 22.9953 10.5562 22.775 9.97969 22.3344C8.26875 21.0312 5.775 18.8516 3.70781 16.3438C2.01094 14.2859 0 11.4547 0 8.23906C0 4.79375 2.79375 2 6.23906 2C8.24063 2 10.125 2.96094 11.2969 4.58281L12 5.55313L12.7031 4.58281Z\"\n fill=\"white\"\n />\n <path\n d=\"M17.7609 4.25C16.4812 4.25 15.2766 4.86406 14.5266 5.9L12.9141 8.13125C12.7031 8.42188 12.3656 8.59531 12.0047 8.59531C11.6438 8.59531 11.3062 8.42188 11.0953 8.13125L9.48281 5.9C8.73281 4.86406 7.52813 4.25 6.24844 4.25C4.04531 4.25 2.25938 6.03594 2.25938 8.23906C2.25938 10.5781 3.75938 12.8516 5.45156 14.9094C7.37813 17.2531 9.73594 19.3156 11.3531 20.5484C11.5031 20.6609 11.7234 20.7453 12.0094 20.7453C12.2953 20.7453 12.5156 20.6609 12.6656 20.5484C14.2828 19.3156 16.6406 17.2484 18.5672 14.9094C20.2641 12.8516 21.7594 10.5781 21.7594 8.23906C21.7594 6.03594 19.9734 4.25 17.7703 4.25H17.7609ZM12.7031 4.58281C13.875 2.96094 15.7594 2 17.7609 2C21.2062 2 24 4.79375 24 8.23906C24 11.4547 21.9891 14.2812 20.2922 16.3391C18.225 18.8516 15.7313 21.0312 14.0203 22.3344C13.4438 22.775 12.7312 22.9953 12 22.9953C11.2688 22.9953 10.5562 22.775 9.97969 22.3344C8.26875 21.0312 5.775 18.8516 3.70781 16.3438C2.01094 14.2859 0 11.4547 0 8.23906C0 4.79375 2.79375 2 6.23906 2C8.24063 2 10.125 2.96094 11.2969 4.58281L12 5.55313L12.7031 4.58281Z\"\n fill=\"#4B5563\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_heart\">\n <rect width=\"24\" height=\"24\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n);\n\nexport const HotelCardImage: React.FC<HotelCardImageProps> = ({\n images,\n hotelName,\n badges,\n isFavorite,\n onFavoriteClick,\n}) => {\n // Accessibility labels\n const labels = {\n removeFromFavorites: 'Remove from favorites',\n addToFavorites: 'Add to favorites',\n previousImage: 'Previous image',\n nextImage: 'Next image',\n };\n const displayImages = images.slice(0, MAX_IMAGES);\n const [currentImageIndex, setCurrentImageIndex] = useState(0);\n const [failedImages, setFailedImages] = useState<Set<number>>(new Set());\n const [touchStart, setTouchStart] = useState<number | null>(null);\n const [touchEnd, setTouchEnd] = useState<number | null>(null);\n const [isDragging, setIsDragging] = useState(false);\n const imageRef = useRef<HTMLDivElement>(null);\n\n const handleImageError = (index: number) => {\n setFailedImages(prev => new Set(prev).add(index));\n };\n\n const getImageSrc = (index: number) => {\n if (failedImages.has(index)) return HOTEL_PLACEHOLDER;\n return displayImages[index] || HOTEL_PLACEHOLDER;\n };\n\n const goToPreviousImage = () => {\n setCurrentImageIndex(prev => prev === 0 ? displayImages.length - 1 : prev - 1);\n };\n\n const goToNextImage = () => {\n setCurrentImageIndex(prev => prev === displayImages.length - 1 ? 0 : prev + 1);\n };\n\n const handlePrevImage = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n goToPreviousImage();\n };\n\n const handleNextImage = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n goToNextImage();\n };\n\n // Touch handlers for swipe\n const handleTouchStart = (e: React.TouchEvent) => {\n e.stopPropagation();\n setTouchEnd(null);\n setTouchStart(e.targetTouches[0].clientX);\n setIsDragging(true);\n };\n\n const handleTouchMove = (e: React.TouchEvent) => {\n e.stopPropagation();\n if (!touchStart) return;\n setTouchEnd(e.targetTouches[0].clientX);\n };\n\n const handleTouchEnd = (e: React.TouchEvent) => {\n e.stopPropagation();\n setIsDragging(false);\n if (!touchStart || !touchEnd) return;\n\n const distance = touchStart - touchEnd;\n if (distance > SWIPE_THRESHOLD) goToNextImage();\n else if (distance < -SWIPE_THRESHOLD) goToPreviousImage();\n\n setTouchStart(null);\n setTouchEnd(null);\n };\n\n const handleFavorite = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onFavoriteClick();\n };\n\n return (\n <div\n className=\"hc-hotel-card__image-section\"\n ref={imageRef}\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n style={{ cursor: isDragging ? 'grabbing' : 'grab' }}\n >\n <img\n src={getImageSrc(currentImageIndex)}\n alt={`${hotelName} - Image ${currentImageIndex + 1} of ${displayImages.length}`}\n className=\"hc-hotel-card__image\"\n loading=\"lazy\"\n onError={() => handleImageError(currentImageIndex)}\n draggable=\"false\"\n />\n\n <div className=\"hc-hotel-card__image-overlay\" />\n\n <div className=\"hc-hotel-card__top-overlay\">\n <div className=\"hc-hotel-card__badges-column\">\n {badges?.map((badge, index) => (\n <div key={index} className=\"hc-hotel-card__new-badge\">\n <BuildingIcon />\n <span>{badge}</span>\n </div>\n ))}\n </div>\n\n <button\n className=\"hc-hotel-card__favorite-button\"\n onClick={handleFavorite}\n aria-label={isFavorite ? labels.removeFromFavorites : labels.addToFavorites}\n type=\"button\"\n >\n <HeartIcon filled={isFavorite} />\n </button>\n </div>\n\n {displayImages.length > 1 && (\n <>\n <button\n className=\"hc-hotel-card__nav-button hc-hotel-card__nav-button--left\"\n onClick={handlePrevImage}\n aria-label={labels.previousImage}\n type=\"button\"\n >\n <ArrowLeftIcon />\n </button>\n\n <button\n className=\"hc-hotel-card__nav-button hc-hotel-card__nav-button--right\"\n onClick={handleNextImage}\n aria-label={labels.nextImage}\n type=\"button\"\n >\n <ArrowRightIcon />\n </button>\n\n <div className=\"hc-hotel-card__image-indicator\">\n {displayImages.map((_, index) => (\n <span\n key={index}\n className={`hc-hotel-card__indicator-dot ${\n index === currentImageIndex ? 'hc-hotel-card__indicator-dot--active' : ''\n }`}\n />\n ))}\n </div>\n </>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { useUIContext } from '../../context';\nimport type { HotelCardContentProps } from './HotelCard.types';\nimport './HotelCard.css';\n\n// Star icon - 9x9\nconst StarIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\">\n <g clipPath=\"url(#clip0_star)\">\n <path d=\"M4.80018 0.366577C4.93104 0.366577 5.05173 0.440968 5.11135 0.557659L6.18011 2.66102L8.50521 3.03152C8.63462 3.05194 8.74222 3.14383 8.78294 3.26927C8.82365 3.39472 8.79021 3.53183 8.6986 3.62518L7.03366 5.29533L7.40155 7.6277C7.42191 7.75752 7.3681 7.88879 7.26195 7.9661C7.15581 8.04341 7.01476 8.05508 6.89843 7.99528L4.80018 6.92463L2.70192 7.99528C2.58559 8.05508 2.44454 8.04341 2.33839 7.9661C2.23225 7.88879 2.17844 7.75898 2.1988 7.6277L2.56523 5.29533L0.901751 3.62518C0.808689 3.53183 0.776699 3.39472 0.817413 3.26927C0.858128 3.14383 0.964277 3.05194 1.09515 3.03152L3.42024 2.66102L4.49045 0.557659C4.55007 0.440968 4.67076 0.366577 4.80163 0.366577H4.80018Z\" fill=\"#1F2937\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_star\">\n <rect width=\"8\" height=\"8\" fill=\"white\" transform=\"translate(0.800049 0.199951)\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Pin icon\nconst PinIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M8 1.5C5.51562 1.5 3.5 3.51562 3.5 6C3.5 9.5 8 14 8 14C8 14 12.5 9.5 12.5 6C12.5 3.51562 10.4844 1.5 8 1.5ZM8 7.75C7.0325 7.75 6.25 6.9675 6.25 6C6.25 5.0325 7.0325 4.25 8 4.25C8.9675 4.25 9.75 5.0325 9.75 6C9.75 6.9675 8.9675 7.75 8 7.75Z\" fill=\"#6B7280\"/>\n </svg>\n);\n\n// Breakfast icon\nconst BreakfastIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <g clipPath=\"url(#clip0_breakfast)\">\n <path d=\"M8 1.5C9.525 1.5 10.9281 2.025 12.0344 2.90313L9.4125 5.525L7.975 1.5H8ZM13.0969 3.96563C13.4656 4.43125 13.7719 4.94687 14.0031 5.5H11.5625L13.0969 3.96563ZM10.0594 7H14.3969C15.1875 7 15.8563 6.23438 15.5656 5.39375C14.4844 2.25625 11.5062 0 8 0C3.58125 0 0 3.58125 0 8C0 11.5062 2.25625 14.4844 5.39375 15.5656C6.23438 15.8563 7 15.1875 7 14.3969V10.0594L7.12187 9.9375L7.39375 10.0531C7.8625 10.2531 8.40938 10.15 8.76875 9.7875L9.80625 8.75C10.1469 8.40938 10.2625 7.9 10.1 7.44688L9.97188 7.0875L10.0625 6.99687L10.0594 7ZM5.6375 9.30313L2.90313 12.0344C2.025 10.925 1.5 9.52188 1.5 8C1.5 7.84375 1.50625 7.69062 1.51562 7.5375L5.63438 9.30313H5.6375ZM3.96563 13.0969L5.5 11.5625V14.0031C4.94375 13.7719 4.42813 13.4656 3.96563 13.0969ZM1.80313 6.02812C2.48438 3.8875 4.24687 2.225 6.45 1.6875L8.63437 7.80625L7.82812 8.6125L1.80313 6.03125V6.02812Z\" fill=\"#006962\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_breakfast\">\n <rect width=\"16\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Free cancellation icon\nconst FreeCancellationIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M0.838695 4.18584L2.62218 6.00458C2.85502 6.24202 3.23153 6.24202 3.4619 6.00458C3.69227 5.76713 3.69474 5.38317 3.4619 5.14825L2.69401 4.36518L3.66406 4.36518C3.9974 4.36518 4.33073 4.36518 4.37346 4.36518C4.66406 4.36518 4.66406 4.36518 4.9974 4.36518L5.22309 4.36518H5.22804H11.5644C11.5644 5.25687 12.2753 5.98184 13.1497 5.98184V8.61902C13.5386 8.66196 13.9151 8.83625 14.2123 9.13938L14.3387 9.26821V4.76682C14.3387 3.87513 13.6278 3.15016 12.7533 3.15016H4.37346H2.69649L3.46438 2.3671C3.69722 2.12965 3.69722 1.74569 3.46438 1.51077C3.23153 1.27585 2.85502 1.27332 2.62218 1.50825L0.838695 3.32699C0.605852 3.56443 0.605852 3.94839 0.838695 4.18331V4.18584ZM1.65612 6.73207V11.2335C1.65612 12.1251 2.36704 12.8501 3.24144 12.8501H13.3008L12.5329 13.6332C12.3 13.8706 12.3 14.2546 12.5329 14.4895C12.7657 14.7244 13.1422 14.727 13.3726 14.4895L15.1561 12.6708C15.3889 12.4333 15.3889 12.0494 15.1561 11.8144L13.3726 9.9957C13.1398 9.75826 12.7633 9.75826 12.5329 9.9957C12.3025 10.2331 12.3 10.6171 12.5329 10.852L13.3008 11.6351L12.3307 11.6351C11.974 11.6351 11.9036 11.6351 11.737 11.6351C11.6641 11.6351 11.6354 11.6351 11.5644 11.6351H4.43043C4.43043 10.7434 3.71952 10.0184 2.84511 10.0184V7.38126C2.45622 7.33832 2.0797 7.16402 1.78245 6.8609L1.65612 6.73207ZM10.3754 8.00014C10.3754 7.35699 10.1248 6.74019 9.67888 6.28541C9.23292 5.83064 8.62807 5.57515 7.9974 5.57515C7.36672 5.57515 6.76187 5.83064 6.31591 6.28541C5.86996 6.74019 5.61942 7.35699 5.61942 8.00014C5.61942 8.64329 5.86996 9.26009 6.31591 9.71486C6.76187 10.1696 7.36672 10.4251 7.9974 10.4251C8.62807 10.4251 9.23292 10.1696 9.67888 9.71486C10.1248 9.26009 10.3754 8.64329 10.3754 8.00014Z\" fill=\"#006962\"/>\n </svg>\n);\n\n// Checkmark icon (default)\nconst CheckmarkIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path d=\"M13.5 4.5L6 12L2.5 8.5\" stroke=\"#006962\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\n// Rating badge SVG (blue speech bubble)\nconst RatingBadgeSvg = () => (\n <svg width=\"32\" height=\"24\" viewBox=\"0 0 36 38\" fill=\"#478EFA\" className=\"hc-hotel-card__rating-badge-bg\">\n <path d=\"M4 0C1.79086 0 0 1.79086 0 4V32V38L9 32H32C34.2091 32 36 30.2091 36 28V0H4Z\"/>\n </svg>\n);\n\nexport const HotelCardContent: React.FC<HotelCardContentProps> = ({\n name,\n stars,\n isSuperior = false,\n rating,\n location,\n benefits,\n price,\n currency = 'CHF',\n isAvailable = true,\n onClick,\n}) => {\n const { t } = useUIContext();\n\n // Get translations from context\n const labels = {\n ratingExcellent: t('label.rating-excellent', 'Excellent'),\n ratingVeryGood: t('label.rating-very-good', 'Very good'),\n ratingGood: t('label.rating-good', 'Good'),\n ratingFair: t('label.rating-fair', 'Fair'),\n rating: t('label.rating', 'Rating'),\n priceFrom: t('label.per-room-night', 'per room & night from'),\n notAvailable: t('general.unavailable-for-selected-days', 'Not available'),\n swissLodge: 'Swiss Lodge',\n };\n\n const getRatingCategory = (score: number): string => {\n if (score >= 4.4) return labels.ratingExcellent;\n if (score >= 4.1) return labels.ratingVeryGood;\n if (score >= 3.8) return labels.ratingGood;\n if (score >= 3.5) return labels.ratingFair;\n return labels.rating;\n };\n\n const getBenefitIcon = (benefitId: string) => {\n switch (benefitId) {\n case 'free-breakfast':\n return <BreakfastIcon />;\n case 'free-cancellation':\n return <FreeCancellationIcon />;\n default:\n return <CheckmarkIcon />;\n }\n };\n\n const getBenefitLabel = (benefit: { id: string; label: string }) => {\n switch (benefit.id) {\n case 'free-breakfast':\n return t('general.breakfast-included', 'Breakfast included');\n case 'free-cancellation':\n return t('general.free-cancellation', 'Free cancellation');\n default:\n return benefit.label;\n }\n };\n\n const getStarRating = (starRating: number) => {\n if (!starRating || starRating <= 0) return null;\n if (starRating === 6) return <span className=\"hc-hotel-card__swiss-lodge\">{labels.swissLodge}</span>;\n\n const starCount = Math.min(Math.floor(starRating), 5);\n return (\n <>\n {Array.from({ length: starCount }, (_, index) => (\n <StarIcon key={index} />\n ))}\n </>\n );\n };\n\n return (\n <div\n className=\"hc-hotel-card__content\"\n onClick={onClick}\n style={{ cursor: onClick ? 'pointer' : undefined }}\n >\n {/* Star rating and TrustYou rating */}\n <div className=\"hc-hotel-card__header-section\">\n <div className=\"hc-hotel-card__rating-section\">\n <div className=\"hc-hotel-card__stars\">\n {getStarRating(stars)}\n {isSuperior && <span className=\"hc-hotel-card__stars-indicator\">(s)</span>}\n </div>\n\n {rating > 0 && (\n <div className=\"hc-hotel-card__rating-wrapper\">\n <span className=\"hc-hotel-card__rating-text\">{getRatingCategory(rating)}</span>\n <div className=\"hc-hotel-card__rating-badge\">\n <RatingBadgeSvg />\n <span className=\"hc-hotel-card__rating-number\">{rating.toFixed(1)}</span>\n </div>\n </div>\n )}\n </div>\n\n <h3 className=\"hc-hotel-card__hotel-name\">{name}</h3>\n </div>\n\n {/* Location */}\n <div className=\"hc-hotel-card__location-section\">\n <span className=\"hc-hotel-card__pin-icon\"><PinIcon /></span>\n <span className=\"hc-hotel-card__location\">{location}</span>\n </div>\n\n {/* Benefits and Pricing - side by side on desktop */}\n <div className=\"hc-hotel-card__benefits-and-pricing\">\n {/* Benefits */}\n {benefits.length > 0 && (\n <div className=\"hc-hotel-card__benefits-section\">\n {benefits.slice(0, 3).map((benefit, index) => (\n <div key={index} className=\"hc-hotel-card__benefit\">\n <span className=\"hc-hotel-card__benefit-icon\">\n {getBenefitIcon(benefit.id)}\n </span>\n <span className=\"hc-hotel-card__benefit-text\">{getBenefitLabel(benefit)}</span>\n </div>\n ))}\n </div>\n )}\n\n {/* Pricing */}\n <div className=\"hc-hotel-card__pricing-section\">\n {isAvailable && (\n <div className=\"hc-hotel-card__price-label\">{labels.priceFrom}</div>\n )}\n\n {!isAvailable && (\n <div className=\"hc-hotel-card__not-available\">{labels.notAvailable}</div>\n )}\n\n {isAvailable && (\n <div className=\"hc-hotel-card__price-container\">\n <span className=\"hc-hotel-card__current-price\">{`${currency} ${price.current}`}</span>\n {price.original && price.original > price.current && (\n <span className=\"hc-hotel-card__original-price\">{`${currency} ${price.original}`}</span>\n )}\n {price.discount && price.discount > 0 && (\n <span className=\"hc-hotel-card__discount-badge\">-{price.discount} %</span>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { BaseCard } from '../BaseCard';\nimport { HotelCardImage } from './HotelCardImage';\nimport { HotelCardContent } from './HotelCardContent';\nimport type { HotelCardProps } from './HotelCard.types';\nimport './HotelCard.css';\n\n/**\n * HotelCard Component\n *\n * A presentational card component for displaying hotel information in search results.\n * Built on BaseCard for consistent card styling across the app.\n * Platform-agnostic - navigation and auth logic should be handled by consuming apps.\n * Translations handled internally via UIContext.\n *\n * @example\n * ```tsx\n * <HotelCard\n * hotel={hotelData}\n * onFavoriteClick={() => toggleFavorite(hotelData.id)}\n * onContentClick={() => navigate(`/hotel/${hotelData.slug}`)}\n * />\n * ```\n */\nexport const HotelCard: React.FC<HotelCardProps> = ({\n hotel,\n onFavoriteClick,\n onContentClick,\n className,\n}) => {\n return (\n <BaseCard\n hoverable\n borderRadius={24}\n className={`hc-hotel-card ${className || ''}`}\n >\n <HotelCardImage\n images={hotel.images}\n hotelName={hotel.name}\n badges={hotel.badges}\n isFavorite={hotel.isFavorite}\n onFavoriteClick={onFavoriteClick}\n />\n\n {hotel.usp && (\n <div className=\"hc-hotel-card__usp-banner\">{hotel.usp}</div>\n )}\n\n <HotelCardContent\n name={hotel.name}\n stars={hotel.stars}\n isSuperior={hotel.isSuperior}\n rating={hotel.rating}\n location={hotel.location}\n benefits={hotel.benefits}\n price={hotel.price}\n currency={hotel.currency}\n isAvailable={hotel.isAvailable}\n onClick={onContentClick}\n />\n </BaseCard>\n );\n};\n","import React from 'react';\nimport { BaseCardSkeleton } from '../BaseCard';\nimport './HotelCardSkeleton.css';\n\n/**\n * HotelCardSkeleton - Loading placeholder for hotel cards\n *\n * Uses BaseCardSkeleton for the card shell and image,\n * with HotelCard-specific content placeholders.\n */\nexport const HotelCardSkeleton: React.FC = () => {\n return (\n <BaseCardSkeleton className=\"hc-hotel-card-skeleton--horizontal\">\n {/* Rating row */}\n <div className=\"hc-hotel-card-skeleton__rating hc-skeleton\" />\n\n {/* Hotel name */}\n <div className=\"hc-hotel-card-skeleton__name hc-skeleton\" />\n\n {/* Location */}\n <div className=\"hc-hotel-card-skeleton__location hc-skeleton\" />\n\n {/* Benefits and Pricing */}\n <div className=\"hc-hotel-card-skeleton__benefits-pricing\">\n <div className=\"hc-hotel-card-skeleton__benefits\">\n <div className=\"hc-hotel-card-skeleton__benefit hc-skeleton\" />\n </div>\n <div className=\"hc-hotel-card-skeleton__pricing\">\n <div className=\"hc-hotel-card-skeleton__price-label hc-skeleton\" />\n <div className=\"hc-hotel-card-skeleton__price-container\">\n <div className=\"hc-hotel-card-skeleton__badge hc-skeleton\" />\n <div className=\"hc-hotel-card-skeleton__price hc-skeleton\" />\n </div>\n </div>\n </div>\n </BaseCardSkeleton>\n );\n};\n\nHotelCardSkeleton.displayName = 'HotelCardSkeleton';\n","/**\n * Autocomplete API Service\n * Handles location autocomplete API calls\n */\n\nexport interface LocationSuggestion {\n type: 'hotel' | 'city' | 'region' | 'country';\n name: string;\n id?: number;\n slug?: string;\n city?: string;\n region?: string;\n}\n\n/**\n * Fetch location suggestions from the autocomplete API\n *\n * @param query - Search query string (minimum 2 characters)\n * @param apiBaseUrl - Base URL for the API\n * @param locale - Current locale for translations\n * @returns Promise resolving to array of location suggestions\n */\nexport async function autocompleteLocations(\n query: string,\n apiBaseUrl: string,\n locale: string\n): Promise<LocationSuggestion[]> {\n if (!query || query.trim().length < 2) {\n return [];\n }\n\n try {\n const response = await fetch(\n `${apiBaseUrl}/api/search/autocomplete?q=${encodeURIComponent(query)}&lang=${locale}`,\n {\n method: 'GET',\n headers: {\n 'Accept': 'application/json',\n },\n }\n );\n\n if (!response.ok) {\n console.error(`Autocomplete API error: ${response.status}`);\n return [];\n }\n\n const data = await response.json();\n\n if (!data.success || !data.suggestions) {\n return [];\n }\n\n // Map API response to our interface\n return data.suggestions.map((suggestion: {\n text: string;\n type: string;\n id?: number;\n slug?: string;\n city?: string;\n region?: string;\n }) => ({\n type: suggestion.type as LocationSuggestion['type'],\n name: suggestion.text,\n id: suggestion.id,\n slug: suggestion.slug,\n city: suggestion.city,\n region: suggestion.region,\n }));\n } catch (error) {\n console.error('Autocomplete error:', error);\n return [];\n }\n}\n","import React, { useState, useEffect, useRef, useMemo } from 'react';\nimport { useUIContext } from '../../../context';\nimport { autocompleteLocations } from '../../../services/autocomplete';\nimport styles from './LocationSearchContent.module.css';\n\n// SVG Icons matching Figma design (20x20)\n\n// Search/Location icon (24x24) - for the main input field\nconst SearchLocationIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <g clipPath=\"url(#clip0_location_content)\">\n <path d=\"M9.75 2.25C11.7391 2.25 13.6468 3.04018 15.0533 4.4467C16.4598 5.85322 17.25 7.76088 17.25 9.75C17.25 11.7391 16.4598 13.6468 15.0533 15.0533C13.6468 16.4598 11.7391 17.25 9.75 17.25C7.76088 17.25 5.85322 16.4598 4.4467 15.0533C3.04018 13.6468 2.25 11.7391 2.25 9.75C2.25 7.76088 3.04018 5.85322 4.4467 4.4467C5.85322 3.04018 7.76088 2.25 9.75 2.25ZM9.75 19.5C12.0375 19.5 14.1422 18.7125 15.8016 17.3953L22.0781 23.6719C22.5187 24.1125 23.2312 24.1125 23.6672 23.6719C24.1031 23.2313 24.1078 22.5188 23.6672 22.0828L17.3953 15.8016C18.7125 14.1422 19.5 12.0375 19.5 9.75C19.5 4.36406 15.1359 0 9.75 0C4.36406 0 0 4.36406 0 9.75C0 15.1359 4.36406 19.5 9.75 19.5ZM13.5 8.25C13.5 6.17812 11.8219 4.5 9.75 4.5C7.67812 4.5 6 6.17812 6 8.25C6 10.5375 8.17969 13.4813 9.21562 14.7469C9.49687 15.0891 10.0031 15.0891 10.2797 14.7469C11.3156 13.4813 13.4953 10.5375 13.4953 8.25H13.5ZM8.25 8.25C8.25 7.85218 8.40804 7.47064 8.68934 7.18934C8.97064 6.90804 9.35217 6.75 9.75 6.75C10.1478 6.75 10.5294 6.90804 10.8107 7.18934C11.092 7.47064 11.25 7.85218 11.25 8.25C11.25 8.64782 11.092 9.02936 10.8107 9.31066C10.5294 9.59196 10.1478 9.75 9.75 9.75C9.35217 9.75 8.97064 9.59196 8.68934 9.31066C8.40804 9.02936 8.25 8.64782 8.25 8.25Z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_location_content\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Clear/X icon (16x16)\nconst ClearIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"16\" viewBox=\"0 0 24 16\" fill=\"none\">\n <path d=\"M8.55417 0C7.84583 0 7.16667 0.279167 6.66667 0.779167L0.391667 7.05833C0.141667 7.30833 0 7.64583 0 8C0 8.35417 0.141667 8.69167 0.391667 8.94167L6.66667 15.2208C7.16667 15.7208 7.84583 16 8.55417 16H21.3333C22.8042 16 24 14.8042 24 13.3333V2.66667C24 1.19583 22.8042 0 21.3333 0H8.55417ZM22 2.66667V13.3333C22 13.7 21.7 14 21.3333 14H8.55417C8.37917 14 8.20833 13.9292 8.08333 13.8042L2.275 8L8.07917 2.19583C8.20417 2.07083 8.375 2 8.55 2H21.3333C21.7 2 22 2.3 22 2.66667ZM11.8375 5.17083C11.4458 5.5625 11.4458 6.19583 11.8375 6.58333L13.25 7.99583L11.8375 9.40833C11.4458 9.8 11.4458 10.4333 11.8375 10.8208C12.2292 11.2083 12.8625 11.2125 13.25 10.8208L14.6625 9.40833L16.075 10.8208C16.4667 11.2125 17.1 11.2125 17.4875 10.8208C17.875 10.4292 17.8792 9.79583 17.4875 9.40833L16.075 7.99583L17.4875 6.58333C17.8792 6.19167 17.8792 5.55833 17.4875 5.17083C17.0958 4.78333 16.4625 4.77917 16.075 5.17083L14.6625 6.58333L13.25 5.17083C12.8583 4.77917 12.225 4.77917 11.8375 5.17083Z\" fill=\"#1F2937\"/>\n </svg>\n);\n\n// AllDestinationsIcon icon - viewfinder/focus corners with center circle\nconst AllDestinationsIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clipPath=\"url(#clip0_1151_67394_content)\">\n <path d=\"M8.125 1.875C9.7826 1.875 11.3723 2.53348 12.5444 3.70558C13.7165 4.87768 14.375 6.4674 14.375 8.125C14.375 9.7826 13.7165 11.3723 12.5444 12.5444C11.3723 13.7165 9.7826 14.375 8.125 14.375C6.4674 14.375 4.87768 13.7165 3.70558 12.5444C2.53348 11.3723 1.875 9.7826 1.875 8.125C1.875 6.4674 2.53348 4.87768 3.70558 3.70558C4.87768 2.53348 6.4674 1.875 8.125 1.875ZM8.125 16.25C10.0312 16.25 11.7852 15.5937 13.168 14.4961L18.3984 19.7266C18.7656 20.0937 19.3594 20.0937 19.7227 19.7266C20.0859 19.3594 20.0898 18.7656 19.7227 18.4023L14.4961 13.168C15.5937 11.7852 16.25 10.0312 16.25 8.125C16.25 3.63672 12.6133 0 8.125 0C3.63672 0 0 3.63672 0 8.125C0 12.6133 3.63672 16.25 8.125 16.25ZM11.25 6.875C11.25 5.14844 9.85156 3.75 8.125 3.75C6.39844 3.75 5 5.14844 5 6.875C5 8.78125 6.81641 11.2344 7.67969 12.2891C7.91406 12.5742 8.33594 12.5742 8.56641 12.2891C9.42969 11.2344 11.2461 8.78125 11.2461 6.875H11.25ZM6.875 6.875C6.875 6.54348 7.0067 6.22554 7.24112 5.99112C7.47554 5.7567 7.79348 5.625 8.125 5.625C8.45652 5.625 8.77446 5.7567 9.00888 5.99112C9.2433 6.22554 9.375 6.54348 9.375 6.875C9.375 7.20652 9.2433 7.52446 9.00888 7.75888C8.77446 7.9933 8.45652 8.125 8.125 8.125C7.79348 8.125 7.47554 7.9933 7.24112 7.75888C7.0067 7.52446 6.875 7.20652 6.875 6.875Z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1151_67394_content\">\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Nearme icon - person with location beacon rings (matching Figma design)\nconst NearMeIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clipPath=\"url(#clip0_nearme)\">\n <path d=\"M9.0625 2.8125C9.0625 2.56386 9.16127 2.3254 9.33709 2.14959C9.5129 1.97377 9.75136 1.875 10 1.875C10.2486 1.875 10.4871 1.97377 10.6629 2.14959C10.8387 2.3254 10.9375 2.56386 10.9375 2.8125C10.9375 3.06114 10.8387 3.2996 10.6629 3.47541C10.4871 3.65123 10.2486 3.75 10 3.75C9.75136 3.75 9.5129 3.65123 9.33709 3.47541C9.16127 3.2996 9.0625 3.06114 9.0625 2.8125ZM12.8125 2.8125C12.8125 2.06658 12.5162 1.35121 11.9887 0.823762C11.4613 0.296316 10.7459 0 10 0C9.25408 0 8.53871 0.296316 8.01126 0.823762C7.48382 1.35121 7.1875 2.06658 7.1875 2.8125C7.1875 3.55842 7.48382 4.27379 8.01126 4.80124C8.53871 5.32868 9.25408 5.625 10 5.625C10.7459 5.625 11.4613 5.32868 11.9887 4.80124C12.5162 4.27379 12.8125 3.55842 12.8125 2.8125ZM5.625 9.6875V10.7305C5.625 11.3125 5.85547 11.8672 6.26562 12.2773L6.94141 12.9531L7.32812 15.0742C7.51563 16.1133 8.42188 16.8711 9.48047 16.8711H10.5195C11.5781 16.8711 12.4844 16.1133 12.6719 15.0742L13.0586 12.9531L13.7344 12.2773C14.1445 11.8672 14.375 11.3125 14.375 10.7305V9.6875C14.375 7.78906 12.8359 6.25 10.9375 6.25H9.0625C7.16406 6.25 5.625 7.78906 5.625 9.6875ZM9.0625 8.125H10.9375C11.8008 8.125 12.5 8.82422 12.5 9.6875V10.7305C12.5 10.8125 12.4688 10.8945 12.4102 10.9531L11.5234 11.8359C11.3867 11.9688 11.2969 12.1445 11.2656 12.332L10.8281 14.7422C10.8008 14.8906 10.6719 15 10.5195 15H9.48047C9.32812 15 9.19922 14.8906 9.17188 14.7422L8.73438 12.332C8.69922 12.1445 8.60938 11.9727 8.47656 11.8359L7.59375 10.9531C7.53516 10.8945 7.50391 10.8164 7.50391 10.7305V9.6875C7.50391 8.82422 8.20312 8.125 9.06641 8.125H9.0625ZM5.23047 13.457C4.58203 13.5547 3.97266 13.6758 3.42188 13.8203C2.54688 14.0469 1.75781 14.3398 1.16406 14.7305C0.589844 15.1055 0 15.7031 0 16.5664C0 17.4297 0.589844 18.0273 1.16406 18.4023C1.75781 18.7852 2.54688 19.0781 3.42188 19.3047C5.18359 19.7617 7.53516 20 10 20C12.4648 20 14.8164 19.7617 16.5781 19.3047C17.4531 19.0781 18.2422 18.7852 18.8359 18.3945C19.4102 18.0195 20 17.4219 20 16.5586C20 15.6953 19.4102 15.0977 18.8359 14.7227C18.2422 14.3359 17.4492 14.0391 16.5781 13.8125C16.0273 13.6719 15.4219 13.5508 14.7695 13.4492L14.5625 15.3164C15.125 15.4023 15.6445 15.5078 16.1094 15.6289C18.3203 16.1992 18.3203 16.9141 16.1094 17.4844C14.5508 17.8867 12.3672 18.1172 10 18.1172C7.63281 18.1172 5.44922 17.8867 3.89062 17.4844C1.67969 16.9141 1.67969 16.1992 3.89062 15.6289C4.35547 15.5078 4.875 15.4023 5.4375 15.3164L5.23047 13.4492V13.457Z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_nearme\">\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Hotel icon - building with windows\nconst HotelIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <g clipPath=\"url(#clip0_1151_67415_content)\">\n <path d=\"M0.9375 0C0.417969 0 0 0.417969 0 0.9375C0 1.45703 0.417969 1.875 0.9375 1.875H1.25V18.125H0.9375C0.417969 18.125 0 18.543 0 19.0625C0 19.582 0.417969 20 0.9375 20H19.0625C19.582 20 20 19.582 20 19.0625C20 18.543 19.582 18.125 19.0625 18.125H18.75V1.875H19.0625C19.582 1.875 20 1.45703 20 0.9375C20 0.417969 19.582 0 19.0625 0H0.9375ZM16.875 18.125H11.25V15H13.125C13.4688 15 13.7539 14.7188 13.6992 14.3789C13.4023 12.6055 11.8594 11.25 10 11.25C8.14062 11.25 6.59766 12.6016 6.30078 14.3789C6.24219 14.7188 6.52734 15 6.875 15H8.75V18.125H3.125V1.875H16.875V18.125ZM5.625 3.75C5.28125 3.75 5 4.03125 5 4.375V5.625C5 5.96875 5.28125 6.25 5.625 6.25H6.875C7.21875 6.25 7.5 5.96875 7.5 5.625V4.375C7.5 4.03125 7.21875 3.75 6.875 3.75H5.625ZM8.75 4.375V5.625C8.75 5.96875 9.03125 6.25 9.375 6.25H10.625C10.9688 6.25 11.25 5.96875 11.25 5.625V4.375C11.25 4.03125 10.9688 3.75 10.625 3.75H9.375C9.03125 3.75 8.75 4.03125 8.75 4.375ZM13.125 3.75C12.7812 3.75 12.5 4.03125 12.5 4.375V5.625C12.5 5.96875 12.7812 6.25 13.125 6.25H14.375C14.7188 6.25 15 5.96875 15 5.625V4.375C15 4.03125 14.7188 3.75 14.375 3.75H13.125ZM5 8.125V9.375C5 9.71875 5.28125 10 5.625 10H6.875C7.21875 10 7.5 9.71875 7.5 9.375V8.125C7.5 7.78125 7.21875 7.5 6.875 7.5H5.625C5.28125 7.5 5 7.78125 5 8.125ZM9.375 7.5C9.03125 7.5 8.75 7.78125 8.75 8.125V9.375C8.75 9.71875 9.03125 10 9.375 10H10.625C10.9688 10 11.25 9.71875 11.25 9.375V8.125C11.25 7.78125 10.9688 7.5 10.625 7.5H9.375ZM12.5 8.125V9.375C12.5 9.71875 12.7812 10 13.125 10H14.375C14.7188 10 15 9.71875 15 9.375V8.125C15 7.78125 14.7188 7.5 14.375 7.5H13.125C12.7812 7.5 12.5 7.78125 12.5 8.125Z\" fill=\"currentColor\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1151_67415_content\">\n <rect width=\"20\" height=\"20\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n);\n\n// Location pin icon - for cities\nconst LocationIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M10 10.8333C11.3807 10.8333 12.5 9.71404 12.5 8.33333C12.5 6.95262 11.3807 5.83333 10 5.83333C8.61929 5.83333 7.5 6.95262 7.5 8.33333C7.5 9.71404 8.61929 10.8333 10 10.8333Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M10 18.3333C10 18.3333 16.6667 13.3333 16.6667 8.33333C16.6667 4.65143 13.6819 1.66667 10 1.66667C6.31811 1.66667 3.33334 4.65143 3.33334 8.33333C3.33334 13.3333 10 18.3333 10 18.3333Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\n// Region icon - map/area\nconst RegionIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M7.5 2.5L2.5 5V17.5L7.5 15M7.5 2.5L12.5 5M7.5 2.5V15M12.5 5L17.5 2.5V15L12.5 17.5M12.5 5V17.5M12.5 17.5L7.5 15\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\n// Country icon - globe\nconst CountryIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"10\" cy=\"10\" r=\"8.25\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <path d=\"M2.5 10H17.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n <path d=\"M10 1.75C10 1.75 6.25 5 6.25 10C6.25 15 10 18.25 10 18.25\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n <path d=\"M10 1.75C10 1.75 13.75 5 13.75 10C13.75 15 10 18.25 10 18.25\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n);\n\nexport interface LocationSuggestion {\n id?: number;\n type: 'hotel' | 'city' | 'region' | 'country';\n name: string;\n city?: string;\n region?: string;\n latitude?: number;\n longitude?: number;\n}\n\nexport interface LocationSearchContentProps {\n /** Current search query */\n value: string;\n /** Called when query changes */\n onChange: (value: string) => void;\n /** Called when a suggestion is selected with value and optional coordinates */\n onSelect: (\n selectedValue: string,\n coordinates?: { lat: number; lng: number },\n regionId?: number,\n destinationMode?: string\n ) => void;\n onClear: () => void;\n /** Placeholder text for input */\n placeholder?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Display variant: 'dropdown' for desktop, 'expanded' for mobile modal */\n variant?: 'dropdown' | 'expanded';\n /** Additional class name */\n className?: string;\n /** Show input field (false when used in desktop search bar which has its own input) */\n showInput?: boolean;\n /** Ref to pass to input for external focus control */\n inputRef?: React.RefObject<HTMLInputElement>;\n}\n\n/**\n * LocationSearchContent - Shared location search UI\n *\n * Used in:\n * - Desktop search bar (as dropdown below input)\n * - Mobile search modal (as expanded section)\n * - Map view filter modal\n *\n * Features:\n * - Debounced API calls (300ms)\n * - Keyboard navigation\n * - Shows hotels, cities, and regions grouped by type\n * - Shows \"All destinations\" and \"Nearby\" options\n * - Bold text highlighting for search matches\n */\nexport const LocationSearchContent: React.FC<LocationSearchContentProps> = ({\n value,\n onChange,\n onSelect,\n onClear,\n placeholder,\n disabled = false,\n variant = 'dropdown',\n className = '',\n showInput = true,\n inputRef: externalInputRef,\n}) => {\n const { t, apiBaseUrl, locale } = useUIContext();\n const [suggestions, setSuggestions] = useState<LocationSuggestion[]>([]);\n const [selectedIndex, setSelectedIndex] = useState(-1);\n const [isLoading, setIsLoading] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n const [isOpen, setIsOpen] = useState(false);\n\n const internalInputRef = useRef<HTMLInputElement>(null);\n const inputRef = externalInputRef || internalInputRef;\n const debounceRef = useRef<NodeJS.Timeout>();\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Determine if icon should be \"active\" (blue)\n const isIconActive = isFocused || value.trim().length > 0;\n\n // Group suggestions by type\n const groupedSuggestions = useMemo(() => {\n const hotels = suggestions.filter(s => s.type === 'hotel');\n const cities = suggestions.filter(s => s.type === 'city');\n const regions = suggestions.filter(s => s.type === 'region');\n const countries = suggestions.filter(s => s.type === 'country');\n return { hotels, cities, regions, countries };\n }, [suggestions]);\n\n // Calculate total items for keyboard navigation\n // Order: quick options, cities, regions, countries, hotels (per Figma priority)\n const allItems = useMemo(() => {\n const quickOptions = [\n { type: 'anywhere' as const, name: t('label.anywhere') },\n { type: 'nearme' as const, name: t('label.nearby') },\n ];\n return [\n ...quickOptions,\n ...groupedSuggestions.cities,\n ...groupedSuggestions.regions,\n ...groupedSuggestions.countries,\n ...groupedSuggestions.hotels,\n ];\n }, [groupedSuggestions, t]);\n\n // Fetch suggestions from API\n const fetchSuggestions = async (query: string) => {\n if (query.length < 2) {\n setSuggestions([]);\n return;\n }\n\n try {\n setIsLoading(true);\n const results = await autocompleteLocations(query, apiBaseUrl, locale);\n\n setSuggestions(results);\n setSelectedIndex(-1);\n } catch (error) {\n console.error('Autocomplete error:', error);\n setSuggestions([]);\n } finally {\n setIsLoading(false);\n }\n };\n\n // Debounced search\n useEffect(() => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n\n debounceRef.current = setTimeout(() => {\n fetchSuggestions(value);\n }, 300);\n\n return () => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n };\n }, [value]);\n\n // Click outside to close (only in dropdown mode, not in mobile modal)\n useEffect(() => {\n // In expanded mode (mobile modal), the modal handles its own lifecycle\n // Adding click-outside handler can interfere with accordion button clicks\n if (variant === 'expanded') return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node) &&\n inputRef.current &&\n !inputRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [variant]);\n\n // Handle input change\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n setIsOpen(true);\n };\n\n // Handle clear button click\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange('');\n inputRef.current?.focus();\n onClear();\n };\n\n // Handle suggestion selection\n const handleSelectItem = (item: LocationSuggestion | { type: 'anywhere' | 'nearme'; name: string }) => {\n if (item.type === 'anywhere') {\n onChange('');\n setIsOpen(false);\n onSelect('');\n return;\n }\n\n if (item.type === 'nearme') {\n handleNearMe();\n return;\n }\n\n const suggestion = item as LocationSuggestion;\n const displayText = suggestion.name;\n const coordinates = getCoordinates(suggestion);\n const regionId = (suggestion.type === 'region') ? suggestion.id : undefined;\n\n onChange(displayText);\n onSelect(displayText, coordinates, regionId, suggestion.type);\n setIsOpen(false);\n\n };\n\n const getCoordinates = (params: LocationSuggestion): { lat: number; lng: number } | undefined => {\n if (!params?.latitude || !params?.longitude) {\n return undefined;\n }\n\n return {\n lat: params.latitude,\n lng: params.longitude,\n };\n };\n\n // Handle \"Near me\" - request geolocation\n const handleNearMe = () => {\n setIsOpen(false);\n if (!navigator.geolocation) {\n console.warn('Geolocation not supported');\n onChange('');\n onSelect('');\n return;\n }\n\n navigator.geolocation.getCurrentPosition(\n (position) => {\n const coords = {\n lat: position.coords.latitude,\n lng: position.coords.longitude,\n };\n onChange(t('label.nearby'));\n onSelect(t('label.nearby'), coords);\n },\n (error) => {\n console.warn('Geolocation error:', error.message);\n onChange('');\n onSelect('');\n },\n {\n enableHighAccuracy: false,\n timeout: 10000,\n maximumAge: 300000,\n }\n );\n };\n\n // Keyboard navigation\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isOpen || allItems.length === 0) {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n setIsOpen(true);\n }\n return;\n }\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n setSelectedIndex((prev) =>\n prev < allItems.length - 1 ? prev + 1 : prev\n );\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n setSelectedIndex((prev) => (prev > 0 ? prev - 1 : -1));\n break;\n\n case 'Enter':\n e.preventDefault();\n if (selectedIndex >= 0 && selectedIndex < allItems.length) {\n handleSelectItem(allItems[selectedIndex]);\n }\n break;\n\n case 'Escape':\n e.preventDefault();\n setIsOpen(false);\n setSelectedIndex(-1);\n break;\n }\n };\n\n // Get icon component for suggestion type\n const getIcon = (type: string) => {\n switch (type) {\n case 'hotel':\n return <HotelIcon />;\n case 'city':\n return <LocationIcon />;\n case 'region':\n return <RegionIcon />;\n case 'country':\n return <CountryIcon />;\n case 'anywhere':\n return <AllDestinationsIcon />;\n case 'nearme':\n return <NearMeIcon />;\n default:\n return <AllDestinationsIcon />;\n }\n };\n\n // Clean region/city text from debug info (e.g., \"Bern (Region) common 1\" -> \"Bern\")\n const cleanLocationText = (text: string | undefined): string | undefined => {\n if (!text) return undefined;\n // Remove \" (Region)\" suffix and \"common X\" patterns\n return text\n .replace(/\\s*\\(Region\\)\\s*/gi, '')\n .replace(/\\s*common\\s*\\d+\\s*/gi, '')\n .trim();\n };\n\n // Highlight matching text in suggestion name\n const highlightMatch = (text: string, query: string) => {\n if (!query || query.length < 2) {\n return <span>{text}</span>;\n }\n\n const lowerText = text.toLowerCase();\n const lowerQuery = query.toLowerCase();\n const matchIndex = lowerText.indexOf(lowerQuery);\n\n if (matchIndex === -1) {\n return <span>{text}</span>;\n }\n\n const beforeMatch = text.slice(0, matchIndex);\n const match = text.slice(matchIndex, matchIndex + query.length);\n const afterMatch = text.slice(matchIndex + query.length);\n\n return (\n <span>\n {beforeMatch}\n <span className={styles.suggestionNameBold}>{match}</span>\n {afterMatch}\n </span>\n );\n };\n\n // Calculate base index offset for each section\n // Order: quick options (2), cities, regions, countries, hotels (per Figma priority)\n const QUICK_OPTIONS_COUNT = 2;\n const citiesStartIndex = QUICK_OPTIONS_COUNT;\n const regionsStartIndex = citiesStartIndex + groupedSuggestions.cities.length;\n const countriesStartIndex = regionsStartIndex + groupedSuggestions.regions.length;\n const hotelsStartIndex = countriesStartIndex + groupedSuggestions.countries.length;\n\n // Check if we have search results\n const hasSearchResults = suggestions.length > 0;\n const showEmptyState = value.length >= 2 && !hasSearchResults && !isLoading;\n\n const containerClasses = [\n styles.container,\n variant === 'expanded' ? styles.containerExpanded : styles.containerDropdown,\n className,\n ].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n {/* Input field - shown in expanded variant or when showInput is true */}\n {showInput && (\n <div className={styles.inputWrapper}>\n <span className={`${styles.inputIcon} ${isIconActive ? styles.inputIconActive : ''}`}>\n <SearchLocationIcon />\n </span>\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={() => {\n setIsFocused(true);\n setIsOpen(true);\n }}\n onBlur={() => setIsFocused(false)}\n placeholder={\n // In expanded variant (mobile modal), never show placeholder while active\n // In dropdown variant, only show placeholder when not focused\n variant === 'expanded' || isFocused\n ? ''\n : (placeholder || t('label.anywhere'))\n }\n disabled={disabled}\n className={styles.input}\n aria-label=\"Search location\"\n aria-autocomplete=\"list\"\n autoComplete=\"off\"\n />\n {/* Clear button - inside inputWrapper so it's positioned correctly */}\n {value.trim().length > 0 && (\n <button\n type=\"button\"\n className={styles.clearButton}\n onClick={handleClear}\n aria-label={t('label.clear')}\n >\n <ClearIcon />\n </button>\n )}\n </div>\n )}\n\n {/* Loading indicator */}\n {isLoading && (\n <div className={styles.loadingIndicator}>\n <span>{t('search_form.searching')}</span>\n </div>\n )}\n\n {/* Results content */}\n {isOpen && (\n <div ref={dropdownRef} className={styles.resultsContainer}>\n {/* Dropdown header - only shown when no search query */}\n {!hasSearchResults && !showEmptyState && (\n <div className={styles.dropdownHeader}>\n {t('general.suggested-destinations')}\n </div>\n )}\n\n {/* Quick options - shown when no search query */}\n {!hasSearchResults && !showEmptyState && (\n <div className={styles.section}>\n {/* All destinations option */}\n <button\n type=\"button\"\n className={`${styles.suggestion} ${selectedIndex === 0 ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelectItem({ type: 'anywhere', name: t('label.anywhere') })}\n onMouseEnter={() => setSelectedIndex(0)}\n >\n <span className={styles.suggestionIcon}>{getIcon('anywhere')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {t('label.anywhere')}\n </div>\n </div>\n </button>\n\n {/* Nearby option */}\n <button\n type=\"button\"\n className={`${styles.suggestion} ${selectedIndex === 1 ? styles.suggestionSelected : ''}`}\n onClick={handleNearMe}\n onMouseEnter={() => setSelectedIndex(1)}\n >\n <span className={styles.suggestionIcon}>{getIcon('nearme')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {t('label.nearby')}\n </div>\n </div>\n </button>\n </div>\n )}\n\n {/* Cities section - priority 1 */}\n {groupedSuggestions.cities.length > 0 && (\n <div className={styles.section}>\n <div className={styles.sectionHeader}>\n {t('dropdown.cities')}\n </div>\n <div>\n {groupedSuggestions.cities.map((suggestion, index) => {\n const itemIndex = citiesStartIndex + index;\n return (\n <button\n key={`city-${suggestion.name}-${index}`}\n type=\"button\"\n className={`${styles.suggestion} ${itemIndex === selectedIndex ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelectItem(suggestion)}\n onMouseEnter={() => setSelectedIndex(itemIndex)}\n >\n <span className={styles.suggestionIcon}>{getIcon('city')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {highlightMatch(suggestion.name, value)}\n </div>\n {suggestion.region && cleanLocationText(suggestion.region) && (\n <div className={styles.suggestionMeta}>\n {cleanLocationText(suggestion.region)}\n </div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Regions section - priority 2 */}\n {groupedSuggestions.regions.length > 0 && (\n <div className={styles.section}>\n <div className={styles.sectionHeader}>\n {t('dropdown.regions')}\n </div>\n <div>\n {groupedSuggestions.regions.map((suggestion, index) => {\n const itemIndex = regionsStartIndex + index;\n return (\n <button\n key={`region-${suggestion.name}-${index}`}\n type=\"button\"\n className={`${styles.suggestion} ${itemIndex === selectedIndex ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelectItem(suggestion)}\n onMouseEnter={() => setSelectedIndex(itemIndex)}\n >\n <span className={styles.suggestionIcon}>{getIcon('region')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {highlightMatch(suggestion.name, value)}\n </div>\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Countries section - priority 3 */}\n {groupedSuggestions.countries.length > 0 && (\n <div className={styles.section}>\n <div className={styles.sectionHeader}>\n {t('dropdown.countries')}\n </div>\n <div>\n {groupedSuggestions.countries.map((suggestion, index) => {\n const itemIndex = countriesStartIndex + index;\n return (\n <button\n key={`country-${suggestion.name}-${index}`}\n type=\"button\"\n className={`${styles.suggestion} ${itemIndex === selectedIndex ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelectItem(suggestion)}\n onMouseEnter={() => setSelectedIndex(itemIndex)}\n >\n <span className={styles.suggestionIcon}>{getIcon('country')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {highlightMatch(suggestion.name, value)}\n </div>\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Hotels section - priority 4 */}\n {groupedSuggestions.hotels.length > 0 && (\n <div className={styles.section}>\n <div className={styles.sectionHeader}>\n {t('dropdown.hotels')}\n </div>\n <div>\n {groupedSuggestions.hotels.map((suggestion, index) => {\n const itemIndex = hotelsStartIndex + index;\n return (\n <button\n key={`hotel-${suggestion.name}-${index}`}\n type=\"button\"\n className={`${styles.suggestion} ${itemIndex === selectedIndex ? styles.suggestionSelected : ''}`}\n onClick={() => handleSelectItem(suggestion)}\n onMouseEnter={() => setSelectedIndex(itemIndex)}\n >\n <span className={styles.suggestionIcon}>{getIcon('hotel')}</span>\n <div className={styles.suggestionContent}>\n <div className={styles.suggestionName}>\n {highlightMatch(suggestion.name, value)}\n </div>\n {suggestion.city && (\n <div className={styles.suggestionMeta}>\n {cleanLocationText(suggestion.city)}\n {suggestion.region && cleanLocationText(suggestion.region) && `, ${cleanLocationText(suggestion.region)}`}\n </div>\n )}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Empty state */}\n {showEmptyState && (\n <div className={styles.emptyState}>\n {t('dropdown.no-results')}\n </div>\n )}\n </div>\n )}\n\n </div>\n );\n};\n\nexport default LocationSearchContent;\n","import React, {useEffect, useState} from 'react';\nimport { useUIContext } from '../../context';\nimport { WhenContent, type DateRange } from '../DateSelector';\nimport { GuestContent, type ChildAgeError, type GuestCounts } from '../GuestSelector';\nimport { LocationSearchContent } from './LocationSearchContent/LocationSearchContent';\nimport styles from './SearchModal.module.css';\n\nexport interface SearchModalProps {\n isOpen: boolean;\n onClose: () => void;\n onSearch: (params: SearchParams) => void;\n initialQuery?: string;\n initialGuests?: GuestCounts;\n initialPetFilter?: number;\n initialDateRange?: DateRange | null;\n initialMonthFilter?: string[] | null;\n\n // Optional extra props\n onChange?: (guests: GuestCounts) => void;\n onQueryChange?: (query: string) => void;\n disabled?: boolean;\n className?: string;\n icon?: React.ReactNode;\n getGuestsDisplay?: () => string;\n}\n\nexport interface SearchParams {\n query: string;\n destinationMode?: string;\n guests: GuestCounts;\n petFilter: number;\n dateRange: DateRange | null;\n monthFilter: string[] | null;\n coordinates?: Coordinates;\n regionsFilter: string[];\n}\n\ninterface Coordinates {\n lat: number;\n lng: number;\n}\n\n// Props for the content-only component (no overlay)\nexport interface SearchModalContentProps {\n onSearch: (params: SearchParams) => void;\n onClose: () => void;\n initialQuery?: string;\n initialGuests?: GuestCounts;\n initialPetFilter?: number;\n initialDateRange?: DateRange | null;\n initialMonthFilter?: string[] | null;\n onChange?: (guests: GuestCounts) => void;\n onQueryChange?: (query: string) => void;\n getGuestsDisplay?: () => string;\n // Show header with close button - set to false when using IonModal which has its own header\n showHeader?: boolean;\n}\n\n/**\n * SearchModalContent - The content of the search modal without the overlay\n * Use this when you need to wrap the content in a custom modal (e.g., IonModal)\n */\nexport const SearchModalContent: React.FC<SearchModalContentProps> = ({\n onSearch,\n onClose,\n initialQuery = '',\n initialGuests = { adults: 2, children: 0, childrenAges: [] },\n initialPetFilter = 0,\n initialDateRange = null,\n initialMonthFilter = null,\n onChange,\n onQueryChange,\n getGuestsDisplay,\n showHeader = true,\n}) => {\n const { t } = useUIContext();\n\n // Form state\n const [query, setQuery] = useState(initialQuery);\n const [guests, setGuests] = useState<GuestCounts>(initialGuests);\n const [petFilter, setPetFilter] = useState(initialPetFilter);\n const [dateRange, setDateRange] = useState<DateRange | null>(initialDateRange);\n const [monthFilter, setMonthFilter] = useState<string[] | null>(initialMonthFilter);\n const [coordinates, setCoordinates] = useState<Coordinates | undefined>(undefined);\n const [regionsFilter, setRegionsFilter] = useState<string[]>([]);\n const [destinationMode, setDestinationMode] = useState<string | ''>('');\n const [childAgeErrors, setChildAgeErrors] = useState<ChildAgeError[]>([]);\n\n // Accordion state\n const [expandedSection, setExpandedSection] = useState<'where' | 'when' | 'who' | null>('where');\n\n useEffect(() => {\n setGuests(initialGuests);\n setQuery(initialQuery);\n setMonthFilter(initialMonthFilter);\n setDateRange(initialDateRange);\n }, [initialGuests, initialQuery, initialMonthFilter, initialDateRange]);\n\n // Validate children ages\n const validateChildrenAges = (): ChildAgeError[] => {\n const validationErrors: ChildAgeError[] = [];\n const childrenAges = Array.isArray(guests.childrenAges) ? guests.childrenAges : [];\n\n for (let index = 0; index < guests.children; index++) {\n const age = childrenAges[index];\n if (age === null || age === undefined) {\n validationErrors.push({\n index,\n message: t('form.age-error')\n });\n }\n }\n\n return validationErrors;\n };\n\n // Handlers\n const handleSubmit = () => {\n const errors = validateChildrenAges();\n if (errors.length > 0) {\n setChildAgeErrors(errors);\n setExpandedSection('who');\n return;\n }\n\n onSearch({\n query,\n guests,\n petFilter,\n dateRange,\n monthFilter,\n coordinates,\n regionsFilter,\n destinationMode\n });\n onClose();\n };\n\n const handleLocationSelect = (\n selectedValue: string,\n coords?: Coordinates,\n regionId?: number,\n destMode?: string\n ) => {\n setQuery(selectedValue);\n setCoordinates(coords);\n setRegionsFilter(regionId ? [`region_${regionId}`] : []);\n onQueryChange?.(selectedValue);\n setExpandedSection('when')\n setDestinationMode(destMode || '');\n };\n\n const handleGuestChange = (newGuests: GuestCounts) => {\n setGuests(newGuests);\n if (newGuests.children !== guests.children) {\n setChildAgeErrors([]);\n }\n };\n\n const handlePetChange = (value: number) => {\n setPetFilter(value);\n };\n\n const handleErrorClear = (index: number) => {\n setChildAgeErrors(prev => prev.filter(error => error.index !== index));\n };\n\n const formatDate = (date: string) => {\n const d = new Date(date);\n return d.toLocaleDateString('en-GB', {\n day: '2-digit',\n month: 'short',\n });\n };\n\n const getWhenLabel = () => {\n return dateRange?.start && dateRange?.end\n ? `${formatDate(dateRange.start)} - ${formatDate(dateRange.end)}`\n : monthFilter && monthFilter.length > 0\n ? monthFilter.length === 1\n ? monthFilter[0]\n : `${monthFilter.length} ${t('label.months')}`\n : t('label.anytime');\n };\n\n return (\n <div className={styles.modal}>\n {/* Header - only show if not using external header (like IonModal) */}\n {showHeader && (\n <div className={styles.header}>\n <button\n type=\"button\"\n onClick={onClose}\n className={styles.closeButton}\n aria-label={t('modal.close_search')}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\">\n <path d=\"M0.275391 1.59961C-0.0917969 1.23242 -0.0917969 0.638672 0.275391 0.275391C0.642578 -0.0878906 1.23633 -0.0917969 1.59961 0.275391L7.49805 6.17383L13.3965 0.275391C13.7637 -0.0917969 14.3574 -0.0917969 14.7207 0.275391C15.084 0.642578 15.0879 1.23633 14.7207 1.59961L8.82226 7.49805L14.7207 13.3965C15.0879 13.7637 15.0879 14.3574 14.7207 14.7207C14.3535 15.084 13.7598 15.0879 13.3965 14.7207L7.49805 8.82226L1.59961 14.7207C1.23242 15.0879 0.638672 15.0879 0.275391 14.7207C-0.0878906 14.3535 -0.0917969 13.7598 0.275391 13.3965L6.17383 7.49805L0.275391 1.59961Z\" fill=\"#1F2937\"/>\n </svg>\n </button>\n </div>\n )}\n\n {/* Content */}\n <div className={styles.content}>\n {/* Where Section */}\n {expandedSection !== 'where' && (\n <button\n type=\"button\"\n onClick={() => setExpandedSection('where')}\n className={styles.collapsibleSection}\n >\n <span className={styles.collapsibleLabel}>\n {t('label.where')}\n </span>\n <span className={styles.collapsibleValue}>\n {query || t('label.anywhere')}\n </span>\n </button>\n )}\n {expandedSection === 'where' && (\n <div className={styles.expandedContent}>\n <div className={styles.whereSection}>\n <h2 className={styles.sectionTitle}>\n {t('label.where')}\n </h2>\n <LocationSearchContent\n value={query}\n onChange={setQuery}\n onSelect={handleLocationSelect}\n onClear={() => setQuery('')}\n placeholder={t('label.anywhere')}\n showInput={true}\n variant=\"expanded\"\n />\n </div>\n </div>\n )}\n\n {/* When Section */}\n {expandedSection !== 'when' && (\n <button\n type=\"button\"\n onClick={() => setExpandedSection('when')}\n className={styles.collapsibleSection}\n >\n <span className={styles.collapsibleLabel}>\n {t('label.when')}\n </span>\n <span className={styles.collapsibleValue}>{getWhenLabel()}</span>\n </button>\n )}\n {expandedSection === 'when' && (\n <div className={styles.expandedContent}>\n <div className={styles.whenSection}>\n <WhenContent\n initialDateRange={dateRange || { start: null, end: null }}\n initialMonthFilter={monthFilter}\n onChange={(newDateRange) => {\n setDateRange(newDateRange);\n if (newDateRange && newDateRange.start !== null && newDateRange.end !== null) {\n setExpandedSection('who');\n }\n }}\n onMonthFilterChange={(months) => setMonthFilter(months)}\n variant=\"expanded\"\n showApplyButton={false}\n />\n </div>\n </div>\n )}\n\n {/* Who Section */}\n {expandedSection !== 'who' && (\n <button\n type=\"button\"\n onClick={() => setExpandedSection('who')}\n className={styles.collapsibleSection}\n >\n <span className={styles.collapsibleLabel}>\n {t('label.who')}\n </span>\n <span className={styles.collapsibleValue}>{getGuestsDisplay?.() ?? `${guests.adults + guests.children} ${t('form.guests')}`}</span>\n </button>\n )}\n {expandedSection === 'who' && (\n <div className={styles.expandedContent}>\n <div className={styles.whoGuestSection}>\n <h2 className={styles.sectionTitle}>\n {t('label.who')}\n </h2>\n <GuestContent\n guests={guests}\n onChange={handleGuestChange}\n petFilter={petFilter}\n onPetChange={handlePetChange}\n showPetToggle={true}\n childAgeErrors={childAgeErrors}\n onErrorClear={handleErrorClear}\n />\n </div>\n </div>\n )}\n </div>\n\n {/* Footer */}\n <div className={styles.footer}>\n <button type=\"button\" onClick={handleSubmit} className={styles.searchButton}>\n <span>{t('button.search')}</span>\n </button>\n </div>\n </div>\n );\n};\n\n/**\n * SearchModal - Full modal with overlay (for web)\n * For Ionic apps, use SearchModalContent with IonModal instead\n */\nexport const SearchModal: React.FC<SearchModalProps> = ({\n isOpen,\n onClose,\n onSearch,\n initialQuery = '',\n initialGuests = { adults: 2, children: 0, childrenAges: [] },\n initialPetFilter = 0,\n initialDateRange = null,\n initialMonthFilter = null,\n onChange,\n onQueryChange,\n getGuestsDisplay\n}) => {\n if (!isOpen) return null;\n\n return (\n <div className={styles.overlay}>\n <SearchModalContent\n onSearch={onSearch}\n onClose={onClose}\n initialQuery={initialQuery}\n initialGuests={initialGuests}\n initialPetFilter={initialPetFilter}\n initialDateRange={initialDateRange}\n initialMonthFilter={initialMonthFilter}\n onChange={onChange}\n onQueryChange={onQueryChange}\n getGuestsDisplay={getGuestsDisplay}\n showHeader={true}\n />\n </div>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport styles from './CollapsibleFilterSection.module.css';\n\n/**\n * CollapsibleFilterSection - Wrapper for expandable/collapsible filter sections\n *\n * Figma Spec:\n * - Section header with title + chevron\n * - Collapse/expand animation\n * - Optional \"Show all\" link for long lists\n * - Default collapsed state configurable\n */\n\ninterface CollapsibleFilterSectionProps {\n title: string;\n children: React.ReactNode;\n defaultExpanded?: boolean;\n showAllText?: string;\n showLessText?: string;\n hasShowAll?: boolean;\n initialItemsToShow?: number;\n className?: string;\n}\n\nexport const CollapsibleFilterSection: React.FC<CollapsibleFilterSectionProps> = ({\n title,\n children,\n defaultExpanded = true,\n showAllText = 'Show all',\n showLessText = 'Show less',\n hasShowAll = false,\n initialItemsToShow = 5,\n className = '',\n}) => {\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n const [showAll, setShowAll] = useState(false);\n\n // Auto-expand when defaultExpanded becomes true (e.g., filter selected from URL)\n // Don't auto-collapse - let user control that\n useEffect(() => {\n if (defaultExpanded && !isExpanded) {\n setIsExpanded(true);\n }\n }, [defaultExpanded]);\n\n const toggleExpanded = () => {\n setIsExpanded(!isExpanded);\n };\n\n const toggleShowAll = () => {\n setShowAll(!showAll);\n };\n\n // If hasShowAll, we need to limit children display\n const childrenArray = React.Children.toArray(children);\n const shouldShowToggle = hasShowAll && childrenArray.length > initialItemsToShow;\n const displayedChildren = shouldShowToggle && !showAll\n ? childrenArray.slice(0, initialItemsToShow)\n : childrenArray;\n\n return (\n <div className={`${styles.section} ${className}`}>\n <button\n type=\"button\"\n className={styles.header}\n onClick={toggleExpanded}\n aria-expanded={isExpanded}\n >\n <span className={styles.title}>{title}</span>\n <svg\n className={`${styles.chevron} ${isExpanded ? styles.chevronExpanded : ''}`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 9L12 15L18 9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n\n <div\n className={`${styles.content} ${isExpanded ? styles.contentExpanded : ''}`}\n aria-hidden={!isExpanded}\n >\n <div className={styles.contentInner}>\n {displayedChildren}\n\n {shouldShowToggle && (\n <button\n type=\"button\"\n className={styles.showAllButton}\n onClick={toggleShowAll}\n >\n {showAll ? showLessText : showAllText}\n <svg\n className={`${styles.showAllChevron} ${showAll ? styles.showAllChevronUp : ''}`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M6 9L12 15L18 9\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport styles from './FilterCheckboxItem.module.css';\n\n/**\n * FilterCheckboxItem - Reusable filter checkbox row with proper states\n *\n * Figma Spec (714-8371 - StarsRating/Filtering/Item):\n * - States: :idle, :hover, :active (checked), :focused, :disabled\n * - Idle: white background, unchecked\n * - Hover: gray background (#e5e7eb)\n * - Active: white background, blue checked checkbox\n * - Focused: white background with blue glow ring\n * - Disabled: gray checkbox, muted text\n */\n\nexport interface FilterCheckboxItemProps {\n /** Unique identifier for the checkbox */\n id?: string;\n /** Display label */\n label: React.ReactNode;\n /** Count to display on the right */\n count?: number | string;\n /** Whether the checkbox is checked */\n checked: boolean;\n /** Whether the item is disabled */\n disabled?: boolean;\n /** Change handler */\n onChange: () => void;\n /** Additional class name */\n className?: string;\n /** Analytics tracking name (used for data-track attribute) */\n trackName?: string;\n}\n\nexport const FilterCheckboxItem: React.FC<FilterCheckboxItemProps> = ({\n id,\n label,\n count,\n checked,\n disabled = false,\n onChange,\n className = '',\n trackName,\n}) => {\n return (\n <label\n className={`${styles.filterRow} ${disabled ? styles.filterRowDisabled : ''} ${className}`}\n tabIndex={disabled ? -1 : 0}\n data-track={trackName}\n >\n <div className={styles.checkboxLabel}>\n <div className={styles.checkboxButton}>\n <input\n id={id}\n type=\"checkbox\"\n className={styles.checkbox}\n checked={checked}\n disabled={disabled}\n onChange={onChange}\n />\n <span className={`${styles.checkboxBox} ${disabled ? styles.checkboxBoxDisabled : ''}`}>\n {checked && (\n <svg viewBox=\"0 0 12 10\" fill=\"none\" className={styles.checkIcon}>\n <path\n d=\"M1 5L4.5 8.5L11 1\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </span>\n </div>\n\n <span className={`${styles.filterLabel} ${disabled ? styles.filterLabelDisabled : ''}`}>\n {label}\n </span>\n </div>\n\n {count !== undefined && (\n <span className={`${styles.filterCount} ${disabled ? styles.filterCountDisabled : ''}`}>\n {count}\n </span>\n )}\n </label>\n );\n};\n","import React, { useState } from 'react';\nimport { useUIContext } from '../../../context';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport type { ThemeAggregation } from '../FilterPanel';\nimport styles from './CheckboxFilter.module.css';\n\n/**\n * ExperienceFilter - Checkbox list for experience types\n *\n * Figma Spec:\n * - Checkbox list with counts\n * - Options: City trip, Wellness & Spa, Design/Boutique, Water body, Hiking\n * - Expandable with \"Show all\"\n *\n * Uses translated theme names from API when available\n */\n\ninterface ExperienceFilterProps {\n selected: string[];\n /** Theme aggregations from API with pre-translated names */\n themes?: ThemeAggregation[];\n /** Legacy counts format (deprecated - use themes instead) */\n counts?: Record<string, number>;\n onChange: (values: string[]) => void;\n className?: string;\n}\n\nexport const ExperienceFilter: React.FC<ExperienceFilterProps> = ({\n selected,\n themes = [],\n counts = {},\n onChange,\n className = '',\n}) => {\n const { t } = useUIContext();\n const [expanded, setExpanded] = useState(false);\n\n // Use themes from API if available, they come pre-translated\n const visibleThemes = expanded ? themes : themes.slice(0, 5);\n const hasMoreThemes = themes.length > 5;\n\n const handleToggle = (value: string) => {\n if (selected.includes(value)) {\n onChange(selected.filter(v => v !== value));\n } else {\n onChange([...selected, value]);\n }\n };\n\n // Don't render if no themes available\n if (themes.length === 0) {\n return null;\n }\n\n return (\n <div className={`${styles.filterList} ${className}`}>\n {visibleThemes.map((theme) => {\n const themeIdStr = String(theme.id);\n const isDisabled = theme.count === 0 && !selected.includes(themeIdStr);\n return (\n <FilterCheckboxItem\n key={theme.id}\n id={`experience-${theme.id}`}\n label={theme.name}\n count={theme.count > 0 ? theme.count : undefined}\n checked={selected.includes(themeIdStr)}\n disabled={isDisabled}\n onChange={() => handleToggle(themeIdStr)}\n trackName={`filter-experience-${theme.id}`}\n />\n );\n })}\n\n {hasMoreThemes && (\n <button\n type=\"button\"\n className={styles.showMoreBtn}\n onClick={() => setExpanded(!expanded)}\n >\n {expanded\n ? t('filter.show-less', 'Show less')\n : t('filter.show-all', 'Show all')}\n <span\n className={`${styles.arrowIcon} ${expanded ? styles.arrowUp : ''}`}\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\n <path d=\"M9.36927 13.9061C9.71908 14.2535 10.2847 14.2535 10.6308 13.9061L16.4069 8.1803C16.7567 7.83285 16.7567 7.27102 16.4069 6.92727C16.0571 6.58352 15.4915 6.57983 15.1454 6.92727L10.0019 12.0247L4.85845 6.92727C4.50864 6.57983 3.94299 6.57983 3.5969 6.92727C3.25081 7.27472 3.24709 7.83655 3.5969 8.1803L9.37299 13.9061H9.36927Z\" fill=\"#114799\"/>\n </svg>\n </span>\n </button>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { useUIContext } from '../../../context';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport styles from './HotelCategoryFilter.module.css';\n\n/**\n * HotelCategoryFilter - Checkbox list for hotel star ratings\n *\n * Figma Spec:\n * - Checkbox list with star icons and counts\n * - Options: 5★, 4★, 3★, 2★, Swiss Lodge, No category\n * - Footer with HotellerieSuisse link\n */\n\nexport interface CategoryOption {\n value: string;\n stars: number;\n label: string | null;\n}\n\nexport const CATEGORY_OPTIONS: CategoryOption[] = [\n { value: '5', stars: 5, label: null },\n { value: '4', stars: 4, label: null },\n { value: '3', stars: 3, label: null },\n { value: '2', stars: 2, label: null },\n { value: 'swiss_lodge', stars: 0, label: 'Swiss Lodge' },\n { value: 'not_classified', stars: 0, label: 'No category' },\n];\n\ninterface HotelCategoryFilterProps {\n selected: string[];\n counts?: Record<string, number>;\n onChange: (values: string[]) => void;\n className?: string;\n}\n\nexport const HotelCategoryFilter: React.FC<HotelCategoryFilterProps> = ({\n selected,\n counts = {},\n onChange,\n className = '',\n}) => {\n const { t } = useUIContext();\n\n const handleToggle = (value: string) => {\n if (selected.includes(value)) {\n onChange(selected.filter(v => v !== value));\n } else {\n onChange([...selected, value]);\n }\n };\n\n return (\n <div className={className}>\n <div className={styles.filterList}>\n {CATEGORY_OPTIONS.map((option) => {\n const count = counts[option.value];\n const isDisabled = count === 0 && !selected.includes(option.value);\n return (\n <FilterCheckboxItem\n key={option.value}\n id={`category-${option.value}`}\n label={\n option.stars > 0 ? (\n <div className={styles.starsContainer}>\n {Array.from({ length: option.stars }).map((_, i) => (\n <svg key={i} className={styles.starIcon} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M12 0L14.6942 8.2918H23.4127L16.3593 13.4164L19.0534 21.7082L12 16.5836L4.94658 21.7082L7.64074 13.4164L0.587322 8.2918H9.30583L12 0Z\" />\n </svg>\n ))}\n </div>\n ) : (\n t(`star_rating.${option.value}`, option.label || option.value)\n )\n }\n count={count}\n checked={selected.includes(option.value)}\n disabled={isDisabled}\n onChange={() => handleToggle(option.value)}\n trackName={`filter-category-${option.value}`}\n />\n );\n })}\n </div>\n <div className={styles.footer}>\n <span className={styles.footerText}>\n {t('filter.hotellerie-suisse', 'Classification by HotellerieSuisse')}\n </span>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport type { FilterOption } from '../FilterPanel';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport styles from './CheckboxFilter.module.css';\n\n/**\n * MealsFilter - Checkbox list for meal options\n *\n * Figma Spec:\n * - Checkbox list with counts\n * - Options: Breakfast, Restaurant\n *\n * Options now come from API with pre-translated names\n */\n\ninterface MealsFilterProps {\n selected: string[];\n counts?: Record<string, number>;\n /** Filter options from API with pre-translated names */\n options?: FilterOption[];\n onChange: (values: string[]) => void;\n className?: string;\n}\n\nexport const MealsFilter: React.FC<MealsFilterProps> = ({\n selected,\n counts = {},\n options = [],\n onChange,\n className = '',\n}) => {\n const handleToggle = (value: string) => {\n if (selected.includes(value)) {\n onChange(selected.filter(v => v !== value));\n } else {\n onChange([...selected, value]);\n }\n };\n\n // Don't render if no options available\n if (options.length === 0) {\n return null;\n }\n\n return (\n <div className={`${styles.filterList} ${className}`}>\n {options.map((option) => {\n const count = counts[option.key];\n const isDisabled = count === 0 && !selected.includes(option.key);\n return (\n <FilterCheckboxItem\n key={option.key}\n id={`meal-${option.key}`}\n label={option.name}\n count={count}\n checked={selected.includes(option.key)}\n disabled={isDisabled}\n onChange={() => handleToggle(option.key)}\n trackName={`filter-meals-${option.key}`}\n />\n );\n })}\n </div>\n );\n};\n","import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { useUIContext } from '../../../context';\nimport styles from './PriceRangeFilter.module.css';\n\n// Default histogram data (will be replaced by real data from API)\nconst DEFAULT_HISTOGRAM = [\n 12, 25, 38, 45, 52, 48, 42, 35, 28, 22, 18, 15, 12, 10, 8, 6, 5, 4, 3, 2\n];\n\n// Minimum number of buckets to show a meaningful histogram\nconst MIN_HISTOGRAM_BUCKETS = 5;\n\n/**\n * Normalize histogram to always have a consistent number of buckets (20)\n * This handles cases where API returns very few buckets (e.g., only 2 hotels)\n */\nfunction normalizeHistogram(histogram: number[]): number[] {\n const targetBuckets = 20;\n\n // If histogram is empty or too sparse, return empty to hide it\n if (!histogram || histogram.length === 0) {\n return [];\n }\n\n // If histogram has fewer than minimum buckets, it's not meaningful to display\n if (histogram.length < MIN_HISTOGRAM_BUCKETS) {\n return [];\n }\n\n // If already has target buckets, return as-is\n if (histogram.length === targetBuckets) {\n return histogram;\n }\n\n // If more buckets than target, downsample by combining adjacent buckets\n if (histogram.length > targetBuckets) {\n const result: number[] = [];\n const ratio = histogram.length / targetBuckets;\n for (let i = 0; i < targetBuckets; i++) {\n const start = Math.floor(i * ratio);\n const end = Math.floor((i + 1) * ratio);\n let sum = 0;\n for (let j = start; j < end; j++) {\n sum += histogram[j];\n }\n result.push(sum);\n }\n return result;\n }\n\n // If fewer buckets than target, upsample by distributing values\n // This creates a smoother visualization for sparse data\n const result: number[] = new Array(targetBuckets).fill(0);\n const ratio = targetBuckets / histogram.length;\n for (let i = 0; i < histogram.length; i++) {\n const targetIndex = Math.floor(i * ratio);\n result[targetIndex] += histogram[i];\n }\n return result;\n}\n\nexport interface PriceRangeFilterProps {\n minPrice: number;\n maxPrice: number;\n value: { min: number; max: number };\n onChange: (value: { min: number; max: number }) => void;\n /** New prop: Called only when user finishes selecting (debounced) */\n onApply?: (value: { min: number; max: number }) => void;\n histogram?: number[];\n currency?: string;\n /** Called when user is actively dragging (to prevent apply during drag) */\n onDragStart?: () => void;\n onDragEnd?: () => void;\n /** Show loading skeleton instead of filter */\n isLoading?: boolean;\n /** Debounce delay in milliseconds for onApply */\n debounceDelay?: number;\n}\n\nexport const PriceRangeFilter: React.FC<PriceRangeFilterProps> = ({\n minPrice,\n maxPrice,\n value,\n onChange,\n onApply,\n histogram = DEFAULT_HISTOGRAM,\n currency,\n onDragStart,\n onDragEnd,\n debounceDelay = 500,\n}) => {\n const { t, currency: contextCurrency } = useUIContext();\n const displayCurrency = currency ?? contextCurrency;\n\n const sliderRef = useRef<HTMLDivElement>(null);\n const [isDragging, setIsDragging] = useState<'min' | 'max' | null>(null);\n const [isDraggingExternal, setIsDraggingExternal] = useState(false);\n\n // Store the last value to debounce\n const lastValueRef = useRef(value);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n // Input state for editable fields\n const [minInputValue, setMinInputValue] = useState('');\n const [maxInputValue, setMaxInputValue] = useState('');\n const [minInputFocused, setMinInputFocused] = useState(false);\n const [maxInputFocused, setMaxInputFocused] = useState(false);\n\n // Calculate percentages for slider positioning\n const range = maxPrice - minPrice;\n const minPercent = range > 0 ? ((value.min - minPrice) / range) * 100 : 0;\n const maxPercent = range > 0 ? ((value.max - minPrice) / range) * 100 : 100;\n\n // Normalize histogram to consistent bucket count, or hide if too sparse\n const normalizedHistogram = normalizeHistogram(histogram);\n const showHistogram = normalizedHistogram.length > 0;\n\n // Normalize histogram values\n const maxHistogramValue = Math.max(...normalizedHistogram, 1);\n\n // Check if histogram bar is in the selected range\n const getBarActive = useCallback((index: number) => {\n const barStartPercent = (index / normalizedHistogram.length) * 100;\n const barEndPercent = ((index + 1) / normalizedHistogram.length) * 100;\n return barStartPercent < maxPercent && barEndPercent > minPercent;\n }, [normalizedHistogram.length, minPercent, maxPercent]);\n\n // Track is inset by 12px (--size-rem-0-75) on each side\n const trackInset = 12; // px value of --size-rem-0-75\n\n // Function to trigger onApply with debounce\n const triggerOnApply = useCallback((newValue: { min: number; max: number }) => {\n if (!onApply) return;\n\n // Clear any existing timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n // Set new timeout\n timeoutRef.current = setTimeout(() => {\n onApply(newValue);\n }, debounceDelay);\n }, [onApply, debounceDelay]);\n\n // Handle slider drag\n const handleDrag = useCallback((clientX: number) => {\n if (!sliderRef.current || !isDragging) return;\n\n const rect = sliderRef.current.getBoundingClientRect();\n // Account for track inset: track starts at trackInset and ends at (width - trackInset)\n const trackWidth = rect.width - (trackInset * 2);\n const trackLeft = rect.left + trackInset;\n const percent = Math.max(0, Math.min(100, ((clientX - trackLeft) / trackWidth) * 100));\n const newValue = Math.round(minPrice + (percent / 100) * range);\n\n let newMin = value.min;\n let newMax = value.max;\n\n if (isDragging === 'min') {\n const clampedValue = Math.min(newValue, value.max - 1);\n newMin = Math.max(minPrice, clampedValue);\n } else {\n const clampedValue = Math.max(newValue, value.min + 1);\n newMax = Math.min(maxPrice, clampedValue);\n }\n\n // Update UI immediately\n const newRange = { min: newMin, max: newMax };\n onChange(newRange);\n\n // Store for debounced apply\n lastValueRef.current = newRange;\n\n // Only trigger onApply if we're not dragging (for keyboard/input changes)\n // During drag, we'll call it in the drag end handler\n if (!isDraggingExternal) {\n triggerOnApply(newRange);\n }\n }, [isDragging, minPrice, maxPrice, range, value, onChange, isDraggingExternal, triggerOnApply]);\n\n // Mouse events for desktop\n const handleMouseDown = (handle: 'min' | 'max') => (e: React.MouseEvent) => {\n e.preventDefault();\n setIsDragging(handle);\n setIsDraggingExternal(true);\n onDragStart?.();\n };\n\n // Touch events for mobile\n // Note: Don't call preventDefault here - React's touch events are passive by default\n // We prevent scrolling in the document-level touchmove handler instead\n const handleTouchStart = (handle: 'min' | 'max') => () => {\n setIsDragging(handle);\n setIsDraggingExternal(true);\n onDragStart?.();\n };\n\n // Handle drag end - trigger onApply immediately\n const handleDragEnd = useCallback(() => {\n if (isDraggingExternal && onApply) {\n // Trigger apply immediately when drag ends\n onApply(lastValueRef.current);\n }\n setIsDragging(null);\n setIsDraggingExternal(false);\n onDragEnd?.();\n }, [isDraggingExternal, onApply, onDragEnd]);\n\n // Global mouse/touch move and up handlers\n useEffect(() => {\n if (!isDragging) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n handleDrag(e.clientX);\n };\n\n const handleTouchMove = (e: TouchEvent) => {\n // Prevent scrolling while dragging the slider\n e.preventDefault();\n if (e.touches.length > 0) {\n handleDrag(e.touches[0].clientX);\n }\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleDragEnd);\n document.addEventListener('touchmove', handleTouchMove, { passive: false });\n document.addEventListener('touchend', handleDragEnd);\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleDragEnd);\n document.removeEventListener('touchmove', handleTouchMove);\n document.removeEventListener('touchend', handleDragEnd);\n\n // Clear timeout on unmount\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [isDragging, handleDrag, handleDragEnd]);\n\n // Input handlers\n const handleMinInputFocus = () => {\n setMinInputFocused(true);\n setMinInputValue(value.min.toString());\n };\n\n const handleMaxInputFocus = () => {\n setMaxInputFocused(true);\n setMaxInputValue(value.max.toString());\n };\n\n const handleMinInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value.replace(/[^0-9]/g, '');\n setMinInputValue(val);\n };\n\n const handleMaxInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value.replace(/[^0-9]/g, '');\n setMaxInputValue(val);\n };\n\n const handleMinInputBlur = () => {\n setMinInputFocused(false);\n const numValue = parseInt(minInputValue, 10);\n if (!isNaN(numValue)) {\n const clampedValue = Math.max(minPrice, Math.min(numValue, value.max - 1));\n const newRange = { min: clampedValue, max: value.max };\n onChange(newRange);\n if (onApply) {\n triggerOnApply(newRange);\n }\n }\n };\n\n const handleMaxInputBlur = () => {\n setMaxInputFocused(false);\n const numValue = parseInt(maxInputValue, 10);\n if (!isNaN(numValue)) {\n const clampedValue = Math.min(maxPrice, Math.max(numValue, value.min + 1));\n const newRange = { min: value.min, max: clampedValue };\n onChange(newRange);\n if (onApply) {\n triggerOnApply(newRange);\n }\n }\n };\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, []);\n\n return (\n <div className={styles.priceRangeWrapper}>\n {/* Price Inputs */}\n <div className={styles.priceInputs}>\n <div className={styles.priceInputWrapper}>\n <input\n type=\"text\"\n inputMode=\"numeric\"\n className={styles.priceInput}\n value={minInputFocused ? minInputValue : `${displayCurrency} ${value.min}`}\n onChange={handleMinInputChange}\n onFocus={handleMinInputFocus}\n onBlur={handleMinInputBlur}\n aria-label={t('filter.min-price', 'Minimum price')}\n />\n </div>\n <div className={styles.priceInputDivider}>—</div>\n <div className={styles.priceInputWrapper}>\n <input\n type=\"text\"\n inputMode=\"numeric\"\n className={styles.priceInput}\n value={maxInputFocused ? maxInputValue : `${displayCurrency} ${value.max}`}\n onChange={handleMaxInputChange}\n onFocus={handleMaxInputFocus}\n onBlur={handleMaxInputBlur}\n aria-label={t('filter.max-price', 'Maximum price')}\n />\n </div>\n </div>\n\n {/* Histogram - only show if we have enough data for meaningful visualization */}\n {showHistogram && (\n <div className={styles.histogram}>\n {normalizedHistogram.map((histValue, index) => {\n const height = (histValue / maxHistogramValue) * 100;\n const isActive = getBarActive(index);\n return (\n <div\n key={index}\n className={`${styles.histogramBar} ${isActive ? styles.histogramBarActive : ''}`}\n style={{ height: `${Math.max(height, 10)}%` }}\n />\n );\n })}\n </div>\n )}\n\n {/* Dual Range Slider */}\n <div className={styles.sliderContainer} ref={sliderRef}>\n <div className={styles.sliderTrack} />\n <div\n className={styles.sliderActiveTrack}\n style={{\n left: `calc(var(--size-rem-0-75) + (100% - 2 * var(--size-rem-0-75)) * ${minPercent / 100})`,\n width: `calc((100% - 2 * var(--size-rem-0-75)) * ${(maxPercent - minPercent) / 100})`\n }}\n />\n <div\n className={`${styles.sliderHandle} ${isDragging === 'min' ? styles.sliderHandleActive : ''}`}\n style={{ left: `calc(var(--size-rem-0-75) + (100% - 2 * var(--size-rem-0-75)) * ${minPercent / 100})` }}\n onMouseDown={handleMouseDown('min')}\n onTouchStart={handleTouchStart('min')}\n role=\"slider\"\n aria-label={t('filter.min-price', 'Minimum price')}\n aria-valuenow={value.min}\n aria-valuemin={minPrice}\n aria-valuemax={value.max}\n tabIndex={0}\n />\n <div\n className={`${styles.sliderHandle} ${isDragging === 'max' ? styles.sliderHandleActive : ''}`}\n style={{ left: `calc(var(--size-rem-0-75) + (100% - 2 * var(--size-rem-0-75)) * ${maxPercent / 100})` }}\n onMouseDown={handleMouseDown('max')}\n onTouchStart={handleTouchStart('max')}\n role=\"slider\"\n aria-label={t('filter.max-price', 'Maximum price')}\n aria-valuenow={value.max}\n aria-valuemin={value.min}\n aria-valuemax={maxPrice}\n tabIndex={0}\n />\n </div>\n </div>\n );\n};\n\nexport default PriceRangeFilter;\n","import React, { useState, useEffect, useRef, useMemo, useCallback } from 'react';\nimport { useUIContext } from '../../../context';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport styles from './RegionsFilter.module.css';\nimport { Chip } from '../../Chip';\n\n/**\n * RegionsFilter - Accordion-style destinations filter\n *\n * Figma Spec (632-51682, 702-76591):\n * - Country rows are accordion headers (NO checkbox on country)\n * - Clicking country row expands/collapses accordion (does NOT auto-select)\n * - Country row: 56px height, gray background, 12px border-radius\n * - Count badge: pill shape in country row\n * - Chevron: 20x20px, rotates on expand\n * - Sub-regions appear as checkbox list when country is expanded\n */\n\nexport interface RegionOption {\n value: string;\n label: string;\n count?: number;\n subRegions?: RegionOption[];\n}\n\ninterface RegionsFilterProps {\n regions: RegionOption[];\n selected: string[];\n onChange: (values: string[]) => void;\n className?: string;\n isPlaceSearchActive?: boolean;\n searchType?: 'hotel' | 'city' | 'country' | 'region';\n searchValue?: string;\n selectedRegions?: string[];\n resetDestinationFilter?: () => void;\n}\n\nexport const RegionsFilter: React.FC<RegionsFilterProps> = ({\n regions,\n selected,\n onChange,\n className = '',\n isPlaceSearchActive = false,\n searchType,\n searchValue,\n selectedRegions = [],\n resetDestinationFilter\n}) => {\n const { t } = useUIContext();\n\n const shouldShowResetContainer = useMemo(() => {\n return !!((searchType === 'hotel' || searchType === 'city' || !searchType) && searchValue?.trim());\n }, [searchType, searchValue, selected]);\n\n const findRegionByValue = useCallback((\n regions: RegionOption[],\n value: string\n ): RegionOption | undefined => {\n const topLevelMatch = regions.find(region => region.value === value);\n if (topLevelMatch) return topLevelMatch;\n\n for (const region of regions) {\n if (region.subRegions) {\n const subMatch = findRegionByValue(region.subRegions, value);\n if (subMatch) return subMatch;\n }\n }\n return undefined;\n }, []);\n\n // Track which countries are expanded (accordion state)\n const [expandedCountries, setExpandedCountries] = useState<Set<string>>(new Set(['country_215']));\n\n // Track if we've done the initial expansion (only expand once on load)\n const hasInitializedRef = useRef(false);\n\n // Auto-expand countries that have selected sub-regions on initial load\n useEffect(() => {\n if (hasInitializedRef.current) return;\n if (regions.length === 0 || selected.length === 0) return;\n\n const countriesWithSelectedRegions = new Set<string>();\n regions.forEach(region => {\n if (region.subRegions?.some(sub => selected.includes(sub.value))) {\n countriesWithSelectedRegions.add(region.value);\n }\n });\n\n if (countriesWithSelectedRegions.size > 0) {\n setExpandedCountries(countriesWithSelectedRegions);\n hasInitializedRef.current = true;\n }\n }, [regions, selected]);\n\n // Toggle country accordion open/close\n const handleCountryToggle = (countryValue: string) => {\n setExpandedCountries(prev => {\n const next = new Set(prev);\n if (next.has(countryValue)) {\n next.delete(countryValue);\n } else {\n next.add(countryValue);\n }\n return next;\n });\n };\n\n // Toggle individual region checkbox\n const handleRegionToggle = (regionValue: string) => {\n if (selected.includes(regionValue)) {\n onChange(selected.filter(r => r !== regionValue));\n } else {\n onChange([...selected, regionValue]);\n }\n };\n\n const WarningIcon = () => {\n return <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M12 2.25C14.5859 2.25 17.0658 3.27723 18.8943 5.10571C20.7228 6.93419 21.75 9.41414 21.75 12C21.75 14.5859 20.7228 17.0658 18.8943 18.8943C17.0658 20.7228 14.5859 21.75 12 21.75C9.41414 21.75 6.93419 20.7228 5.10571 18.8943C3.27723 17.0658 2.25 14.5859 2.25 12C2.25 9.41414 3.27723 6.93419 5.10571 5.10571C6.93419 3.27723 9.41414 2.25 12 2.25ZM12 24C15.1826 24 18.2348 22.7357 20.4853 20.4853C22.7357 18.2348 24 15.1826 24 12C24 8.8174 22.7357 5.76516 20.4853 3.51472C18.2348 1.26428 15.1826 0 12 0C8.8174 0 5.76516 1.26428 3.51472 3.51472C1.26428 5.76516 0 8.8174 0 12C0 15.1826 1.26428 18.2348 3.51472 20.4853C5.76516 22.7357 8.8174 24 12 24ZM10.125 15.75C9.50156 15.75 9 16.2516 9 16.875C9 17.4984 9.50156 18 10.125 18H13.875C14.4984 18 15 17.4984 15 16.875C15 16.2516 14.4984 15.75 13.875 15.75H13.5V11.625C13.5 11.0016 12.9984 10.5 12.375 10.5H10.125C9.50156 10.5 9 11.0016 9 11.625C9 12.2484 9.50156 12.75 10.125 12.75H11.25V15.75H10.125ZM12 9C12.3978 9 12.7794 8.84196 13.0607 8.56066C13.342 8.27936 13.5 7.89782 13.5 7.5C13.5 7.10218 13.342 6.72064 13.0607 6.43934C12.7794 6.15804 12.3978 6 12 6C11.6022 6 11.2206 6.15804 10.9393 6.43934C10.658 6.72064 10.5 7.10218 10.5 7.5C10.5 7.89782 10.658 8.27936 10.9393 8.56066C11.2206 8.84196 11.6022 9 12 9Z\" fill=\"#6B7280\"/>\n </svg>\n }\n\n if (regions.length === 0) {\n return null;\n }\n\n return (\n <>\n {shouldShowResetContainer && (\n <div className={styles.resetDestinationContainer}>\n <div className={styles.resetDestinationContent}>\n <div className={styles.resetDestinationStyles}>\n <WarningIcon />\n <p className={styles.resetDestinationText}>\n {t('general.reset-destination', 'Reset destination search')}\n </p>\n </div>\n </div>\n <div className={styles.chips}>\n <>\n {searchValue?.trim() && (\n <Chip\n label={searchValue}\n size=\"small\"\n state=\"idle\"\n removable\n onRemove={() => {resetDestinationFilter?.()}}\n />\n )}\n </>\n </div>\n </div>\n )}\n {!shouldShowResetContainer && (\n <div className={`${styles.filterList} ${className}`}>\n {regions.map((region) => {\n const hasSubRegions = region.subRegions && region.subRegions.length > 0;\n const isExpanded = expandedCountries.has(region.value);\n\n return (\n <div key={region.value} className={styles.regionItem}>\n {/* Country row - accordion header (no checkbox) */}\n <button\n type=\"button\"\n className={`${styles.countryRow} ${isExpanded ? styles.countryRowExpanded : ''}`}\n onClick={() => handleCountryToggle(region.value)}\n aria-expanded={isExpanded}\n disabled={isPlaceSearchActive}\n >\n <div className={styles.countryInfo}>\n <span className={styles.countryName}>\n {region.label}\n </span>\n\n {region.count !== undefined && (\n <span className={styles.countBadge}>{region.count}</span>\n )}\n </div>\n\n {hasSubRegions && (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\"\n className={`${styles.chevron} ${isExpanded ? styles.chevronExpanded : ''}`}\n >\n <path d=\"M9.36927 13.9061C9.71908 14.2535 10.2847 14.2535 10.6308 13.9061L16.4069 8.18027C16.7567 7.83283 16.7567 7.271 16.4069 6.92725C16.0571 6.5835 15.4915 6.5798 15.1454 6.92725L10.0019 12.0247L4.85845 6.92725C4.50864 6.5798 3.94299 6.5798 3.5969 6.92725C3.25081 7.2747 3.24709 7.83652 3.5969 8.18027L9.37299 13.9061H9.36927Z\" fill=\"#6B7280\"/>\n </svg>\n )}\n </button>\n\n {/* Mobile-only Select All / Reset (PLACED HERE — BEFORE sub-regions) */}\n {hasSubRegions && isExpanded && (() => {\n // Check if there are any selectable regions (count > 0)\n const hasSelectableRegions = region.subRegions!.some(\n sr => sr.count === undefined || sr.count > 0\n );\n // Check if any sub-regions of this country are selected\n const subValues = region.subRegions!.map(sr => sr.value);\n const hasSelectedRegions = subValues.some(v => selected.includes(v));\n return (\n <div className={styles.mobileSelectAllActions}>\n <button\n type=\"button\"\n className={styles.selectAllBtn}\n disabled={!hasSelectableRegions}\n onClick={() => {\n // Only select regions with count > 0 (exclude disabled ones)\n const selectableSubValues = region.subRegions!\n .filter(sr => sr.count === undefined || sr.count > 0)\n .map(sr => sr.value);\n const merged = Array.from(new Set([...selected, ...selectableSubValues]));\n onChange(merged);\n }}\n >\n {t('filter.select-all', 'Select all')}\n </button>\n\n <button\n type=\"button\"\n className={styles.resetAllBtn}\n disabled={!hasSelectedRegions}\n onClick={() => {\n onChange(selected.filter(v => !subValues.includes(v)));\n }}\n >\n {t('filter.reset', 'Reset')}\n </button>\n </div>\n );\n })()}\n\n {/* Sub-regions (checkbox list) */}\n {hasSubRegions && isExpanded && (\n <div className={styles.subRegions}>\n {region.subRegions!.map((subRegion) => {\n const isDisabled =\n // Disabled by count\n (subRegion.count === 0 && !selected.includes(subRegion.value)) ||\n\n // Disabled by active place search\n (isPlaceSearchActive && !selected.includes(subRegion.value));\n return (\n <FilterCheckboxItem\n key={subRegion.value}\n id={`region-${subRegion.value}`}\n label={subRegion.label}\n count={subRegion.count}\n checked={selected.includes(subRegion.value)}\n disabled={isDisabled}\n onChange={() => handleRegionToggle(subRegion.value)}\n trackName={`filter-region-${subRegion.value}`}\n />\n );\n })}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </>\n );\n};\n\n// Default regions (placeholder - will be overridden by API data)\nexport const DEFAULT_REGIONS: RegionOption[] = [\n {\n value: 'switzerland',\n label: 'Switzerland',\n subRegions: [\n { value: 'aargau', label: 'Aargau' },\n { value: 'basel', label: 'Basel (region)' },\n { value: 'bern', label: 'Bern (region)' },\n { value: 'graubunden', label: 'Graubünden' },\n { value: 'zurich', label: 'Zürich' },\n ]\n },\n { value: 'germany', label: 'Germany' },\n { value: 'austria', label: 'Austria' },\n { value: 'italy', label: 'Italy' },\n { value: 'france', label: 'France' },\n];\n","import React from 'react';\nimport { useUIContext } from '../../../context';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport styles from './CheckboxFilter.module.css';\nimport reviewStyles from './ReviewsFilter.module.css';\n\n/**\n * ReviewsFilter - Checkbox list for filtering by review rating\n *\n * Figma Spec:\n * - Checkbox list with counts\n * - Options: Excellent (4.4+), Very Good (4.1-4.3), Good (3.8-4.0), Fair (3.5-3.7), No rating\n * - Footer: TrustYou attribution\n */\n\nexport interface ReviewOption {\n value: string;\n labelKey: string;\n range: string;\n}\n\n// Review filter options from Figma - using design-tokens keys\nexport const REVIEW_OPTIONS: ReviewOption[] = [\n { value: 'excellent', labelKey: 'label.rating-excellent', range: '(4.4+)' },\n { value: 'very_good', labelKey: 'label.rating-very-good', range: '(4.1 – 4.3)' },\n { value: 'good', labelKey: 'label.rating-good', range: '(3.8 – 4.0)' },\n { value: 'fair', labelKey: 'label.rating-fair', range: '(3.5 – 3.7)' },\n { value: 'no_rating', labelKey: 'label.rating-none', range: '' },\n];\n\ninterface ReviewsFilterProps {\n selected: string[];\n counts?: Record<string, number>;\n onChange: (values: string[]) => void;\n className?: string;\n isPlaceSearchActive?: boolean;\n}\n\nexport const ReviewsFilter: React.FC<ReviewsFilterProps> = ({\n selected,\n counts = {},\n onChange,\n className = '',\n isPlaceSearchActive = false,\n}) => {\n const { t } = useUIContext();\n\n const handleToggle = (value: string) => {\n if (selected.includes(value)) {\n onChange(selected.filter(v => v !== value));\n } else {\n onChange([...selected, value]);\n }\n };\n\n return (\n <div className={className}>\n <div className={styles.filterList}>\n {REVIEW_OPTIONS.map((option) => {\n const count = counts[option.value];\n const isDisabled =\n !isPlaceSearchActive && count === 0 && !selected.includes(option.value);\n return (\n <FilterCheckboxItem\n key={option.value}\n id={`review-${option.value}`}\n label={\n <>\n {t(option.labelKey, option.value)}\n {option.range && (\n <span className={reviewStyles.filterRange}> {option.range}</span>\n )}\n </>\n }\n count={count}\n checked={selected.includes(option.value)}\n disabled={isDisabled}\n onChange={() => handleToggle(option.value)}\n trackName={`filter-review-${option.value}`}\n />\n );\n })}\n </div>\n <div className={reviewStyles.footer}>\n <span className={reviewStyles.footerText}>\n {t('filter.trustyou', 'Ratings by TrustYou')}\n </span>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { useUIContext } from '../../../context';\nimport { Chip } from '../../Chip';\nimport { Button } from '../../Button';\nimport styles from './SelectedFiltersRow.module.css';\n\n/**\n * SelectedFiltersRow - Shows active filters as removable chips\n *\n * Figma: 746-94121\n *\n * Specs:\n * - Horizontal wrapping flex layout\n * - Each chip uses Chip/Filter component (small size)\n * - \"Clear all\" link at end\n * - Hidden when no filters active\n */\n\nexport interface SelectedFilter {\n id: string;\n label: string;\n type: string; // e.g., 'discount', 'category', 'experience', etc.\n value: string;\n}\n\ninterface SelectedFiltersRowProps {\n filters: SelectedFilter[];\n onRemove: (filter: SelectedFilter) => void;\n onClearAll: () => void;\n className?: string;\n}\n\nexport const SelectedFiltersRow: React.FC<SelectedFiltersRowProps> = ({\n filters,\n onRemove,\n onClearAll,\n className = '',\n}) => {\n const { t } = useUIContext();\n if (filters.length === 0) {\n return null;\n }\n\n return (\n <div className={`${styles.container} ${className}`}>\n <div className={styles.chipsWrapper}>\n {/* Show only once at top */}\n <p className={styles.selectedText}>{t('filter.selected', 'Selected')} </p>\n <div className={styles.chips}>\n {filters.map((filter) => (\n <Chip\n key={filter.id}\n label={filter.label}\n size=\"small\"\n state=\"idle\"\n removable\n onRemove={() => onRemove(filter)}\n />\n ))}\n {onClearAll && (\n <Button\n variant=\"link\"\n className={styles.footerLink}\n onClick={onClearAll}\n >\n {t('filter.clear-all', 'Clear all')}\n </Button>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport type { FilterOption } from '../FilterPanel';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport styles from './CheckboxFilter.module.css';\n\n/**\n * TransportFilter - Checkbox list for transport/parking options\n *\n * Figma Spec:\n * - Checkbox list with counts\n * - Options: Free parking, EV charging station\n *\n * Options now come from API with pre-translated names\n */\n\ninterface TransportFilterProps {\n selected: string[];\n counts?: Record<string, number>;\n /** Filter options from API with pre-translated names */\n options?: FilterOption[];\n onChange: (values: string[]) => void;\n className?: string;\n}\n\nexport const TransportFilter: React.FC<TransportFilterProps> = ({\n selected,\n counts = {},\n options = [],\n onChange,\n className = '',\n}) => {\n const handleToggle = (value: string) => {\n if (selected.includes(value)) {\n onChange(selected.filter(v => v !== value));\n } else {\n onChange([...selected, value]);\n }\n };\n\n // Don't render if no options available\n if (options.length === 0) {\n return null;\n }\n\n return (\n <div className={`${styles.filterList} ${className}`}>\n {options.map((option) => {\n const count = counts[option.key];\n const isDisabled = count === 0 && !selected.includes(option.key);\n return (\n <FilterCheckboxItem\n key={option.key}\n id={`transport-${option.key}`}\n label={option.name}\n count={count}\n checked={selected.includes(option.key)}\n disabled={isDisabled}\n onChange={() => handleToggle(option.key)}\n trackName={`filter-transport-${option.key}`}\n />\n );\n })}\n </div>\n );\n};\n","import React from 'react';\nimport type { FilterOption } from '../FilterPanel';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport styles from './CheckboxFilter.module.css';\n\n/**\n * WellnessFilter - Checkbox list for wellness & spa amenities\n *\n * Figma Spec:\n * - Checkbox list with counts\n * - Options: Indoor pool, Outdoor pool, Sauna/Steam bath, Massage, Cosmetic treatments\n *\n * Options now come from API with pre-translated names\n */\n\ninterface WellnessFilterProps {\n selected: string[];\n counts?: Record<string, number>;\n /** Filter options from API with pre-translated names */\n options?: FilterOption[];\n onChange: (values: string[]) => void;\n className?: string;\n}\n\nexport const WellnessFilter: React.FC<WellnessFilterProps> = ({\n selected,\n counts = {},\n options = [],\n onChange,\n className = '',\n}) => {\n const handleToggle = (value: string) => {\n if (selected.includes(value)) {\n onChange(selected.filter(v => v !== value));\n } else {\n onChange([...selected, value]);\n }\n };\n\n // Don't render if no options available\n if (options.length === 0) {\n return null;\n }\n\n return (\n <div className={`${styles.filterList} ${className}`}>\n {options.map((option) => {\n const count = counts[option.key];\n const isDisabled = count === 0 && !selected.includes(option.key);\n return (\n <FilterCheckboxItem\n key={option.key}\n id={`wellness-${option.key}`}\n label={option.name}\n count={count}\n checked={selected.includes(option.key)}\n disabled={isDisabled}\n onChange={() => handleToggle(option.key)}\n trackName={`filter-wellness-${option.key}`}\n />\n );\n })}\n </div>\n );\n};\n","import React from 'react';\nimport { useUIContext } from '../../../context';\nimport { Button } from '../../Button';\nimport styles from './FilterMinimap.module.css';\n\n/**\n * FilterMinimap - Map preview at top of filter sidebar\n *\n * Figma: Desktop List View (723-97947)\n *\n * Features:\n * - Static map preview showing search area\n * - \"View in a Map\" button to switch to map view\n * - Only shown on desktop (hidden on mobile)\n *\n * Specs:\n * - Height: 200px\n * - Border radius: 12px\n * - Button: small size, no icon\n */\n\nexport interface FilterMinimapProps {\n /** Callback when \"View in a Map\" is clicked */\n onViewMap: () => void;\n /** Optional center coordinates for the map preview */\n center?: { lat: number; lng: number };\n /** Optional zoom level */\n zoom?: number;\n /** Optional class name */\n className?: string;\n}\n\nexport const FilterMinimap: React.FC<FilterMinimapProps> = ({\n onViewMap,\n center,\n zoom = 9,\n className = '',\n}) => {\n const { t } = useUIContext();\n\n // Generate static map URL using OpenStreetMap\n // Default to Switzerland/Alps area\n const getStaticMapUrl = () => {\n const lat = center?.lat ?? 46.8;\n const lng = center?.lng ?? 9.8;\n const z = zoom;\n\n // Calculate tile coordinates\n const x = Math.floor((lng + 180) / 360 * Math.pow(2, z));\n const y = Math.floor((1 - Math.log(Math.tan(lat * Math.PI / 180) + 1 / Math.cos(lat * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, z));\n\n return `https://tile.openstreetmap.org/${z}/${x}/${y}.png`;\n };\n\n return (\n <div className={`${styles.container} ${className}`}>\n <div className={styles.mapPreview}>\n {/* Map background image */}\n <div\n className={styles.mapImage}\n style={{ backgroundImage: `url(${getStaticMapUrl()})` }}\n />\n\n {/* View in Map button */}\n <div className={styles.buttonContainer}>\n <Button\n variant=\"secondary\"\n size=\"small\"\n onClick={onViewMap}\n className={styles.viewMapText}\n >\n {t('filters.view_in_map', 'View in a Map')}\n </Button>\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport styles from './FilterSkeleton.module.css';\n\n/**\n * FilterSkeleton - Loading placeholder for filter sections\n *\n * Displays a shimmer animation while filter data is loading.\n * Shows placeholder items for checkbox-style filters.\n */\ninterface FilterSkeletonProps {\n /** Number of skeleton items to show */\n itemCount?: number;\n /** Show expandable country/region style skeleton */\n isRegionFilter?: boolean;\n /** Show price range slider style skeleton */\n isPriceFilter?: boolean;\n /** Show discount filter (checkbox list with 3 items) skeleton */\n isDiscountFilter?: boolean;\n /** Show category filter (star ratings) skeleton */\n isCategoryFilter?: boolean;\n}\n\nexport const FilterSkeleton: React.FC<FilterSkeletonProps> = ({\n itemCount = 5,\n isRegionFilter = false,\n isPriceFilter = false,\n isDiscountFilter = false,\n isCategoryFilter = false,\n}) => {\n // Price range filter skeleton - histogram + slider + inputs\n if (isPriceFilter) {\n return (\n <div className={styles.priceSkeleton}>\n {/* Histogram bars */}\n <div className={styles.histogramSkeleton}>\n {Array.from({ length: 20 }).map((_, idx) => (\n <div\n key={idx}\n className={`${styles.histogramBar} ${styles.skeleton}`}\n style={{ height: `${20 + Math.random() * 60}%` }}\n />\n ))}\n </div>\n {/* Slider track */}\n <div className={styles.sliderSkeleton}>\n <div className={`${styles.sliderTrack} ${styles.skeleton}`} />\n <div className={`${styles.sliderHandle} ${styles.skeleton}`} style={{ left: '20%' }} />\n <div className={`${styles.sliderHandle} ${styles.skeleton}`} style={{ left: '80%' }} />\n </div>\n {/* Price inputs */}\n <div className={styles.priceInputsSkeleton}>\n <div className={`${styles.priceInputBox} ${styles.skeleton}`} />\n <div className={styles.priceInputDivider}>—</div>\n <div className={`${styles.priceInputBox} ${styles.skeleton}`} />\n </div>\n </div>\n );\n }\n\n // Discount filter skeleton - 3 checkbox items\n if (isDiscountFilter) {\n return (\n <div className={styles.filterSkeleton}>\n {[1, 2, 3].map((idx) => (\n <div key={idx} className={styles.filterRow}>\n <div className={`${styles.checkbox} ${styles.skeleton}`} />\n <div className={`${styles.label} ${styles.skeleton}`} style={{ width: '40px' }} />\n <div className={`${styles.count} ${styles.skeleton}`} />\n </div>\n ))}\n </div>\n );\n }\n\n // Category filter skeleton - 5 star rating rows\n if (isCategoryFilter) {\n return (\n <div className={styles.filterSkeleton}>\n {[5, 4, 3, 2, 1].map((stars) => (\n <div key={stars} className={styles.filterRow}>\n <div className={`${styles.checkbox} ${styles.skeleton}`} />\n <div className={styles.starsRow}>\n {Array.from({ length: stars }).map((_, idx) => (\n <div key={idx} className={`${styles.star} ${styles.skeleton}`} />\n ))}\n </div>\n <div className={`${styles.count} ${styles.skeleton}`} />\n </div>\n ))}\n </div>\n );\n }\n\n if (isRegionFilter) {\n return (\n <div className={styles.regionSkeleton}>\n {/* Country items with sub-regions */}\n {[1, 2, 3].map((countryIdx) => (\n <div key={countryIdx} className={styles.countryGroup}>\n <div className={styles.countryRow}>\n <div className={`${styles.checkbox} ${styles.skeleton}`} />\n <div className={`${styles.countryLabel} ${styles.skeleton}`} />\n <div className={`${styles.count} ${styles.skeleton}`} />\n </div>\n {/* Sub-regions for first country only */}\n {countryIdx === 1 && (\n <div className={styles.subRegions}>\n {[1, 2, 3, 4].map((regionIdx) => (\n <div key={regionIdx} className={styles.regionRow}>\n <div className={`${styles.checkbox} ${styles.skeleton}`} />\n <div className={`${styles.regionLabel} ${styles.skeleton}`} />\n <div className={`${styles.count} ${styles.skeleton}`} />\n </div>\n ))}\n </div>\n )}\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <div className={styles.filterSkeleton}>\n {Array.from({ length: itemCount }).map((_, idx) => (\n <div key={idx} className={styles.filterRow}>\n <div className={`${styles.checkbox} ${styles.skeleton}`} />\n <div className={`${styles.label} ${styles.skeleton}`} style={{ width: `${60 + Math.random() * 30}%` }} />\n <div className={`${styles.count} ${styles.skeleton}`} />\n </div>\n ))}\n </div>\n );\n};\n\nexport default FilterSkeleton;\n","import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { useResponsive } from '../../hooks';\nimport { useUIContext } from '../../context';\nimport {\n CollapsibleFilterSection,\n FilterMinimap,\n ExperienceFilter,\n MealsFilter,\n ReviewsFilter,\n TransportFilter,\n WellnessFilter,\n HotelCategoryFilter,\n RegionsFilter,\n FilterSkeleton,\n PriceRangeFilter,\n FilterCheckboxItem,\n CATEGORY_OPTIONS,\n} from './components';\nimport type { RegionOption } from './components';\nimport styles from './FilterPanel.module.css';\n\n/**\n * FilterPanel - Sidebar filters for search results\n *\n * Figma Spec (Desktop):\n * - Width: 280px\n * - Position: Fixed left sidebar\n * - Independent scroll\n * - Filter groups: Selected, Regions, Experience, Price, Discount, Options, Meals, Category, Reviews, Transport, Wellness\n *\n * Figma Spec (Mobile):\n * - Full-screen modal overlay\n * - Opened by \"Filter\" button in search bar\n * - Shows active filter count badge\n */\n\n// Types for filter options from API\nexport interface ThemeAggregation {\n id: number;\n name: string;\n count: number;\n}\n\nexport interface FilterOption {\n id: number;\n key: string;\n name: string;\n}\n\nexport interface FilterOptions {\n meals?: FilterOption[];\n transport?: FilterOption[];\n wellness?: FilterOption[];\n services?: FilterOption[];\n}\n\nexport interface FilterPanelProps {\n onFilterChange?: (filters: FilterState) => void;\n /** Callback when \"View in a Map\" is clicked */\n onViewMap?: () => void;\n className?: string;\n /** Show skeleton loaders while filter data is loading */\n isLoading?: boolean;\n priceHistogram?: number[];\n minPrice?: number;\n maxPrice?: number;\n regions?: RegionOption[];\n discountCounts?: { [key: string]: number };\n optionsCounts?: { [key: string]: number };\n categoryCounts?: { [key: string]: number };\n experienceCounts?: { [key: string]: number };\n /** Theme aggregations with pre-translated names from API */\n themes?: ThemeAggregation[];\n mealsCounts?: { [key: string]: number };\n reviewsCounts?: { [key: string]: number };\n transportCounts?: { [key: string]: number };\n wellnessCounts?: { [key: string]: number };\n servicesCounts?: { [key: string]: number };\n /** Filter options with pre-translated names from database */\n filterOptions?: FilterOptions;\n /** Controlled selected values - synced with external state (e.g., URL params) */\n selectedDiscounts?: string[];\n selectedOptions?: string[];\n selectedExperiences?: string[];\n selectedRegions?: string[];\n selectedCategories?: string[];\n selectedMeals?: string[];\n selectedReviews?: string[];\n selectedTransport?: string[];\n selectedWellness?: string[];\n selectedServices?: string[];\n /** Controlled price range - synced with external state */\n selectedPriceRange?: { min: number; max: number } | null;\n /** Map center coordinates for minimap */\n mapCenter?: { lat: number; lng: number };\n searchType?: string;\n searchValue?: string;\n resetDestinationFilter?: () => void;\n}\n\nexport interface FilterState {\n regions?: string[];\n experiences?: string[];\n priceRange?: { min: number; max: number };\n discounts?: string[];\n options?: string[];\n meals?: string[];\n categories?: string[];\n ratings?: string[];\n transport?: string[];\n wellness?: string[];\n services?: string[];\n}\n\n// No default histogram - show skeleton until real data loads\n\n// Discount filter options - ordered highest to lowest per Figma design\nconst DISCOUNT_OPTIONS = [\n { value: '50', label: '50%' },\n { value: '30', label: '30%' },\n { value: '10', label: '10%' },\n];\n\n// Options filter - per Figma design\nconst OPTIONS_FILTER = [\n { value: 'instant_booking', labelKey: 'filter.instant-booking' },\n];\n\nexport const FilterPanel: React.FC<FilterPanelProps> = ({\n onFilterChange,\n onViewMap,\n className = '',\n isLoading = false,\n priceHistogram,\n minPrice = 50,\n maxPrice = 500,\n regions = [],\n searchType,\n searchValue,\n resetDestinationFilter,\n discountCounts = {},\n optionsCounts = {},\n categoryCounts = {},\n experienceCounts = {},\n themes = [],\n mealsCounts = {},\n reviewsCounts = {},\n transportCounts = {},\n wellnessCounts = {},\n servicesCounts = {},\n filterOptions,\n selectedDiscounts: externalDiscounts,\n selectedOptions: externalOptions,\n selectedExperiences: externalExperiences,\n selectedRegions: externalRegions,\n selectedCategories: externalCategories,\n selectedMeals: externalMeals,\n selectedReviews: externalReviews,\n selectedTransport: externalTransport,\n selectedWellness: externalWellness,\n selectedServices: externalServices,\n selectedPriceRange: externalPriceRange,\n mapCenter,\n}) => {\n const { isDesktop } = useResponsive();\n const { t, currency } = useUIContext();\n\n // Track if initial data has been loaded (to avoid showing skeleton on 0 results)\n // Once ANY filter data is loaded, we consider initial load complete\n const hasInitialLoadRef = useRef(false);\n\n // Mark initial load complete when any data arrives\n if (!hasInitialLoadRef.current) {\n if (regions.length > 0 ||\n (priceHistogram && priceHistogram.length > 0) ||\n Object.keys(discountCounts).length > 0 ||\n Object.keys(categoryCounts).length > 0) {\n hasInitialLoadRef.current = true;\n }\n }\n\n // Price range state - initialize from external prop or defaults\n const [priceMin, setPriceMin] = useState(externalPriceRange?.min ?? minPrice);\n const [priceMax, setPriceMax] = useState(externalPriceRange?.max ?? maxPrice);\n\n // Filter states - initialize from external props\n const [selectedRegions, setSelectedRegions] = useState<string[]>(externalRegions ?? []);\n const [selectedDiscounts, setSelectedDiscounts] = useState<string[]>(externalDiscounts ?? []);\n const [selectedOptions, setSelectedOptions] = useState<string[]>(externalOptions ?? []);\n const [selectedCategories, setSelectedCategories] = useState<string[]>(externalCategories ?? []);\n const [selectedExperiences, setSelectedExperiences] = useState<string[]>(externalExperiences ?? []);\n const [selectedMeals, setSelectedMeals] = useState<string[]>(externalMeals ?? []);\n const [selectedReviews, setSelectedReviews] = useState<string[]>(externalReviews ?? []);\n const [selectedTransport, setSelectedTransport] = useState<string[]>(externalTransport ?? []);\n const [selectedWellness, setSelectedWellness] = useState<string[]>(externalWellness ?? []);\n const [selectedServices, setSelectedServices] = useState<string[]>(externalServices ?? []);\n\n // Sync price range when props change (either from external or bounds)\n useEffect(() => {\n if (externalPriceRange) {\n setPriceMin(externalPriceRange.min);\n setPriceMax(externalPriceRange.max);\n } else {\n setPriceMin(minPrice);\n setPriceMax(maxPrice);\n }\n }, [externalPriceRange, minPrice, maxPrice]);\n\n // Sync all external filter states with internal state\n useEffect(() => {\n if (externalDiscounts !== undefined) {\n setSelectedDiscounts(externalDiscounts);\n }\n }, [externalDiscounts]);\n\n useEffect(() => {\n if (externalOptions !== undefined) {\n setSelectedOptions(externalOptions);\n }\n }, [externalOptions]);\n\n useEffect(() => {\n if (externalExperiences !== undefined) {\n setSelectedExperiences(externalExperiences);\n }\n }, [externalExperiences]);\n\n useEffect(() => {\n if (externalRegions !== undefined) {\n setSelectedRegions(externalRegions);\n }\n }, [externalRegions]);\n\n useEffect(() => {\n if (externalCategories !== undefined) {\n setSelectedCategories(externalCategories);\n }\n }, [externalCategories]);\n\n useEffect(() => {\n if (externalMeals !== undefined) {\n setSelectedMeals(externalMeals);\n }\n }, [externalMeals]);\n\n useEffect(() => {\n if (externalReviews !== undefined) {\n setSelectedReviews(externalReviews);\n }\n }, [externalReviews]);\n\n useEffect(() => {\n if (externalTransport !== undefined) {\n setSelectedTransport(externalTransport);\n }\n }, [externalTransport]);\n\n useEffect(() => {\n if (externalWellness !== undefined) {\n setSelectedWellness(externalWellness);\n }\n }, [externalWellness]);\n\n useEffect(() => {\n if (externalServices !== undefined) {\n setSelectedServices(externalServices);\n }\n }, [externalServices]);\n\n // Handle price range change from unified component\n const handlePriceChange = (value: { min: number; max: number }) => {\n setPriceMin(value.min);\n setPriceMax(value.max);\n };\n\n // Handle price apply - PriceRangeFilter already debounces, so we just call onFilterChange directly\n const handlePriceApply = useCallback((range: { min: number; max: number }) => {\n onFilterChange?.({ priceRange: range });\n }, [onFilterChange]);\n\n // Handle filter toggles\n const handleDiscountToggle = (discountValue: string) => {\n setSelectedDiscounts(prev => {\n const newDiscounts = prev.includes(discountValue)\n ? prev.filter(d => d !== discountValue)\n : [...prev, discountValue];\n onFilterChange?.({ discounts: newDiscounts });\n return newDiscounts;\n });\n };\n\n const handleOptionToggle = (optionValue: string) => {\n setSelectedOptions(prev => {\n const newOptions = prev.includes(optionValue)\n ? prev.filter(o => o !== optionValue)\n : [...prev, optionValue];\n onFilterChange?.({ options: newOptions });\n return newOptions;\n });\n };\n\n const handleCategoriesChange = (values: string[]) => {\n setSelectedCategories(values);\n onFilterChange?.({ categories: values });\n };\n\n const handleRegionsChange = (values: string[]) => {\n setSelectedRegions(values);\n onFilterChange?.({ regions: values });\n };\n\n const handleExperienceChange = (values: string[]) => {\n setSelectedExperiences(values);\n onFilterChange?.({ experiences: values });\n };\n\n const handleMealsChange = (values: string[]) => {\n setSelectedMeals(values);\n onFilterChange?.({ meals: values });\n };\n\n const handleReviewsChange = (values: string[]) => {\n setSelectedReviews(values);\n onFilterChange?.({ ratings: values });\n };\n\n const handleServicesChange = (values: string[]) => {\n setSelectedServices(values);\n onFilterChange?.({ services: values });\n };\n\n const handleTransportChange = (values: string[]) => {\n setSelectedTransport(values);\n onFilterChange?.({ transport: values });\n };\n\n const handleWellnessChange = (values: string[]) => {\n setSelectedWellness(values);\n onFilterChange?.({ wellness: values });\n };\n\n return (\n <aside className={`${styles.filterPanel} ${className}`}>\n <div className={styles.content}>\n {/* Minimap Preview - Desktop only */}\n {onViewMap && (\n <FilterMinimap\n onViewMap={onViewMap}\n center={mapCenter}\n />\n )}\n\n {/* Destinations Filter */}\n <CollapsibleFilterSection\n title={t('filter.destination', 'Destination')}\n defaultExpanded={true}\n >\n {/* Show skeleton when regions data is not loaded yet */}\n {regions.length === 0 && !hasInitialLoadRef.current ? (\n <FilterSkeleton isRegionFilter />\n ) : (\n <RegionsFilter\n regions={regions}\n selected={selectedRegions}\n onChange={handleRegionsChange}\n searchType={searchType as 'hotel' | 'city' | 'country' | 'region' | undefined}\n searchValue={searchValue}\n resetDestinationFilter={resetDestinationFilter}\n />\n )}\n </CollapsibleFilterSection>\n\n {/* Experience Filter */}\n <CollapsibleFilterSection\n title={t('filter.experience', 'Experience')}\n defaultExpanded={selectedExperiences.length > 0}\n >\n <ExperienceFilter\n selected={selectedExperiences}\n themes={themes}\n counts={experienceCounts}\n onChange={handleExperienceChange}\n />\n </CollapsibleFilterSection>\n\n {/* Price Range Filter */}\n <CollapsibleFilterSection\n title={t('filter.price', 'Price')}\n defaultExpanded={true}\n >\n {/* Show skeleton when price histogram data is not loaded yet */}\n {(!priceHistogram || priceHistogram.length === 0) && !hasInitialLoadRef.current ? (\n <FilterSkeleton isPriceFilter />\n ) : (\n <PriceRangeFilter\n minPrice={minPrice}\n maxPrice={maxPrice}\n value={{ min: priceMin, max: priceMax }}\n onChange={handlePriceChange}\n onApply={handlePriceApply}\n histogram={priceHistogram}\n currency={currency}\n />\n )}\n </CollapsibleFilterSection>\n\n {/* Discount Filter */}\n <CollapsibleFilterSection\n title={t('filter.discount', 'Discount')}\n defaultExpanded={true}\n >\n {/* Show skeleton when discount counts are not loaded yet */}\n {Object.keys(discountCounts).length === 0 && !hasInitialLoadRef.current ? (\n <FilterSkeleton isDiscountFilter />\n ) : (\n <div className={styles.discountList}>\n {DISCOUNT_OPTIONS.map(option => {\n const count = discountCounts[option.value];\n const isDisabled = count === 0 && !selectedDiscounts.includes(option.value);\n return (\n <FilterCheckboxItem\n key={option.value}\n id={`discount-${option.value}`}\n label={option.label}\n count={count}\n checked={selectedDiscounts.includes(option.value)}\n disabled={isDisabled}\n onChange={() => handleDiscountToggle(option.value)}\n />\n );\n })}\n </div>\n )}\n </CollapsibleFilterSection>\n\n {/* Options Filter - combines instant_booking + services per Figma */}\n <CollapsibleFilterSection\n title={t('filter.options', 'Options')}\n defaultExpanded={selectedOptions.length > 0 || selectedServices.length > 0}\n >\n <div className={styles.discountList}>\n {/* Instant booking option */}\n {OPTIONS_FILTER.map(option => {\n const count = optionsCounts[option.value];\n const isDisabled = count === 0 && !selectedOptions.includes(option.value);\n return (\n <FilterCheckboxItem\n key={option.value}\n id={`option-${option.value}`}\n label={t(option.labelKey, 'Instant booking')}\n count={count}\n checked={selectedOptions.includes(option.value)}\n disabled={isDisabled}\n onChange={() => handleOptionToggle(option.value)}\n />\n );\n })}\n {/* Services options (24h front desk, accessible, pets allowed) */}\n {filterOptions?.services?.map(option => {\n const count = servicesCounts[option.key];\n const isDisabled = count === 0 && !selectedServices.includes(option.key);\n return (\n <FilterCheckboxItem\n key={option.key}\n id={`service-${option.key}`}\n label={option.name}\n count={count}\n checked={selectedServices.includes(option.key)}\n disabled={isDisabled}\n onChange={() => handleServicesChange(\n selectedServices.includes(option.key)\n ? selectedServices.filter(v => v !== option.key)\n : [...selectedServices, option.key]\n )}\n />\n );\n })}\n </div>\n </CollapsibleFilterSection>\n\n {/* Meals Filter */}\n {filterOptions?.meals && filterOptions.meals.length > 0 && (\n <CollapsibleFilterSection\n title={t('filter.meals', 'Meals')}\n defaultExpanded={selectedMeals.length > 0}\n >\n <MealsFilter\n selected={selectedMeals}\n counts={mealsCounts}\n options={filterOptions.meals}\n onChange={handleMealsChange}\n />\n </CollapsibleFilterSection>\n )}\n\n {/* Hotel Category Filter */}\n <CollapsibleFilterSection\n title={t('filter.hotel-category', 'Hotel category')}\n defaultExpanded={true}\n >\n {/* Show skeleton when category counts are not loaded yet */}\n {Object.keys(categoryCounts).length === 0 && !hasInitialLoadRef.current ? (\n <FilterSkeleton isCategoryFilter />\n ) : (\n <HotelCategoryFilter\n selected={selectedCategories}\n counts={categoryCounts}\n onChange={handleCategoriesChange}\n />\n )}\n </CollapsibleFilterSection>\n\n {/* Reviews Filter */}\n <CollapsibleFilterSection\n title={t('filter.reviews', 'Reviews')}\n defaultExpanded={selectedReviews.length > 0}\n >\n <ReviewsFilter\n selected={selectedReviews}\n counts={reviewsCounts}\n onChange={handleReviewsChange}\n />\n </CollapsibleFilterSection>\n\n {/* Transport Options Filter */}\n {filterOptions?.transport && filterOptions.transport.length > 0 && (\n <CollapsibleFilterSection\n title={t('filter.mobility', 'Mobility')}\n defaultExpanded={selectedTransport.length > 0}\n >\n <TransportFilter\n selected={selectedTransport}\n counts={transportCounts}\n options={filterOptions.transport}\n onChange={handleTransportChange}\n />\n </CollapsibleFilterSection>\n )}\n\n {/* Wellness & Spa Filter */}\n {filterOptions?.wellness && filterOptions.wellness.length > 0 && (\n <CollapsibleFilterSection\n title={t('filter.wellness-spa', 'Wellness & Spa')}\n defaultExpanded={selectedWellness.length > 0}\n >\n <WellnessFilter\n selected={selectedWellness}\n counts={wellnessCounts}\n options={filterOptions.wellness}\n onChange={handleWellnessChange}\n />\n </CollapsibleFilterSection>\n )}\n\n </div>\n </aside>\n );\n};\n","import React, { useEffect } from 'react';\nimport { useUIContext } from '../../context';\nimport { Button } from '../Button';\nimport { FilterPanel, FilterPanelProps } from '../FilterPanel/FilterPanel';\nimport { SelectedFiltersRow, SelectedFilter } from '../FilterPanel/components/SelectedFiltersRow';\nimport styles from './FilterModal.module.css';\n\n/**\n * FilterModal - Modal wrapper for FilterPanel\n *\n * Used in:\n * - Mobile list view\n * - Map view (both desktop and mobile)\n *\n * This is just a modal container - all filter logic is in FilterPanel\n * Selected filters chips are passed from the parent (same as list view)\n */\n\nexport interface FilterModalProps extends Omit<FilterPanelProps, 'className' | 'onViewMap'> {\n isOpen: boolean;\n onClose: () => void;\n resultCount?: number;\n /** Selected filters to display as chips - passed from parent */\n selectedFilters?: SelectedFilter[];\n /** Handler for removing a single filter chip - passed from parent */\n onRemoveFilter?: (filter: SelectedFilter) => void;\n /** Handler for clearing all filters - passed from parent */\n onClearAllFilters?: () => void;\n}\n\n// Close icon\nconst CloseIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"15\" height=\"15\" viewBox=\"0 0 15 15\" fill=\"none\">\n <path d=\"M0.275391 1.59961C-0.0917969 1.23242 -0.0917969 0.638672 0.275391 0.275391C0.642578 -0.0878906 1.23633 -0.0917969 1.59961 0.275391L7.49805 6.17383L13.3965 0.275391C13.7637 -0.0917969 14.3574 -0.0917969 14.7207 0.275391C15.084 0.642578 15.0879 1.23633 14.7207 1.59961L8.82226 7.49805L14.7207 13.3965C15.0879 13.7637 15.0879 14.3574 14.7207 14.7207C14.3535 15.084 13.7598 15.0879 13.3965 14.7207L7.49805 8.82226L1.59961 14.7207C1.23242 15.0879 0.638672 15.0879 0.275391 14.7207C-0.0878906 14.3535 -0.0917969 13.7598 0.275391 13.3965L6.17383 7.49805L0.275391 1.59961Z\" fill=\"#1F2937\"/>\n </svg>\n);\n\nexport const FilterModal: React.FC<FilterModalProps> = ({\n isOpen,\n onClose,\n resultCount = 0,\n selectedFilters = [],\n onRemoveFilter,\n onClearAllFilters,\n onFilterChange,\n selectedDiscounts = [],\n selectedOptions = [],\n selectedCategories = [],\n selectedExperiences = [],\n selectedRegions = [],\n selectedMeals = [],\n selectedWellness = [],\n selectedServices = [],\n selectedTransport = [],\n selectedReviews = [],\n selectedPriceRange,\n minPrice = 0,\n maxPrice = 500,\n regions = [],\n ...filterPanelProps\n}) => {\n const { t } = useUIContext();\n const hasSelectedFilters = selectedFilters.length > 0;\n\n // Prevent body scroll when modal is open\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = '';\n };\n }\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n return (\n <div className={styles.overlay}>\n <div className={styles.modal}>\n {/* Header */}\n <div className={styles.header}>\n <h2 className={styles.title}>\n {t('filter.filters', 'Filters')}\n </h2>\n <Button\n variant=\"secondary\"\n size=\"small\"\n iconOnly\n onClick={onClose}\n aria-label={t('common.close', 'Close')}\n >\n <CloseIcon />\n </Button>\n </div>\n\n {/* Scrollable Content - FilterPanel */}\n <div className={styles.content}>\n {/* Selected filters chips - below header (reusing same component as list view) */}\n {selectedFilters.length > 0 && onRemoveFilter && onClearAllFilters && (\n <div className={styles.selectedFilters}>\n <SelectedFiltersRow\n filters={selectedFilters}\n onRemove={onRemoveFilter}\n onClearAll={onClearAllFilters}\n />\n </div>\n )}\n <FilterPanel\n {...filterPanelProps}\n onFilterChange={onFilterChange}\n selectedDiscounts={selectedDiscounts}\n selectedOptions={selectedOptions}\n selectedCategories={selectedCategories}\n selectedExperiences={selectedExperiences}\n selectedRegions={selectedRegions}\n selectedMeals={selectedMeals}\n selectedWellness={selectedWellness}\n selectedServices={selectedServices}\n selectedTransport={selectedTransport}\n selectedReviews={selectedReviews}\n selectedPriceRange={selectedPriceRange}\n minPrice={minPrice}\n maxPrice={maxPrice}\n regions={regions}\n className={styles.filterPanel}\n />\n </div>\n\n {/* Footer */}\n <div className={styles.footer}>\n {onClearAllFilters && (\n <Button\n variant=\"link\"\n className={styles.footerLink}\n onClick={onClearAllFilters}\n disabled={!hasSelectedFilters}\n >\n {t('filter.clear-all', 'Clear all')}\n </Button>\n )}\n <Button\n variant=\"primary\"\n size=\"medium\"\n onClick={onClose}\n >\n {t('filters.show_results', { count: resultCount }, `Show ${resultCount} results`)}\n </Button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default FilterModal;\n","import React, { useState, useRef } from 'react';\nimport { useUIContext } from '../../context';\nimport type { BookingCardDetailsProps } from './BookingCard.types';\n\nconst ChevronDownIcon = ({ expanded }: { expanded: boolean }) => (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ transform: expanded ? 'rotate(180deg)' : 'rotate(0deg)', transition: 'transform 0.2s' }}\n >\n <path d=\"M6 9L12 15L18 9\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nfunction formatDate(dateString: string, locale: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString(locale, {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n });\n}\n\nfunction formatDateTime(dateString: string, time: string | undefined, locale: string): string {\n const formatted = formatDate(dateString, locale);\n return time ? `${formatted}, ${time}` : formatted;\n}\n\nfunction formatPrice(amount: number, currency: string): string {\n return `${currency} ${amount.toFixed(0)}`;\n}\n\nexport const BookingCardDetails: React.FC<BookingCardDetailsProps> = ({\n booking,\n onCancelBooking,\n}) => {\n const { t, locale } = useUIContext();\n const [isExpanded, setIsExpanded] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n\n const handleToggle = () => {\n const willExpand = !isExpanded;\n setIsExpanded(willExpand);\n\n if (willExpand) {\n setTimeout(() => {\n contentRef.current?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }, 50);\n }\n };\n\n const guestsText = booking.children > 0\n ? `${booking.adults} adults, ${booking.children} children`\n : `${booking.guests} guests`;\n\n return (\n <div className=\"hc-booking-card-details\">\n <button\n type=\"button\"\n className=\"hc-booking-card-details__header\"\n onClick={handleToggle}\n aria-expanded={isExpanded}\n >\n <span className=\"hc-booking-card-details__header-text\">\n {t('booking.card_more_about_booking', 'More about this booking')}\n </span>\n <span className=\"hc-booking-card-details__header-icon\">\n <ChevronDownIcon expanded={isExpanded} />\n </span>\n </button>\n\n {isExpanded && (\n <div className=\"hc-booking-card-details__content\" ref={contentRef}>\n <div className=\"hc-booking-card-details__row\">\n <span className=\"hc-booking-card-details__label\">\n {t('booking.details_check_in', 'Check-in')}\n </span>\n <span className=\"hc-booking-card-details__value\">\n {formatDateTime(booking.checkIn, booking.hotel.checkInTime, locale)}\n </span>\n </div>\n <div className=\"hc-booking-card-details__row\">\n <span className=\"hc-booking-card-details__label\">\n {t('booking.details_check_out', 'Check-out')}\n </span>\n <span className=\"hc-booking-card-details__value\">\n {formatDateTime(booking.checkOut, booking.hotel.checkOutTime, locale)}\n </span>\n </div>\n\n <div className=\"hc-booking-card-details__row\">\n <span className=\"hc-booking-card-details__label\">\n {t('booking.details_guests', 'Guests')}\n </span>\n <span className=\"hc-booking-card-details__value\">{guestsText}</span>\n </div>\n\n <div className=\"hc-booking-card-details__row\">\n <span className=\"hc-booking-card-details__label\">\n {t('booking.details_room', 'Room name')}\n </span>\n <span className=\"hc-booking-card-details__value\">{booking.roomName}</span>\n </div>\n\n {booking.hasBreakfast && (\n <div className=\"hc-booking-card-details__row\">\n <span className=\"hc-booking-card-details__label\">\n {t('booking.details_breakfast', 'Breakfast')}\n </span>\n <span className=\"hc-booking-card-details__value\">\n {booking.breakfastInfo || 'Included'}\n </span>\n </div>\n )}\n\n {booking.cancellationPolicy && (\n <div className=\"hc-booking-card-details__row\">\n <span className=\"hc-booking-card-details__label\">\n {t('booking.details_cancellation', 'Cancellation')}\n </span>\n <span className=\"hc-booking-card-details__value\">\n {booking.cancellationPolicy}\n </span>\n </div>\n )}\n\n {booking.isCancellable && onCancelBooking && (\n <button\n type=\"button\"\n className=\"hc-booking-card-details__cancel-link\"\n onClick={onCancelBooking}\n >\n {t('booking.details_cancel_booking', 'Cancel booking')}\n </button>\n )}\n\n <div className=\"hc-booking-card-details__divider\" />\n\n <div className=\"hc-booking-card-details__row\">\n <span className=\"hc-booking-card-details__label\">\n {t('booking.details_booked', 'Booked')}\n </span>\n <span className=\"hc-booking-card-details__value\">\n {formatDate(booking.bookedAt, locale)}\n </span>\n </div>\n\n <div className=\"hc-booking-card-details__price-section\">\n <div className=\"hc-booking-card-details__row\">\n <span className=\"hc-booking-card-details__label\">\n {t('booking.details_room_price', 'Room price')}\n </span>\n <span className=\"hc-booking-card-details__price-original\">\n {formatPrice(booking.originalPrice, booking.currency)}\n </span>\n </div>\n <div className=\"hc-booking-card-details__row\">\n <span className=\"hc-booking-card-details__label--highlight\">\n {t('booking.details_saved_with_hotelcard', 'Saved with HotelCard')}\n </span>\n <span className=\"hc-booking-card-details__value--savings\">\n -{formatPrice(booking.savings, booking.currency)}\n </span>\n </div>\n <div className=\"hc-booking-card-details__row--total\">\n <span className=\"hc-booking-card-details__label--total\">\n {t('booking.details_total_cost', 'Total cost')}\n </span>\n <span className=\"hc-booking-card-details__value--total\">\n {formatPrice(booking.totalPrice, booking.currency)}\n </span>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nBookingCardDetails.displayName = 'BookingCardDetails';\n","import React, { useState } from 'react';\nimport { useUIContext } from '../../context';\nimport { BaseCard, BaseCardImage, BaseCardContent } from '../BaseCard';\nimport { Button } from '../Button';\nimport { BookingCardDetails } from './BookingCardDetails';\nimport './BookingCard.css';\nimport type { FeaturedBookingCardProps } from './BookingCard.types';\n\nconst LocationIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 1.33334C5.42 1.33334 3.33333 3.42001 3.33333 6.00001C3.33333 9.50001 8 14.6667 8 14.6667C8 14.6667 12.6667 9.50001 12.6667 6.00001C12.6667 3.42001 10.58 1.33334 8 1.33334ZM8 7.66668C7.08 7.66668 6.33333 6.92001 6.33333 6.00001C6.33333 5.08001 7.08 4.33334 8 4.33334C8.92 4.33334 9.66667 5.08001 9.66667 6.00001C9.66667 6.92001 8.92 7.66668 8 7.66668Z\" fill=\"currentColor\"/>\n </svg>\n);\n\nconst PhoneIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14.6667 11.28V13.28C14.6675 13.4657 14.6294 13.6495 14.555 13.8196C14.4806 13.9897 14.3715 14.1424 14.2347 14.2679C14.0979 14.3934 13.9364 14.489 13.7605 14.5485C13.5847 14.608 13.3983 14.6301 13.2133 14.6133C11.1619 14.3904 9.19135 13.6894 7.46 12.5667C5.84926 11.5431 4.48356 10.1774 3.46 8.56668C2.33333 6.82748 1.6322 4.84738 1.41333 2.78668C1.39666 2.60233 1.41852 2.41652 1.47763 2.24115C1.53673 2.06577 1.63175 1.90457 1.75655 1.76793C1.88134 1.63129 2.03323 1.52209 2.20256 1.44728C2.37189 1.37248 2.55491 1.33374 2.74 1.33334H4.74C5.06354 1.33016 5.37723 1.44473 5.6228 1.65569C5.86838 1.86665 6.02963 2.15962 6.07333 2.48001C6.15458 3.12005 6.31363 3.74849 6.54667 4.35334C6.63598 4.59196 6.64916 4.85127 6.58441 5.09719C6.51966 5.34311 6.37987 5.56478 6.18333 5.73334L5.34 6.57668C6.28937 8.25964 7.74037 9.71064 9.42333 10.66L10.2667 9.81668C10.4352 9.62014 10.6569 9.48035 10.9028 9.4156C11.1487 9.35085 11.408 9.36403 11.6467 9.45334C12.2515 9.68638 12.88 9.84543 13.52 9.92668C13.8438 9.97078 14.1396 10.1355 14.3511 10.3857C14.5625 10.6359 14.6748 10.9545 14.6667 11.28Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nconst EmailIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M2.66666 2.66666H13.3333C14.0667 2.66666 14.6667 3.26666 14.6667 3.99999V12C14.6667 12.7333 14.0667 13.3333 13.3333 13.3333H2.66666C1.93333 13.3333 1.33333 12.7333 1.33333 12V3.99999C1.33333 3.26666 1.93333 2.66666 2.66666 2.66666Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M14.6667 4L8 8.66667L1.33333 4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nconst MapIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M1.33334 4V13.3333L5.33334 10.6667L10.6667 13.3333L14.6667 10.6667V1.33334L10.6667 4L5.33334 1.33334L1.33334 4Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M5.33334 1.33334V10.6667\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n <path d=\"M10.6667 4V13.3333\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nconst MessageIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M14 10C14 10.3536 13.8595 10.6928 13.6095 10.9428C13.3594 11.1929 13.0203 11.3333 12.6667 11.3333H4.66667L2 14V3.33333C2 2.97971 2.14048 2.64057 2.39052 2.39052C2.64057 2.14048 2.97971 2 3.33333 2H12.6667C13.0203 2 13.3594 2.14048 13.6095 2.39052C13.8595 2.64057 14 2.97971 14 3.33333V10Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nconst ChevronDownIcon = ({ expanded }: { expanded: boolean }) => (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n style={{ transform: expanded ? 'rotate(180deg)' : 'rotate(0deg)', transition: 'transform 0.2s' }}\n >\n <path d=\"M6 9L12 15L18 9\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n);\n\nconst ClockIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"6\" cy=\"6\" r=\"5\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <path d=\"M6 3V6L8 7\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n </svg>\n);\n\nfunction getDaysUntil(checkIn: string): number {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n const checkInDate = new Date(checkIn);\n checkInDate.setHours(0, 0, 0, 0);\n const diffTime = checkInDate.getTime() - today.getTime();\n return Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n}\n\nfunction formatDateRange(checkIn: string, checkOut: string, locale: string): string {\n const inDate = new Date(checkIn);\n const outDate = new Date(checkOut);\n\n const inDay = inDate.getDate();\n const outDay = outDate.getDate();\n const month = outDate.toLocaleDateString(locale, { month: 'short' });\n const year = outDate.getFullYear();\n\n if (inDate.getMonth() === outDate.getMonth()) {\n return `${inDay}–${outDay} ${month} ${year}`;\n }\n\n const inMonth = inDate.toLocaleDateString(locale, { month: 'short' });\n return `${inDay} ${inMonth} – ${outDay} ${month} ${year}`;\n}\n\nexport const FeaturedBookingCard: React.FC<FeaturedBookingCardProps> = ({\n booking,\n onCancelBooking,\n onAddToCalendar,\n}) => {\n const { t, locale } = useUIContext();\n const [showHotelMessage, setShowHotelMessage] = useState(false);\n\n const fullAddress = `${booking.hotel.address}, ${booking.hotel.postalCode} ${booking.hotel.city}`;\n const daysUntil = getDaysUntil(booking.checkIn);\n\n const handleDirections = () => {\n const encoded = encodeURIComponent(fullAddress);\n const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);\n const url = isIOS\n ? `maps://maps.apple.com/?daddr=${encoded}`\n : `https://www.google.com/maps/dir/?api=1&destination=${encoded}`;\n window.open(url, '_system');\n };\n\n return (\n <div>\n <BaseCard hoverable={false} borderRadius={16}>\n <BaseCardImage\n src={booking.hotel.imageUrl || ''}\n alt={booking.hotel.name}\n aspectRatio=\"16/9\"\n showGradient={true}\n />\n\n <BaseCardContent padding=\"medium\">\n <div className=\"hc-featured-booking-card__content\">\n <div className=\"hc-featured-booking-card__date-row\">\n <span className=\"hc-featured-booking-card__date-range\">\n {formatDateRange(booking.checkIn, booking.checkOut, locale)}\n </span>\n {daysUntil > 0 && (\n <span className=\"hc-featured-booking-card__countdown-badge\">\n <ClockIcon />\n {daysUntil} {t('booking.countdown_days', 'days')}\n </span>\n )}\n </div>\n\n <h2 className=\"hc-featured-booking-card__hotel-name\">\n <span className=\"hc-featured-booking-card__location-icon\"><LocationIcon /></span>\n {booking.hotel.name}\n </h2>\n\n <button\n type=\"button\"\n className=\"hc-featured-booking-card__address-row\"\n onClick={handleDirections}\n aria-label={t('booking.card_directions', 'Directions')}\n >\n <span className=\"hc-featured-booking-card__address\">{fullAddress}</span>\n <span className=\"hc-featured-booking-card__directions-icon\"><MapIcon /></span>\n </button>\n\n <div className=\"hc-featured-booking-card__contact-links\">\n <a href={`tel:${booking.hotel.phone}`} className=\"hc-featured-booking-card__contact-link\">\n <PhoneIcon />\n <span>{booking.hotel.phone}</span>\n </a>\n <a href={`mailto:${booking.hotel.email}`} className=\"hc-featured-booking-card__contact-link\">\n <EmailIcon />\n <span>{booking.hotel.email}</span>\n </a>\n </div>\n\n {booking.hotelMessage && (\n <div className=\"hc-featured-booking-card__message-section\">\n <button\n type=\"button\"\n className=\"hc-featured-booking-card__message-header\"\n onClick={() => setShowHotelMessage(!showHotelMessage)}\n >\n <span className=\"hc-featured-booking-card__message-icon\"><MessageIcon /></span>\n <span className=\"hc-featured-booking-card__message-title\">\n {t('booking.card_message_from_hotel', 'Message from the hotel')}\n </span>\n <span className=\"hc-featured-booking-card__message-chevron\">\n <ChevronDownIcon expanded={showHotelMessage} />\n </span>\n </button>\n {showHotelMessage && (\n <p className=\"hc-featured-booking-card__message-content\">{booking.hotelMessage}</p>\n )}\n </div>\n )}\n\n <BookingCardDetails\n booking={booking}\n onCancelBooking={onCancelBooking}\n />\n\n {onAddToCalendar && (\n <Button\n variant=\"secondary\"\n size=\"small\"\n onClick={onAddToCalendar}\n >\n {t('booking.countdown_add_to_calendar', 'Add to calendar')}\n </Button>\n )}\n </div>\n </BaseCardContent>\n </BaseCard>\n </div>\n );\n};\n\nFeaturedBookingCard.displayName = 'FeaturedBookingCard';\n","import React from 'react';\nimport { useUIContext } from '../../context';\nimport { BaseCard, BaseCardContent } from '../BaseCard';\nimport { Button } from '../Button';\nimport { BookingCardDetails } from './BookingCardDetails';\nimport type { CompactBookingCardProps } from './BookingCard.types';\nimport type { Booking } from '../../types';\nimport './BookingCard.css';\n\nconst LocationIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M8 1.33334C5.42 1.33334 3.33333 3.42001 3.33333 6.00001C3.33333 9.50001 8 14.6667 8 14.6667C8 14.6667 12.6667 9.50001 12.6667 6.00001C12.6667 3.42001 10.58 1.33334 8 1.33334ZM8 7.66668C7.08 7.66668 6.33333 6.92001 6.33333 6.00001C6.33333 5.08001 7.08 4.33334 8 4.33334C8.92 4.33334 9.66667 5.08001 9.66667 6.00001C9.66667 6.92001 8.92 7.66668 8 7.66668Z\" fill=\"currentColor\"/>\n </svg>\n);\n\nfunction formatDateRange(checkIn: string, checkOut: string, locale: string): string {\n const inDate = new Date(checkIn);\n const outDate = new Date(checkOut);\n\n const inDay = inDate.getDate();\n const outDay = outDate.getDate();\n const month = outDate.toLocaleDateString(locale, { month: 'short' });\n const year = outDate.getFullYear();\n\n if (inDate.getMonth() === outDate.getMonth()) {\n return `${inDay}–${outDay} ${month} ${year}`;\n }\n\n const inMonth = inDate.toLocaleDateString(locale, { month: 'short' });\n return `${inDay} ${inMonth} – ${outDay} ${month} ${year}`;\n}\n\nfunction formatPrice(amount: number, currency: string): string {\n return `${currency} ${amount.toFixed(0)}`;\n}\n\nconst StatusBadge: React.FC<{ status: Booking['status'] }> = ({ status }) => {\n const { t } = useUIContext();\n\n const statusLabels: Record<Booking['status'], string> = {\n confirmed: t('booking.status_confirmed', 'Confirmed'),\n completed: t('booking.status_completed', 'Completed'),\n cancelled: t('booking.status_cancelled', 'Cancelled'),\n };\n\n return (\n <span className={`hc-compact-booking-card__status-badge hc-compact-booking-card__status-badge--${status}`}>\n {statusLabels[status]}\n </span>\n );\n};\n\nexport const CompactBookingCard: React.FC<CompactBookingCardProps> = ({\n booking,\n showBookAgain = true,\n onBookAgain,\n onAddToCalendar,\n}) => {\n const { t, locale } = useUIContext();\n\n const location = `${booking.hotel.city}, ${booking.hotel.country}`;\n\n return (\n <BaseCard hoverable={false} borderRadius={16}>\n <BaseCardContent padding=\"medium\">\n <div className=\"hc-compact-booking-card__content\">\n <div className=\"hc-compact-booking-card__top-row\">\n <div className=\"hc-compact-booking-card__thumbnail\">\n {booking.hotel.imageUrl ? (\n <img\n src={booking.hotel.imageUrl}\n alt={booking.hotel.name}\n className=\"hc-compact-booking-card__thumbnail-image\"\n />\n ) : (\n <div className=\"hc-compact-booking-card__thumbnail-placeholder\" />\n )}\n </div>\n\n <div className=\"hc-compact-booking-card__info\">\n <StatusBadge status={booking.status} />\n\n <h3 className=\"hc-compact-booking-card__hotel-name\">{booking.hotel.name}</h3>\n\n <p className=\"hc-compact-booking-card__location\">\n <LocationIcon />\n <span>{location}</span>\n </p>\n\n <p className=\"hc-compact-booking-card__date-range\">\n {formatDateRange(booking.checkIn, booking.checkOut, locale)}\n </p>\n\n <div className=\"hc-compact-booking-card__price-row\">\n {booking.originalPrice > booking.totalPrice && (\n <span className=\"hc-compact-booking-card__price-original\">\n {formatPrice(booking.originalPrice, booking.currency)}\n </span>\n )}\n <span className=\"hc-compact-booking-card__price-current\">\n {formatPrice(booking.totalPrice, booking.currency)}\n </span>\n </div>\n </div>\n </div>\n\n {showBookAgain && onBookAgain && (\n <Button\n variant=\"secondary\"\n size=\"small\"\n onClick={onBookAgain}\n >\n {t('booking.card_book_again', 'Book again')}\n </Button>\n )}\n\n {onAddToCalendar && (\n <Button\n variant=\"secondary\"\n size=\"small\"\n onClick={onAddToCalendar}\n >\n {t('booking.countdown_add_to_calendar', 'Add to calendar')}\n </Button>\n )}\n\n <BookingCardDetails booking={booking} />\n </div>\n </BaseCardContent>\n </BaseCard>\n );\n};\n\nCompactBookingCard.displayName = 'CompactBookingCard';\n","import React from 'react';\nimport { BaseCardSkeleton } from '../BaseCard';\nimport './BookingCard.css';\n\nexport const FeaturedBookingCardSkeleton: React.FC = () => {\n return (\n <BaseCardSkeleton imageAspectRatio=\"16/9\">\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__date-range hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__hotel-name hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__address hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__address-short hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__action-row\">\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__action-button hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__action-button hc-skeleton\" />\n </div>\n </BaseCardSkeleton>\n );\n};\n\nFeaturedBookingCardSkeleton.displayName = 'FeaturedBookingCardSkeleton';\n\nexport const CompactBookingCardSkeleton: React.FC = () => {\n return (\n <BaseCardSkeleton imageHeight={0}>\n <div className=\"hc-booking-card-skeleton__compact-content\">\n <div className=\"hc-booking-card-skeleton__compact-top-row\">\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__compact-thumbnail hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__compact-info\">\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__status-badge hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__compact-name hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__location hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__date hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__compact-price-row\">\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__price-original hc-skeleton\" />\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__price-current hc-skeleton\" />\n </div>\n </div>\n </div>\n <div className=\"hc-booking-card-skeleton__line hc-booking-card-skeleton__full-button hc-skeleton\" />\n </div>\n </BaseCardSkeleton>\n );\n};\n\nCompactBookingCardSkeleton.displayName = 'CompactBookingCardSkeleton';\n","interface HeartIconProps {\n filled?: boolean;\n className?: string;\n size?: number;\n}\n\nexport const HeartIcon = ({ filled = false, className = '', size = 24 }: HeartIconProps) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n className={className}\n fill={filled ? 'currentColor' : 'none'}\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z\" />\n </svg>\n);\n\nHeartIcon.displayName = 'HeartIcon';\n","interface StarIconProps {\n filled?: boolean;\n className?: string;\n size?: number;\n}\n\n// Small filled star for hotel category display\nexport const StarIcon = ({ filled = true, className = '', size = 9 }: StarIconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 9 9\"\n fill=\"none\"\n className={className}\n >\n <g clipPath=\"url(#clip0_star_icon)\">\n <path\n d=\"M4.80018 0.366577C4.93104 0.366577 5.05173 0.440968 5.11135 0.557659L6.18011 2.66102L8.50521 3.03152C8.63462 3.05194 8.74222 3.14383 8.78294 3.26927C8.82365 3.39472 8.79021 3.53183 8.6986 3.62518L7.03366 5.29533L7.40155 7.6277C7.42191 7.75752 7.3681 7.88879 7.26195 7.9661C7.15581 8.04341 7.01476 8.05508 6.89843 7.99528L4.80018 6.92463L2.70192 7.99528C2.58559 8.05508 2.44454 8.04341 2.33839 7.9661C2.23225 7.88879 2.17844 7.75898 2.1988 7.6277L2.56523 5.29533L0.901751 3.62518C0.808689 3.53183 0.776699 3.39472 0.817413 3.26927C0.858128 3.14383 0.964277 3.05194 1.09515 3.03152L3.42024 2.66102L4.49045 0.557659C4.55007 0.440968 4.67076 0.366577 4.80163 0.366577H4.80018Z\"\n fill={filled ? '#1F2937' : '#D1D5DB'}\n />\n </g>\n <defs>\n <clipPath id=\"clip0_star_icon\">\n <rect width=\"8\" height=\"8\" fill=\"white\" transform=\"translate(0.800049 0.199951)\" />\n </clipPath>\n </defs>\n </svg>\n);\n\nStarIcon.displayName = 'StarIcon';\n","interface ChevronLeftIconProps {\n className?: string;\n size?: number;\n}\n\nexport const ChevronLeftIcon = ({ className = '', size = 20 }: ChevronLeftIconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n);\n\nChevronLeftIcon.displayName = 'ChevronLeftIcon';\n","interface ChevronRightIconProps {\n className?: string;\n size?: number;\n}\n\nexport const ChevronRightIcon = ({ className = '', size = 20 }: ChevronRightIconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n);\n\nChevronRightIcon.displayName = 'ChevronRightIcon';\n","interface PinIconProps {\n className?: string;\n size?: number;\n}\n\nexport const PinIcon = ({ className = '', size = 16 }: PinIconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n className={className}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 1.5C5.51472 1.5 3.5 3.51472 3.5 6C3.5 7.52671 4.48181 9.28285 5.83073 10.8739C6.48993 11.6504 7.18485 12.3259 7.73205 12.8316C7.8331 12.9249 7.92519 13.0096 8.00599 13.0857C8.08539 13.0108 8.17547 12.9276 8.27398 12.8362C8.81849 12.3312 9.51007 11.656 10.1655 10.8792C11.5093 9.28692 12.5 7.52773 12.5 6C12.5 3.51472 10.4853 1.5 8 1.5ZM8 14C7.57347 14.4982 7.57321 14.498 7.57291 14.4977L7.57178 14.4967L7.56899 14.4942L7.56002 14.4864C7.5525 14.4798 7.54197 14.4706 7.52861 14.4588C7.5019 14.4353 7.46403 14.4016 7.41618 14.3584C7.3205 14.272 7.18745 14.1481 7.02576 13.9917C6.70282 13.6792 6.26632 13.238 5.81302 12.7042C4.89319 11.6202 3 9.61329 3 6C3 3.23858 5.23858 1 8 1C10.7614 1 13 3.23858 13 6C13 9.61229 11.0969 11.6169 10.1732 12.6989C9.71743 13.2324 9.27901 13.6735 8.95477 13.9862C8.79239 14.1428 8.65889 14.267 8.56288 14.3537C8.51486 14.3971 8.47683 14.4309 8.45001 14.4545C8.43659 14.4664 8.42601 14.4757 8.41845 14.4823L8.40942 14.4902L8.40661 14.4927L8.40546 14.4937C8.40517 14.494 8.40492 14.4942 8 14ZM8 14L8.40492 14.4942C8.17766 14.6895 7.84451 14.6919 7.57291 14.4977L8 14Z\"\n fill=\"currentColor\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 4.5C7.17157 4.5 6.5 5.17157 6.5 6C6.5 6.82843 7.17157 7.5 8 7.5C8.82843 7.5 9.5 6.82843 9.5 6C9.5 5.17157 8.82843 4.5 8 4.5ZM6 6C6 4.89543 6.89543 4 8 4C9.10457 4 10 4.89543 10 6C10 7.10457 9.10457 8 8 8C6.89543 8 6 7.10457 6 6Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n\nPinIcon.displayName = 'PinIcon';\n","export const formatPrice = (\n amount: number,\n currency: string = 'CHF',\n locale: string = 'de-CH'\n): string => {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(amount);\n};\n","/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param argument - The value to convert\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\nexport function toDate(argument) {\n const argStr = Object.prototype.toString.call(argument);\n\n // Clone the date\n if (\n argument instanceof Date ||\n (typeof argument === \"object\" && argStr === \"[object Date]\")\n ) {\n // Prevent the date to lose the milliseconds when passed to new Date() in IE10\n return new argument.constructor(+argument);\n } else if (\n typeof argument === \"number\" ||\n argStr === \"[object Number]\" ||\n typeof argument === \"string\" ||\n argStr === \"[object String]\"\n ) {\n // TODO: Can we get rid of as?\n return new Date(argument);\n } else {\n // TODO: Can we get rid of as?\n return new Date(NaN);\n }\n}\n\n// Fallback for modularized imports:\nexport default toDate;\n","/**\n * @name constructFrom\n * @category Generic Helpers\n * @summary Constructs a date using the reference date and the value\n *\n * @description\n * The function constructs a new date using the constructor from the reference\n * date and the given value. It helps to build generic functions that accept\n * date extensions.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The reference date to take constructor from\n * @param value - The value to create the date\n *\n * @returns Date initialized using the given date and value\n *\n * @example\n * import { constructFrom } from 'date-fns'\n *\n * // A function that clones a date preserving the original type\n * function cloneDate<DateType extends Date(date: DateType): DateType {\n * return constructFrom(\n * date, // Use contrustor from the given date\n * date.getTime() // Use the date value to create a new date\n * )\n * }\n */\nexport function constructFrom(date, value) {\n if (date instanceof Date) {\n return new date.constructor(value);\n } else {\n return new Date(value);\n }\n}\n\n// Fallback for modularized imports:\nexport default constructFrom;\n","/**\n * @module constants\n * @summary Useful constants\n * @description\n * Collection of useful date constants.\n *\n * The constants could be imported from `date-fns/constants`:\n *\n * ```ts\n * import { maxTime, minTime } from \"./constants/date-fns/constants\";\n *\n * function isAllowedTime(time) {\n * return time <= maxTime && time >= minTime;\n * }\n * ```\n */\n\n/**\n * @constant\n * @name daysInWeek\n * @summary Days in 1 week.\n */\nexport const daysInWeek = 7;\n\n/**\n * @constant\n * @name daysInYear\n * @summary Days in 1 year.\n *\n * @description\n * How many days in a year.\n *\n * One years equals 365.2425 days according to the formula:\n *\n * > Leap year occures every 4 years, except for years that are divisable by 100 and not divisable by 400.\n * > 1 mean year = (365+1/4-1/100+1/400) days = 365.2425 days\n */\nexport const daysInYear = 365.2425;\n\n/**\n * @constant\n * @name maxTime\n * @summary Maximum allowed time.\n *\n * @example\n * import { maxTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = 8640000000000001 <= maxTime;\n * //=> false\n *\n * new Date(8640000000000001);\n * //=> Invalid Date\n */\nexport const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;\n\n/**\n * @constant\n * @name minTime\n * @summary Minimum allowed time.\n *\n * @example\n * import { minTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = -8640000000000001 >= minTime;\n * //=> false\n *\n * new Date(-8640000000000001)\n * //=> Invalid Date\n */\nexport const minTime = -maxTime;\n\n/**\n * @constant\n * @name millisecondsInWeek\n * @summary Milliseconds in 1 week.\n */\nexport const millisecondsInWeek = 604800000;\n\n/**\n * @constant\n * @name millisecondsInDay\n * @summary Milliseconds in 1 day.\n */\nexport const millisecondsInDay = 86400000;\n\n/**\n * @constant\n * @name millisecondsInMinute\n * @summary Milliseconds in 1 minute\n */\nexport const millisecondsInMinute = 60000;\n\n/**\n * @constant\n * @name millisecondsInHour\n * @summary Milliseconds in 1 hour\n */\nexport const millisecondsInHour = 3600000;\n\n/**\n * @constant\n * @name millisecondsInSecond\n * @summary Milliseconds in 1 second\n */\nexport const millisecondsInSecond = 1000;\n\n/**\n * @constant\n * @name minutesInYear\n * @summary Minutes in 1 year.\n */\nexport const minutesInYear = 525600;\n\n/**\n * @constant\n * @name minutesInMonth\n * @summary Minutes in 1 month.\n */\nexport const minutesInMonth = 43200;\n\n/**\n * @constant\n * @name minutesInDay\n * @summary Minutes in 1 day.\n */\nexport const minutesInDay = 1440;\n\n/**\n * @constant\n * @name minutesInHour\n * @summary Minutes in 1 hour.\n */\nexport const minutesInHour = 60;\n\n/**\n * @constant\n * @name monthsInQuarter\n * @summary Months in 1 quarter.\n */\nexport const monthsInQuarter = 3;\n\n/**\n * @constant\n * @name monthsInYear\n * @summary Months in 1 year.\n */\nexport const monthsInYear = 12;\n\n/**\n * @constant\n * @name quartersInYear\n * @summary Quarters in 1 year\n */\nexport const quartersInYear = 4;\n\n/**\n * @constant\n * @name secondsInHour\n * @summary Seconds in 1 hour.\n */\nexport const secondsInHour = 3600;\n\n/**\n * @constant\n * @name secondsInMinute\n * @summary Seconds in 1 minute.\n */\nexport const secondsInMinute = 60;\n\n/**\n * @constant\n * @name secondsInDay\n * @summary Seconds in 1 day.\n */\nexport const secondsInDay = secondsInHour * 24;\n\n/**\n * @constant\n * @name secondsInWeek\n * @summary Seconds in 1 week.\n */\nexport const secondsInWeek = secondsInDay * 7;\n\n/**\n * @constant\n * @name secondsInYear\n * @summary Seconds in 1 year.\n */\nexport const secondsInYear = secondsInDay * daysInYear;\n\n/**\n * @constant\n * @name secondsInMonth\n * @summary Seconds in 1 month\n */\nexport const secondsInMonth = secondsInYear / 12;\n\n/**\n * @constant\n * @name secondsInQuarter\n * @summary Seconds in 1 quarter.\n */\nexport const secondsInQuarter = secondsInMonth * 3;\n","let defaultOptions = {};\n\nexport function getDefaultOptions() {\n return defaultOptions;\n}\n\nexport function setDefaultOptions(newOptions) {\n defaultOptions = newOptions;\n}\n","import { toDate } from \"./toDate.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\n\n/**\n * The {@link startOfWeek} function options.\n */\n\n/**\n * @name startOfWeek\n * @category Week Helpers\n * @summary Return the start of a week for the given date.\n *\n * @description\n * Return the start of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week\n *\n * @example\n * // The start of a week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfWeek(date, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const _date = toDate(date);\n const day = _date.getDay();\n const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\n _date.setDate(_date.getDate() - diff);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeek;\n","import { startOfWeek } from \"./startOfWeek.mjs\";\n\n/**\n * @name startOfISOWeek\n * @category ISO Week Helpers\n * @summary Return the start of an ISO week for the given date.\n *\n * @description\n * Return the start of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of an ISO week\n *\n * @example\n * // The start of an ISO week for 2 September 2014 11:55:00:\n * const result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfISOWeek(date) {\n return startOfWeek(date, { weekStartsOn: 1 });\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeek;\n","import { constructFrom } from \"./constructFrom.mjs\";\nimport { startOfISOWeek } from \"./startOfISOWeek.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name getISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the ISO week-numbering year of the given date.\n *\n * @description\n * Get the ISO week-numbering year of the given date,\n * which always starts 3 days before the year's first Thursday.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n *\n * @returns The ISO week-numbering year\n *\n * @example\n * // Which ISO-week numbering year is 2 January 2005?\n * const result = getISOWeekYear(new Date(2005, 0, 2))\n * //=> 2004\n */\nexport function getISOWeekYear(date) {\n const _date = toDate(date);\n const year = _date.getFullYear();\n\n const fourthOfJanuaryOfNextYear = constructFrom(date, 0);\n fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);\n fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);\n\n const fourthOfJanuaryOfThisYear = constructFrom(date, 0);\n fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);\n fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);\n\n if (_date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (_date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getISOWeekYear;\n","import { toDate } from \"./toDate.mjs\";\n\n/**\n * @name startOfDay\n * @category Day Helpers\n * @summary Return the start of a day for the given date.\n *\n * @description\n * Return the start of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of a day\n *\n * @example\n * // The start of a day for 2 September 2014 11:55:00:\n * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 00:00:00\n */\nexport function startOfDay(date) {\n const _date = toDate(date);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfDay;\n","import { toDate } from \"../toDate.mjs\";\n\n/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport function getTimezoneOffsetInMilliseconds(date) {\n const _date = toDate(date);\n const utcDate = new Date(\n Date.UTC(\n _date.getFullYear(),\n _date.getMonth(),\n _date.getDate(),\n _date.getHours(),\n _date.getMinutes(),\n _date.getSeconds(),\n _date.getMilliseconds(),\n ),\n );\n utcDate.setUTCFullYear(_date.getFullYear());\n return +date - +utcDate;\n}\n","import { millisecondsInDay } from \"./constants.mjs\";\nimport { startOfDay } from \"./startOfDay.mjs\";\nimport { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.mjs\";\n\n/**\n * @name differenceInCalendarDays\n * @category Day Helpers\n * @summary Get the number of calendar days between the given dates.\n *\n * @description\n * Get the number of calendar days between the given dates. This means that the times are removed\n * from the dates and then the difference in days is calculated.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The later date\n * @param dateRight - The earlier date\n *\n * @returns The number of calendar days\n *\n * @example\n * // How many calendar days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInCalendarDays(\n * new Date(2012, 6, 2, 0, 0),\n * new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 366\n * // How many calendar days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInCalendarDays(\n * new Date(2011, 6, 3, 0, 1),\n * new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 1\n */\nexport function differenceInCalendarDays(dateLeft, dateRight) {\n const startOfDayLeft = startOfDay(dateLeft);\n const startOfDayRight = startOfDay(dateRight);\n\n const timestampLeft =\n +startOfDayLeft - getTimezoneOffsetInMilliseconds(startOfDayLeft);\n const timestampRight =\n +startOfDayRight - getTimezoneOffsetInMilliseconds(startOfDayRight);\n\n // Round the number of days to the nearest integer because the number of\n // milliseconds in a day is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round((timestampLeft - timestampRight) / millisecondsInDay);\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarDays;\n","import { getISOWeekYear } from \"./getISOWeekYear.mjs\";\nimport { startOfISOWeek } from \"./startOfISOWeek.mjs\";\nimport { constructFrom } from \"./constructFrom.mjs\";\n\n/**\n * @name startOfISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Return the start of an ISO week-numbering year for the given date.\n *\n * @description\n * Return the start of an ISO week-numbering year,\n * which always starts 3 days before the year's first Thursday.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of an ISO week-numbering year\n *\n * @example\n * // The start of an ISO week-numbering year for 2 July 2005:\n * const result = startOfISOWeekYear(new Date(2005, 6, 2))\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfISOWeekYear(date) {\n const year = getISOWeekYear(date);\n const fourthOfJanuary = constructFrom(date, 0);\n fourthOfJanuary.setFullYear(year, 0, 4);\n fourthOfJanuary.setHours(0, 0, 0, 0);\n return startOfISOWeek(fourthOfJanuary);\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeekYear;\n","/**\n * @name isDate\n * @category Common Helpers\n * @summary Is the given value a date?\n *\n * @description\n * Returns true if the given value is an instance of Date. The function works for dates transferred across iframes.\n *\n * @param value - The value to check\n *\n * @returns True if the given value is a date\n *\n * @example\n * // For a valid date:\n * const result = isDate(new Date())\n * //=> true\n *\n * @example\n * // For an invalid date:\n * const result = isDate(new Date(NaN))\n * //=> true\n *\n * @example\n * // For some value:\n * const result = isDate('2014-02-31')\n * //=> false\n *\n * @example\n * // For an object:\n * const result = isDate({})\n * //=> false\n */\nexport function isDate(value) {\n return (\n value instanceof Date ||\n (typeof value === \"object\" &&\n Object.prototype.toString.call(value) === \"[object Date]\")\n );\n}\n\n// Fallback for modularized imports:\nexport default isDate;\n","import { isDate } from \"./isDate.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name isValid\n * @category Common Helpers\n * @summary Is the given date valid?\n *\n * @description\n * Returns false if argument is Invalid Date and true otherwise.\n * Argument is converted to Date using `toDate`. See [toDate](https://date-fns.org/docs/toDate)\n * Invalid Date is a Date, whose time value is NaN.\n *\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The date to check\n *\n * @returns The date is valid\n *\n * @example\n * // For the valid date:\n * const result = isValid(new Date(2014, 1, 31))\n * //=> true\n *\n * @example\n * // For the value, convertable into a date:\n * const result = isValid(1393804800000)\n * //=> true\n *\n * @example\n * // For the invalid date:\n * const result = isValid(new Date(''))\n * //=> false\n */\nexport function isValid(date) {\n if (!isDate(date) && typeof date !== \"number\") {\n return false;\n }\n const _date = toDate(date);\n return !isNaN(Number(_date));\n}\n\n// Fallback for modularized imports:\nexport default isValid;\n","import { toDate } from \"./toDate.mjs\";\nimport { constructFrom } from \"./constructFrom.mjs\";\n\n/**\n * @name startOfYear\n * @category Year Helpers\n * @summary Return the start of a year for the given date.\n *\n * @description\n * Return the start of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n *\n * @returns The start of a year\n *\n * @example\n * // The start of a year for 2 September 2014 11:55:00:\n * const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Jan 01 2014 00:00:00\n */\nexport function startOfYear(date) {\n const cleanDate = toDate(date);\n const _date = constructFrom(date, 0);\n _date.setFullYear(cleanDate.getFullYear(), 0, 1);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfYear;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"less than a second\",\n other: \"less than {{count}} seconds\",\n },\n\n xSeconds: {\n one: \"1 second\",\n other: \"{{count}} seconds\",\n },\n\n halfAMinute: \"half a minute\",\n\n lessThanXMinutes: {\n one: \"less than a minute\",\n other: \"less than {{count}} minutes\",\n },\n\n xMinutes: {\n one: \"1 minute\",\n other: \"{{count}} minutes\",\n },\n\n aboutXHours: {\n one: \"about 1 hour\",\n other: \"about {{count}} hours\",\n },\n\n xHours: {\n one: \"1 hour\",\n other: \"{{count}} hours\",\n },\n\n xDays: {\n one: \"1 day\",\n other: \"{{count}} days\",\n },\n\n aboutXWeeks: {\n one: \"about 1 week\",\n other: \"about {{count}} weeks\",\n },\n\n xWeeks: {\n one: \"1 week\",\n other: \"{{count}} weeks\",\n },\n\n aboutXMonths: {\n one: \"about 1 month\",\n other: \"about {{count}} months\",\n },\n\n xMonths: {\n one: \"1 month\",\n other: \"{{count}} months\",\n },\n\n aboutXYears: {\n one: \"about 1 year\",\n other: \"about {{count}} years\",\n },\n\n xYears: {\n one: \"1 year\",\n other: \"{{count}} years\",\n },\n\n overXYears: {\n one: \"over 1 year\",\n other: \"over {{count}} years\",\n },\n\n almostXYears: {\n one: \"almost 1 year\",\n other: \"almost {{count}} years\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", count.toString());\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"in \" + result;\n } else {\n return result + \" ago\";\n }\n }\n\n return result;\n};\n","export function buildFormatLongFn(args) {\n return (options = {}) => {\n // TODO: Remove String()\n const width = options.width ? String(options.width) : args.defaultWidth;\n const format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.mjs\";\n\nconst dateFormats = {\n full: \"EEEE, MMMM do, y\",\n long: \"MMMM do, y\",\n medium: \"MMM d, y\",\n short: \"MM/dd/yyyy\",\n};\n\nconst timeFormats = {\n full: \"h:mm:ss a zzzz\",\n long: \"h:mm:ss a z\",\n medium: \"h:mm:ss a\",\n short: \"h:mm a\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'at' {{time}}\",\n long: \"{{date}} 'at' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"'last' eeee 'at' p\",\n yesterday: \"'yesterday at' p\",\n today: \"'today at' p\",\n tomorrow: \"'tomorrow at' p\",\n nextWeek: \"eeee 'at' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","/* eslint-disable no-unused-vars */\n\n/**\n * The localize function argument callback which allows to convert raw value to\n * the actual type.\n *\n * @param value - The value to convert\n *\n * @returns The converted value\n */\n\n/**\n * The map of localized values for each width.\n */\n\n/**\n * The index type of the locale unit value. It types conversion of units of\n * values that don't start at 0 (i.e. quarters).\n */\n\n/**\n * Converts the unit value to the tuple of values.\n */\n\n/**\n * The tuple of localized era values. The first element represents BC,\n * the second element represents AD.\n */\n\n/**\n * The tuple of localized quarter values. The first element represents Q1.\n */\n\n/**\n * The tuple of localized day values. The first element represents Sunday.\n */\n\n/**\n * The tuple of localized month values. The first element represents January.\n */\n\nexport function buildLocalizeFn(args) {\n return (value, options) => {\n const context = options?.context ? String(options.context) : \"standalone\";\n\n let valuesArray;\n if (context === \"formatting\" && args.formattingValues) {\n const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n const width = options?.width ? String(options.width) : defaultWidth;\n\n valuesArray =\n args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n const defaultWidth = args.defaultWidth;\n const width = options?.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[width] || args.values[defaultWidth];\n }\n const index = args.argumentCallback ? args.argumentCallback(value) : value;\n\n // @ts-expect-error - For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n return valuesArray[index];\n };\n}\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.mjs\";\n\nconst eraValues = {\n narrow: [\"B\", \"A\"],\n abbreviated: [\"BC\", \"AD\"],\n wide: [\"Before Christ\", \"Anno Domini\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1st quarter\", \"2nd quarter\", \"3rd quarter\", \"4th quarter\"],\n};\n\n// Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n\n wide: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n short: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n abbreviated: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n wide: [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n const number = Number(dirtyNumber);\n\n // If ordinal numbers depend on context, for example,\n // if they are different for different grammatical genders,\n // use `options.unit`.\n //\n // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n // 'day', 'hour', 'minute', 'second'.\n\n const rem100 = number % 100;\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + \"st\";\n case 2:\n return number + \"nd\";\n case 3:\n return number + \"rd\";\n }\n }\n return number + \"th\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","export function buildMatchFn(args) {\n return (string, options = {}) => {\n const width = options.width;\n\n const matchPattern =\n (width && args.matchPatterns[width]) ||\n args.matchPatterns[args.defaultMatchWidth];\n const matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n const matchedString = matchResult[0];\n\n const parsePatterns =\n (width && args.parsePatterns[width]) ||\n args.parsePatterns[args.defaultParseWidth];\n\n const key = Array.isArray(parsePatterns)\n ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))\n : // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I challange you to fix the type\n findKey(parsePatterns, (pattern) => pattern.test(matchedString));\n\n let value;\n\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback\n ? // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I challange you to fix the type\n options.valueCallback(value)\n : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n\nfunction findKey(object, predicate) {\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) &&\n predicate(object[key])\n ) {\n return key;\n }\n }\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (let key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n return undefined;\n}\n","export function buildMatchPatternFn(args) {\n return (string, options = {}) => {\n const matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n const matchedString = matchResult[0];\n\n const parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n let value = args.valueCallback\n ? args.valueCallback(parseResult[0])\n : parseResult[0];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- I challange you to fix the type\n value = options.valueCallback ? options.valueCallback(value) : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.mjs\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.mjs\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(b|a)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(before christ|before common era|anno domini|common era)/i,\n};\nconst parseEraPatterns = {\n any: [/^b/i, /^(a|c)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](th|st|nd|rd)? quarter/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ja/i,\n /^f/i,\n /^mar/i,\n /^ap/i,\n /^may/i,\n /^jun/i,\n /^jul/i,\n /^au/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[smtwf]/i,\n short: /^(su|mo|tu|we|th|fr|sa)/i,\n abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i,\n};\nconst parseDayPatterns = {\n narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mi/i,\n noon: /^no/i,\n morning: /morning/i,\n afternoon: /afternoon/i,\n evening: /evening/i,\n night: /night/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./en-US/_lib/formatDistance.mjs\";\nimport { formatLong } from \"./en-US/_lib/formatLong.mjs\";\nimport { formatRelative } from \"./en-US/_lib/formatRelative.mjs\";\nimport { localize } from \"./en-US/_lib/localize.mjs\";\nimport { match } from \"./en-US/_lib/match.mjs\";\n\n/**\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp](https://github.com/kossnocorp)\n * @author Lesha Koss [@leshakoss](https://github.com/leshakoss)\n */\nexport const enUS = {\n code: \"en-US\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default enUS;\n","import { differenceInCalendarDays } from \"./differenceInCalendarDays.mjs\";\nimport { startOfYear } from \"./startOfYear.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name getDayOfYear\n * @category Day Helpers\n * @summary Get the day of the year of the given date.\n *\n * @description\n * Get the day of the year of the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n *\n * @returns The day of year\n *\n * @example\n * // Which day of the year is 2 July 2014?\n * const result = getDayOfYear(new Date(2014, 6, 2))\n * //=> 183\n */\nexport function getDayOfYear(date) {\n const _date = toDate(date);\n const diff = differenceInCalendarDays(_date, startOfYear(_date));\n const dayOfYear = diff + 1;\n return dayOfYear;\n}\n\n// Fallback for modularized imports:\nexport default getDayOfYear;\n","import { millisecondsInWeek } from \"./constants.mjs\";\nimport { startOfISOWeek } from \"./startOfISOWeek.mjs\";\nimport { startOfISOWeekYear } from \"./startOfISOWeekYear.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * @name getISOWeek\n * @category ISO Week Helpers\n * @summary Get the ISO week of the given date.\n *\n * @description\n * Get the ISO week of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n *\n * @returns The ISO week\n *\n * @example\n * // Which week of the ISO-week numbering year is 2 January 2005?\n * const result = getISOWeek(new Date(2005, 0, 2))\n * //=> 53\n */\nexport function getISOWeek(date) {\n const _date = toDate(date);\n const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getISOWeek;\n","import { constructFrom } from \"./constructFrom.mjs\";\nimport { startOfWeek } from \"./startOfWeek.mjs\";\nimport { toDate } from \"./toDate.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\n\n/**\n * The {@link getWeekYear} function options.\n */\n\n/**\n * @name getWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Get the local week-numbering year of the given date.\n *\n * @description\n * Get the local week-numbering year of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n * @param options - An object with options.\n *\n * @returns The local week-numbering year\n *\n * @example\n * // Which week numbering year is 26 December 2004 with the default settings?\n * const result = getWeekYear(new Date(2004, 11, 26))\n * //=> 2005\n *\n * @example\n * // Which week numbering year is 26 December 2004 if week starts on Saturday?\n * const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })\n * //=> 2004\n *\n * @example\n * // Which week numbering year is 26 December 2004 if the first week contains 4 January?\n * const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })\n * //=> 2004\n */\nexport function getWeekYear(date, options) {\n const _date = toDate(date);\n const year = _date.getFullYear();\n\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const firstWeekOfNextYear = constructFrom(date, 0);\n firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);\n firstWeekOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);\n\n const firstWeekOfThisYear = constructFrom(date, 0);\n firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);\n firstWeekOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);\n\n if (_date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (_date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getWeekYear;\n","import { constructFrom } from \"./constructFrom.mjs\";\nimport { getWeekYear } from \"./getWeekYear.mjs\";\nimport { startOfWeek } from \"./startOfWeek.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\n\n/**\n * The {@link startOfWeekYear} function options.\n */\n\n/**\n * @name startOfWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Return the start of a local week-numbering year for the given date.\n *\n * @description\n * Return the start of a local week-numbering year.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week-numbering year\n *\n * @example\n * // The start of an a week-numbering year for 2 July 2005 with default settings:\n * const result = startOfWeekYear(new Date(2005, 6, 2))\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // The start of a week-numbering year for 2 July 2005\n * // if Monday is the first day of week\n * // and 4 January is always in the first week of the year:\n * const result = startOfWeekYear(new Date(2005, 6, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfWeekYear(date, options) {\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const year = getWeekYear(date, options);\n const firstWeek = constructFrom(date, 0);\n firstWeek.setFullYear(year, 0, firstWeekContainsDate);\n firstWeek.setHours(0, 0, 0, 0);\n const _date = startOfWeek(firstWeek, options);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeekYear;\n","import { millisecondsInWeek } from \"./constants.mjs\";\nimport { startOfWeek } from \"./startOfWeek.mjs\";\nimport { startOfWeekYear } from \"./startOfWeekYear.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n/**\n * The {@link getWeek} function options.\n */\n\n/**\n * @name getWeek\n * @category Week Helpers\n * @summary Get the local week index of the given date.\n *\n * @description\n * Get the local week index of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The week\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005 with default options?\n * const result = getWeek(new Date(2005, 0, 2))\n * //=> 2\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January?\n * const result = getWeek(new Date(2005, 0, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> 53\n */\n\nexport function getWeek(date, options) {\n const _date = toDate(date);\n const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getWeek;\n","export function addLeadingZeros(number, targetLength) {\n const sign = number < 0 ? \"-\" : \"\";\n const output = Math.abs(number).toString().padStart(targetLength, \"0\");\n return sign + output;\n}\n","import { addLeadingZeros } from \"../addLeadingZeros.mjs\";\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | |\n * | d | Day of month | D | |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | m | Minute | M | Month |\n * | s | Second | S | Fraction of second |\n * | y | Year (abs) | Y | |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n */\n\nexport const lightFormatters = {\n // Year\n y(date, token) {\n // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens\n // | Year | y | yy | yyy | yyyy | yyyyy |\n // |----------|-------|----|-------|-------|-------|\n // | AD 1 | 1 | 01 | 001 | 0001 | 00001 |\n // | AD 12 | 12 | 12 | 012 | 0012 | 00012 |\n // | AD 123 | 123 | 23 | 123 | 0123 | 00123 |\n // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 |\n // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return addLeadingZeros(token === \"yy\" ? year % 100 : year, token.length);\n },\n\n // Month\n M(date, token) {\n const month = date.getMonth();\n return token === \"M\" ? String(month + 1) : addLeadingZeros(month + 1, 2);\n },\n\n // Day of the month\n d(date, token) {\n return addLeadingZeros(date.getDate(), token.length);\n },\n\n // AM or PM\n a(date, token) {\n const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return dayPeriodEnumValue.toUpperCase();\n case \"aaa\":\n return dayPeriodEnumValue;\n case \"aaaaa\":\n return dayPeriodEnumValue[0];\n case \"aaaa\":\n default:\n return dayPeriodEnumValue === \"am\" ? \"a.m.\" : \"p.m.\";\n }\n },\n\n // Hour [1-12]\n h(date, token) {\n return addLeadingZeros(date.getHours() % 12 || 12, token.length);\n },\n\n // Hour [0-23]\n H(date, token) {\n return addLeadingZeros(date.getHours(), token.length);\n },\n\n // Minute\n m(date, token) {\n return addLeadingZeros(date.getMinutes(), token.length);\n },\n\n // Second\n s(date, token) {\n return addLeadingZeros(date.getSeconds(), token.length);\n },\n\n // Fraction of second\n S(date, token) {\n const numberOfDigits = token.length;\n const milliseconds = date.getMilliseconds();\n const fractionalSeconds = Math.trunc(\n milliseconds * Math.pow(10, numberOfDigits - 3),\n );\n return addLeadingZeros(fractionalSeconds, token.length);\n },\n};\n","import { getDayOfYear } from \"../../getDayOfYear.mjs\";\nimport { getISOWeek } from \"../../getISOWeek.mjs\";\nimport { getISOWeekYear } from \"../../getISOWeekYear.mjs\";\nimport { getWeek } from \"../../getWeek.mjs\";\nimport { getWeekYear } from \"../../getWeekYear.mjs\";\nimport { addLeadingZeros } from \"../addLeadingZeros.mjs\";\nimport { lightFormatters } from \"./lightFormatters.mjs\";\n\nconst dayPeriodEnum = {\n am: \"am\",\n pm: \"pm\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n};\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | Milliseconds in day |\n * | b | AM, PM, noon, midnight | B | Flexible day period |\n * | c | Stand-alone local day of week | C* | Localized hour w/ day period |\n * | d | Day of month | D | Day of year |\n * | e | Local day of week | E | Day of week |\n * | f | | F* | Day of week in month |\n * | g* | Modified Julian day | G | Era |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | i! | ISO day of week | I! | ISO week of year |\n * | j* | Localized hour w/ day period | J* | Localized hour w/o day period |\n * | k | Hour [1-24] | K | Hour [0-11] |\n * | l* | (deprecated) | L | Stand-alone month |\n * | m | Minute | M | Month |\n * | n | | N | |\n * | o! | Ordinal number modifier | O | Timezone (GMT) |\n * | p! | Long localized time | P! | Long localized date |\n * | q | Stand-alone quarter | Q | Quarter |\n * | r* | Related Gregorian year | R! | ISO week-numbering year |\n * | s | Second | S | Fraction of second |\n * | t! | Seconds timestamp | T! | Milliseconds timestamp |\n * | u | Extended year | U* | Cyclic year |\n * | v* | Timezone (generic non-locat.) | V* | Timezone (location) |\n * | w | Local week of year | W* | Week of month |\n * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) |\n * | y | Year (abs) | Y | Local week-numbering year |\n * | z | Timezone (specific non-locat.) | Z* | Timezone (aliases) |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `format` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n * i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n * `R` is supposed to be used in conjunction with `I` and `i`\n * for universal ISO week-numbering date, whereas\n * `Y` is supposed to be used in conjunction with `w` and `e`\n * for week-numbering date specific to the locale.\n * - `P` is long localized date format\n * - `p` is long localized time format\n */\n\nexport const formatters = {\n // Era\n G: function (date, token, localize) {\n const era = date.getFullYear() > 0 ? 1 : 0;\n switch (token) {\n // AD, BC\n case \"G\":\n case \"GG\":\n case \"GGG\":\n return localize.era(era, { width: \"abbreviated\" });\n // A, B\n case \"GGGGG\":\n return localize.era(era, { width: \"narrow\" });\n // Anno Domini, Before Christ\n case \"GGGG\":\n default:\n return localize.era(era, { width: \"wide\" });\n }\n },\n\n // Year\n y: function (date, token, localize) {\n // Ordinal number\n if (token === \"yo\") {\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return localize.ordinalNumber(year, { unit: \"year\" });\n }\n\n return lightFormatters.y(date, token);\n },\n\n // Local week-numbering year\n Y: function (date, token, localize, options) {\n const signedWeekYear = getWeekYear(date, options);\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;\n\n // Two digit year\n if (token === \"YY\") {\n const twoDigitYear = weekYear % 100;\n return addLeadingZeros(twoDigitYear, 2);\n }\n\n // Ordinal number\n if (token === \"Yo\") {\n return localize.ordinalNumber(weekYear, { unit: \"year\" });\n }\n\n // Padding\n return addLeadingZeros(weekYear, token.length);\n },\n\n // ISO week-numbering year\n R: function (date, token) {\n const isoWeekYear = getISOWeekYear(date);\n\n // Padding\n return addLeadingZeros(isoWeekYear, token.length);\n },\n\n // Extended year. This is a single number designating the year of this calendar system.\n // The main difference between `y` and `u` localizers are B.C. years:\n // | Year | `y` | `u` |\n // |------|-----|-----|\n // | AC 1 | 1 | 1 |\n // | BC 1 | 1 | 0 |\n // | BC 2 | 2 | -1 |\n // Also `yy` always returns the last two digits of a year,\n // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n u: function (date, token) {\n const year = date.getFullYear();\n return addLeadingZeros(year, token.length);\n },\n\n // Quarter\n Q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"Q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"QQ\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"Qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"QQQ\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"QQQQQ\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"QQQQ\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone quarter\n q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"qq\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"qqq\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"qqqqq\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"qqqq\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // Month\n M: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n case \"M\":\n case \"MM\":\n return lightFormatters.M(date, token);\n // 1st, 2nd, ..., 12th\n case \"Mo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"MMM\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // J, F, ..., D\n case \"MMMMM\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // January, February, ..., December\n case \"MMMM\":\n default:\n return localize.month(month, { width: \"wide\", context: \"formatting\" });\n }\n },\n\n // Stand-alone month\n L: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n // 1, 2, ..., 12\n case \"L\":\n return String(month + 1);\n // 01, 02, ..., 12\n case \"LL\":\n return addLeadingZeros(month + 1, 2);\n // 1st, 2nd, ..., 12th\n case \"Lo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"LLL\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // J, F, ..., D\n case \"LLLLL\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // January, February, ..., December\n case \"LLLL\":\n default:\n return localize.month(month, { width: \"wide\", context: \"standalone\" });\n }\n },\n\n // Local week of year\n w: function (date, token, localize, options) {\n const week = getWeek(date, options);\n\n if (token === \"wo\") {\n return localize.ordinalNumber(week, { unit: \"week\" });\n }\n\n return addLeadingZeros(week, token.length);\n },\n\n // ISO week of year\n I: function (date, token, localize) {\n const isoWeek = getISOWeek(date);\n\n if (token === \"Io\") {\n return localize.ordinalNumber(isoWeek, { unit: \"week\" });\n }\n\n return addLeadingZeros(isoWeek, token.length);\n },\n\n // Day of the month\n d: function (date, token, localize) {\n if (token === \"do\") {\n return localize.ordinalNumber(date.getDate(), { unit: \"date\" });\n }\n\n return lightFormatters.d(date, token);\n },\n\n // Day of year\n D: function (date, token, localize) {\n const dayOfYear = getDayOfYear(date);\n\n if (token === \"Do\") {\n return localize.ordinalNumber(dayOfYear, { unit: \"dayOfYear\" });\n }\n\n return addLeadingZeros(dayOfYear, token.length);\n },\n\n // Day of week\n E: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n switch (token) {\n // Tue\n case \"E\":\n case \"EE\":\n case \"EEE\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"EEEEE\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"EEEEEE\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"EEEE\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Local day of week\n e: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (Nth day of week with current locale or weekStartsOn)\n case \"e\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"ee\":\n return addLeadingZeros(localDayOfWeek, 2);\n // 1st, 2nd, ..., 7th\n case \"eo\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"eee\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"eeeee\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"eeeeee\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"eeee\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone local day of week\n c: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (same as in `e`)\n case \"c\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"cc\":\n return addLeadingZeros(localDayOfWeek, token.length);\n // 1st, 2nd, ..., 7th\n case \"co\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"ccc\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // T\n case \"ccccc\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // Tu\n case \"cccccc\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"standalone\",\n });\n // Tuesday\n case \"cccc\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // ISO day of week\n i: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\n switch (token) {\n // 2\n case \"i\":\n return String(isoDayOfWeek);\n // 02\n case \"ii\":\n return addLeadingZeros(isoDayOfWeek, token.length);\n // 2nd\n case \"io\":\n return localize.ordinalNumber(isoDayOfWeek, { unit: \"day\" });\n // Tue\n case \"iii\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"iiiii\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"iiiiii\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"iiii\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM or PM\n a: function (date, token, localize) {\n const hours = date.getHours();\n const dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"aaa\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"aaaaa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"aaaa\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM, PM, midnight, noon\n b: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours === 12) {\n dayPeriodEnumValue = dayPeriodEnum.noon;\n } else if (hours === 0) {\n dayPeriodEnumValue = dayPeriodEnum.midnight;\n } else {\n dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n }\n\n switch (token) {\n case \"b\":\n case \"bb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"bbb\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"bbbbb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"bbbb\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // in the morning, in the afternoon, in the evening, at night\n B: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours >= 17) {\n dayPeriodEnumValue = dayPeriodEnum.evening;\n } else if (hours >= 12) {\n dayPeriodEnumValue = dayPeriodEnum.afternoon;\n } else if (hours >= 4) {\n dayPeriodEnumValue = dayPeriodEnum.morning;\n } else {\n dayPeriodEnumValue = dayPeriodEnum.night;\n }\n\n switch (token) {\n case \"B\":\n case \"BB\":\n case \"BBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"BBBBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"BBBB\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Hour [1-12]\n h: function (date, token, localize) {\n if (token === \"ho\") {\n let hours = date.getHours() % 12;\n if (hours === 0) hours = 12;\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return lightFormatters.h(date, token);\n },\n\n // Hour [0-23]\n H: function (date, token, localize) {\n if (token === \"Ho\") {\n return localize.ordinalNumber(date.getHours(), { unit: \"hour\" });\n }\n\n return lightFormatters.H(date, token);\n },\n\n // Hour [0-11]\n K: function (date, token, localize) {\n const hours = date.getHours() % 12;\n\n if (token === \"Ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Hour [1-24]\n k: function (date, token, localize) {\n let hours = date.getHours();\n if (hours === 0) hours = 24;\n\n if (token === \"ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Minute\n m: function (date, token, localize) {\n if (token === \"mo\") {\n return localize.ordinalNumber(date.getMinutes(), { unit: \"minute\" });\n }\n\n return lightFormatters.m(date, token);\n },\n\n // Second\n s: function (date, token, localize) {\n if (token === \"so\") {\n return localize.ordinalNumber(date.getSeconds(), { unit: \"second\" });\n }\n\n return lightFormatters.s(date, token);\n },\n\n // Fraction of second\n S: function (date, token) {\n return lightFormatters.S(date, token);\n },\n\n // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n X: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n if (timezoneOffset === 0) {\n return \"Z\";\n }\n\n switch (token) {\n // Hours and optional minutes\n case \"X\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XX`\n case \"XXXX\":\n case \"XX\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XXX`\n case \"XXXXX\":\n case \"XXX\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n x: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Hours and optional minutes\n case \"x\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xx`\n case \"xxxx\":\n case \"xx\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xxx`\n case \"xxxxx\":\n case \"xxx\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (GMT)\n O: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"O\":\n case \"OO\":\n case \"OOO\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"OOOO\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (specific non-location)\n z: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"z\":\n case \"zz\":\n case \"zzz\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"zzzz\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Seconds timestamp\n t: function (date, token, _localize) {\n const timestamp = Math.trunc(date.getTime() / 1000);\n return addLeadingZeros(timestamp, token.length);\n },\n\n // Milliseconds timestamp\n T: function (date, token, _localize) {\n const timestamp = date.getTime();\n return addLeadingZeros(timestamp, token.length);\n },\n};\n\nfunction formatTimezoneShort(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = Math.trunc(absOffset / 60);\n const minutes = absOffset % 60;\n if (minutes === 0) {\n return sign + String(hours);\n }\n return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);\n}\n\nfunction formatTimezoneWithOptionalMinutes(offset, delimiter) {\n if (offset % 60 === 0) {\n const sign = offset > 0 ? \"-\" : \"+\";\n return sign + addLeadingZeros(Math.abs(offset) / 60, 2);\n }\n return formatTimezone(offset, delimiter);\n}\n\nfunction formatTimezone(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);\n const minutes = addLeadingZeros(absOffset % 60, 2);\n return sign + hours + delimiter + minutes;\n}\n","const dateLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"P\":\n return formatLong.date({ width: \"short\" });\n case \"PP\":\n return formatLong.date({ width: \"medium\" });\n case \"PPP\":\n return formatLong.date({ width: \"long\" });\n case \"PPPP\":\n default:\n return formatLong.date({ width: \"full\" });\n }\n};\n\nconst timeLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"p\":\n return formatLong.time({ width: \"short\" });\n case \"pp\":\n return formatLong.time({ width: \"medium\" });\n case \"ppp\":\n return formatLong.time({ width: \"long\" });\n case \"pppp\":\n default:\n return formatLong.time({ width: \"full\" });\n }\n};\n\nconst dateTimeLongFormatter = (pattern, formatLong) => {\n const matchResult = pattern.match(/(P+)(p+)?/) || [];\n const datePattern = matchResult[1];\n const timePattern = matchResult[2];\n\n if (!timePattern) {\n return dateLongFormatter(pattern, formatLong);\n }\n\n let dateTimeFormat;\n\n switch (datePattern) {\n case \"P\":\n dateTimeFormat = formatLong.dateTime({ width: \"short\" });\n break;\n case \"PP\":\n dateTimeFormat = formatLong.dateTime({ width: \"medium\" });\n break;\n case \"PPP\":\n dateTimeFormat = formatLong.dateTime({ width: \"long\" });\n break;\n case \"PPPP\":\n default:\n dateTimeFormat = formatLong.dateTime({ width: \"full\" });\n break;\n }\n\n return dateTimeFormat\n .replace(\"{{date}}\", dateLongFormatter(datePattern, formatLong))\n .replace(\"{{time}}\", timeLongFormatter(timePattern, formatLong));\n};\n\nexport const longFormatters = {\n p: timeLongFormatter,\n P: dateTimeLongFormatter,\n};\n","const dayOfYearTokenRE = /^D+$/;\nconst weekYearTokenRE = /^Y+$/;\n\nconst throwTokens = [\"D\", \"DD\", \"YY\", \"YYYY\"];\n\nexport function isProtectedDayOfYearToken(token) {\n return dayOfYearTokenRE.test(token);\n}\n\nexport function isProtectedWeekYearToken(token) {\n return weekYearTokenRE.test(token);\n}\n\nexport function warnOrThrowProtectedError(token, format, input) {\n const _message = message(token, format, input);\n console.warn(_message);\n if (throwTokens.includes(token)) throw new RangeError(_message);\n}\n\nfunction message(token, format, input) {\n const subject = token[0] === \"Y\" ? \"years\" : \"days of the month\";\n return `Use \\`${token.toLowerCase()}\\` instead of \\`${token}\\` (in \\`${format}\\`) for formatting ${subject} to the input \\`${input}\\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;\n}\n","import { defaultLocale } from \"./_lib/defaultLocale.mjs\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.mjs\";\nimport { formatters } from \"./_lib/format/formatters.mjs\";\nimport { longFormatters } from \"./_lib/format/longFormatters.mjs\";\nimport {\n isProtectedDayOfYearToken,\n isProtectedWeekYearToken,\n warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.mjs\";\nimport { isValid } from \"./isValid.mjs\";\nimport { toDate } from \"./toDate.mjs\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { formatters, longFormatters };\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n// (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n// except a single quote symbol, which ends the sequence.\n// Two quote characters do not end the sequence.\n// If there is no matching single quote\n// then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\nexport { format as formatDate };\n\n/**\n * The {@link format} function options.\n */\n\n/**\n * @name format\n * @alias formatDate\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format. The result may vary by locale.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n * (see the last example)\n *\n * Format of the string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 7 below the table).\n *\n * Accepted patterns:\n * | Unit | Pattern | Result examples | Notes |\n * |---------------------------------|---------|-----------------------------------|-------|\n * | Era | G..GGG | AD, BC | |\n * | | GGGG | Anno Domini, Before Christ | 2 |\n * | | GGGGG | A, B | |\n * | Calendar year | y | 44, 1, 1900, 2017 | 5 |\n * | | yo | 44th, 1st, 0th, 17th | 5,7 |\n * | | yy | 44, 01, 00, 17 | 5 |\n * | | yyy | 044, 001, 1900, 2017 | 5 |\n * | | yyyy | 0044, 0001, 1900, 2017 | 5 |\n * | | yyyyy | ... | 3,5 |\n * | Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |\n * | | Yo | 44th, 1st, 1900th, 2017th | 5,7 |\n * | | YY | 44, 01, 00, 17 | 5,8 |\n * | | YYY | 044, 001, 1900, 2017 | 5 |\n * | | YYYY | 0044, 0001, 1900, 2017 | 5,8 |\n * | | YYYYY | ... | 3,5 |\n * | ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |\n * | | RR | -43, 00, 01, 1900, 2017 | 5,7 |\n * | | RRR | -043, 000, 001, 1900, 2017 | 5,7 |\n * | | RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |\n * | | RRRRR | ... | 3,5,7 |\n * | Extended year | u | -43, 0, 1, 1900, 2017 | 5 |\n * | | uu | -43, 01, 1900, 2017 | 5 |\n * | | uuu | -043, 001, 1900, 2017 | 5 |\n * | | uuuu | -0043, 0001, 1900, 2017 | 5 |\n * | | uuuuu | ... | 3,5 |\n * | Quarter (formatting) | Q | 1, 2, 3, 4 | |\n * | | Qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | QQ | 01, 02, 03, 04 | |\n * | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | q | 1, 2, 3, 4 | |\n * | | qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | qq | 01, 02, 03, 04 | |\n * | | qqq | Q1, Q2, Q3, Q4 | |\n * | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | qqqqq | 1, 2, 3, 4 | 4 |\n * | Month (formatting) | M | 1, 2, ..., 12 | |\n * | | Mo | 1st, 2nd, ..., 12th | 7 |\n * | | MM | 01, 02, ..., 12 | |\n * | | MMM | Jan, Feb, ..., Dec | |\n * | | MMMM | January, February, ..., December | 2 |\n * | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | L | 1, 2, ..., 12 | |\n * | | Lo | 1st, 2nd, ..., 12th | 7 |\n * | | LL | 01, 02, ..., 12 | |\n * | | LLL | Jan, Feb, ..., Dec | |\n * | | LLLL | January, February, ..., December | 2 |\n * | | LLLLL | J, F, ..., D | |\n * | Local week of year | w | 1, 2, ..., 53 | |\n * | | wo | 1st, 2nd, ..., 53th | 7 |\n * | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | I | 1, 2, ..., 53 | 7 |\n * | | Io | 1st, 2nd, ..., 53th | 7 |\n * | | II | 01, 02, ..., 53 | 7 |\n * | Day of month | d | 1, 2, ..., 31 | |\n * | | do | 1st, 2nd, ..., 31st | 7 |\n * | | dd | 01, 02, ..., 31 | |\n * | Day of year | D | 1, 2, ..., 365, 366 | 9 |\n * | | Do | 1st, 2nd, ..., 365th, 366th | 7 |\n * | | DD | 01, 02, ..., 365, 366 | 9 |\n * | | DDD | 001, 002, ..., 365, 366 | |\n * | | DDDD | ... | 3 |\n * | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | |\n * | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | EEEEE | M, T, W, T, F, S, S | |\n * | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |\n * | | io | 1st, 2nd, ..., 7th | 7 |\n * | | ii | 01, 02, ..., 07 | 7 |\n * | | iii | Mon, Tue, Wed, ..., Sun | 7 |\n * | | iiii | Monday, Tuesday, ..., Sunday | 2,7 |\n * | | iiiii | M, T, W, T, F, S, S | 7 |\n * | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 |\n * | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |\n * | | eo | 2nd, 3rd, ..., 1st | 7 |\n * | | ee | 02, 03, ..., 01 | |\n * | | eee | Mon, Tue, Wed, ..., Sun | |\n * | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | eeeee | M, T, W, T, F, S, S | |\n * | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |\n * | | co | 2nd, 3rd, ..., 1st | 7 |\n * | | cc | 02, 03, ..., 01 | |\n * | | ccc | Mon, Tue, Wed, ..., Sun | |\n * | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | ccccc | M, T, W, T, F, S, S | |\n * | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | AM, PM | a..aa | AM, PM | |\n * | | aaa | am, pm | |\n * | | aaaa | a.m., p.m. | 2 |\n * | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | |\n * | | bbb | am, pm, noon, midnight | |\n * | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | bbbbb | a, p, n, mi | |\n * | Flexible day period | B..BBB | at night, in the morning, ... | |\n * | | BBBB | at night, in the morning, ... | 2 |\n * | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | h | 1, 2, ..., 11, 12 | |\n * | | ho | 1st, 2nd, ..., 11th, 12th | 7 |\n * | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | H | 0, 1, 2, ..., 23 | |\n * | | Ho | 0th, 1st, 2nd, ..., 23rd | 7 |\n * | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | K | 1, 2, ..., 11, 0 | |\n * | | Ko | 1st, 2nd, ..., 11th, 0th | 7 |\n * | | KK | 01, 02, ..., 11, 00 | |\n * | Hour [1-24] | k | 24, 1, 2, ..., 23 | |\n * | | ko | 24th, 1st, 2nd, ..., 23rd | 7 |\n * | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | m | 0, 1, ..., 59 | |\n * | | mo | 0th, 1st, ..., 59th | 7 |\n * | | mm | 00, 01, ..., 59 | |\n * | Second | s | 0, 1, ..., 59 | |\n * | | so | 0th, 1st, ..., 59th | 7 |\n * | | ss | 00, 01, ..., 59 | |\n * | Fraction of second | S | 0, 1, ..., 9 | |\n * | | SS | 00, 01, ..., 99 | |\n * | | SSS | 000, 001, ..., 999 | |\n * | | SSSS | ... | 3 |\n * | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |\n * | | XX | -0800, +0530, Z | |\n * | | XXX | -08:00, +05:30, Z | |\n * | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |\n * | | xx | -0800, +0530, +0000 | |\n * | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |\n * | | OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |\n * | Timezone (specific non-locat.) | z...zzz | GMT-8, GMT+5:30, GMT+0 | 6 |\n * | | zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | 2,6 |\n * | Seconds timestamp | t | 512969520 | 7 |\n * | | tt | ... | 3,7 |\n * | Milliseconds timestamp | T | 512969520900 | 7 |\n * | | TT | ... | 3,7 |\n * | Long localized date | P | 04/29/1453 | 7 |\n * | | PP | Apr 29, 1453 | 7 |\n * | | PPP | April 29th, 1453 | 7 |\n * | | PPPP | Friday, April 29th, 1453 | 2,7 |\n * | Long localized time | p | 12:00 AM | 7 |\n * | | pp | 12:00:00 AM | 7 |\n * | | ppp | 12:00:00 AM GMT+2 | 7 |\n * | | pppp | 12:00:00 AM GMT+02:00 | 2,7 |\n * | Combination of date and time | Pp | 04/29/1453, 12:00 AM | 7 |\n * | | PPpp | Apr 29, 1453, 12:00:00 AM | 7 |\n * | | PPPppp | April 29th, 1453 at ... | 7 |\n * | | PPPPpppp| Friday, April 29th, 1453 at ... | 2,7 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n * the output will be the same as default pattern for this unit, usually\n * the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n * are marked with \"2\" in the last column of the table.\n *\n * `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n *\n * `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n *\n * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n * The output will be padded with zeros to match the length of the pattern.\n *\n * `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n *\n * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 5. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` always returns the last two digits of a year,\n * while `uu` pads single digit years to 2 characters and returns other years unchanged:\n *\n * | Year | `yy` | `uu` |\n * |------|------|------|\n * | 1 | 01 | 01 |\n * | 14 | 14 | 14 |\n * | 376 | 76 | 376 |\n * | 1453 | 53 | 1453 |\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [getISOWeekYear](https://date-fns.org/docs/getISOWeekYear)\n * and [getWeekYear](https://date-fns.org/docs/getWeekYear)).\n *\n * 6. Specific non-location timezones are currently unavailable in `date-fns`,\n * so right now these tokens fall back to GMT timezones.\n *\n * 7. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `t`: seconds timestamp\n * - `T`: milliseconds timestamp\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The original date\n * @param format - The string of tokens\n * @param options - An object with options\n *\n * @returns The formatted date string\n *\n * @throws `date` must not be Invalid Date\n * @throws `options.locale` must contain `localize` property\n * @throws `options.locale` must contain `formatLong` property\n * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = format(new Date(2014, 6, 2), \"do 'de' MMMM yyyy\", {\n * locale: eoLocale\n * })\n * //=> '2-a de julio 2014'\n *\n * @example\n * // Escape string by single quote characters:\n * const result = format(new Date(2014, 6, 2, 15), \"h 'o''clock'\")\n * //=> \"3 o'clock\"\n */\nexport function format(date, formatStr, options) {\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const originalDate = toDate(date);\n\n if (!isValid(originalDate)) {\n throw new RangeError(\"Invalid time value\");\n }\n\n let parts = formatStr\n .match(longFormattingTokensRegExp)\n .map((substring) => {\n const firstCharacter = substring[0];\n if (firstCharacter === \"p\" || firstCharacter === \"P\") {\n const longFormatter = longFormatters[firstCharacter];\n return longFormatter(substring, locale.formatLong);\n }\n return substring;\n })\n .join(\"\")\n .match(formattingTokensRegExp)\n .map((substring) => {\n // Replace two single quote characters with one single quote character\n if (substring === \"''\") {\n return { isToken: false, value: \"'\" };\n }\n\n const firstCharacter = substring[0];\n if (firstCharacter === \"'\") {\n return { isToken: false, value: cleanEscapedString(substring) };\n }\n\n if (formatters[firstCharacter]) {\n return { isToken: true, value: substring };\n }\n\n if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n throw new RangeError(\n \"Format string contains an unescaped latin alphabet character `\" +\n firstCharacter +\n \"`\",\n );\n }\n\n return { isToken: false, value: substring };\n });\n\n // invoke localize preprocessor (only for french locales at the moment)\n if (locale.localize.preprocessor) {\n parts = locale.localize.preprocessor(originalDate, parts);\n }\n\n const formatterOptions = {\n firstWeekContainsDate,\n weekStartsOn,\n locale,\n };\n\n return parts\n .map((part) => {\n if (!part.isToken) return part.value;\n\n const token = part.value;\n\n if (\n (!options?.useAdditionalWeekYearTokens &&\n isProtectedWeekYearToken(token)) ||\n (!options?.useAdditionalDayOfYearTokens &&\n isProtectedDayOfYearToken(token))\n ) {\n warnOrThrowProtectedError(token, formatStr, String(date));\n }\n\n const formatter = formatters[token[0]];\n return formatter(originalDate, token, locale.localize, formatterOptions);\n })\n .join(\"\");\n}\n\nfunction cleanEscapedString(input) {\n const matched = input.match(escapedStringRegExp);\n\n if (!matched) {\n return input;\n }\n\n return matched[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default format;\n","import { startOfWeek } from \"./startOfWeek.mjs\";\n\n/**\n * The {@link isSameWeek} function options.\n */\n\n/**\n * @name isSameWeek\n * @category Week Helpers\n * @summary Are the given dates in the same week (and month and year)?\n *\n * @description\n * Are the given dates in the same week (and month and year)?\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param dateLeft - The first date to check\n * @param dateRight - The second date to check\n * @param options - An object with options\n *\n * @returns The dates are in the same week (and month and year)\n *\n * @example\n * // Are 31 August 2014 and 4 September 2014 in the same week?\n * const result = isSameWeek(new Date(2014, 7, 31), new Date(2014, 8, 4))\n * //=> true\n *\n * @example\n * // If week starts with Monday,\n * // are 31 August 2014 and 4 September 2014 in the same week?\n * const result = isSameWeek(new Date(2014, 7, 31), new Date(2014, 8, 4), {\n * weekStartsOn: 1\n * })\n * //=> false\n *\n * @example\n * // Are 1 January 2014 and 1 January 2015 in the same week?\n * const result = isSameWeek(new Date(2014, 0, 1), new Date(2015, 0, 1))\n * //=> false\n */\nexport function isSameWeek(dateLeft, dateRight, options) {\n const dateLeftStartOfWeek = startOfWeek(dateLeft, options);\n const dateRightStartOfWeek = startOfWeek(dateRight, options);\n\n return +dateLeftStartOfWeek === +dateRightStartOfWeek;\n}\n\n// Fallback for modularized imports:\nexport default isSameWeek;\n","import { millisecondsInHour, millisecondsInMinute } from \"./constants.mjs\";\n\n/**\n * The {@link parseISO} function options.\n */\n\n/**\n * @name parseISO\n * @category Common Helpers\n * @summary Parse ISO string\n *\n * @description\n * Parse the given string in ISO 8601 format and return an instance of Date.\n *\n * Function accepts complete ISO 8601 formats as well as partial implementations.\n * ISO 8601: http://en.wikipedia.org/wiki/ISO_8601\n *\n * If the argument isn't a string, the function cannot parse the string or\n * the values are invalid, it returns Invalid Date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param argument - The value to convert\n * @param options - An object with options\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Convert string '2014-02-11T11:30:30' to date:\n * const result = parseISO('2014-02-11T11:30:30')\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert string '+02014101' to date,\n * // if the additional number of digits in the extended year format is 1:\n * const result = parseISO('+02014101', { additionalDigits: 1 })\n * //=> Fri Apr 11 2014 00:00:00\n */\nexport function parseISO(argument, options) {\n const additionalDigits = options?.additionalDigits ?? 2;\n const dateStrings = splitDateString(argument);\n\n let date;\n if (dateStrings.date) {\n const parseYearResult = parseYear(dateStrings.date, additionalDigits);\n date = parseDate(parseYearResult.restDateString, parseYearResult.year);\n }\n\n if (!date || isNaN(date.getTime())) {\n return new Date(NaN);\n }\n\n const timestamp = date.getTime();\n let time = 0;\n let offset;\n\n if (dateStrings.time) {\n time = parseTime(dateStrings.time);\n if (isNaN(time)) {\n return new Date(NaN);\n }\n }\n\n if (dateStrings.timezone) {\n offset = parseTimezone(dateStrings.timezone);\n if (isNaN(offset)) {\n return new Date(NaN);\n }\n } else {\n const dirtyDate = new Date(timestamp + time);\n // JS parsed string assuming it's in UTC timezone\n // but we need it to be parsed in our timezone\n // so we use utc values to build date in our timezone.\n // Year values from 0 to 99 map to the years 1900 to 1999\n // so set year explicitly with setFullYear.\n const result = new Date(0);\n result.setFullYear(\n dirtyDate.getUTCFullYear(),\n dirtyDate.getUTCMonth(),\n dirtyDate.getUTCDate(),\n );\n result.setHours(\n dirtyDate.getUTCHours(),\n dirtyDate.getUTCMinutes(),\n dirtyDate.getUTCSeconds(),\n dirtyDate.getUTCMilliseconds(),\n );\n return result;\n }\n\n return new Date(timestamp + time + offset);\n}\n\nconst patterns = {\n dateTimeDelimiter: /[T ]/,\n timeZoneDelimiter: /[Z ]/i,\n timezone: /([Z+-].*)$/,\n};\n\nconst dateRegex =\n /^-?(?:(\\d{3})|(\\d{2})(?:-?(\\d{2}))?|W(\\d{2})(?:-?(\\d{1}))?|)$/;\nconst timeRegex =\n /^(\\d{2}(?:[.,]\\d*)?)(?::?(\\d{2}(?:[.,]\\d*)?))?(?::?(\\d{2}(?:[.,]\\d*)?))?$/;\nconst timezoneRegex = /^([+-])(\\d{2})(?::?(\\d{2}))?$/;\n\nfunction splitDateString(dateString) {\n const dateStrings = {};\n const array = dateString.split(patterns.dateTimeDelimiter);\n let timeString;\n\n // The regex match should only return at maximum two array elements.\n // [date], [time], or [date, time].\n if (array.length > 2) {\n return dateStrings;\n }\n\n if (/:/.test(array[0])) {\n timeString = array[0];\n } else {\n dateStrings.date = array[0];\n timeString = array[1];\n if (patterns.timeZoneDelimiter.test(dateStrings.date)) {\n dateStrings.date = dateString.split(patterns.timeZoneDelimiter)[0];\n timeString = dateString.substr(\n dateStrings.date.length,\n dateString.length,\n );\n }\n }\n\n if (timeString) {\n const token = patterns.timezone.exec(timeString);\n if (token) {\n dateStrings.time = timeString.replace(token[1], \"\");\n dateStrings.timezone = token[1];\n } else {\n dateStrings.time = timeString;\n }\n }\n\n return dateStrings;\n}\n\nfunction parseYear(dateString, additionalDigits) {\n const regex = new RegExp(\n \"^(?:(\\\\d{4}|[+-]\\\\d{\" +\n (4 + additionalDigits) +\n \"})|(\\\\d{2}|[+-]\\\\d{\" +\n (2 + additionalDigits) +\n \"})$)\",\n );\n\n const captures = dateString.match(regex);\n // Invalid ISO-formatted year\n if (!captures) return { year: NaN, restDateString: \"\" };\n\n const year = captures[1] ? parseInt(captures[1]) : null;\n const century = captures[2] ? parseInt(captures[2]) : null;\n\n // either year or century is null, not both\n return {\n year: century === null ? year : century * 100,\n restDateString: dateString.slice((captures[1] || captures[2]).length),\n };\n}\n\nfunction parseDate(dateString, year) {\n // Invalid ISO-formatted year\n if (year === null) return new Date(NaN);\n\n const captures = dateString.match(dateRegex);\n // Invalid ISO-formatted string\n if (!captures) return new Date(NaN);\n\n const isWeekDate = !!captures[4];\n const dayOfYear = parseDateUnit(captures[1]);\n const month = parseDateUnit(captures[2]) - 1;\n const day = parseDateUnit(captures[3]);\n const week = parseDateUnit(captures[4]);\n const dayOfWeek = parseDateUnit(captures[5]) - 1;\n\n if (isWeekDate) {\n if (!validateWeekDate(year, week, dayOfWeek)) {\n return new Date(NaN);\n }\n return dayOfISOWeekYear(year, week, dayOfWeek);\n } else {\n const date = new Date(0);\n if (\n !validateDate(year, month, day) ||\n !validateDayOfYearDate(year, dayOfYear)\n ) {\n return new Date(NaN);\n }\n date.setUTCFullYear(year, month, Math.max(dayOfYear, day));\n return date;\n }\n}\n\nfunction parseDateUnit(value) {\n return value ? parseInt(value) : 1;\n}\n\nfunction parseTime(timeString) {\n const captures = timeString.match(timeRegex);\n if (!captures) return NaN; // Invalid ISO-formatted time\n\n const hours = parseTimeUnit(captures[1]);\n const minutes = parseTimeUnit(captures[2]);\n const seconds = parseTimeUnit(captures[3]);\n\n if (!validateTime(hours, minutes, seconds)) {\n return NaN;\n }\n\n return (\n hours * millisecondsInHour + minutes * millisecondsInMinute + seconds * 1000\n );\n}\n\nfunction parseTimeUnit(value) {\n return (value && parseFloat(value.replace(\",\", \".\"))) || 0;\n}\n\nfunction parseTimezone(timezoneString) {\n if (timezoneString === \"Z\") return 0;\n\n const captures = timezoneString.match(timezoneRegex);\n if (!captures) return 0;\n\n const sign = captures[1] === \"+\" ? -1 : 1;\n const hours = parseInt(captures[2]);\n const minutes = (captures[3] && parseInt(captures[3])) || 0;\n\n if (!validateTimezone(hours, minutes)) {\n return NaN;\n }\n\n return sign * (hours * millisecondsInHour + minutes * millisecondsInMinute);\n}\n\nfunction dayOfISOWeekYear(isoWeekYear, week, day) {\n const date = new Date(0);\n date.setUTCFullYear(isoWeekYear, 0, 4);\n const fourthOfJanuaryDay = date.getUTCDay() || 7;\n const diff = (week - 1) * 7 + day + 1 - fourthOfJanuaryDay;\n date.setUTCDate(date.getUTCDate() + diff);\n return date;\n}\n\n// Validation functions\n\n// February is null to handle the leap year (using ||)\nconst daysInMonths = [31, null, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nfunction isLeapYearIndex(year) {\n return year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);\n}\n\nfunction validateDate(year, month, date) {\n return (\n month >= 0 &&\n month <= 11 &&\n date >= 1 &&\n date <= (daysInMonths[month] || (isLeapYearIndex(year) ? 29 : 28))\n );\n}\n\nfunction validateDayOfYearDate(year, dayOfYear) {\n return dayOfYear >= 1 && dayOfYear <= (isLeapYearIndex(year) ? 366 : 365);\n}\n\nfunction validateWeekDate(_year, week, day) {\n return week >= 1 && week <= 53 && day >= 0 && day <= 6;\n}\n\nfunction validateTime(hours, minutes, seconds) {\n if (hours === 24) {\n return minutes === 0 && seconds === 0;\n }\n\n return (\n seconds >= 0 &&\n seconds < 60 &&\n minutes >= 0 &&\n minutes < 60 &&\n hours >= 0 &&\n hours < 25\n );\n}\n\nfunction validateTimezone(_hours, minutes) {\n return minutes >= 0 && minutes <= 59;\n}\n\n// Fallback for modularized imports:\nexport default parseISO;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n standalone: {\n one: \"weniger als 1 Sekunde\",\n other: \"weniger als {{count}} Sekunden\",\n },\n withPreposition: {\n one: \"weniger als 1 Sekunde\",\n other: \"weniger als {{count}} Sekunden\",\n },\n },\n\n xSeconds: {\n standalone: {\n one: \"1 Sekunde\",\n other: \"{{count}} Sekunden\",\n },\n withPreposition: {\n one: \"1 Sekunde\",\n other: \"{{count}} Sekunden\",\n },\n },\n\n halfAMinute: {\n standalone: \"eine halbe Minute\",\n withPreposition: \"einer halben Minute\",\n },\n\n lessThanXMinutes: {\n standalone: {\n one: \"weniger als 1 Minute\",\n other: \"weniger als {{count}} Minuten\",\n },\n withPreposition: {\n one: \"weniger als 1 Minute\",\n other: \"weniger als {{count}} Minuten\",\n },\n },\n\n xMinutes: {\n standalone: {\n one: \"1 Minute\",\n other: \"{{count}} Minuten\",\n },\n withPreposition: {\n one: \"1 Minute\",\n other: \"{{count}} Minuten\",\n },\n },\n\n aboutXHours: {\n standalone: {\n one: \"etwa 1 Stunde\",\n other: \"etwa {{count}} Stunden\",\n },\n withPreposition: {\n one: \"etwa 1 Stunde\",\n other: \"etwa {{count}} Stunden\",\n },\n },\n\n xHours: {\n standalone: {\n one: \"1 Stunde\",\n other: \"{{count}} Stunden\",\n },\n withPreposition: {\n one: \"1 Stunde\",\n other: \"{{count}} Stunden\",\n },\n },\n\n xDays: {\n standalone: {\n one: \"1 Tag\",\n other: \"{{count}} Tage\",\n },\n withPreposition: {\n one: \"1 Tag\",\n other: \"{{count}} Tagen\",\n },\n },\n\n aboutXWeeks: {\n standalone: {\n one: \"etwa 1 Woche\",\n other: \"etwa {{count}} Wochen\",\n },\n withPreposition: {\n one: \"etwa 1 Woche\",\n other: \"etwa {{count}} Wochen\",\n },\n },\n\n xWeeks: {\n standalone: {\n one: \"1 Woche\",\n other: \"{{count}} Wochen\",\n },\n withPreposition: {\n one: \"1 Woche\",\n other: \"{{count}} Wochen\",\n },\n },\n\n aboutXMonths: {\n standalone: {\n one: \"etwa 1 Monat\",\n other: \"etwa {{count}} Monate\",\n },\n withPreposition: {\n one: \"etwa 1 Monat\",\n other: \"etwa {{count}} Monaten\",\n },\n },\n\n xMonths: {\n standalone: {\n one: \"1 Monat\",\n other: \"{{count}} Monate\",\n },\n withPreposition: {\n one: \"1 Monat\",\n other: \"{{count}} Monaten\",\n },\n },\n\n aboutXYears: {\n standalone: {\n one: \"etwa 1 Jahr\",\n other: \"etwa {{count}} Jahre\",\n },\n withPreposition: {\n one: \"etwa 1 Jahr\",\n other: \"etwa {{count}} Jahren\",\n },\n },\n\n xYears: {\n standalone: {\n one: \"1 Jahr\",\n other: \"{{count}} Jahre\",\n },\n withPreposition: {\n one: \"1 Jahr\",\n other: \"{{count}} Jahren\",\n },\n },\n\n overXYears: {\n standalone: {\n one: \"mehr als 1 Jahr\",\n other: \"mehr als {{count}} Jahre\",\n },\n withPreposition: {\n one: \"mehr als 1 Jahr\",\n other: \"mehr als {{count}} Jahren\",\n },\n },\n\n almostXYears: {\n standalone: {\n one: \"fast 1 Jahr\",\n other: \"fast {{count}} Jahre\",\n },\n withPreposition: {\n one: \"fast 1 Jahr\",\n other: \"fast {{count}} Jahren\",\n },\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = options?.addSuffix\n ? formatDistanceLocale[token].withPreposition\n : formatDistanceLocale[token].standalone;\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", String(count));\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"in \" + result;\n } else {\n return \"vor \" + result;\n }\n }\n\n return result;\n};\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.mjs\";\n\n// DIN 5008: https://de.wikipedia.org/wiki/Datumsformat#DIN_5008\nconst dateFormats = {\n full: \"EEEE, do MMMM y\", // Montag, 7. Januar 2018\n long: \"do MMMM y\", // 7. Januar 2018\n medium: \"do MMM y\", // 7. Jan. 2018\n short: \"dd.MM.y\", // 07.01.2018\n};\n\nconst timeFormats = {\n full: \"HH:mm:ss zzzz\",\n long: \"HH:mm:ss z\",\n medium: \"HH:mm:ss\",\n short: \"HH:mm\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'um' {{time}}\",\n long: \"{{date}} 'um' {{time}}\",\n medium: \"{{date}} {{time}}\",\n short: \"{{date}} {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"'letzten' eeee 'um' p\",\n yesterday: \"'gestern um' p\",\n today: \"'heute um' p\",\n tomorrow: \"'morgen um' p\",\n nextWeek: \"eeee 'um' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.mjs\";\n\nconst eraValues = {\n narrow: [\"v.Chr.\", \"n.Chr.\"],\n abbreviated: [\"v.Chr.\", \"n.Chr.\"],\n wide: [\"vor Christus\", \"nach Christus\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1. Quartal\", \"2. Quartal\", \"3. Quartal\", \"4. Quartal\"],\n};\n\n// Note: in German, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"Jan\",\n \"Feb\",\n \"Mär\",\n \"Apr\",\n \"Mai\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Okt\",\n \"Nov\",\n \"Dez\",\n ],\n\n wide: [\n \"Januar\",\n \"Februar\",\n \"März\",\n \"April\",\n \"Mai\",\n \"Juni\",\n \"Juli\",\n \"August\",\n \"September\",\n \"Oktober\",\n \"November\",\n \"Dezember\",\n ],\n};\n\n// https://st.unicode.org/cldr-apps/v#/de/Gregorian/\nconst formattingMonthValues = {\n narrow: monthValues.narrow,\n abbreviated: [\n \"Jan.\",\n \"Feb.\",\n \"März\",\n \"Apr.\",\n \"Mai\",\n \"Juni\",\n \"Juli\",\n \"Aug.\",\n \"Sep.\",\n \"Okt.\",\n \"Nov.\",\n \"Dez.\",\n ],\n\n wide: monthValues.wide,\n};\n\nconst dayValues = {\n narrow: [\"S\", \"M\", \"D\", \"M\", \"D\", \"F\", \"S\"],\n short: [\"So\", \"Mo\", \"Di\", \"Mi\", \"Do\", \"Fr\", \"Sa\"],\n abbreviated: [\"So.\", \"Mo.\", \"Di.\", \"Mi.\", \"Do.\", \"Fr.\", \"Sa.\"],\n wide: [\n \"Sonntag\",\n \"Montag\",\n \"Dienstag\",\n \"Mittwoch\",\n \"Donnerstag\",\n \"Freitag\",\n \"Samstag\",\n ],\n};\n\n// https://www.unicode.org/cldr/charts/32/summary/de.html#1881\nconst dayPeriodValues = {\n narrow: {\n am: \"vm.\",\n pm: \"nm.\",\n midnight: \"Mitternacht\",\n noon: \"Mittag\",\n morning: \"Morgen\",\n afternoon: \"Nachm.\",\n evening: \"Abend\",\n night: \"Nacht\",\n },\n abbreviated: {\n am: \"vorm.\",\n pm: \"nachm.\",\n midnight: \"Mitternacht\",\n noon: \"Mittag\",\n morning: \"Morgen\",\n afternoon: \"Nachmittag\",\n evening: \"Abend\",\n night: \"Nacht\",\n },\n wide: {\n am: \"vormittags\",\n pm: \"nachmittags\",\n midnight: \"Mitternacht\",\n noon: \"Mittag\",\n morning: \"Morgen\",\n afternoon: \"Nachmittag\",\n evening: \"Abend\",\n night: \"Nacht\",\n },\n};\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"vm.\",\n pm: \"nm.\",\n midnight: \"Mitternacht\",\n noon: \"Mittag\",\n morning: \"morgens\",\n afternoon: \"nachm.\",\n evening: \"abends\",\n night: \"nachts\",\n },\n abbreviated: {\n am: \"vorm.\",\n pm: \"nachm.\",\n midnight: \"Mitternacht\",\n noon: \"Mittag\",\n morning: \"morgens\",\n afternoon: \"nachmittags\",\n evening: \"abends\",\n night: \"nachts\",\n },\n wide: {\n am: \"vormittags\",\n pm: \"nachmittags\",\n midnight: \"Mitternacht\",\n noon: \"Mittag\",\n morning: \"morgens\",\n afternoon: \"nachmittags\",\n evening: \"abends\",\n night: \"nachts\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber) => {\n const number = Number(dirtyNumber);\n\n return number + \".\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n formattingValues: formattingMonthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.mjs\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.mjs\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(\\.)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(v\\.? ?Chr\\.?|n\\.? ?Chr\\.?)/i,\n abbreviated: /^(v\\.? ?Chr\\.?|n\\.? ?Chr\\.?)/i,\n wide: /^(vor Christus|vor unserer Zeitrechnung|nach Christus|unserer Zeitrechnung)/i,\n};\nconst parseEraPatterns = {\n any: [/^v/i, /^n/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](\\.)? Quartal/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated:\n /^(j[aä]n|feb|mär[z]?|apr|mai|jun[i]?|jul[i]?|aug|sep|okt|nov|dez)\\.?/i,\n wide: /^(januar|februar|märz|april|mai|juni|juli|august|september|oktober|november|dezember)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^j[aä]/i,\n /^f/i,\n /^mär/i,\n /^ap/i,\n /^mai/i,\n /^jun/i,\n /^jul/i,\n /^au/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[smdmf]/i,\n short: /^(so|mo|di|mi|do|fr|sa)/i,\n abbreviated: /^(son?|mon?|die?|mit?|don?|fre?|sam?)\\.?/i,\n wide: /^(sonntag|montag|dienstag|mittwoch|donnerstag|freitag|samstag)/i,\n};\nconst parseDayPatterns = {\n any: [/^so/i, /^mo/i, /^di/i, /^mi/i, /^do/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(vm\\.?|nm\\.?|Mitternacht|Mittag|morgens|nachm\\.?|abends|nachts)/i,\n abbreviated:\n /^(vorm\\.?|nachm\\.?|Mitternacht|Mittag|morgens|nachm\\.?|abends|nachts)/i,\n wide: /^(vormittags|nachmittags|Mitternacht|Mittag|morgens|nachmittags|abends|nachts)/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^v/i,\n pm: /^n/i,\n midnight: /^Mitte/i,\n noon: /^Mitta/i,\n morning: /morgens/i,\n afternoon: /nachmittags/i, // will never be matched. Afternoon is matched by `pm`\n evening: /abends/i,\n night: /nachts/i, // will never be matched. Night is matched by `pm`\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./de/_lib/formatDistance.mjs\";\nimport { formatLong } from \"./de/_lib/formatLong.mjs\";\nimport { formatRelative } from \"./de/_lib/formatRelative.mjs\";\nimport { localize } from \"./de/_lib/localize.mjs\";\nimport { match } from \"./de/_lib/match.mjs\";\n\n/**\n * @category Locales\n * @summary German locale.\n * @language German\n * @iso-639-2 deu\n * @author Thomas Eilmsteiner [@DeMuu](https://github.com/DeMuu)\n * @author Asia [@asia-t](https://github.com/asia-t)\n * @author Van Vuong Ngo [@vanvuongngo](https://github.com/vanvuongngo)\n * @author RomanErnst [@pex](https://github.com/pex)\n * @author Philipp Keck [@Philipp91](https://github.com/Philipp91)\n */\nexport const de = {\n code: \"de\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 1 /* Monday */,\n firstWeekContainsDate: 4,\n },\n};\n\n// Fallback for modularized imports:\nexport default de;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"moins d’une seconde\",\n other: \"moins de {{count}} secondes\",\n },\n\n xSeconds: {\n one: \"1 seconde\",\n other: \"{{count}} secondes\",\n },\n\n halfAMinute: \"30 secondes\",\n\n lessThanXMinutes: {\n one: \"moins d’une minute\",\n other: \"moins de {{count}} minutes\",\n },\n\n xMinutes: {\n one: \"1 minute\",\n other: \"{{count}} minutes\",\n },\n\n aboutXHours: {\n one: \"environ 1 heure\",\n other: \"environ {{count}} heures\",\n },\n\n xHours: {\n one: \"1 heure\",\n other: \"{{count}} heures\",\n },\n\n xDays: {\n one: \"1 jour\",\n other: \"{{count}} jours\",\n },\n\n aboutXWeeks: {\n one: \"environ 1 semaine\",\n other: \"environ {{count}} semaines\",\n },\n\n xWeeks: {\n one: \"1 semaine\",\n other: \"{{count}} semaines\",\n },\n\n aboutXMonths: {\n one: \"environ 1 mois\",\n other: \"environ {{count}} mois\",\n },\n\n xMonths: {\n one: \"1 mois\",\n other: \"{{count}} mois\",\n },\n\n aboutXYears: {\n one: \"environ 1 an\",\n other: \"environ {{count}} ans\",\n },\n\n xYears: {\n one: \"1 an\",\n other: \"{{count}} ans\",\n },\n\n overXYears: {\n one: \"plus d’un an\",\n other: \"plus de {{count}} ans\",\n },\n\n almostXYears: {\n one: \"presqu’un an\",\n other: \"presque {{count}} ans\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n const form = formatDistanceLocale[token];\n if (typeof form === \"string\") {\n result = form;\n } else if (count === 1) {\n result = form.one;\n } else {\n result = form.other.replace(\"{{count}}\", String(count));\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"dans \" + result;\n } else {\n return \"il y a \" + result;\n }\n }\n\n return result;\n};\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.mjs\";\n\nconst dateFormats = {\n full: \"EEEE d MMMM y\",\n long: \"d MMMM y\",\n medium: \"d MMM y\",\n short: \"dd/MM/y\",\n};\n\nconst timeFormats = {\n full: \"HH:mm:ss zzzz\",\n long: \"HH:mm:ss z\",\n medium: \"HH:mm:ss\",\n short: \"HH:mm\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'à' {{time}}\",\n long: \"{{date}} 'à' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"eeee 'dernier à' p\",\n yesterday: \"'hier à' p\",\n today: \"'aujourd’hui à' p\",\n tomorrow: \"'demain à' p'\",\n nextWeek: \"eeee 'prochain à' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.mjs\";\n\nconst eraValues = {\n narrow: [\"av. J.-C\", \"ap. J.-C\"],\n abbreviated: [\"av. J.-C\", \"ap. J.-C\"],\n wide: [\"avant Jésus-Christ\", \"après Jésus-Christ\"],\n};\n\nconst quarterValues = {\n narrow: [\"T1\", \"T2\", \"T3\", \"T4\"],\n abbreviated: [\"1er trim.\", \"2ème trim.\", \"3ème trim.\", \"4ème trim.\"],\n wide: [\"1er trimestre\", \"2ème trimestre\", \"3ème trimestre\", \"4ème trimestre\"],\n};\n\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"janv.\",\n \"févr.\",\n \"mars\",\n \"avr.\",\n \"mai\",\n \"juin\",\n \"juil.\",\n \"août\",\n \"sept.\",\n \"oct.\",\n \"nov.\",\n \"déc.\",\n ],\n\n wide: [\n \"janvier\",\n \"février\",\n \"mars\",\n \"avril\",\n \"mai\",\n \"juin\",\n \"juillet\",\n \"août\",\n \"septembre\",\n \"octobre\",\n \"novembre\",\n \"décembre\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"D\", \"L\", \"M\", \"M\", \"J\", \"V\", \"S\"],\n short: [\"di\", \"lu\", \"ma\", \"me\", \"je\", \"ve\", \"sa\"],\n abbreviated: [\"dim.\", \"lun.\", \"mar.\", \"mer.\", \"jeu.\", \"ven.\", \"sam.\"],\n\n wide: [\n \"dimanche\",\n \"lundi\",\n \"mardi\",\n \"mercredi\",\n \"jeudi\",\n \"vendredi\",\n \"samedi\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"minuit\",\n noon: \"midi\",\n morning: \"mat.\",\n afternoon: \"ap.m.\",\n evening: \"soir\",\n night: \"mat.\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"minuit\",\n noon: \"midi\",\n morning: \"matin\",\n afternoon: \"après-midi\",\n evening: \"soir\",\n night: \"matin\",\n },\n wide: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"minuit\",\n noon: \"midi\",\n morning: \"du matin\",\n afternoon: \"de l’après-midi\",\n evening: \"du soir\",\n night: \"du matin\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, options) => {\n const number = Number(dirtyNumber);\n const unit = options?.unit;\n\n if (number === 0) return \"0\";\n\n const feminineUnits = [\"year\", \"week\", \"hour\", \"minute\", \"second\"];\n let suffix;\n\n if (number === 1) {\n suffix = unit && feminineUnits.includes(unit) ? \"ère\" : \"er\";\n } else {\n suffix = \"ème\";\n }\n\n return number + suffix;\n};\n\nconst LONG_MONTHS_TOKENS = [\"MMM\", \"MMMM\"];\n\nexport const localize = {\n preprocessor: (date, parts) => {\n // Replaces the `do` tokens with `d` when used with long month tokens and the day of the month is greater than one.\n // Use case \"do MMMM\" => 1er août, 29 août\n // see https://github.com/date-fns/date-fns/issues/1391\n\n if (date.getDate() === 1) return parts;\n\n const hasLongMonthToken = parts.some(\n (part) => part.isToken && LONG_MONTHS_TOKENS.includes(part.value),\n );\n\n if (!hasLongMonthToken) return parts;\n\n return parts.map((part) =>\n part.isToken && part.value === \"do\"\n ? { isToken: true, value: \"d\" }\n : part,\n );\n },\n\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n }),\n};\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.mjs\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.mjs\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(ième|ère|ème|er|e)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(av\\.J\\.C|ap\\.J\\.C|ap\\.J\\.-C)/i,\n abbreviated: /^(av\\.J\\.-C|av\\.J-C|apr\\.J\\.-C|apr\\.J-C|ap\\.J-C)/i,\n wide: /^(avant Jésus-Christ|après Jésus-Christ)/i,\n};\nconst parseEraPatterns = {\n any: [/^av/i, /^ap/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^T?[1234]/i,\n abbreviated: /^[1234](er|ème|e)? trim\\.?/i,\n wide: /^[1234](er|ème|e)? trimestre/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated:\n /^(janv|févr|mars|avr|mai|juin|juill|juil|août|sept|oct|nov|déc)\\.?/i,\n wide: /^(janvier|février|mars|avril|mai|juin|juillet|août|septembre|octobre|novembre|décembre)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ja/i,\n /^f/i,\n /^mar/i,\n /^av/i,\n /^ma/i,\n /^juin/i,\n /^juil/i,\n /^ao/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[lmjvsd]/i,\n short: /^(di|lu|ma|me|je|ve|sa)/i,\n abbreviated: /^(dim|lun|mar|mer|jeu|ven|sam)\\.?/i,\n wide: /^(dimanche|lundi|mardi|mercredi|jeudi|vendredi|samedi)/i,\n};\nconst parseDayPatterns = {\n narrow: [/^d/i, /^l/i, /^m/i, /^m/i, /^j/i, /^v/i, /^s/i],\n any: [/^di/i, /^lu/i, /^ma/i, /^me/i, /^je/i, /^ve/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(a|p|minuit|midi|mat\\.?|ap\\.?m\\.?|soir|nuit)/i,\n any: /^([ap]\\.?\\s?m\\.?|du matin|de l'après[-\\s]midi|du soir|de la nuit)/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^min/i,\n noon: /^mid/i,\n morning: /mat/i,\n afternoon: /ap/i,\n evening: /soir/i,\n night: /nuit/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./fr/_lib/formatDistance.mjs\";\nimport { formatLong } from \"./fr/_lib/formatLong.mjs\";\nimport { formatRelative } from \"./fr/_lib/formatRelative.mjs\";\nimport { localize } from \"./fr/_lib/localize.mjs\";\nimport { match } from \"./fr/_lib/match.mjs\";\n\n/**\n * @category Locales\n * @summary French locale.\n * @language French\n * @iso-639-2 fra\n * @author Jean Dupouy [@izeau](https://github.com/izeau)\n * @author François B [@fbonzon](https://github.com/fbonzon)\n */\nexport const fr = {\n code: \"fr\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 1 /* Monday */,\n firstWeekContainsDate: 4,\n },\n};\n\n// Fallback for modularized imports:\nexport default fr;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"meno di un secondo\",\n other: \"meno di {{count}} secondi\",\n },\n\n xSeconds: {\n one: \"un secondo\",\n other: \"{{count}} secondi\",\n },\n\n halfAMinute: \"alcuni secondi\",\n\n lessThanXMinutes: {\n one: \"meno di un minuto\",\n other: \"meno di {{count}} minuti\",\n },\n\n xMinutes: {\n one: \"un minuto\",\n other: \"{{count}} minuti\",\n },\n\n aboutXHours: {\n one: \"circa un'ora\",\n other: \"circa {{count}} ore\",\n },\n\n xHours: {\n one: \"un'ora\",\n other: \"{{count}} ore\",\n },\n\n xDays: {\n one: \"un giorno\",\n other: \"{{count}} giorni\",\n },\n\n aboutXWeeks: {\n one: \"circa una settimana\",\n other: \"circa {{count}} settimane\",\n },\n\n xWeeks: {\n one: \"una settimana\",\n other: \"{{count}} settimane\",\n },\n\n aboutXMonths: {\n one: \"circa un mese\",\n other: \"circa {{count}} mesi\",\n },\n\n xMonths: {\n one: \"un mese\",\n other: \"{{count}} mesi\",\n },\n\n aboutXYears: {\n one: \"circa un anno\",\n other: \"circa {{count}} anni\",\n },\n\n xYears: {\n one: \"un anno\",\n other: \"{{count}} anni\",\n },\n\n overXYears: {\n one: \"più di un anno\",\n other: \"più di {{count}} anni\",\n },\n\n almostXYears: {\n one: \"quasi un anno\",\n other: \"quasi {{count}} anni\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", count.toString());\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"tra \" + result;\n } else {\n return result + \" fa\";\n }\n }\n\n return result;\n};\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.mjs\";\n\nconst dateFormats = {\n full: \"EEEE d MMMM y\",\n long: \"d MMMM y\",\n medium: \"d MMM y\",\n short: \"dd/MM/y\",\n};\n\nconst timeFormats = {\n full: \"HH:mm:ss zzzz\",\n long: \"HH:mm:ss z\",\n medium: \"HH:mm:ss\",\n short: \"HH:mm\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} {{time}}\",\n long: \"{{date}} {{time}}\",\n medium: \"{{date}} {{time}}\",\n short: \"{{date}} {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","import { isSameWeek } from \"../../../isSameWeek.mjs\";\n\nconst weekdays = [\n \"domenica\",\n \"lunedì\",\n \"martedì\",\n \"mercoledì\",\n \"giovedì\",\n \"venerdì\",\n \"sabato\",\n];\n\nfunction lastWeek(day) {\n switch (day) {\n case 0:\n return \"'domenica scorsa alle' p\";\n default:\n return \"'\" + weekdays[day] + \" scorso alle' p\";\n }\n}\n\nfunction thisWeek(day) {\n return \"'\" + weekdays[day] + \" alle' p\";\n}\n\nfunction nextWeek(day) {\n switch (day) {\n case 0:\n return \"'domenica prossima alle' p\";\n default:\n return \"'\" + weekdays[day] + \" prossimo alle' p\";\n }\n}\n\nconst formatRelativeLocale = {\n lastWeek: (date, baseDate, options) => {\n const day = date.getDay();\n if (isSameWeek(date, baseDate, options)) {\n return thisWeek(day);\n } else {\n return lastWeek(day);\n }\n },\n yesterday: \"'ieri alle' p\",\n today: \"'oggi alle' p\",\n tomorrow: \"'domani alle' p\",\n nextWeek: (date, baseDate, options) => {\n const day = date.getDay();\n if (isSameWeek(date, baseDate, options)) {\n return thisWeek(day);\n } else {\n return nextWeek(day);\n }\n },\n other: \"P\",\n};\n\nexport const formatRelative = (token, date, baseDate, options) => {\n const format = formatRelativeLocale[token];\n\n if (typeof format === \"function\") {\n return format(date, baseDate, options);\n }\n\n return format;\n};\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.mjs\";\n\nconst eraValues = {\n narrow: [\"aC\", \"dC\"],\n abbreviated: [\"a.C.\", \"d.C.\"],\n wide: [\"avanti Cristo\", \"dopo Cristo\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"T1\", \"T2\", \"T3\", \"T4\"],\n wide: [\"1º trimestre\", \"2º trimestre\", \"3º trimestre\", \"4º trimestre\"],\n};\n\nconst monthValues = {\n narrow: [\"G\", \"F\", \"M\", \"A\", \"M\", \"G\", \"L\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"gen\",\n \"feb\",\n \"mar\",\n \"apr\",\n \"mag\",\n \"giu\",\n \"lug\",\n \"ago\",\n \"set\",\n \"ott\",\n \"nov\",\n \"dic\",\n ],\n\n wide: [\n \"gennaio\",\n \"febbraio\",\n \"marzo\",\n \"aprile\",\n \"maggio\",\n \"giugno\",\n \"luglio\",\n \"agosto\",\n \"settembre\",\n \"ottobre\",\n \"novembre\",\n \"dicembre\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"D\", \"L\", \"M\", \"M\", \"G\", \"V\", \"S\"],\n short: [\"dom\", \"lun\", \"mar\", \"mer\", \"gio\", \"ven\", \"sab\"],\n abbreviated: [\"dom\", \"lun\", \"mar\", \"mer\", \"gio\", \"ven\", \"sab\"],\n wide: [\n \"domenica\",\n \"lunedì\",\n \"martedì\",\n \"mercoledì\",\n \"giovedì\",\n \"venerdì\",\n \"sabato\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"m.\",\n pm: \"p.\",\n midnight: \"mezzanotte\",\n noon: \"mezzogiorno\",\n morning: \"mattina\",\n afternoon: \"pomeriggio\",\n evening: \"sera\",\n night: \"notte\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"mezzanotte\",\n noon: \"mezzogiorno\",\n morning: \"mattina\",\n afternoon: \"pomeriggio\",\n evening: \"sera\",\n night: \"notte\",\n },\n wide: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"mezzanotte\",\n noon: \"mezzogiorno\",\n morning: \"mattina\",\n afternoon: \"pomeriggio\",\n evening: \"sera\",\n night: \"notte\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"m.\",\n pm: \"p.\",\n midnight: \"mezzanotte\",\n noon: \"mezzogiorno\",\n morning: \"di mattina\",\n afternoon: \"del pomeriggio\",\n evening: \"di sera\",\n night: \"di notte\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"mezzanotte\",\n noon: \"mezzogiorno\",\n morning: \"di mattina\",\n afternoon: \"del pomeriggio\",\n evening: \"di sera\",\n night: \"di notte\",\n },\n wide: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"mezzanotte\",\n noon: \"mezzogiorno\",\n morning: \"di mattina\",\n afternoon: \"del pomeriggio\",\n evening: \"di sera\",\n night: \"di notte\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n const number = Number(dirtyNumber);\n return String(number);\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.mjs\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.mjs\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(º)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(aC|dC)/i,\n abbreviated: /^(a\\.?\\s?C\\.?|a\\.?\\s?e\\.?\\s?v\\.?|d\\.?\\s?C\\.?|e\\.?\\s?v\\.?)/i,\n wide: /^(avanti Cristo|avanti Era Volgare|dopo Cristo|Era Volgare)/i,\n};\nconst parseEraPatterns = {\n any: [/^a/i, /^(d|e)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^t[1234]/i,\n wide: /^[1234](º)? trimestre/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[gfmalsond]/i,\n abbreviated: /^(gen|feb|mar|apr|mag|giu|lug|ago|set|ott|nov|dic)/i,\n wide: /^(gennaio|febbraio|marzo|aprile|maggio|giugno|luglio|agosto|settembre|ottobre|novembre|dicembre)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^g/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^g/i,\n /^l/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ge/i,\n /^f/i,\n /^mar/i,\n /^ap/i,\n /^mag/i,\n /^gi/i,\n /^l/i,\n /^ag/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[dlmgvs]/i,\n short: /^(do|lu|ma|me|gi|ve|sa)/i,\n abbreviated: /^(dom|lun|mar|mer|gio|ven|sab)/i,\n wide: /^(domenica|luned[i|ì]|marted[i|ì]|mercoled[i|ì]|gioved[i|ì]|venerd[i|ì]|sabato)/i,\n};\nconst parseDayPatterns = {\n narrow: [/^d/i, /^l/i, /^m/i, /^m/i, /^g/i, /^v/i, /^s/i],\n any: [/^d/i, /^l/i, /^ma/i, /^me/i, /^g/i, /^v/i, /^s/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow:\n /^(a|m\\.|p|mezzanotte|mezzogiorno|(di|del) (mattina|pomeriggio|sera|notte))/i,\n any: /^([ap]\\.?\\s?m\\.?|mezzanotte|mezzogiorno|(di|del) (mattina|pomeriggio|sera|notte))/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mezza/i,\n noon: /^mezzo/i,\n morning: /mattina/i,\n afternoon: /pomeriggio/i,\n evening: /sera/i,\n night: /notte/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./it/_lib/formatDistance.mjs\";\nimport { formatLong } from \"./it/_lib/formatLong.mjs\";\nimport { formatRelative } from \"./it/_lib/formatRelative.mjs\";\nimport { localize } from \"./it/_lib/localize.mjs\";\nimport { match } from \"./it/_lib/match.mjs\";\n\n/**\n * @category Locales\n * @summary Italian locale.\n * @language Italian\n * @iso-639-2 ita\n * @author Alberto Restifo [@albertorestifo](https://github.com/albertorestifo)\n * @author Giovanni Polimeni [@giofilo](https://github.com/giofilo)\n * @author Vincenzo Carrese [@vin-car](https://github.com/vin-car)\n */\nexport const it = {\n code: \"it\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 1 /* Monday */,\n firstWeekContainsDate: 4,\n },\n};\n\n// Fallback for modularized imports:\nexport default it;\n","import { format, parseISO, type Locale } from 'date-fns';\nimport { de, enUS, fr, it } from 'date-fns/locale';\n\nconst locales: Record<string, Locale> = { de, en: enUS, fr, it };\n\nexport const formatDate = (\n date: string | Date,\n formatStr: string = 'dd. MMM yyyy',\n locale: string = 'de'\n): string => {\n const d = typeof date === 'string' ? parseISO(date) : date;\n return format(d, formatStr, { locale: locales[locale] || de });\n};\n\nexport const formatDateRange = (\n checkIn: string | Date,\n checkOut: string | Date,\n locale: string = 'de'\n): string => {\n const start = formatDate(checkIn, 'dd.', locale);\n const end = formatDate(checkOut, 'dd. MMM yyyy', locale);\n return `${start} - ${end}`;\n};\n","export const calculateDiscount = (\n originalPrice: number,\n discountedPrice: number\n): number => {\n if (originalPrice <= 0) return 0;\n return Math.round(((originalPrice - discountedPrice) / originalPrice) * 100);\n};\n","import React from 'react';\nimport { useUIContext } from '../../context';\nimport type { MembershipCardProps } from './MembershipCard.types';\nimport './MembershipCard.css';\n\nexport const MembershipCard: React.FC<MembershipCardProps> = ({\n fullName,\n cardNumber,\n validFrom,\n validUntil,\n validThruLabel,\n domainText = 'hotelcard.ch',\n cardImageUrl,\n}) => {\n const { t } = useUIContext();\n\n const label = validThruLabel || t('membership.valid_thru', 'Gültigkeit/Validité');\n\n return (\n <div\n className=\"hc-membership-card\"\n style={{ backgroundImage: `url(${cardImageUrl})` }}\n >\n <span className=\"hc-membership-card__field hc-membership-card__name\">\n {fullName}\n </span>\n <span className=\"hc-membership-card__field hc-membership-card__number\">\n {cardNumber}\n </span>\n <span className=\"hc-membership-card__field hc-membership-card__valid-thru-label\">\n {label}\n </span>\n <span className=\"hc-membership-card__field hc-membership-card__dates\">\n {validFrom} – {validUntil}\n </span>\n <span className=\"hc-membership-card__domain\">\n {domainText}\n </span>\n </div>\n );\n};\n\nMembershipCard.displayName = 'MembershipCard';\n"],"names":["translations","de","en","fr","it","getNestedValue","obj","path","keys","current","key","interpolate","str","options","_","value","createTranslateFunction","locale","localeTranslations","optionsOrFallback","fallback","isOptions","result","defaultT","defaultValue","UIContext","createContext","HotelCardUIProvider","currency","isDesktop","apiBaseUrl","customT","children","t","useMemo","jsx","useUIContext","useContext","cx","className","Button","forwardRef","variant","size","leftIcon","rightIcon","disabled","iconOnly","style","props","ref","getButtonClasses","classes","jsxs","Fragment","Badge","color","icon","colorStyleKey","badgeClasses","iconClasses","textClasses","StarIcon","HalfStarIcon","EmptyStarIcon","Rating","maxValue","showValue","name","date","quote","clampedValue","fullStars","hasHalfStar","emptyStars","renderStars","starClasses","stars","i","containerClasses","Divider","label","orientation","isHorizontal","lineClass","containerClass","CloseIcon","Chip","count","state","removable","onClick","onRemove","effectiveState","chipClasses","labelClasses","countBadgeClasses","handleClick","handleKeyDown","e","Checkbox","checked","defaultChecked","onChange","error","id","localChecked","setLocalChecked","useState","isFocused","setIsFocused","actualChecked","handleChange","newChecked","wrapperClasses","boxClasses","inputClasses","checkmarkClasses","RadioButton","autoComplete","event","outerCircleClasses","innerDotClasses","ChevronRightIcon","SectionHeader","title","showAllLabel","onShowAllClick","headerClasses","Modal","isOpen","onClose","width","showCloseButton","disableBackdropClick","modalRef","useRef","useEffect","handleEscape","handleBackdropClick","modalClasses","modalContent","createPortal","CommentIcon","PLACEHOLDER","repeat","n","renderFn","Card","image","imageAlt","price","isSuperior","badge","hasRating","withPadding","withHeight","ratingInfo","context","swissLodgeLabel","starsRowClasses","priceClasses","displayImage","renderRatingInfo","DEFAULT_PLACEHOLDER","BaseCard","hoverable","borderRadius","classNames","BaseCardImage","src","alt","height","aspectRatio","topLeftSlot","topRightSlot","bottomSlot","centerSlot","showGradient","placeholder","imageSrc","setImageSrc","hasError","setHasError","handleError","React","containerStyle","hasTopRow","BaseCardContent","padding","BaseCardSkeleton","imageHeight","imageAspectRatio","imageStyle","ChevronIcon","Dropdown","localValue","setLocalValue","setIsOpen","dropdownRef","actualValue","selectedLabel","_a","o","handleClickOutside","handleSelect","selectedValue","buttonClasses","chevronClasses","listClasses","option","opt","Input","helper","onFocus","onBlur","type","prefix","inputClassName","wrapperClassName","required","autoFocus","readOnly","inputProps","inputRef","newValue","handleFocus","handleBlur","helperClasses","Block","visual","description","showArrow","iconContainerClass","ReviewCard","rating","FAQ","items","defaultOpenIndex","allowMultiple","openIndices","setOpenIndices","toggleItem","index","prev","newSet","item","answerClasses","Benefits","subtitle","benefits","contactTitle","contactDescription","contactButtonText","onContactClick","sectionClasses","benefit","HeartIcon","HomeIcon","Pin","viewed","showFavorite","styleVariant","pinClasses","formattedPrice","EmptyState","action","useDebounce","delay","debouncedValue","setDebouncedValue","timer","useResponsive","setWidth","handleResize","useWindowData","useTranslation","namespace","i18nT","i18n","useI18nTranslation","actualFallback","resultStr","DualCalendar","startDate","endDate","onDateSelect","minDate","currentMonth","setCurrentMonth","isStartDate","dateStr","isEndDate","isMidDate","endOfMonth","getDaysInMonth","getFirstDayOfMonth","day","formatMonthYear","weekDays","days","baseDate","isDateDisabled","today","oneYearFromToday","dateParts","minParts","min","generateCalendar","monthOffset","daysInMonth","firstDay","styles","start","end","inRange","dayCellClasses","handlePrevMonth","handleNextMonth","prevMonth","isPrevDisabled","maxMonth","nextMonth","isNextDisabled","isNextDisabledMobile","PrevArrowIcon","NextArrowIcon","calendarsContainerClasses","getDateLocale","WhenContent","initialDateRange","initialMonthFilter","onMonthFilterChange","showApplyButton","onApply","dateLocale","dateRange","setDateRange","mode","setMode","selectedMonths","isAnytimeSelected","months","now","handleAnytimeClick","handleMonthToggle","monthValue","newSelectedMonths","m","handleApply","handleModeSwitch","newMode","getTodayDate","getNextDate","dateString","handleDateSelect","newRange","nextDate","monthGridClasses","contentClasses","month","CalendarIcon","DateSelector","setSelectedMonths","next","handlePointerDown","newDateRange","newMonthFilter","formatDateDisplay","format","d","handleDateRangeChange","range","handleMonthFilterChange","dropdownClasses","v","MinusIcon","PlusIcon","DropdownIcon","GuestContent","guests","petFilter","onPetChange","showPetToggle","childAgeErrors","onErrorClear","labels","childrenAges","handleIncrement","newChildrenAges","handleDecrement","handleAgeChange","currentAge","errorMessage","age","PersonIcon","GuestSelector","initialGuests","initialPetValue","setGuests","setPetFilter","errors","setErrors","totalGuests","handleGuestChange","newGuests","handlePetChange","handleErrorClear","SearchLocationIcon","ClearIcon","AllDestinationsIcon","NearMeIcon","HotelIcon","LocationIcon","RegionIcon","CountryIcon","LocationAutocomplete","onSelect","onSubmit","onAutocomplete","suggestions","setSuggestions","selectedIndex","setSelectedIndex","isLoading","setIsLoading","debounceRef","isIconActive","groupedSuggestions","hotels","s","cities","regions","countries","allItems","fetchSuggestions","query","results","handleInputChange","handleClear","suggestion","position","coordinates","displayText","getCoordinates","regionId","params","getIcon","highlightMatch","text","lowerText","lowerQuery","matchIndex","beforeMatch","match","afterMatch","citiesStartIndex","regionsStartIndex","countriesStartIndex","hotelsStartIndex","hasSearchResults","showEmptyState","itemIndex","MobileSortModal","sortOptions","SearchIcon","FilterIcon","SortIcon","MobileMapIcon","GuestsIcon","SearchControlsBar","onSearch","onGuestChange","onQueryChange","onDateRangeChange","onDestinationModeChange","onRegionsFilterChange","onCoordinatesChange","getGuestsDisplay","getDateDisplay","onMobileClick","onFilterClick","onSortClick","initialQuery","initialPetFilter","initialDestinationMode","initialRegionsFilter","initialCoordinates","viewMode","onViewModeChange","hideViewToggle","compact","setQuery","monthFilter","setMonthFilter","destinationMode","setDestinationMode","regionsFilter","setRegionsFilter","setChildAgeErrors","setCoordinates","handleSubmit","validationErrors","validateChildrenAges","onGuestFilterChange","getLocationDisplay","handleClearLocation","handleClearDate","handleClearGuests","defaultGuests","handleQueryChange","handleDateDropdownClose","handleGuestDropdownClose","newPetFilter","hasDateFilter","hasNonDefaultGuests","coordinate","setQueryValue","destination","regionFilter","MAX_IMAGES","SWIPE_THRESHOLD","HOTEL_PLACEHOLDER","BuildingIcon","ArrowLeftIcon","ArrowRightIcon","filled","HotelCardImage","images","hotelName","badges","isFavorite","onFavoriteClick","displayImages","currentImageIndex","setCurrentImageIndex","failedImages","setFailedImages","touchStart","setTouchStart","touchEnd","setTouchEnd","isDragging","setIsDragging","imageRef","handleImageError","getImageSrc","goToPreviousImage","goToNextImage","handlePrevImage","handleNextImage","handleTouchStart","handleTouchMove","handleTouchEnd","distance","handleFavorite","PinIcon","BreakfastIcon","FreeCancellationIcon","CheckmarkIcon","RatingBadgeSvg","HotelCardContent","location","isAvailable","getRatingCategory","score","getBenefitIcon","benefitId","getBenefitLabel","getStarRating","starRating","starCount","HotelCard","hotel","onContentClick","HotelCardSkeleton","autocompleteLocations","response","data","LocationSearchContent","onClear","showInput","externalInputRef","internalInputRef","handleSelectItem","handleNearMe","coords","cleanLocationText","SearchModalContent","showHeader","expandedSection","setExpandedSection","handleLocationSelect","destMode","formatDate","getWhenLabel","SearchModal","CollapsibleFilterSection","defaultExpanded","showAllText","showLessText","hasShowAll","initialItemsToShow","isExpanded","setIsExpanded","showAll","setShowAll","toggleExpanded","toggleShowAll","childrenArray","shouldShowToggle","displayedChildren","FilterCheckboxItem","trackName","ExperienceFilter","selected","themes","counts","expanded","setExpanded","visibleThemes","hasMoreThemes","handleToggle","theme","themeIdStr","isDisabled","CATEGORY_OPTIONS","HotelCategoryFilter","MealsFilter","DEFAULT_HISTOGRAM","MIN_HISTOGRAM_BUCKETS","normalizeHistogram","histogram","ratio","sum","j","targetIndex","PriceRangeFilter","minPrice","maxPrice","onDragStart","onDragEnd","debounceDelay","contextCurrency","displayCurrency","sliderRef","isDraggingExternal","setIsDraggingExternal","lastValueRef","timeoutRef","minInputValue","setMinInputValue","maxInputValue","setMaxInputValue","minInputFocused","setMinInputFocused","maxInputFocused","setMaxInputFocused","minPercent","maxPercent","normalizedHistogram","showHistogram","maxHistogramValue","getBarActive","useCallback","barStartPercent","barEndPercent","trackInset","triggerOnApply","handleDrag","clientX","rect","trackWidth","trackLeft","percent","newMin","newMax","handleMouseDown","handle","handleDragEnd","handleMouseMove","handleMinInputFocus","handleMaxInputFocus","handleMinInputChange","val","handleMaxInputChange","handleMinInputBlur","numValue","handleMaxInputBlur","histValue","isActive","RegionsFilter","isPlaceSearchActive","searchType","searchValue","selectedRegions","resetDestinationFilter","shouldShowResetContainer","findRegionByValue","topLevelMatch","region","subMatch","expandedCountries","setExpandedCountries","hasInitializedRef","countriesWithSelectedRegions","sub","handleCountryToggle","countryValue","handleRegionToggle","regionValue","r","WarningIcon","hasSubRegions","hasSelectableRegions","sr","subValues","hasSelectedRegions","selectableSubValues","merged","subRegion","REVIEW_OPTIONS","ReviewsFilter","reviewStyles","SelectedFiltersRow","filters","onClearAll","filter","TransportFilter","WellnessFilter","FilterMinimap","onViewMap","center","zoom","getStaticMapUrl","lat","lng","z","x","y","FilterSkeleton","itemCount","isRegionFilter","isPriceFilter","isDiscountFilter","isCategoryFilter","idx","countryIdx","regionIdx","DISCOUNT_OPTIONS","OPTIONS_FILTER","FilterPanel","onFilterChange","priceHistogram","discountCounts","optionsCounts","categoryCounts","experienceCounts","mealsCounts","reviewsCounts","transportCounts","wellnessCounts","servicesCounts","filterOptions","externalDiscounts","externalOptions","externalExperiences","externalRegions","externalCategories","externalMeals","externalReviews","externalTransport","externalWellness","externalServices","externalPriceRange","mapCenter","hasInitialLoadRef","priceMin","setPriceMin","priceMax","setPriceMax","setSelectedRegions","selectedDiscounts","setSelectedDiscounts","selectedOptions","setSelectedOptions","selectedCategories","setSelectedCategories","selectedExperiences","setSelectedExperiences","selectedMeals","setSelectedMeals","selectedReviews","setSelectedReviews","selectedTransport","setSelectedTransport","selectedWellness","setSelectedWellness","selectedServices","setSelectedServices","handlePriceChange","handlePriceApply","handleDiscountToggle","discountValue","newDiscounts","handleOptionToggle","optionValue","newOptions","handleCategoriesChange","values","handleRegionsChange","handleExperienceChange","handleMealsChange","handleReviewsChange","handleServicesChange","handleTransportChange","handleWellnessChange","FilterModal","resultCount","selectedFilters","onRemoveFilter","onClearAllFilters","selectedPriceRange","filterPanelProps","hasSelectedFilters","ChevronDownIcon","formatDateTime","time","formatted","formatPrice","amount","BookingCardDetails","booking","onCancelBooking","contentRef","willExpand","guestsText","PhoneIcon","EmailIcon","MapIcon","MessageIcon","ClockIcon","getDaysUntil","checkIn","checkInDate","diffTime","formatDateRange","checkOut","inDate","outDate","inDay","outDay","year","inMonth","FeaturedBookingCard","onAddToCalendar","showHotelMessage","setShowHotelMessage","fullAddress","daysUntil","handleDirections","encoded","url","StatusBadge","status","statusLabels","CompactBookingCard","showBookAgain","onBookAgain","FeaturedBookingCardSkeleton","CompactBookingCardSkeleton","ChevronLeftIcon","toDate","argument","argStr","constructFrom","millisecondsInWeek","millisecondsInDay","millisecondsInMinute","millisecondsInHour","defaultOptions","getDefaultOptions","startOfWeek","weekStartsOn","_b","_d","_c","_date","diff","startOfISOWeek","getISOWeekYear","fourthOfJanuaryOfNextYear","startOfNextYear","fourthOfJanuaryOfThisYear","startOfThisYear","startOfDay","getTimezoneOffsetInMilliseconds","utcDate","differenceInCalendarDays","dateLeft","dateRight","startOfDayLeft","startOfDayRight","timestampLeft","timestampRight","startOfISOWeekYear","fourthOfJanuary","isDate","isValid","startOfYear","cleanDate","formatDistanceLocale","formatDistance","token","tokenValue","buildFormatLongFn","args","dateFormats","timeFormats","dateTimeFormats","formatLong","formatRelativeLocale","formatRelative","_baseDate","_options","buildLocalizeFn","valuesArray","defaultWidth","eraValues","quarterValues","monthValues","dayValues","dayPeriodValues","formattingDayPeriodValues","ordinalNumber","dirtyNumber","number","rem100","localize","quarter","buildMatchFn","string","matchPattern","matchResult","matchedString","parsePatterns","findIndex","pattern","findKey","rest","object","predicate","array","buildMatchPatternFn","parseResult","matchOrdinalNumberPattern","parseOrdinalNumberPattern","matchEraPatterns","parseEraPatterns","matchQuarterPatterns","parseQuarterPatterns","matchMonthPatterns","parseMonthPatterns","matchDayPatterns","parseDayPatterns","matchDayPeriodPatterns","parseDayPeriodPatterns","enUS","getDayOfYear","getISOWeek","getWeekYear","firstWeekContainsDate","firstWeekOfNextYear","firstWeekOfThisYear","startOfWeekYear","firstWeek","getWeek","addLeadingZeros","targetLength","sign","output","lightFormatters","signedYear","dayPeriodEnumValue","numberOfDigits","milliseconds","fractionalSeconds","dayPeriodEnum","formatters","era","signedWeekYear","weekYear","twoDigitYear","isoWeekYear","week","isoWeek","dayOfYear","dayOfWeek","localDayOfWeek","isoDayOfWeek","hours","_localize","timezoneOffset","formatTimezoneWithOptionalMinutes","formatTimezone","formatTimezoneShort","timestamp","offset","delimiter","absOffset","minutes","dateLongFormatter","timeLongFormatter","dateTimeLongFormatter","datePattern","timePattern","dateTimeFormat","longFormatters","dayOfYearTokenRE","weekYearTokenRE","throwTokens","isProtectedDayOfYearToken","isProtectedWeekYearToken","warnOrThrowProtectedError","input","_message","message","subject","formattingTokensRegExp","longFormattingTokensRegExp","escapedStringRegExp","doubleQuoteRegExp","unescapedLatinCharacterRegExp","formatStr","defaultLocale","_f","_e","_h","_g","originalDate","parts","substring","firstCharacter","longFormatter","cleanEscapedString","formatterOptions","part","formatter","matched","isSameWeek","dateLeftStartOfWeek","dateRightStartOfWeek","parseISO","dateStrings","splitDateString","parseYearResult","parseYear","parseDate","parseTime","parseTimezone","dirtyDate","patterns","dateRegex","timeRegex","timezoneRegex","timeString","additionalDigits","regex","captures","century","isWeekDate","parseDateUnit","validateWeekDate","dayOfISOWeekYear","validateDate","validateDayOfYearDate","parseTimeUnit","seconds","validateTime","timezoneString","validateTimezone","fourthOfJanuaryDay","daysInMonths","isLeapYearIndex","_year","_hours","formattingMonthValues","form","unit","feminineUnits","suffix","LONG_MONTHS_TOKENS","weekdays","lastWeek","thisWeek","nextWeek","locales","calculateDiscount","originalPrice","discountedPrice","MembershipCard","fullName","cardNumber","validFrom","validUntil","validThruLabel","domainText","cardImageUrl"],"mappings":"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","x_google_ignoreList":[66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120]}