@hotelcard/ui 0.0.17 → 0.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/context/UIContext.tsx","../src/locales/de.json","../src/locales/en.json","../src/locales/fr.json","../src/locales/it.json","../src/locales/index.ts","../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/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/DateSelector/DateSelector.tsx","../src/hooks/useDebounce.ts","../src/hooks/useResponsive.ts","../src/hooks/useWindowData.ts","../src/hooks/useTranslation.ts","../src/components/DateSelector/WhenContent.tsx","../src/components/DateSelector/DualCalendar.tsx","../src/components/GuestSelector/GuestContent.tsx","../src/components/HotelCard/HotelCardImage.tsx","../src/components/HotelCard/HotelCardContent.tsx","../src/components/HotelCard/HotelCard.tsx","../src/components/Filters/FilterCheckboxItem.module.css","../src/components/Filters/FilterCheckboxItem.tsx","../src/components/Filters/CollapsibleFilterSection.tsx","../src/components/Filters/CollapsibleFilterSection.module.css","../src/components/Filters/PriceRangeFilter.tsx","../src/components/Filters/PriceRangeFilter.module.css","../src/components/Filters/HotelCategoryFilter.module.css","../src/components/Filters/HotelCategoryFilter.tsx","../src/components/Filters/ReviewsFilter.module.css","../src/components/Filters/ReviewsFilter.tsx","../src/components/Filters/ExperienceFilter.tsx","../src/components/Filters/ExperienceFilter.module.css","../src/components/Filters/RegionsFilter.tsx","../src/components/Filters/RegionsFilter.module.css","../src/components/Filters/CheckboxFilter.module.css","../src/components/Filters/CheckboxFilter.tsx","../src/components/Filters/SelectedFiltersRow.module.css","../src/components/Filters/SelectedFiltersRow.tsx","../src/components/Filters/FilterPanel.tsx","../src/components/Filters/FilterPanel.module.css","../src/components/Filters/FilterModal.tsx","../src/components/Filters/FilterModal.module.css","../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","../src/utils/formatDate.ts","../src/utils/calculateDiscount.ts"],"sourcesContent":["// @hotelcard/ui - Shared UI Components\n// Version: 0.0.17\n\n// =================================================================\n// CONTEXT / PROVIDER\n// =================================================================\n\nexport {\n HotelCardUIProvider,\n useUIContext,\n type UIContextValue,\n type HotelCardUIProviderProps,\n type TranslateFunction,\n} from './context';\n\n// =================================================================\n// COMPONENTS\n// =================================================================\n\n// Button\nexport { Button } from './components/Button';\nexport type { ButtonProps } from './components/Button';\n\n// Badge\nexport { Badge } from './components/Badge';\nexport type { BadgeProps } from './components/Badge';\n\n// Rating\nexport { Rating } from './components/Rating';\nexport type { RatingProps } from './components/Rating';\n\n// Divider\nexport { Divider } from './components/Divider';\nexport type { DividerProps } from './components/Divider';\n\n// Chip\nexport { Chip } from './components/Chip';\nexport type { ChipProps, ChipSize, ChipState } from './components/Chip';\n\n// Checkbox\nexport { Checkbox } from './components/Checkbox';\nexport type { CheckboxProps, CheckboxSize } from './components/Checkbox';\n\n// RadioButton\nexport { RadioButton } from './components/RadioButton';\nexport type { RadioButtonProps } from './components/RadioButton';\n\n// SectionHeader\nexport { SectionHeader } from './components/SectionHeader';\nexport type { SectionHeaderProps } from './components/SectionHeader';\n\n// Modal\nexport { Modal } from './components/Modal';\nexport type { ModalProps } from './components/Modal';\n\n// Card\nexport { Card } from './components/Card';\nexport type { CardProps, CardBadge, CardRatingInfo } from './components/Card';\n\n// Dropdown\nexport { Dropdown } from './components/Dropdown';\nexport type { DropdownProps, DropdownOption } from './components/Dropdown';\n\n// Input\nexport { Input } from './components/Input';\nexport type { InputProps, InputType } from './components/Input';\n\n// Block\nexport { Block } from './components/Block';\nexport type { BlockProps } from './components/Block';\n\n// ReviewCard\nexport { ReviewCard } from './components/ReviewCard';\nexport type { ReviewCardProps } from './components/ReviewCard';\n\n// FAQ\nexport { FAQ } from './components/FAQ';\nexport type { FAQProps, FAQItem } from './components/FAQ';\n\n// Benefits\nexport { Benefits } from './components/Benefits';\nexport type { BenefitsProps, BenefitItem } from './components/Benefits';\n\n// Pin\nexport { Pin } from './components/Pin';\nexport type { PinProps } from './components/Pin';\n\n// DateSelector\nexport { DateSelector, WhenContent, DualCalendar } from './components/DateSelector';\nexport type { DateSelectorProps, DateRange, WhenContentProps } from './components/DateSelector';\n\n// GuestSelector\nexport { GuestContent } from './components/GuestSelector';\nexport type { GuestContentProps, GuestCounts, ChildAgeError } from './components/GuestSelector';\n\n// HotelCard\nexport { HotelCard, HotelCardImage, HotelCardContent } from './components/HotelCard';\nexport type {\n HotelCardProps,\n HotelCardHotel,\n HotelCardImageProps,\n HotelCardContentProps,\n} from './components/HotelCard';\n\n// Filters\nexport {\n // Base components\n FilterCheckboxItem,\n CollapsibleFilterSection,\n // Specific filters\n PriceRangeFilter,\n HotelCategoryFilter,\n CATEGORY_OPTIONS,\n ReviewsFilter,\n REVIEW_OPTIONS,\n ExperienceFilter,\n RegionsFilter,\n // Generic checkbox filter\n CheckboxFilter,\n MealsFilter,\n TransportFilter,\n WellnessFilter,\n // Selected filters display\n SelectedFiltersRow,\n // Complete panel and modal\n FilterPanel,\n FilterModal,\n} from './components/Filters';\nexport type {\n FilterCheckboxItemProps,\n CollapsibleFilterSectionProps,\n PriceRangeFilterProps,\n HotelCategoryFilterProps,\n CategoryOption,\n ReviewsFilterProps,\n ReviewOption,\n ExperienceFilterProps,\n ThemeAggregation,\n RegionsFilterProps,\n RegionOption,\n CheckboxFilterProps,\n FilterOption,\n SelectedFiltersRowProps,\n SelectedFilter,\n // Panel and modal types\n FilterPanelProps,\n FilterState,\n FilterOptions,\n FilterModalProps,\n} from './components/Filters';\n\n// =================================================================\n// ICONS\n// =================================================================\n\nexport { HeartIcon, StarIcon, ChevronLeftIcon, ChevronRightIcon, PinIcon } from './components/icons';\n\n// =================================================================\n// HOOKS\n// =================================================================\n\nexport { useDebounce, useResponsive, useWindowData, useTranslation } from './hooks';\n\n// =================================================================\n// UTILS\n// =================================================================\n\nexport { formatPrice } from './utils';\nexport { formatDate, formatDateRange } from './utils';\nexport { calculateDiscount } from './utils';\n\n// =================================================================\n// TYPES\n// =================================================================\n\nexport type { Hotel } from './types';\nexport type { Booking } from './types';\nexport type { User, Address, Membership } from './types';\nexport type { SearchParams, SearchFilters } from './types';\n\n// =================================================================\n// TRANSLATIONS\n// =================================================================\n\nexport { translations, type Locale, type TranslationKeys } from './locales';\n","import React, { createContext, useContext, ReactNode, useMemo } from 'react';\nimport { translations, type Locale } from '../locales';\n\n/** Translation function type */\nexport type TranslateFunction = (key: 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 /** 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 * 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, fallback?: string): string => {\n const value = getNestedValue(localeTranslations as Record<string, unknown>, key);\n return value ?? fallback ?? key;\n };\n}\n\nconst defaultT = createTranslateFunction('de');\n\nconst defaultValue: UIContextValue = {\n locale: 'de',\n currency: 'CHF',\n isDesktop: false,\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 /** 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 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, t }),\n [locale, currency, isDesktop, 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","{\n \"button\": {\n \"order\": \"Bestellen\",\n \"order-navigation\": \"Bestellen\",\n \"order-hc\": \"HotelCard bestellen\",\n \"my-account\": \"Mein Konto\",\n \"search\": \"Suchen\",\n \"back-to-top\": \"Nach oben\"\n },\n \"link\": {\n \"member-benefits\": \"Member Benefits\",\n \"view-all-hotels\": \"Alle Hoteldeals ansehen\",\n \"search-by-map\": \"Kartenansicht\",\n \"search-by-region\": \"Hotels nach Region\",\n \"search-by-experience\": \"Hotels nach Erlebnis\",\n \"travel-inspiration\": \"Reiseinspiration\",\n \"booking-tips-and-tricks\": \"Buchungstipps\",\n \"home\": \"Startseite\",\n \"all-hotel-deals\": \"Alle Hotelangebote\",\n \"search-results\": \"Suchergebnisse\"\n },\n \"general\": {\n \"signed-out\": \"Anmelden und buchen\",\n \"room-price\": \"ab CHF xxx / Zimmer\",\n \"guarantee\": \"14 Tage Geld-zurück-Garantie\",\n \"contact\": \"Weitere Fragen? Kontaktieren Sie uns.\",\n \"breakfast-included\": \"Frühstück inbegriffen\",\n \"free-cancellation\": \"Kostenlose Stornierung\",\n \"suggested-destinations\": \"Vorgeschlagene Reiseziele\",\n \"when-months\": \"Wann möchtest du reisen?\",\n \"hotel-deals-found\": \"Hotelangebote gefunden\",\n \"no-results\": \"Probieren Sie andere Reiseziele, ändern Sie Ihre Daten oder entfernen Sie einige Filter.\",\n \"unavailable-for-selected-days\": \"Für die ausgewählten Daten nicht verfügbar.\",\n \"cant-accommodate-all\": \"Das Hotel kann nicht alle Gäste beherbergen.\",\n \"reset-destination\": \"Zielsuche zurücksetzen, um Regionen zu filtern\"\n },\n \"label\": {\n \"price-from\": \"ab \",\n \"price-for\": \"/ Zimmer\",\n \"per-room-night\": \"pro Zimmer & Nacht ab\",\n \"new\": \"Neu\",\n \"anytime\": \"Jederzeit\",\n \"anywhere\": \"Alle Reiseziele\",\n \"dates\": \"Datum\",\n \"flexible\": \"Flexibel\",\n \"where\": \"Wohin\",\n \"when\": \"Wann\",\n \"who\": \"Wer\",\n \"nearby\": \"In der Nähe\",\n \"hotels\": \"Hotel\",\n \"filter\": \"Filter\",\n \"sort\": \"Sortieren\",\n \"map\": \"Karte\",\n \"rating\": \"Bewertung\",\n \"rating-excellent\": \"Ausgezeichnet\",\n \"rating-very-good\": \"Sehr gut\",\n \"rating-good\": \"Gut\",\n \"rating-fair\": \"Ansprechend\",\n \"rating-none\": \"Keine Bewertung\"\n },\n \"product\": {\n \"6m\": \"6-Monatsabo\",\n \"1y\": \"1-Jahresabo\",\n \"2y\": \"2-Jahresabo\",\n \"3y\": \"3-Jahresabo\",\n \"price-6m\": \"79.-\",\n \"price-6m-disc\": \"59.-\",\n \"price-1y\": \"99.-\",\n \"price-1y-disc\": \"79.-\",\n \"price-2y\": \"198.-\",\n \"price-2y-disc\": \"173.-\",\n \"price-3y\": \"297.-\",\n \"price-3y-disc\": \"247.-\",\n \"price-gift\": \"99.-\",\n \"price-gift-disc\": \"59.-\"\n },\n \"subheadline\": {\n \"your-hc\": \"Ihre HotelCard\",\n \"popular-hotels\": \"Beliebte Hotelangebote\",\n \"no-results\": \"Probieren Sie andere Reiseziele, ändern Sie Ihre Daten oder entfernen Sie einige Filter.\",\n \"sort-by\": \"Sortieren nach\"\n },\n \"form\": {\n \"guests\": \"Gäste\",\n \"guest\": \"Gast\",\n \"adults\": \"Erwachsene\",\n \"children\": \"Kinder\",\n \"pet\": \"Haustier\",\n \"age-of-child\": \"Alter des Kindes\",\n \"age\": \"Alter\",\n \"age-error\": \"Bitte wählen Sie das Alter aus\"\n },\n \"filter\": {\n \"filters\": \"Filter\",\n \"destination\": \"Reiseziel\",\n \"experience\": \"Erlebnis\",\n \"show-all\": \"Alle anzeigen\",\n \"price\": \"Preis\",\n \"discount\": \"Rabatt\",\n \"services\": \"Leistungen\",\n \"meals\": \"Verpflegung\",\n \"hotel-category\": \"Hotelkategorie\",\n \"reviews\": \"Bewertungen\",\n \"mobility\": \"Mobilität\",\n \"wellness-spa\": \"Wellness & Spa\",\n \"price-high-low\": \"Preis: absteigend\",\n \"price-low-high\": \"Preis: aufsteigend\",\n \"best-rating\": \"Beste Bewertung\",\n \"most-popular\": \"Beliebt\",\n \"newest-hotels\": \"Neueste\",\n \"relevance\": \"Relevanz\",\n \"selected\": \"String value\",\n \"clear-all\": \"Alles löschen\",\n \"options\": \"Leistungen\",\n \"hotellerie-suisse\": \"Klassifikation HotellerieSuisse\",\n \"trustyou\": \"Bewertungen von Reisenden auf Trust You®\",\n \"select-all\": \"Alle auswählen\",\n \"reset\": \"Zurücksetzen\",\n \"breakfast-included\": \"Frühstück inbegriffen\"\n },\n \"headline\": {\n \"no-results\": \"Zurzeit entsprechen keine Aufenthalte Ihrer Suche\"\n }\n}\n","{\n \"button\": {\n \"order\": \"Order\",\n \"order-navigation\": \"Join\",\n \"order-hc\": \"Order HotelCard\",\n \"my-account\": \"My account\",\n \"search\": \"Search\",\n \"back-to-top\": \"Back to top\"\n },\n \"link\": {\n \"member-benefits\": \"Member Benefits\",\n \"view-all-hotels\": \"View all hotel deals\",\n \"search-by-map\": \"Map search\",\n \"search-by-region\": \"Hotels by region\",\n \"search-by-experience\": \"Hotels by experience\",\n \"travel-inspiration\": \"Travel inspiration\",\n \"booking-tips-and-tricks\": \"Booking tips\",\n \"home\": \"Home\",\n \"all-hotel-deals\": \"All hotel deals\",\n \"search-results\": \"Search results\"\n },\n \"general\": {\n \"signed-out\": \"Log in and book\",\n \"room-price\": \"from CHF xxx / room\",\n \"guarantee\": \"14-day money-back guarantee\",\n \"contact\": \"More questions? Contact us.\",\n \"breakfast-included\": \"Breakfast included\",\n \"free-cancellation\": \"Free cancellation\",\n \"suggested-destinations\": \"Not sure where to travel next?\",\n \"when-months\": \"When do you want to go?\",\n \"hotel-deals-found\": \"hotel deals found\",\n \"no-results\": \"Explore different destinations, change your dates, or remove some filters.\",\n \"unavailable-for-selected-days\": \"Unavailable for selected dates.\",\n \"cant-accommodate-all\": \"Hotel can’t accommodate all guests.\",\n \"reset-destination\": \"Reset destination search to use region filters.\"\n },\n \"label\": {\n \"price-from\": \"from \",\n \"price-for\": \"/ room\",\n \"per-room-night\": \"per room & night from\",\n \"new\": \"New\",\n \"anytime\": \"Anytime\",\n \"anywhere\": \"All destinations\",\n \"dates\": \"Dates\",\n \"flexible\": \"Flexible\",\n \"where\": \"Where\",\n \"when\": \"When\",\n \"who\": \"Who\",\n \"nearby\": \"Nearby\",\n \"hotels\": \"Hotel\",\n \"filter\": \"Filter\",\n \"sort\": \"Sort\",\n \"map\": \"Map\",\n \"rating\": \"Rating\",\n \"rating-excellent\": \"Excellent\",\n \"rating-very-good\": \"Very good\",\n \"rating-good\": \"Good\",\n \"rating-fair\": \"Fair\",\n \"rating-none\": \"No rating\"\n },\n \"product\": {\n \"6m\": \"6-month subscription\",\n \"1y\": \"1-year subscription\",\n \"2y\": \"2-year subscription\",\n \"3y\": \"3-year subscription\",\n \"price-6m\": \"79.-\",\n \"price-6m-disc\": \"59.-\",\n \"price-1y\": \"99.-\",\n \"price-1y-disc\": \"79.-\",\n \"price-2y\": \"198.-\",\n \"price-2y-disc\": \"173.-\",\n \"price-3y\": \"297.-\",\n \"price-3y-disc\": \"247.-\",\n \"price-gift\": \"99.-\",\n \"price-gift-disc\": \"59.-\"\n },\n \"subheadline\": {\n \"your-hc\": \"Your HotelCard\",\n \"popular-hotels\": \"Popular hotel deals\",\n \"no-results\": \"Explore different destinations, change your dates, or remove some filters.\",\n \"sort-by\": \"Sort by\"\n },\n \"form\": {\n \"guests\": \"guests\",\n \"guest\": \"guest\",\n \"adults\": \"Adults\",\n \"children\": \"Children\",\n \"pet\": \"Pet\",\n \"age-of-child\": \"Child’s age\",\n \"age\": \"Age\",\n \"age-error\": \"Please select age\"\n },\n \"filter\": {\n \"filters\": \"Filters\",\n \"destination\": \"Destination\",\n \"experience\": \"Experience\",\n \"show-all\": \"Show all\",\n \"price\": \"Price\",\n \"discount\": \"Discount\",\n \"services\": \"Services\",\n \"meals\": \"Meals\",\n \"hotel-category\": \"Hotel category\",\n \"reviews\": \"Reviews\",\n \"mobility\": \"Mobility\",\n \"wellness-spa\": \"Wellness & Spa\",\n \"price-high-low\": \"Price high to low\",\n \"price-low-high\": \"Price low to high\",\n \"best-rating\": \"Best guest rating\",\n \"most-popular\": \"Most popular\",\n \"newest-hotels\": \"Newest\",\n \"relevance\": \"Relevance\",\n \"selected\": \"Selected\",\n \"clear-all\": \"Clear all\",\n \"options\": \"Options\",\n \"hotellerie-suisse\": \"Classification HotellerieSuisse\",\n \"trustyou\": \"Reviews from travelers on TrustYou®\",\n \"select-all\": \"Select all\",\n \"reset\": \"Reset\",\n \"breakfast-included\": \"Breakfast included\"\n },\n \"headline\": {\n \"no-results\": \"No stays match your search right now\"\n }\n}\n","{\n \"button\": {\n \"order\": \"Commander\",\n \"order-navigation\": \"Commander\",\n \"order-hc\": \"Commander l'HotelCard\",\n \"my-account\": \"Mon compte\",\n \"search\": \"Rechercher\",\n \"back-to-top\": \"Haut de page\"\n },\n \"link\": {\n \"member-benefits\": \"Member Benefits\",\n \"view-all-hotels\": \"Découvrez toutes nos offres\",\n \"search-by-map\": \"Recherche sur la carte\",\n \"search-by-region\": \"Hôtels par région\",\n \"search-by-experience\": \"Hôtels par expérience\",\n \"travel-inspiration\": \"Inspiration voyage\",\n \"booking-tips-and-tricks\": \"Conseils réservation\",\n \"home\": \"Accueil\",\n \"all-hotel-deals\": \"Toutes les offres d’hôtels\",\n \"search-results\": \"Résultats de recherche\"\n },\n \"general\": {\n \"signed-out\": \"Se connecter et réserver\",\n \"room-price\": \"à partir de CHF XXX par chambre\",\n \"guarantee\": \"Garantie de remboursement de 14 jours\",\n \"contact\": \"D’autres questions ? Contactez-nous.\",\n \"breakfast-included\": \"Petit-déjeuner inclus\",\n \"free-cancellation\": \"Annulation gratuite\",\n \"suggested-destinations\": \"Suggestions de destinations\",\n \"when-months\": \"Quand souhaitez-vous partir ?\",\n \"hotel-deals-found\": \"offres d’hôtel trouvées\",\n \"no-results\": \"Explorez d’autres destinations, modifiez vos dates ou retirez certains filtres.\",\n \"unavailable-for-selected-days\": \"Indisponible aux dates sélectionnées.\",\n \"cant-accommodate-all\": \"L’hôtel ne peut pas accueillir tous les voyageurs.\",\n \"reset-destination\": \"Réinitialiser la destination et filtrer par région\"\n },\n \"label\": {\n \"price-from\": \"à partir de \",\n \"price-for\": \"par chambre\",\n \"per-room-night\": \"par chambre & nuit dès\",\n \"new\": \"Nouveau\",\n \"anytime\": \"À tout moment\",\n \"anywhere\": \"Toutes les destinations\",\n \"dates\": \"Dates\",\n \"flexible\": \"Flexible\",\n \"where\": \"Destination\",\n \"when\": \"Quand\",\n \"who\": \"Voyageurs\",\n \"nearby\": \"À proximité\",\n \"hotels\": \"Hôtel\",\n \"filter\": \"Filtrer\",\n \"sort\": \"Trier\",\n \"map\": \"Carte\",\n \"rating\": \"Note\",\n \"rating-excellent\": \"Excellent\",\n \"rating-very-good\": \"Très bien\",\n \"rating-good\": \"Bien\",\n \"rating-fair\": \"Moyen\",\n \"rating-none\": \"Aucune notation\"\n },\n \"product\": {\n \"6m\": \"Abonnement de 6 mois\",\n \"1y\": \"Abonnement 1 an\",\n \"2y\": \"Abonnement 2 ans\",\n \"3y\": \"Abonnement 3 ans\",\n \"price-6m\": \"79.-\",\n \"price-6m-disc\": \"59.-\",\n \"price-1y\": \"99.-\",\n \"price-1y-disc\": \"79.-\",\n \"price-2y\": \"198.-\",\n \"price-2y-disc\": \"173.-\",\n \"price-3y\": \"297.-\",\n \"price-3y-disc\": \"247.-\",\n \"price-gift\": \"99.-\",\n \"price-gift-disc\": \"59.-\"\n },\n \"subheadline\": {\n \"your-hc\": \"Votre HotelCard\",\n \"popular-hotels\": \"Offres d’hôtels populaires\",\n \"no-results\": \"Explorez d’autres destinations, modifiez vos dates ou retirez certains filtres.\",\n \"sort-by\": \"Trier par\"\n },\n \"form\": {\n \"guests\": \"personnes\",\n \"guest\": \"personne\",\n \"adults\": \"Adultes\",\n \"children\": \"Enfants\",\n \"pet\": \"Animal domestique\",\n \"age-of-child\": \"Âge de l’enfant\",\n \"age\": \"Âge\",\n \"age-error\": \"Veuillez sélectionner l’âge\"\n },\n \"filter\": {\n \"filters\": \"Filtres\",\n \"destination\": \"Destination\",\n \"experience\": \"Expérience\",\n \"show-all\": \"Tout afficher\",\n \"price\": \"Prix\",\n \"discount\": \"Réduction\",\n \"services\": \"Services\",\n \"meals\": \"Repas\",\n \"hotel-category\": \"Catégorie d’hôtel\",\n \"reviews\": \"Avis\",\n \"mobility\": \"Mobilité\",\n \"wellness-spa\": \"Bien-être & Spa\",\n \"price-high-low\": \"Prix : du plus bas\",\n \"price-low-high\": \"Prix : du plus élevé\",\n \"best-rating\": \"Meilleure note\",\n \"most-popular\": \"Plus populaires\",\n \"newest-hotels\": \"Plus récents\",\n \"relevance\": \"Pertinence\",\n \"selected\": \"String value\",\n \"clear-all\": \"Tout effacer\",\n \"options\": \"Services\",\n \"hotellerie-suisse\": \"Classification HotellerieSuisse\",\n \"trustyou\": \"Avis de voyageurs sur TrustYou®\",\n \"select-all\": \"Tout sélectionner\",\n \"reset\": \"Réinitialiser\",\n \"breakfast-included\": \"Petit-déjeuner inclus\"\n },\n \"headline\": {\n \"no-results\": \"Aucun séjour ne correspond à votre recherche pour le moment\"\n }\n}\n","{\n \"button\": {\n \"order\": \"Ordina ora\",\n \"order-navigation\": \"Ordina ora\",\n \"order-hc\": \"Ordina HotelCard\",\n \"my-account\": \"Il mio profilo\",\n \"search\": \"Cerca\",\n \"back-to-top\": \"Torna su\"\n },\n \"link\": {\n \"member-benefits\": \"Member Benefits\",\n \"view-all-hotels\": \"Tutte le offerte hotel\",\n \"search-by-map\": \"Ricerca sulla mappa\",\n \"search-by-region\": \"Hotel per regione\",\n \"search-by-experience\": \"Hotel per esperienza\",\n \"travel-inspiration\": \"Ispirazioni di viaggio\",\n \"booking-tips-and-tricks\": \"Consigli prenotazione\",\n \"home\": \"Home\",\n \"all-hotel-deals\": \"Tutte le offerte hotel\",\n \"search-results\": \"Risultati di ricerca\"\n },\n \"general\": {\n \"signed-out\": \"Accedi e prenota\",\n \"room-price\": \"a partire da CHF xxx per camera\",\n \"guarantee\": \"Garanzia di rimborso di 14 giorni\",\n \"contact\": \"Altre domande? Contattaci.\",\n \"breakfast-included\": \"Colazione inclusa\",\n \"free-cancellation\": \"Cancellazione gratuita\",\n \"suggested-destinations\": \"Destinazioni suggerite\",\n \"when-months\": \"Quando vuoi viaggiare?\",\n \"hotel-deals-found\": \"offerte hotel trovate\",\n \"no-results\": \"Prova altre destinazioni, cambia le date o rimuovi qualche filtro.\",\n \"unavailable-for-selected-days\": \"Non disponibile per le date selezionate.\",\n \"cant-accommodate-all\": \"L’hotel non può accogliere tutti gli ospiti.\",\n \"reset-destination\": \"Reimposta la destinazione e filtra per regione\"\n },\n \"label\": {\n \"price-from\": \"a partire da \",\n \"price-for\": \"per camera\",\n \"per-room-night\": \"per camera e notte da\",\n \"new\": \"Nuovo\",\n \"anytime\": \"In qualsiasi momento\",\n \"anywhere\": \"Tutte le destinazioni\",\n \"dates\": \"Date\",\n \"flexible\": \"Flessibile\",\n \"where\": \"Dove\",\n \"when\": \"Date\",\n \"who\": \"Chi\",\n \"nearby\": \"Nelle vicinanze\",\n \"hotels\": \"Hotel\",\n \"filter\": \"Filtra\",\n \"sort\": \"Ordina\",\n \"map\": \"Mappa\",\n \"rating\": \"Rating\",\n \"rating-excellent\": \"Eccellente\",\n \"rating-very-good\": \"Ottimo\",\n \"rating-good\": \"Buono\",\n \"rating-fair\": \"Sufficiente\",\n \"rating-none\": \"Nessun voto\"\n },\n \"product\": {\n \"6m\": \"Abbonamento di 6 mesi\",\n \"1y\": \"Abbonamento 1 anno\",\n \"2y\": \"Abbonamento 2 anni\",\n \"3y\": \"Abbonamento 3 anni\",\n \"price-6m\": \"79.-\",\n \"price-6m-disc\": \"59.-\",\n \"price-1y\": \"99.-\",\n \"price-1y-disc\": \"79.-\",\n \"price-2y\": \"198.-\",\n \"price-2y-disc\": \"173.-\",\n \"price-3y\": \"297.-\",\n \"price-3y-disc\": \"247.-\",\n \"price-gift\": \"99.-\",\n \"price-gift-disc\": \"59.-\"\n },\n \"subheadline\": {\n \"your-hc\": \"La sua HotelCard\",\n \"popular-hotels\": \"Offerte hotel popolari\",\n \"no-results\": \"Prova altre destinazioni, cambia le date o rimuovi qualche filtro.\",\n \"sort-by\": \"Ordina per\"\n },\n \"form\": {\n \"guests\": \"ospiti\",\n \"guest\": \"ospite\",\n \"adults\": \"Adulti\",\n \"children\": \"Bambini\",\n \"pet\": \"Animale domestico\",\n \"age-of-child\": \"L'età del bambino\",\n \"age\": \"L'età\",\n \"age-error\": \"Seleziona l’età\"\n },\n \"filter\": {\n \"filters\": \"Filtri\",\n \"destination\": \"Destinazione\",\n \"experience\": \"Esperienza\",\n \"show-all\": \"Mostra tutto\",\n \"price\": \"Prezzo\",\n \"discount\": \"Sconto\",\n \"services\": \"Servizi\",\n \"meals\": \"Pasti\",\n \"hotel-category\": \"Categoria hotel\",\n \"reviews\": \"Recensioni\",\n \"mobility\": \"Mobilità\",\n \"wellness-spa\": \"Wellness & Spa\",\n \"price-high-low\": \"Prezzo: dal più basso\",\n \"price-low-high\": \"Prezzo: dal più alto\",\n \"best-rating\": \"Miglior voto\",\n \"most-popular\": \"Più popolari\",\n \"newest-hotels\": \"Più recenti\",\n \"relevance\": \"Rilevanza\",\n \"selected\": \"String value\",\n \"clear-all\": \"Cancella tutto\",\n \"options\": \"Servizi\",\n \"hotellerie-suisse\": \"Classificazione HotellerieSuisse\",\n \"trustyou\": \"Recensioni dei viaggiatori su TrustYou®\",\n \"select-all\": \"Seleziona tutto\",\n \"reset\": \"Reimposta\",\n \"breakfast-included\": \"Colazione inclusa\"\n },\n \"headline\": {\n \"no-results\": \"Al momento nessun soggiorno corrisponde alla tua ricerca\"\n }\n}\n","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 { 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, 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, { useState, useRef, useEffect, useMemo } from 'react';\nimport { useWindowData, useResponsive } from '../../hooks';\nimport { useUIContext } from '../../context';\nimport { WhenContent, type DateRange } from './WhenContent';\nimport './DateSelector.css';\n\n// CSS class prefix\nconst cx = (name: string) => `hc-date-selector${name ? `__${name}` : ''}`;\nconst cxMod = (base: string, mod: string) => `hc-date-selector__${base}--${mod}`;\n\n// Map app locale to BCP 47 locale tag\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\n// Default calendar icon\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\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 */\n onClose?: (dateRange: DateRange | null, monthFilter: string[] | null) => void;\n disabled?: boolean;\n className?: string;\n icon?: React.ReactNode;\n}\n\n/**\n * DateSelector - Date range and flexible month picker\n *\n * Features:\n * - Calendar for specific date range\n * - Month chips for flexible dates\n * - \"Anytime\" option\n * - Desktop: centered dropdown\n * - Mobile: bottom sheet\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\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 state when parent changes\n useEffect(() => {\n setDateRange((prev) => {\n if (prev.start === initialDateRange.start && prev.end === initialDateRange.end) {\n return prev;\n }\n return initialDateRange;\n });\n\n setSelectedMonths((prev) => {\n const next = initialMonthFilter || [];\n if (prev.length === next.length && prev.every((m, i) => m === next[i])) {\n return prev;\n }\n return next;\n });\n }, [initialDateRange.start, initialDateRange.end, initialMonthFilter]);\n\n // Close dropdown on outside click\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 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 };\n\n document.addEventListener('pointerdown', handlePointerDown);\n return () => document.removeEventListener('pointerdown', handlePointerDown);\n }, [isOpen, dateRange, selectedMonths, onChange, onMonthFilterChange, onClose]);\n\n // Generate months for display\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 // Display label\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 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', 'Flexible');\n }\n\n if (selectedMonths.length > 1) {\n return `${selectedMonths.length} months`;\n }\n\n return t('label.flexible', 'Flexible');\n };\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 const handleApply = () => {\n if (dateRange.start && dateRange.end) {\n onChange?.(dateRange);\n } else {\n onChange?.(null);\n }\n onMonthFilterChange?.(selectedMonths.length ? selectedMonths : null);\n setIsOpen(false);\n };\n\n const handleBackdropClick = () => {\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\n const buttonClasses = [\n cx('button'),\n disabled && cxMod('button', 'disabled'),\n className,\n ].filter(Boolean).join(' ');\n\n const dropdownClasses = [\n cx('dropdown'),\n isOpen && cxMod('dropdown', 'open'),\n !isDesktop && cxMod('dropdown', 'mobile'),\n ].filter(Boolean).join(' ');\n\n return (\n <div ref={dropdownRef} className={cx('')}>\n <button\n type=\"button\"\n className={buttonClasses}\n onClick={() => !disabled && setIsOpen((v) => !v)}\n disabled={disabled}\n >\n <span className={cx('icon')}>{icon || <CalendarIcon />}</span>\n <span className={cx('label')}>{formatDateDisplay()}</span>\n </button>\n\n {/* Backdrop */}\n {isOpen && (\n <div className={cx('backdrop')} onClick={handleBackdropClick} aria-hidden=\"true\" />\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\nDateSelector.displayName = 'DateSelector';\n\nexport { DateSelector };\nexport type { DateRange };\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, options?: 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 * @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, options, fallback) => {\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 && fallback !== undefined) {\n return fallback;\n }\n return resultStr;\n };\n\n return { t, i18n };\n};\n","import React, { useState, useEffect } from 'react';\nimport { useWindowData, useResponsive } from '../../hooks';\nimport { useUIContext } from '../../context';\nimport { Button } from '../Button';\nimport { DualCalendar } from './DualCalendar';\nimport './WhenContent.css';\n\n// CSS class prefix\nconst cx = (name: string) => `hc-when-content${name ? `__${name}` : ''}`;\nconst cxMod = (base: string, mod: string) => `hc-when-content__${base}--${mod}`;\n\n// Map app locale to BCP 47 locale tag\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 /** Override locale for date formatting (defaults to context locale) */\n locale?: string;\n}\n\n/**\n * WhenContent - Shared date/time selection UI\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 *\n * Translations handled internally via UIContext.\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 locale: localeProp,\n}) => {\n const { locale: contextLocale } = useWindowData();\n const { isDesktop } = useResponsive();\n const { t } = useUIContext();\n\n const locale = localeProp || contextLocale;\n const dateLocale = getDateLocale(locale);\n\n // Get translations from context\n const labels = {\n when: t('label.when', 'When'),\n dates: t('label.dates', 'Dates'),\n flexible: t('label.flexible', 'Flexible'),\n apply: t('button.search', 'Apply'),\n selectMonths: t('general.when-months', 'Select months'),\n anytime: t('label.anytime', 'Anytime'),\n };\n\n const [dateRange, setDateRange] = useState<DateRange>(initialDateRange);\n const [mode, setMode] = useState<'anytime' | 'dates'>(\n initialDateRange.start ? 'dates' : 'anytime'\n );\n\n const selectedMonths = initialMonthFilter || [];\n const isAnytimeSelected = selectedMonths.length === 0;\n\n // Sync 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 return new Date().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 cx(''),\n variant === 'expanded' && cxMod('', 'expanded'),\n className,\n ].filter(Boolean).join(' ');\n\n const monthGridClasses = [\n cx('month-grid'),\n !isDesktop && cxMod('month-grid', 'mobile'),\n ].filter(Boolean).join(' ');\n\n const contentClasses = [\n cx('content'),\n mode === 'dates' && cxMod('content', 'dates'),\n ].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n {/* Section title - only in expanded variant */}\n {variant === 'expanded' && (\n <h2 className={cx('section-title')}>{labels.when}</h2>\n )}\n\n {/* Header with tabs and apply button */}\n <div className={cx('header')}>\n <div className={cx('tabs')}>\n <button\n type=\"button\"\n className={`${cx('tab')} ${mode === 'dates' ? cxMod('tab', 'active') : ''}`}\n onClick={() => handleModeSwitch('dates')}\n >\n {labels.dates}\n </button>\n <button\n type=\"button\"\n className={`${cx('tab')} ${mode === 'anytime' ? cxMod('tab', 'active') : ''}`}\n onClick={() => handleModeSwitch('anytime')}\n >\n {labels.flexible}\n </button>\n </div>\n {showApplyButton && (\n <div className={cx('apply')}>\n <Button variant=\"secondary\" size=\"medium\" onClick={handleApply}>\n {labels.apply}\n </Button>\n </div>\n )}\n </div>\n\n {/* Content */}\n <div className={contentClasses}>\n {mode === 'anytime' ? (\n <div className={cx('flexible')}>\n <h3 className={cx('heading')}>{labels.selectMonths}</h3>\n <div className={monthGridClasses}>\n {/* Anytime button */}\n <button\n type=\"button\"\n className={`${cx('month-button')} ${cx('anytime-button')} ${\n isAnytimeSelected ? cxMod('month-button', 'selected') : ''\n }`}\n onClick={handleAnytimeClick}\n >\n <span className={cx('month-label')}>{labels.anytime}</span>\n </button>\n {/* Month buttons */}\n {months.map((month) => (\n <button\n key={month.value}\n type=\"button\"\n className={`${cx('month-button')} ${\n selectedMonths.includes(month.value) ? cxMod('month-button', 'selected') : ''\n } ${month.disabled ? cxMod('month-button', 'disabled') : ''}`}\n onClick={() => !month.disabled && handleMonthToggle(month.value)}\n disabled={month.disabled}\n >\n <span className={cx('month-label')}>{month.label}</span>\n <span className={cx('month-year')}>{month.year}</span>\n </button>\n ))}\n </div>\n </div>\n ) : (\n <div className={cx('dates')}>\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 } from 'react';\nimport { useResponsive } from '../../hooks';\nimport './DualCalendar.css';\n\n// CSS class prefix\nconst cx = (name: string) => `hc-dual-calendar${name ? `__${name}` : ''}`;\nconst cxMod = (base: string, mod: string) => `hc-dual-calendar__${base}--${mod}`;\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\n const isStartDate = (dateStr: string) => startDate === dateStr;\n const isEndDate = (dateStr: string) => endDate === dateStr;\n const isMidDate = (dateStr: string) => {\n if (!startDate || !endDate) return false;\n return dateStr > startDate && dateStr < endDate;\n };\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 const day = new Date(date.getFullYear(), date.getMonth(), 1).getDay();\n return day === 0 ? 6 : day - 1; // Monday = 0\n };\n\n const formatMonthYear = (date: Date) => {\n return date.toLocaleDateString(locale, { month: 'long', year: 'numeric' });\n };\n\n const getWeekDays = () => {\n const days = [];\n const baseDate = new Date(2020, 0, 6); // Monday\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\n const isDateDisabled = (dateStr: string) => {\n const today = new Date();\n const oneYearFromToday = new Date(today.getFullYear() + 1, today.getMonth(), today.getDate());\n const dateParts = dateStr.split('-').map(Number);\n const date = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]);\n\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 if (date > oneYearFromToday) return true;\n return false;\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 for (let i = 0; i < firstDay; i++) {\n days.push(<div key={`empty-${i}`} className={cx('day')} />);\n }\n\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 classes = [\n cx('day'),\n cx('day-button'),\n disabled && cxMod('day-button', 'disabled'),\n start && cxMod('day-button', 'start'),\n end && cxMod('day-button', 'end'),\n inRange && cxMod('day-button', 'in-range'),\n ].filter(Boolean).join(' ');\n\n days.push(\n <button\n key={day}\n type=\"button\"\n className={classes}\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 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 const nextMonth = new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1, 1);\n const isNextDisabled = nextMonth >= maxMonth;\n\n const PrevArrow = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\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 const NextArrow = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\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 const navButtonClasses = (disabled: boolean) => [\n cx('nav-button'),\n disabled && cxMod('nav-button', 'disabled'),\n ].filter(Boolean).join(' ');\n\n return (\n <div className={`${cx('')} ${!isDesktop ? cxMod('', 'mobile') : ''}`}>\n {/* Mobile: Navigation row at top */}\n {!isDesktop && (\n <div className={cx('navigation')}>\n <button\n type=\"button\"\n className={navButtonClasses(isPrevDisabled)}\n onClick={handlePrevMonth}\n disabled={isPrevDisabled}\n >\n <PrevArrow />\n </button>\n <h3 className={`${cx('month-title')} ${cx('month-title--mobile')}`}>\n {formatMonthYear(currentMonth)}\n </h3>\n <button\n type=\"button\"\n className={navButtonClasses(isNextDisabled)}\n onClick={handleNextMonth}\n disabled={isNextDisabled}\n >\n <NextArrow />\n </button>\n </div>\n )}\n\n {/* Desktop: Dual calendar with nav on sides */}\n {isDesktop ? (\n <div className={cx('desktop-layout')}>\n <button\n type=\"button\"\n className={navButtonClasses(isPrevDisabled)}\n onClick={handlePrevMonth}\n disabled={isPrevDisabled}\n >\n <PrevArrow />\n </button>\n\n <div className={cx('calendars')}>\n {/* First Calendar */}\n <div className={cx('calendar')}>\n <h3 className={cx('month-title')}>{formatMonthYear(currentMonth)}</h3>\n <div className={cx('weekdays')}>\n {weekDays.map((day, i) => (\n <div key={day} className={`${cx('weekday')} ${i >= 5 ? cxMod('weekday', 'weekend') : ''}`}>\n {day}\n </div>\n ))}\n </div>\n <div className={cx('days')}>{generateCalendar(0)}</div>\n </div>\n\n {/* Second Calendar */}\n <div className={cx('calendar')}>\n <h3 className={cx('month-title')}>{formatMonthYear(nextMonth)}</h3>\n <div className={cx('weekdays')}>\n {weekDays.map((day, i) => (\n <div key={day} className={`${cx('weekday')} ${i >= 5 ? cxMod('weekday', 'weekend') : ''}`}>\n {day}\n </div>\n ))}\n </div>\n <div className={cx('days')}>{generateCalendar(1)}</div>\n </div>\n </div>\n\n <button\n type=\"button\"\n className={navButtonClasses(isNextDisabled)}\n onClick={handleNextMonth}\n disabled={isNextDisabled}\n >\n <NextArrow />\n </button>\n </div>\n ) : (\n /* Mobile: Single calendar */\n <div className={`${cx('calendars')} ${cxMod('calendars', 'mobile')}`}>\n <div className={cx('calendar')}>\n <div className={cx('weekdays')}>\n {weekDays.map((day, i) => (\n <div key={day} className={`${cx('weekday')} ${i >= 5 ? cxMod('weekday', 'weekend') : ''}`}>\n {day}\n </div>\n ))}\n </div>\n <div className={cx('days')}>{generateCalendar(0)}</div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport { DualCalendar };\nexport default DualCalendar;\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 } 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 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\">{benefit.label}</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 { 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 * 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 <div className={`hc-hotel-card ${className || ''}`}>\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 </div>\n );\n};\n","/**\n * FilterCheckboxItem Styles\n *\n * States: idle, hover, active (checked), focused, disabled\n */\n\n/* Filter checkbox row */\n.filterRow {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: var(--size-rem-0-625, 10px) 0;\n background-color: var(--background-action-secondary-idle, #fff);\n cursor: pointer;\n user-select: none;\n transition: background-color 0.15s ease;\n border-radius: var(--radius-sm, 4px);\n position: relative;\n}\n\n/* Hover state - gray background */\n.filterRow:hover:not(.filterRowDisabled) {\n background-color: var(--background-action-secondary-hover, #e5e7eb);\n}\n\n/* Active state - pressed feedback */\n.filterRow:active:not(.filterRowDisabled) {\n background-color: var(--background-action-secondary-hover, #e5e7eb);\n}\n\n/* Focus state - blue glow when item has focus */\n.filterRow:focus {\n background-color: var(--background-action-secondary-idle, #fff);\n box-shadow:\n 0 0 0 2px var(--misc-focus, #3474DA),\n 0 0 16px 4px var(--misc-focus, #3474DA);\n outline: none;\n z-index: 1;\n}\n\n/* Disabled state */\n.filterRowDisabled {\n cursor: not-allowed;\n}\n\n.checkboxLabel {\n display: flex;\n align-items: center;\n gap: var(--size-rem-0-5, 8px);\n flex: 1;\n}\n\n.checkboxButton {\n width: 24px;\n height: 24px;\n position: relative;\n overflow: hidden;\n flex-shrink: 0;\n}\n\n/* Visually hidden but still focusable */\n.checkbox {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.checkboxBox {\n position: absolute;\n top: 2px;\n left: 2px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n background-color: var(--background-general-primary, #fff);\n border: 1px solid var(--border-general-tertiary, #d1d5db);\n border-radius: 4px;\n transition: all 0.15s ease;\n}\n\n/* Checked state - blue background */\n.checkbox:checked + .checkboxBox {\n background-color: var(--background-action-highlight-idle, #3474DA);\n border-color: var(--background-action-highlight-idle, #3474DA);\n}\n\n/* Disabled checkbox */\n.checkboxBoxDisabled {\n background-color: var(--background-action-disabled-idle, #f3f4f6);\n border-color: var(--border-action-disabled-idle, #e5e7eb);\n}\n\n.checkbox:checked + .checkboxBoxDisabled {\n background-color: var(--background-action-disabled-idle, #f3f4f6);\n border-color: var(--border-action-disabled-idle, #e5e7eb);\n}\n\n.checkIcon {\n width: 12px;\n height: 10px;\n color: var(--content-action-primary-inverse-idle, #fff);\n}\n\n.checkboxBoxDisabled .checkIcon {\n color: var(--content-action-disabled-idle, #9ca3af);\n}\n\n.filterLabel {\n color: var(--content-general-primary, #111827);\n font-family: var(--text-label-medium-font-family, inherit);\n font-size: var(--text-label-medium-font-size, 14px);\n font-style: normal;\n font-weight: 500;\n line-height: var(--text-label-medium-line-height, 1.5);\n}\n\n.filterLabelDisabled {\n color: var(--content-action-disabled-idle, #9ca3af);\n}\n\n.filterCount {\n color: var(--content-general-tertiary, #6b7280);\n font-family: var(--text-label-medium-font-family, inherit);\n font-size: var(--text-label-medium-font-size, 14px);\n font-style: normal;\n font-weight: 500;\n line-height: var(--text-label-medium-line-height, 1.5);\n}\n\n.filterCountDisabled {\n color: var(--content-action-disabled-idle, #9ca3af);\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 * States: idle, hover, active (checked), focused, disabled\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, useEffect } from 'react';\nimport { useUIContext } from '../../context';\nimport styles from './CollapsibleFilterSection.module.css';\n\n/**\n * CollapsibleFilterSection - Wrapper for expandable/collapsible filter sections\n *\n * Features:\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\nexport interface 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,\n showLessText,\n hasShowAll = false,\n initialItemsToShow = 5,\n className = '',\n}) => {\n const { t } = useUIContext();\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n const [showAll, setShowAll] = useState(false);\n\n // Resolve labels with fallbacks\n const resolvedShowAllText = showAllText ?? t('filter.show-all', 'Show all');\n const resolvedShowLessText = showLessText ?? t('filter.show-less', 'Show less');\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 ? resolvedShowLessText : resolvedShowAllText}\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","/**\n * CollapsibleFilterSection Styles\n */\n\n.section {\n border-bottom: 1px solid var(--border-general-secondary, #e5e7eb);\n}\n\n.header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n padding: var(--size-rem-1, 16px) 0;\n background: transparent;\n border: none;\n cursor: pointer;\n text-align: left;\n}\n\n.title {\n color: var(--content-general-primary, #111827);\n font-family: var(--text-heading-small-font-family, inherit);\n font-size: var(--text-heading-small-font-size, 16px);\n font-weight: 600;\n line-height: var(--text-heading-small-line-height, 1.5);\n}\n\n.chevron {\n width: 20px;\n height: 20px;\n color: var(--content-general-secondary, #6b7280);\n transition: transform 0.2s ease;\n transform: rotate(0deg);\n}\n\n.chevronExpanded {\n transform: rotate(180deg);\n}\n\n.content {\n max-height: 0;\n overflow: hidden;\n transition: max-height 0.3s ease;\n}\n\n.contentExpanded {\n max-height: 2000px; /* Large enough to contain any filter content */\n}\n\n.contentInner {\n padding-bottom: var(--size-rem-1, 16px);\n}\n\n.showAllButton {\n display: flex;\n align-items: center;\n gap: var(--size-rem-0-25, 4px);\n margin-top: var(--size-rem-0-5, 8px);\n padding: var(--size-rem-0-5, 8px) 0;\n background: transparent;\n border: none;\n cursor: pointer;\n color: var(--content-action-highlight-idle, #3474DA);\n font-family: var(--text-label-medium-font-family, inherit);\n font-size: var(--text-label-medium-font-size, 14px);\n font-weight: 500;\n line-height: var(--text-label-medium-line-height, 1.5);\n}\n\n.showAllButton:hover {\n color: var(--content-action-highlight-hover, #2563eb);\n}\n\n.showAllChevron {\n width: 16px;\n height: 16px;\n transition: transform 0.2s ease;\n transform: rotate(0deg);\n}\n\n.showAllChevronUp {\n transform: rotate(180deg);\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\nexport interface PriceRangeFilterProps {\n minPrice: number;\n maxPrice: number;\n value: { min: number; max: number };\n onChange: (value: { min: number; max: number }) => void;\n /** 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 */\n onDragStart?: () => void;\n onDragEnd?: () => void;\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 values\n const maxHistogramValue = Math.max(...histogram, 1);\n\n // Check if histogram bar is in the selected range\n const getBarActive = useCallback((index: number) => {\n const barStartPercent = (index / histogram.length) * 100;\n const barEndPercent = ((index + 1) / histogram.length) * 100;\n return barStartPercent < maxPercent && barEndPercent > minPercent;\n }, [histogram.length, minPercent, maxPercent]);\n\n // Track is inset by 12px on each side\n const trackInset = 12;\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 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\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 const handleTouchStart = (handle: 'min' | 'max') => (e: React.TouchEvent) => {\n e.preventDefault();\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 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 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 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 */}\n <div className={styles.histogram}>\n {histogram.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 {/* 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(12px + (100% - 24px) * ${minPercent / 100})`,\n width: `calc((100% - 24px) * ${(maxPercent - minPercent) / 100})`\n }}\n />\n <div\n className={`${styles.sliderHandle} ${isDragging === 'min' ? styles.sliderHandleActive : ''}`}\n style={{ left: `calc(12px + (100% - 24px) * ${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(12px + (100% - 24px) * ${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","/**\n * PriceRangeFilter Styles\n */\n\n.priceRangeWrapper {\n display: flex;\n flex-direction: column;\n gap: var(--size-rem-1, 16px);\n}\n\n/* Price Inputs */\n.priceInputs {\n display: flex;\n align-items: center;\n gap: var(--size-rem-0-5, 8px);\n}\n\n.priceInputWrapper {\n flex: 1;\n}\n\n.priceInput {\n width: 100%;\n padding: var(--size-rem-0-75, 12px);\n border: 1px solid var(--border-general-secondary, #e5e7eb);\n border-radius: var(--radius-md, 8px);\n background-color: var(--background-general-primary, #fff);\n color: var(--content-general-primary, #111827);\n font-family: var(--text-body-medium-font-family, inherit);\n font-size: var(--text-body-medium-font-size, 14px);\n line-height: var(--text-body-medium-line-height, 1.5);\n text-align: center;\n}\n\n.priceInput:focus {\n outline: none;\n border-color: var(--border-action-highlight-idle, #3474DA);\n box-shadow: 0 0 0 2px var(--misc-focus-light, rgba(52, 116, 218, 0.2));\n}\n\n.priceInputDivider {\n color: var(--content-general-tertiary, #6b7280);\n font-size: 14px;\n flex-shrink: 0;\n}\n\n/* Histogram */\n.histogram {\n display: flex;\n align-items: flex-end;\n gap: 2px;\n height: 48px;\n padding: 0 12px;\n}\n\n.histogramBar {\n flex: 1;\n background-color: var(--background-action-secondary-idle, #e5e7eb);\n border-radius: 2px 2px 0 0;\n transition: background-color 0.15s ease;\n min-height: 4px;\n}\n\n.histogramBarActive {\n background-color: var(--background-action-highlight-idle, #3474DA);\n}\n\n/* Slider */\n.sliderContainer {\n position: relative;\n height: 24px;\n touch-action: none;\n}\n\n.sliderTrack {\n position: absolute;\n top: 50%;\n left: 12px;\n right: 12px;\n height: 4px;\n background-color: var(--background-action-secondary-idle, #e5e7eb);\n border-radius: 2px;\n transform: translateY(-50%);\n}\n\n.sliderActiveTrack {\n position: absolute;\n top: 50%;\n height: 4px;\n background-color: var(--background-action-highlight-idle, #3474DA);\n border-radius: 2px;\n transform: translateY(-50%);\n}\n\n.sliderHandle {\n position: absolute;\n top: 50%;\n width: 24px;\n height: 24px;\n background-color: var(--background-general-primary, #fff);\n border: 2px solid var(--border-action-highlight-idle, #3474DA);\n border-radius: 50%;\n transform: translate(-50%, -50%);\n cursor: grab;\n touch-action: none;\n transition: box-shadow 0.15s ease;\n z-index: 1;\n}\n\n.sliderHandle:hover {\n box-shadow: 0 0 0 4px var(--misc-focus-light, rgba(52, 116, 218, 0.2));\n}\n\n.sliderHandle:focus {\n outline: none;\n box-shadow: 0 0 0 4px var(--misc-focus-light, rgba(52, 116, 218, 0.2));\n}\n\n.sliderHandleActive {\n cursor: grabbing;\n box-shadow: 0 0 0 6px var(--misc-focus-light, rgba(52, 116, 218, 0.3));\n}\n","/**\n * HotelCategoryFilter Styles\n */\n\n.filterList {\n display: flex;\n flex-direction: column;\n}\n\n.starsContainer {\n display: flex;\n align-items: center;\n gap: 2px;\n}\n\n.starIcon {\n width: 16px;\n height: 16px;\n color: var(--content-general-primary, #111827);\n}\n\n.footer {\n margin-top: var(--size-rem-0-75, 12px);\n padding-top: var(--size-rem-0-75, 12px);\n border-top: 1px solid var(--border-general-secondary, #e5e7eb);\n}\n\n.footerText {\n color: var(--content-general-tertiary, #6b7280);\n font-family: var(--text-caption-font-family, inherit);\n font-size: var(--text-caption-font-size, 12px);\n font-style: normal;\n font-weight: 400;\n line-height: var(--text-caption-line-height, 1.5);\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 * Options: 5★, 4★, 3★, 2★, Swiss Lodge, No category\n * Footer with HotellerieSuisse attribution\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\nexport interface 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 // Translation key mapping for labels\n const getLabel = (option: CategoryOption) => {\n if (option.stars > 0) return null; // Will render stars\n if (option.value === 'swiss_lodge') return t('filter.swiss-lodge', 'Swiss Lodge');\n if (option.value === 'not_classified') return t('filter.no-category', 'No category');\n return option.label;\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 getLabel(option)\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 HotellerieSuisse')}\n </span>\n </div>\n </div>\n );\n};\n","/**\n * ReviewsFilter Styles\n */\n\n.filterList {\n display: flex;\n flex-direction: column;\n}\n\n.filterRange {\n color: var(--content-general-tertiary, #6b7280);\n font-weight: 400;\n}\n\n.footer {\n margin-top: var(--size-rem-0-75, 12px);\n padding-top: var(--size-rem-0-75, 12px);\n border-top: 1px solid var(--border-general-secondary, #e5e7eb);\n}\n\n.footerText {\n color: var(--content-general-tertiary, #6b7280);\n font-family: var(--text-caption-font-family, inherit);\n font-size: var(--text-caption-font-size, 12px);\n font-style: normal;\n font-weight: 400;\n line-height: var(--text-caption-line-height, 1.5);\n}\n","import React from 'react';\nimport { useUIContext } from '../../context';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport styles from './ReviewsFilter.module.css';\n\n/**\n * ReviewsFilter - Checkbox list for filtering by review rating\n *\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\nexport const REVIEW_OPTIONS: ReviewOption[] = [\n { value: 'excellent', labelKey: 'rating-excellent', range: '(4.4+)' },\n { value: 'very_good', labelKey: 'rating-very-good', range: '(4.1 – 4.3)' },\n { value: 'good', labelKey: 'rating-good', range: '(3.8 – 4.0)' },\n { value: 'fair', labelKey: 'rating-fair', range: '(3.5 – 3.7)' },\n { value: 'no_rating', labelKey: 'rating-none', range: '' },\n];\n\nexport interface 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 // Map translation keys to labels\n const getRatingLabel = (labelKey: string) => {\n const labelMap: Record<string, string> = {\n 'rating-excellent': t('label.rating-excellent', 'Excellent'),\n 'rating-very-good': t('label.rating-very-good', 'Very Good'),\n 'rating-good': t('label.rating-good', 'Good'),\n 'rating-fair': t('label.rating-fair', 'Fair'),\n 'rating-none': t('label.rating-none', 'No rating'),\n };\n return labelMap[labelKey] ?? labelKey;\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 {getRatingLabel(option.labelKey)}\n {option.range && (\n <span className={styles.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={styles.footer}>\n <span className={styles.footerText}>\n {t('filter.trustyou', 'Reviews from TrustYou®')}\n </span>\n </div>\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { useUIContext } from '../../context';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport styles from './ExperienceFilter.module.css';\n\n/**\n * ExperienceFilter - Checkbox list for experience/theme types\n *\n * Options come from API with pre-translated names\n * Expandable with \"Show all\" if more than 5 options\n */\n\nexport interface ThemeAggregation {\n id: number;\n name: string;\n count: number;\n}\n\nexport interface ExperienceFilterProps {\n selected: string[];\n /** Theme aggregations from API with pre-translated names */\n themes?: ThemeAggregation[];\n onChange: (values: string[]) => void;\n className?: string;\n}\n\nexport const ExperienceFilter: React.FC<ExperienceFilterProps> = ({\n selected,\n themes = [],\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 className={`${styles.arrowIcon} ${expanded ? styles.arrowUp : ''}`}>\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=\"currentColor\"/>\n </svg>\n </span>\n </button>\n )}\n </div>\n );\n};\n","/**\n * ExperienceFilter Styles\n */\n\n.filterList {\n display: flex;\n flex-direction: column;\n}\n\n.showMoreBtn {\n display: flex;\n align-items: center;\n gap: var(--size-rem-0-25, 4px);\n margin-top: var(--size-rem-0-5, 8px);\n padding: var(--size-rem-0-5, 8px) 0;\n background: transparent;\n border: none;\n cursor: pointer;\n color: var(--content-action-highlight-idle, #3474DA);\n font-family: var(--text-label-medium-font-family, inherit);\n font-size: var(--text-label-medium-font-size, 14px);\n font-weight: 500;\n line-height: var(--text-label-medium-line-height, 1.5);\n}\n\n.showMoreBtn:hover {\n color: var(--content-action-highlight-hover, #2563eb);\n}\n\n.arrowIcon {\n display: flex;\n align-items: center;\n transition: transform 0.2s ease;\n}\n\n.arrowIcon svg {\n width: 20px;\n height: 20px;\n}\n\n.arrowUp {\n transform: rotate(180deg);\n}\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 * Features:\n * - Country rows are accordion headers (NO checkbox on country)\n * - Clicking country row expands/collapses accordion\n * - Sub-regions appear as checkbox list when country is expanded\n * - Mobile-friendly \"Select All\" / \"Reset\" actions\n */\n\nexport interface RegionOption {\n value: string;\n label: string;\n count?: number;\n subRegions?: RegionOption[];\n}\n\nexport interface 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 */}\n {hasSubRegions && isExpanded && (() => {\n const hasSelectableRegions = region.subRegions!.some(\n sr => sr.count === undefined || sr.count > 0\n );\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 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 (subRegion.count === 0 && !selected.includes(subRegion.value)) ||\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 * RegionsFilter Styles (Destinations)\n *\n * - Country row: 56px height, gray background, 12px border-radius\n * - No checkbox on country row (accordion header only)\n * - Count badge: pill shape, gray background\n * - Chevron: 20x20px, rotates on expand\n */\n\n.filterList {\n display: flex;\n flex-direction: column;\n gap: var(--size-rem-0-25, 4px);\n}\n\n.regionItem {\n display: flex;\n flex-direction: column;\n}\n\n/* Country row - accordion header (no checkbox) */\n.countryRow {\n display: flex;\n justify-content: space-between;\n align-items: center;\n height: 56px;\n padding: 14px var(--size-rem-0-75, 12px);\n background-color: var(--background-general-secondary-light, #f9fafb);\n border: 1px solid transparent;\n border-radius: var(--size-rem-0-75, 12px);\n cursor: pointer;\n user-select: none;\n transition: background-color 0.15s ease;\n gap: var(--size-rem-0-75, 12px);\n}\n\n.countryRowExpanded {\n border-radius: var(--size-rem-0-75, 12px);\n border: 1px solid var(--border-action-secondary-active, #d1d5db);\n background: var(--background-general-primary, #fff) !important;\n border-bottom: none;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.countryInfo {\n display: flex;\n align-items: center;\n flex: 1 1 0;\n justify-content: space-between;\n}\n\n.countryName {\n color: var(--content-general-primary, #111827);\n font-family: var(--text-label-large-font-family, inherit);\n font-size: var(--text-label-large-font-size, 16px);\n font-weight: var(--text-label-large-font-weight, 600);\n line-height: var(--text-label-large-line-height, 1.55);\n}\n\n.countBadge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n padding: 0 var(--size-rem-0-5, 8px);\n border-radius: 9999px;\n background: var(--background-general-secondary, #e5e7eb) !important;\n color: var(--content-general-primary, #111827);\n text-align: center;\n font-family: var(--text-label-medium-font-family, inherit);\n font-size: var(--text-label-medium-font-size, 14px);\n font-weight: 500;\n line-height: var(--text-label-medium-line-height, 1.5);\n white-space: nowrap;\n}\n\n.chevron {\n width: 20px;\n height: 20px;\n color: var(--content-general-tertiary, #6b7280);\n flex-shrink: 0;\n transition: transform 0.2s ease;\n}\n\n.chevronExpanded {\n transform: rotate(180deg);\n}\n\n/* Sub-regions container */\n.subRegions {\n display: flex;\n flex-direction: column;\n padding: 0 var(--size-rem-0-75, 12px) var(--size-rem-0-875, 14px) var(--size-rem-0-75, 12px);\n border-radius: var(--size-rem-0-75, 12px);\n border: 1px solid var(--border-action-secondary-active, #d1d5db);\n background: var(--background-general-primary, #fff);\n border-top: none;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.mobileSelectAllActions {\n display: flex;\n align-items: center;\n gap: var(--size-rem-1, 16px);\n height: 44px;\n padding: 0 var(--size-rem-0-75, 12px);\n border-top: none;\n border-bottom: none;\n border-right: 1px solid var(--border-action-secondary-active, #d1d5db);\n border-left: 1px solid var(--border-action-secondary-active, #d1d5db);\n background: var(--background-general-primary, #fff);\n}\n\n.selectAllBtn,\n.resetAllBtn {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 0;\n border: none;\n background: transparent;\n font-family: var(--text-label-medium-font-family, inherit);\n font-size: var(--text-label-medium-font-size, 14px);\n font-weight: 500;\n line-height: var(--text-label-medium-line-height, 1.5);\n text-decoration: underline;\n cursor: pointer;\n}\n\n.selectAllBtn {\n color: var(--content-action-link-idle, #3474DA);\n}\n\n.selectAllBtn:disabled {\n color: var(--content-action-disabled-idle, #9ca3af);\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.resetAllBtn {\n color: var(--content-action-disabled-idle, #6b7280);\n}\n\n.resetAllBtn:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.selectAllBtn:focus-visible,\n.resetAllBtn:focus-visible {\n outline: 2px solid var(--misc-focus, #3474DA);\n outline-offset: 2px;\n border-radius: 2px;\n}\n","/**\n * CheckboxFilter Styles\n */\n\n.filterList {\n display: flex;\n flex-direction: column;\n}\n","import React from 'react';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport styles from './CheckboxFilter.module.css';\n\n/**\n * CheckboxFilter - Generic checkbox list filter\n *\n * Used for: Meals, Transport, Wellness, and other dynamic filter options\n * Options come from API with pre-translated names\n */\n\nexport interface FilterOption {\n id: number;\n key: string;\n name: string;\n}\n\nexport interface CheckboxFilterProps {\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 /** Prefix for track names (e.g., 'meals', 'transport', 'wellness') */\n trackPrefix?: string;\n}\n\nexport const CheckboxFilter: React.FC<CheckboxFilterProps> = ({\n selected,\n counts = {},\n options = [],\n onChange,\n className = '',\n trackPrefix = 'filter',\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={`${trackPrefix}-${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-${trackPrefix}-${option.key}`}\n />\n );\n })}\n </div>\n );\n};\n\n// Convenience alias components for specific filter types\nexport const MealsFilter = (props: Omit<CheckboxFilterProps, 'trackPrefix'>) => (\n <CheckboxFilter {...props} trackPrefix=\"meals\" />\n);\n\nexport const TransportFilter = (props: Omit<CheckboxFilterProps, 'trackPrefix'>) => (\n <CheckboxFilter {...props} trackPrefix=\"transport\" />\n);\n\nexport const WellnessFilter = (props: Omit<CheckboxFilterProps, 'trackPrefix'>) => (\n <CheckboxFilter {...props} trackPrefix=\"wellness\" />\n);\n","/**\n * SelectedFiltersRow Styles\n */\n\n.container {\n padding: var(--size-rem-0-75, 12px) 0;\n border-bottom: 1px solid var(--border-general-secondary, #e5e7eb);\n}\n\n.chipsWrapper {\n display: flex;\n align-items: flex-start;\n gap: var(--size-rem-0-5, 8px);\n}\n\n.selectedText {\n margin: 0;\n padding-top: var(--size-rem-0-25, 4px);\n color: var(--content-general-secondary, #6b7280);\n font-family: var(--text-label-medium-font-family, inherit);\n font-size: var(--text-label-medium-font-size, 14px);\n font-weight: 500;\n line-height: var(--text-label-medium-line-height, 1.5);\n white-space: nowrap;\n}\n\n.chips {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--size-rem-0-5, 8px);\n}\n\n.clearAllBtn {\n margin-left: var(--size-rem-0-5, 8px);\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 * Features:\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\nexport interface 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\n if (filters.length === 0) {\n return null;\n }\n\n return (\n <div className={`${styles.container} ${className}`}>\n <div className={styles.chipsWrapper}>\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.clearAllBtn}\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, { useState, useEffect, useRef, useCallback } from 'react';\nimport { useUIContext } from '../../context';\nimport { useDebounce } from '../../hooks';\nimport { CollapsibleFilterSection } from './CollapsibleFilterSection';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport { PriceRangeFilter } from './PriceRangeFilter';\nimport { HotelCategoryFilter } from './HotelCategoryFilter';\nimport { ReviewsFilter } from './ReviewsFilter';\nimport { ExperienceFilter, type ThemeAggregation } from './ExperienceFilter';\nimport { RegionsFilter, type RegionOption } from './RegionsFilter';\nimport { MealsFilter, TransportFilter, WellnessFilter, type FilterOption } from './CheckboxFilter';\nimport styles from './FilterPanel.module.css';\n\n/**\n * FilterPanel - Sidebar/modal filters for search results\n *\n * Desktop: Fixed sidebar\n * Mobile: Full-screen modal (use with FilterModal wrapper)\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\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 onViewMap?: () => void;\n className?: string;\n isLoading?: boolean;\n priceHistogram?: number[];\n minPrice?: number;\n maxPrice?: number;\n regions?: RegionOption[];\n discountCounts?: Record<string, number>;\n optionsCounts?: Record<string, number>;\n categoryCounts?: Record<string, number>;\n experienceCounts?: Record<string, number>;\n themes?: ThemeAggregation[];\n mealsCounts?: Record<string, number>;\n reviewsCounts?: Record<string, number>;\n transportCounts?: Record<string, number>;\n wellnessCounts?: Record<string, number>;\n servicesCounts?: Record<string, number>;\n filterOptions?: FilterOptions;\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 selectedPriceRange?: { min: number; max: number } | null;\n mapCenter?: { lat: number; lng: number };\n}\n\n// Discount filter options\nconst DISCOUNT_OPTIONS = [\n { value: '50', label: '50%' },\n { value: '30', label: '30%' },\n { value: '10', label: '10%' },\n];\n\n// Options filter\nconst OPTIONS_FILTER = [\n { value: 'instant_booking', labelKey: 'filter.instant-booking' },\n];\n\nexport const FilterPanel: React.FC<FilterPanelProps> = ({\n onFilterChange,\n className = '',\n isLoading = false,\n priceHistogram,\n minPrice = 50,\n maxPrice = 500,\n regions = [],\n discountCounts = {},\n optionsCounts = {},\n categoryCounts = {},\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}) => {\n const { t, currency } = useUIContext();\n\n const hasInitialLoadRef = useRef(false);\n\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\n const [priceMin, setPriceMin] = useState(externalPriceRange?.min ?? minPrice);\n const [priceMax, setPriceMax] = useState(externalPriceRange?.max ?? maxPrice);\n\n // Filter states\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 external props\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 useEffect(() => { if (externalDiscounts !== undefined) setSelectedDiscounts(externalDiscounts); }, [externalDiscounts]);\n useEffect(() => { if (externalOptions !== undefined) setSelectedOptions(externalOptions); }, [externalOptions]);\n useEffect(() => { if (externalExperiences !== undefined) setSelectedExperiences(externalExperiences); }, [externalExperiences]);\n useEffect(() => { if (externalRegions !== undefined) setSelectedRegions(externalRegions); }, [externalRegions]);\n useEffect(() => { if (externalCategories !== undefined) setSelectedCategories(externalCategories); }, [externalCategories]);\n useEffect(() => { if (externalMeals !== undefined) setSelectedMeals(externalMeals); }, [externalMeals]);\n useEffect(() => { if (externalReviews !== undefined) setSelectedReviews(externalReviews); }, [externalReviews]);\n useEffect(() => { if (externalTransport !== undefined) setSelectedTransport(externalTransport); }, [externalTransport]);\n useEffect(() => { if (externalWellness !== undefined) setSelectedWellness(externalWellness); }, [externalWellness]);\n useEffect(() => { if (externalServices !== undefined) setSelectedServices(externalServices); }, [externalServices]);\n\n // Handlers\n const handlePriceChange = (value: { min: number; max: number }) => {\n setPriceMin(value.min);\n setPriceMax(value.max);\n };\n\n const handlePriceSearch = useCallback(async (range: { min: number; max: number }) => {\n await onFilterChange?.({ priceRange: range });\n }, [onFilterChange]);\n\n const debouncedFetch = useDebounce(handlePriceSearch, 500);\n\n const handlePriceApply = (range: { min: number; max: number }) => {\n debouncedFetch(range);\n };\n\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 handleServicesChange = (values: string[]) => {\n setSelectedServices(values);\n onFilterChange?.({ services: 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 handleCategoriesChange = (values: string[]) => {\n setSelectedCategories(values);\n onFilterChange?.({ categories: 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 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 {/* Destinations Filter */}\n <CollapsibleFilterSection\n title={t('filter.destination', 'Destination')}\n defaultExpanded={true}\n >\n <RegionsFilter\n regions={regions}\n selected={selectedRegions}\n onChange={handleRegionsChange}\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 onChange={handleExperienceChange}\n />\n </CollapsibleFilterSection>\n\n {/* Price Range Filter */}\n <CollapsibleFilterSection\n title={t('filter.price', 'Price')}\n defaultExpanded={true}\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 </CollapsibleFilterSection>\n\n {/* Discount Filter */}\n <CollapsibleFilterSection\n title={t('filter.discount', 'Discount')}\n defaultExpanded={true}\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 </CollapsibleFilterSection>\n\n {/* Options Filter */}\n <CollapsibleFilterSection\n title={t('filter.options', 'Options')}\n defaultExpanded={selectedOptions.length > 0 || selectedServices.length > 0}\n >\n <div className={styles.discountList}>\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, 'Instantly bookable')}\n count={count}\n checked={selectedOptions.includes(option.value)}\n disabled={isDisabled}\n onChange={() => handleOptionToggle(option.value)}\n />\n );\n })}\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 <HotelCategoryFilter\n selected={selectedCategories}\n counts={categoryCounts}\n onChange={handleCategoriesChange}\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 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 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 </div>\n </aside>\n );\n};\n","/**\n * FilterPanel Styles\n *\n * Desktop: Fixed sidebar (306px width per Figma)\n * Mobile: Full-screen modal (use with FilterModal wrapper)\n */\n\n/* ============================================\n Desktop: Sidebar Layout\n ============================================ */\n\n.filterPanel {\n display: flex;\n flex-direction: column;\n width: 100%;\n background: var(--background-general-primary);\n}\n\n.content {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n}\n\n/* ============================================\n Filter Section - Common Styles\n ============================================ */\n\n.filterSection {\n padding: 24px 0;\n border-bottom: 1px solid var(--border-general-divider);\n}\n\n.filterTitle {\n font-family: var(--font-primary);\n font-size: var(--text-label-large-font-size);\n font-weight: var(--font-weight-medium);\n line-height: var(--text-label-large-line-height);\n color: var(--content-general-secondary);\n margin: 0 0 16px 0;\n}\n\n/* ============================================\n Price Range Filter - Wrapper for alignment\n ============================================ */\n\n.priceRangeWrapper {\n position: relative;\n /* Add horizontal padding to account for slider handle width (26px / 2 = 13px) + extra breathing room */\n padding: 0 16px;\n}\n\n/* ============================================\n Price Range Filter - Histogram\n ============================================ */\n\n.histogram {\n display: flex;\n align-items: flex-end;\n height: 45px;\n width: 100%;\n}\n\n.histogramBar {\n flex: 1;\n min-width: 1px;\n background-color: var(--border-general-divider);\n /* Use border for gap instead of flex gap - more precise */\n border-right: 1px solid var(--background-general-primary);\n transition: background-color 0.15s ease;\n}\n\n.histogramBar:last-child {\n border-right: none;\n}\n\n.histogramBarActive {\n background-color: var(--content-action-highlight-idle);\n}\n\n/* ============================================\n Price Range Filter - Slider\n ============================================ */\n\n.sliderContainer {\n position: relative;\n height: 44px;\n display: flex;\n align-items: center;\n user-select: none;\n}\n\n.sliderTrack {\n position: absolute;\n left: 0;\n right: 0;\n height: 4px;\n background-color: var(--border-general-divider);\n border-radius: 2px;\n}\n\n.sliderActiveTrack {\n position: absolute;\n height: 4px;\n background-color: var(--content-action-highlight-idle);\n border-radius: 2px;\n pointer-events: none;\n}\n\n.sliderHandle {\n position: absolute;\n width: 26px;\n height: 26px;\n background-color: var(--background-general-primary);\n border-radius: 50%;\n box-shadow: 0px 0.5px 4px 0px rgba(0, 0, 0, 0.12),\n 0px 6px 13px 0px rgba(0, 0, 0, 0.12);\n cursor: grab;\n transform: translateX(-50%);\n z-index: 2;\n transition: box-shadow 0.15s ease;\n}\n\n.sliderHandle:hover {\n box-shadow: 0px 0.5px 4px 0px rgba(0, 0, 0, 0.16),\n 0px 6px 16px 0px rgba(0, 0, 0, 0.16);\n}\n\n.sliderHandleActive {\n cursor: grabbing;\n box-shadow: 0px 0.5px 4px 0px rgba(0, 0, 0, 0.2),\n 0px 8px 18px 0px rgba(0, 0, 0, 0.2);\n}\n\n.sliderHandle:focus {\n outline: none;\n box-shadow: 0px 0.5px 4px 0px rgba(0, 0, 0, 0.12),\n 0px 6px 13px 0px rgba(0, 0, 0, 0.12),\n 0 0 0 2px var(--content-action-highlight-idle);\n}\n\n/* ============================================\n Price Range Filter - Inputs\n ============================================ */\n\n.priceInputs {\n display: flex;\n align-items: center;\n gap: 20px;\n margin-top: 16px;\n}\n\n.priceInputWrapper {\n flex: 1;\n}\n\n.priceInput {\n width: 100%;\n height: 45px;\n padding: 12px;\n background-color: var(--background-general-primary);\n border: 1px solid var(--content-general-tertiary);\n border-radius: 4px;\n font-family: var(--font-primary);\n font-size: var(--text-paragraph-base-font-size);\n font-weight: var(--font-weight-regular);\n line-height: 1.4;\n color: var(--content-general-primary);\n box-sizing: border-box;\n}\n\n.priceInput:hover {\n border-radius: var(--size-rem-0-5);\n border: 1px solid var(--border-action-secondary-hover);\n background: var(--background-general-primary);\n color: var(--content-general-secondary);\n /* paragraph/base */\n font-family: var(--text-paragraph-base-font-family) !important;\n font-size: var(--text-paragraph-base-font-size) !important;\n font-style: normal;\n font-weight: var(--text-paragraph-base-font-weight) !important;\n line-height: var(--text-paragraph-base-line-height) !important; /* 150% */\n}\n\n.priceInput:focus {\n outline: none;\n border-radius: var(--size-rem-0-5);\n border: 1px solid var(--misc-focus);\n background: var(--background-general-primary);\n /* focus */\n box-shadow: 0 0 0 2px var(--misc-focus), 0 0 16px 4px var(--misc-focus);\n color: var(--content-general-primary) !important;\n /* paragraph/base */\n font-family: var(--text-paragraph-base-font-family) !important;\n font-size: var(--text-paragraph-base-font-size)!important;\n font-style: normal;\n font-weight: var(--text-paragraph-base-font-weight) !important;\n line-height: var(--text-paragraph-base-line-height) !important; /* 150% */\n}\n\n.priceInputDivider {\n width: 12px;\n height: 1px;\n background-color: var(--content-general-primary);\n flex-shrink: 0;\n}\n\n/* ============================================\n Discount Filter - Figma Design\n ============================================ */\n\n.discountList {\n display: flex;\n flex-direction: column;\n padding: var(--size-rem-0-75) var(--size-rem-0-875) var(--size-rem-0-75);\n}\n\n.discountRow {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 0; /* py-2.5 from Figma */\n}\n\n.discountCheckboxLabel {\n display: flex;\n align-items: center;\n gap: 8px; /* gap-2 from Figma */\n cursor: pointer;\n user-select: none;\n}\n\n.checkboxButton {\n width: 24px; /* size-6 from Figma */\n height: 24px;\n position: relative;\n overflow: hidden;\n}\n\n.checkbox {\n /* Hide native checkbox */\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.checkboxBox {\n position: absolute;\n top: 2px;\n left: 2px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px; /* size-5 from Figma */\n height: 20px;\n background-color: var(--background-general-primary);\n border: 1px solid var(--border-general-divider);\n border-radius: 2px; /* rounded-sm from Figma */\n transition: all 0.15s ease;\n}\n\n.checkbox:checked + .checkboxBox {\n background-color: var(--background-action-highlight-idle);\n}\n\n.checkbox:focus + .checkboxBox {\n box-shadow: none !important;\n}\n\n.discountCheckboxLabel:hover .checkboxBox {\n border-color: var(--content-action-highlight-idle);\n}\n\n.checkIcon {\n width: 12px;\n height: 10px;\n color: var(--background-general-primary);\n}\n\n.discountLabel {\n color: var(--content-general-primary);\n /* label/medium */\n font-family: var(--text-label-medium-font-family);\n font-size: var(--text-label-medium-font-size);\n font-style: normal;\n font-weight: 500;\n line-height: var(--text-label-medium-line-height); /* 150% */\n}\n\n.discountCount {\n color: var(--content-general-tertiary);\n /* label/medium */\n font-family: var(--text-label-medium-font-family);\n font-size: var(--text-label-medium-font-size);\n font-style: normal;\n font-weight: 500;\n line-height: var(--text-label-medium-line-height); /* 150% */\n}\n\n/* Disabled state for inline checkboxes */\n.discountRowDisabled {\n opacity: 0.5;\n pointer-events: none;\n cursor: not-allowed;\n}\n\n.discountRowDisabled .discountCheckboxLabel {\n cursor: not-allowed;\n}\n\n.discountRowDisabled .checkboxBox {\n background-color: var(--background-general-secondary);\n}\n\n/* ============================================\n Hotel Category Filter - Chip Style\n ============================================ */\n\n.categoryChips {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.categoryChip {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 8px 8px 16px;\n background-color: var(--background-general-primary);\n border: 2px solid var(--border-general-divider);\n border-radius: 9999px;\n cursor: pointer;\n transition: all 0.15s ease;\n user-select: none;\n}\n\n.categoryChip:hover {\n border-color: var(--content-action-highlight-idle);\n}\n\n.categoryChipSelected {\n background-color: var(--background-action-secondary-idle);\n border-color: var(--content-action-highlight-idle);\n}\n\n.categoryStars {\n display: flex;\n align-items: center;\n gap: 0;\n}\n\n.categoryStar {\n width: 16px;\n height: 16px;\n color: var(--content-general-tertiary);\n}\n\n.categoryChipSelected .categoryStar {\n color: var(--content-action-highlight-idle);\n}\n\n.categoryLabel {\n font-family: var(--font-primary);\n font-size: var(--text-paragraph-base-font-size);\n font-weight: var(--font-weight-medium);\n line-height: 24px;\n color: var(--content-general-primary);\n white-space: nowrap;\n}\n\n.categoryCount {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 8px;\n min-width: 28px;\n height: 28px;\n background-color: var(--background-general-secondary);\n border-radius: 9999px;\n font-family: var(--font-primary);\n font-size: var(--text-label-large-font-size);\n font-weight: var(--font-weight-medium);\n line-height: 28px;\n color: var(--content-general-primary);\n}\n\n.categoryFooter {\n margin-top: 16px;\n}\n\n.categoryFooterText {\n font-family: var(--font-primary);\n font-size: var(--text-label-small-font-size);\n font-weight: var(--font-weight-medium);\n line-height: 16px;\n color: var(--content-general-tertiary);\n}\n\n.categoryFooterLink {\n color: var(--content-action-link-idle);\n text-decoration: underline;\n}\n\n.categoryFooterLink:hover {\n color: var(--content-action-link-hover);\n}\n\n/* ============================================\n Clear All Section\n ============================================ */\n\n.clearSection {\n padding: 24px 0;\n}\n\n.clearAllLink {\n font-family: var(--font-primary);\n font-size: var(--text-paragraph-base-font-size);\n font-weight: var(--font-weight-medium);\n line-height: 24px;\n color: var(--content-action-link-idle);\n text-decoration: underline;\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n}\n\n.clearAllLink:hover {\n color: var(--content-action-link-hover);\n}\n\n/* ============================================\n Desktop: Show sidebar at 1024px+\n ============================================ */\n\n/* Hidden state for loading */\n.hidden {\n display: none;\n}\n\n@media (min-width: 1024px) {\n .filterPanel {\n display: flex;\n width: 100%; /* Fill parent .filterColumn (306px per Figma) */\n flex-shrink: 0;\n }\n}\n\n/* ============================================\n Mobile: Modal overlay (future phase)\n ============================================ */\n\n/* Modal styles will be added when implementing mobile filter modal */\n","import React, { useEffect } from 'react';\nimport { useUIContext } from '../../context';\nimport { Button } from '../Button';\nimport { FilterPanel, FilterPanelProps } from './FilterPanel';\nimport { SelectedFiltersRow, SelectedFilter } from './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('filter.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('filter.show-results', 'Show {count} results').replace('{count}', String(resultCount))}\n </Button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default FilterModal;\n","/**\n * FilterModal - Modal wrapper for FilterPanel\n *\n * Figma: 632:51682 (mobile fullscreen), 702-76591 (map view centered)\n * Used for mobile list view and map view (both desktop and mobile)\n */\n\n/* Backdrop overlay - semi-transparent background */\n.overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n width: 100%;\n height: 100%;\n height: 100dvh; /* Dynamic viewport height for mobile */\n z-index: 9999; /* Above everything including TopBar */\n background-color: rgba(0, 0, 0, 0.5); /* Semi-transparent backdrop */\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-rem-4, 64px); /* 64px = 4rem spacing around modal */\n box-sizing: border-box;\n animation: fadeIn 0.2s ease-out;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* Centered modal container */\n.modal {\n position: relative;\n width: 100%;\n max-width: 560px; /* Narrower modal per Figma - approx (1440 - 409*2)px */\n height: 100%;\n max-height: calc(100vh - var(--size-rem-8, 128px)); /* Account for top/bottom padding */\n background-color: var(--background-general-primary);\n display: flex;\n flex-direction: column;\n border-radius: var(--radius-xl, 16px); /* Rounded corners */\n box-shadow: 0 20px 50px -10px rgba(0, 0, 0, 0.25);\n animation: slideUp 0.3s ease-out;\n overflow: hidden;\n}\n\n@keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Mobile: Full-screen modal */\n@media (max-width: 767px) {\n .overlay {\n background-color: var(--background-general-primary);\n padding: 0;\n }\n\n .modal {\n width: 100%;\n max-width: 100%;\n height: 100%;\n max-height: 100%;\n border-radius: 0;\n box-shadow: none;\n /* Handle iOS safe areas */\n padding-top: env(safe-area-inset-top);\n padding-bottom: env(safe-area-inset-bottom);\n }\n}\n\n/* Header with title and close button - Figma: 76px height */\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--size-rem-1, 16px); /* 16px */\n height: 76px;\n flex-shrink: 0;\n border-bottom: 1px solid var(--border-general-divider);\n background-color: var(--background-general-primary);\n}\n\n/* Selected filters chips area - below header */\n.selectedFilters {\n padding: var(--size-rem-0, 0) var(--size-rem-3, 48px) var(--size-rem-1-5, 24px) var(--size-rem-3, 48px);\n background-color: var(--background-general-primary);\n flex-shrink: 0;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n@media (max-width: 1023px) {\n .selectedFilters {\n border-bottom: unset !important;\n padding: var(--size-rem-0, 0) var(--size-rem-1, 16px);\n }\n}\n\n.title {\n flex: 1;\n margin: 0;\n color: var(--content-general-primary);\n text-align: center;\n /* heading/small */\n font-family: var(--text-heading-small-font-family, inherit);\n font-size: var(--text-heading-small-font-size, 18px);\n font-style: normal;\n font-weight: 500;\n line-height: var(--text-heading-small-line-height, 1.33); /* 133.333% */\n letter-spacing: -0.6px;\n}\n\n@media (max-width: 1023px) {\n .title {\n text-align: left;\n }\n}\n\n/* Scrollable content area - contains FilterPanel */\n.content {\n flex: 1;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n/* FilterPanel styling within modal - override desktop width */\n.filterPanel {\n /* Remove any default padding/margin from FilterPanel */\n padding: var(--size-rem-0, 0) var(--size-rem-3, 48px) var(--size-rem-1-5, 24px) var(--size-rem-3, 48px);\n margin: 0;\n width: 100% !important; /* Override desktop 280px width */\n display: flex !important; /* Ensure visibility */\n}\n\n@media (max-width: 1023px) {\n .filterPanel {\n padding: var(--size-rem-0, 0) var(--size-rem-1, 16px);\n }\n}\n\n/* Fixed footer - Figma: 92px height */\n.footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--size-rem-1-5, 24px) var(--size-rem-3, 48px) var(--size-rem-1-5, 24px) var(--size-rem-3, 48px);\n height: 92px;\n flex-shrink: 0;\n border-top: 1px solid var(--border-general-divider);\n background-color: var(--background-general-primary);\n}\n\n@media (max-width: 1023px) {\n .footer {\n padding: var(--size-rem-1-5, 24px) var(--size-rem-1, 16px);\n }\n}\n\n.footerLink {\n transition: color 0.15s ease;\n color: var(--content-action-link-idle);\n /* label-link/large */\n font-family: var(--text-label-large-font-family, inherit);\n font-size: var(--text-label-large-font-size, 16px);\n font-style: normal;\n font-weight: 500;\n line-height: var(--text-label-large-line-height, 1.55); /* 155.556% */\n text-decoration-line: underline;\n text-decoration-style: solid;\n text-decoration-skip-ink: none;\n text-decoration-thickness: auto;\n text-underline-offset: auto;\n text-underline-position: from-font;\n cursor: pointer;\n}\n\n.footerLink:focus {\n outline: none;\n box-shadow: none;\n}\n\n/* Disabled state */\n.footerLink:disabled {\n color: var(--content-action-disabled-idle);\n cursor: not-allowed;\n}\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","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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAAC;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAqE;;;ACArE;AAAA,EACE,QAAU;AAAA,IACR,OAAS;AAAA,IACT,oBAAoB;AAAA,IACpB,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,QAAU;AAAA,IACV,eAAe;AAAA,EACjB;AAAA,EACA,MAAQ;AAAA,IACN,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,2BAA2B;AAAA,IAC3B,MAAQ;AAAA,IACR,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,EACpB;AAAA,EACA,SAAW;AAAA,IACT,cAAc;AAAA,IACd,cAAc;AAAA,IACd,WAAa;AAAA,IACb,SAAW;AAAA,IACX,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,0BAA0B;AAAA,IAC1B,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,iCAAiC;AAAA,IACjC,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,EACvB;AAAA,EACA,OAAS;AAAA,IACP,cAAc;AAAA,IACd,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,QAAU;AAAA,IACV,QAAU;AAAA,IACV,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,QAAU;AAAA,IACV,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,eAAe;AAAA,IACf,eAAe;AAAA,IACf,eAAe;AAAA,EACjB;AAAA,EACA,SAAW;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,mBAAmB;AAAA,EACrB;AAAA,EACA,aAAe;AAAA,IACb,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,WAAW;AAAA,EACb;AAAA,EACA,MAAQ;AAAA,IACN,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,KAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,aAAe;AAAA,IACf,YAAc;AAAA,IACd,YAAY;AAAA,IACZ,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,OAAS;AAAA,IACT,kBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,aAAa;AAAA,IACb,SAAW;AAAA,IACX,qBAAqB;AAAA,IACrB,UAAY;AAAA,IACZ,cAAc;AAAA,IACd,OAAS;AAAA,IACT,sBAAsB;AAAA,EACxB;AAAA,EACA,UAAY;AAAA,IACV,cAAc;AAAA,EAChB;AACF;;;AC3HA;AAAA,EACE,QAAU;AAAA,IACR,OAAS;AAAA,IACT,oBAAoB;AAAA,IACpB,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,QAAU;AAAA,IACV,eAAe;AAAA,EACjB;AAAA,EACA,MAAQ;AAAA,IACN,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,2BAA2B;AAAA,IAC3B,MAAQ;AAAA,IACR,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,EACpB;AAAA,EACA,SAAW;AAAA,IACT,cAAc;AAAA,IACd,cAAc;AAAA,IACd,WAAa;AAAA,IACb,SAAW;AAAA,IACX,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,0BAA0B;AAAA,IAC1B,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,iCAAiC;AAAA,IACjC,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,EACvB;AAAA,EACA,OAAS;AAAA,IACP,cAAc;AAAA,IACd,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,QAAU;AAAA,IACV,QAAU;AAAA,IACV,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,QAAU;AAAA,IACV,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,eAAe;AAAA,IACf,eAAe;AAAA,IACf,eAAe;AAAA,EACjB;AAAA,EACA,SAAW;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,mBAAmB;AAAA,EACrB;AAAA,EACA,aAAe;AAAA,IACb,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,WAAW;AAAA,EACb;AAAA,EACA,MAAQ;AAAA,IACN,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,KAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,aAAe;AAAA,IACf,YAAc;AAAA,IACd,YAAY;AAAA,IACZ,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,OAAS;AAAA,IACT,kBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,aAAa;AAAA,IACb,SAAW;AAAA,IACX,qBAAqB;AAAA,IACrB,UAAY;AAAA,IACZ,cAAc;AAAA,IACd,OAAS;AAAA,IACT,sBAAsB;AAAA,EACxB;AAAA,EACA,UAAY;AAAA,IACV,cAAc;AAAA,EAChB;AACF;;;AC3HA;AAAA,EACE,QAAU;AAAA,IACR,OAAS;AAAA,IACT,oBAAoB;AAAA,IACpB,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,QAAU;AAAA,IACV,eAAe;AAAA,EACjB;AAAA,EACA,MAAQ;AAAA,IACN,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,2BAA2B;AAAA,IAC3B,MAAQ;AAAA,IACR,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,EACpB;AAAA,EACA,SAAW;AAAA,IACT,cAAc;AAAA,IACd,cAAc;AAAA,IACd,WAAa;AAAA,IACb,SAAW;AAAA,IACX,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,0BAA0B;AAAA,IAC1B,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,iCAAiC;AAAA,IACjC,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,EACvB;AAAA,EACA,OAAS;AAAA,IACP,cAAc;AAAA,IACd,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,QAAU;AAAA,IACV,QAAU;AAAA,IACV,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,QAAU;AAAA,IACV,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,eAAe;AAAA,IACf,eAAe;AAAA,IACf,eAAe;AAAA,EACjB;AAAA,EACA,SAAW;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,mBAAmB;AAAA,EACrB;AAAA,EACA,aAAe;AAAA,IACb,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,WAAW;AAAA,EACb;AAAA,EACA,MAAQ;AAAA,IACN,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,KAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,aAAe;AAAA,IACf,YAAc;AAAA,IACd,YAAY;AAAA,IACZ,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,OAAS;AAAA,IACT,kBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,aAAa;AAAA,IACb,SAAW;AAAA,IACX,qBAAqB;AAAA,IACrB,UAAY;AAAA,IACZ,cAAc;AAAA,IACd,OAAS;AAAA,IACT,sBAAsB;AAAA,EACxB;AAAA,EACA,UAAY;AAAA,IACV,cAAc;AAAA,EAChB;AACF;;;AC3HA;AAAA,EACE,QAAU;AAAA,IACR,OAAS;AAAA,IACT,oBAAoB;AAAA,IACpB,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,QAAU;AAAA,IACV,eAAe;AAAA,EACjB;AAAA,EACA,MAAQ;AAAA,IACN,mBAAmB;AAAA,IACnB,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,oBAAoB;AAAA,IACpB,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,2BAA2B;AAAA,IAC3B,MAAQ;AAAA,IACR,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,EACpB;AAAA,EACA,SAAW;AAAA,IACT,cAAc;AAAA,IACd,cAAc;AAAA,IACd,WAAa;AAAA,IACb,SAAW;AAAA,IACX,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,0BAA0B;AAAA,IAC1B,eAAe;AAAA,IACf,qBAAqB;AAAA,IACrB,cAAc;AAAA,IACd,iCAAiC;AAAA,IACjC,wBAAwB;AAAA,IACxB,qBAAqB;AAAA,EACvB;AAAA,EACA,OAAS;AAAA,IACP,cAAc;AAAA,IACd,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,KAAO;AAAA,IACP,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,QAAU;AAAA,IACV,QAAU;AAAA,IACV,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,QAAU;AAAA,IACV,oBAAoB;AAAA,IACpB,oBAAoB;AAAA,IACpB,eAAe;AAAA,IACf,eAAe;AAAA,IACf,eAAe;AAAA,EACjB;AAAA,EACA,SAAW;AAAA,IACT,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,cAAc;AAAA,IACd,mBAAmB;AAAA,EACrB;AAAA,EACA,aAAe;AAAA,IACb,WAAW;AAAA,IACX,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,WAAW;AAAA,EACb;AAAA,EACA,MAAQ;AAAA,IACN,QAAU;AAAA,IACV,OAAS;AAAA,IACT,QAAU;AAAA,IACV,UAAY;AAAA,IACZ,KAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,KAAO;AAAA,IACP,aAAa;AAAA,EACf;AAAA,EACA,QAAU;AAAA,IACR,SAAW;AAAA,IACX,aAAe;AAAA,IACf,YAAc;AAAA,IACd,YAAY;AAAA,IACZ,OAAS;AAAA,IACT,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,OAAS;AAAA,IACT,kBAAkB;AAAA,IAClB,SAAW;AAAA,IACX,UAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,WAAa;AAAA,IACb,UAAY;AAAA,IACZ,aAAa;AAAA,IACb,SAAW;AAAA,IACX,qBAAqB;AAAA,IACrB,UAAY;AAAA,IACZ,cAAc;AAAA,IACd,OAAS;AAAA,IACT,sBAAsB;AAAA,EACxB;AAAA,EACA,UAAY;AAAA,IACV,cAAc;AAAA,EAChB;AACF;;;ACtHO,IAAM,eAAe,EAAE,gBAAI,gBAAI,gBAAI,eAAG;;;ALmGzC;AAnFJ,SAAS,eAAe,KAA8B,MAAkC;AACtF,QAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,MAAI,UAAmB;AAEvB,aAAW,OAAO,MAAM;AACtB,QAAI,YAAY,QAAQ,YAAY,UAAa,OAAO,YAAY,UAAU;AAC5E,aAAO;AAAA,IACT;AACA,cAAW,QAAoC,GAAG;AAAA,EACpD;AAEA,SAAO,OAAO,YAAY,WAAW,UAAU;AACjD;AAKA,SAAS,wBAAwB,QAAmC;AAClE,QAAM,qBAAqB,aAAa,MAAM,KAAK,aAAa;AAEhE,SAAO,CAAC,KAAa,aAA8B;AACjD,UAAM,QAAQ,eAAe,oBAA+C,GAAG;AAC/E,WAAO,SAAS,YAAY;AAAA,EAC9B;AACF;AAEA,IAAM,WAAW,wBAAwB,IAAI;AAE7C,IAAM,eAA+B;AAAA,EACnC,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,WAAW;AAAA,EACX,GAAG;AACL;AAEA,IAAM,gBAAY,4BAA8B,YAAY;AA6BrD,IAAM,sBAA0D,CAAC;AAAA,EACtE,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,GAAG;AAAA,EACH;AACF,MAAM;AAEJ,QAAM,QAAI;AAAA,IACR,MAAM,WAAW,wBAAwB,MAAM;AAAA,IAC/C,CAAC,QAAQ,OAAO;AAAA,EAClB;AAEA,QAAM,YAAwB;AAAA,IAC5B,OAAO,EAAE,QAAQ,UAAU,WAAW,EAAE;AAAA,IACxC,CAAC,QAAQ,UAAU,WAAW,CAAC;AAAA,EACjC;AAEA,SACE,4CAAC,UAAU,UAAV,EAAmB,OACjB,UACH;AAEJ;AAMO,IAAM,eAAe,MAAsB;AAChD,aAAO,yBAAW,SAAS;AAC7B;;;AMpHA,IAAAC,gBAA2B;AA0DnB,IAAAC,sBAAA;AArDR,IAAM,KAAK,CAAC,cAAsB,UAAU,SAAS;AAErD,IAAM,aAAS,0BAA2C,CAAC;AAAA,EACzD,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,GAAG;AACL,GAAG,QAAQ;AAGT,QAAM,mBAAmB,MAAM;AAC7B,UAAM,UAAoB,CAAC,GAAG,QAAQ,CAAC;AAGvC,QAAI,YAAY,QAAQ;AACtB,cAAQ,KAAK,GAAG,MAAM,CAAC;AACvB,cAAQ,KAAK,GAAG,IAAI,CAAC;AACrB,aAAO,QAAQ,KAAK,GAAG;AAAA,IACzB;AAGA,QAAI,UAAU;AACZ,cAAQ,KAAK,GAAG,WAAW,CAAC;AAC5B,cAAQ,KAAK,GAAG,IAAI,CAAC;AACrB,cAAQ,KAAK,GAAG,OAAO,CAAC;AACxB,aAAO,QAAQ,KAAK,GAAG;AAAA,IACzB;AAGA,YAAQ,KAAK,GAAG,UAAU,CAAC;AAC3B,YAAQ,KAAK,GAAG,IAAI,CAAC;AACrB,YAAQ,KAAK,GAAG,OAAO,CAAC;AAExB,WAAO,QAAQ,KAAK,GAAG;AAAA,EACzB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,WAAW,GAAG,iBAAiB,CAAC,IAAI,SAAS;AAAA,MAC7C;AAAA,MACC,GAAG;AAAA,MAEH,qBACC,WAEA,8EACG;AAAA,oBACC,6CAAC,UAAK,WAAW,GAAG,cAAc,GAC/B,oBACH;AAAA,QAEF,6CAAC,UAAK,WAAW,GAAG,cAAc,GAAI,UAAS;AAAA,QAC9C,aACC,6CAAC,UAAK,WAAW,GAAG,cAAc,GAC/B,qBACH;AAAA,SAEJ;AAAA;AAAA,EAEJ;AAEJ,CAAC;AAED,OAAO,cAAc;;;ACtCjB,IAAAC,sBAAA;AAlCJ,IAAMC,MAAK,CAAC,cAAsB,YAAY,SAAS;AAEvD,IAAM,QAA8B,CAAC;AAAA,EACnC,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,OAAO;AAAA,EACP;AAAA,EACA,YAAY;AACd,MAAM;AAEJ,QAAM,gBAAgB,GAAG,KAAK,GAAG,MAAM,OAAO,CAAC,EAAE,YAAY,CAAC,GAAG,MAAM,MAAM,CAAC,CAAC;AAG/E,QAAM,eAAe;AAAA,IACnBA,IAAG,OAAO;AAAA,IACVA,IAAG,UAAU,IAAI,EAAE;AAAA,IACnBA,IAAG,UAAU,aAAa,EAAE;AAAA,IAC5B;AAAA,EACF,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAG1B,QAAM,cAAc;AAAA,IAClBA,IAAG,MAAM;AAAA,IACTA,IAAG,SAAS,IAAI,EAAE;AAAA,EACpB,EAAE,KAAK,GAAG;AAGV,QAAM,cAAc;AAAA,IAClBA,IAAG,MAAM;AAAA,IACT,SAAS,WAAW,OAAOA,IAAG,qBAAqB,IAAI;AAAA,EACzD,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACE,8CAAC,SAAI,WAAW,cACb;AAAA,YACC,6CAAC,SAAI,WAAW,aAEhB;AAAA,IAGF,6CAAC,SAAI,WAAW,aACb,UACH;AAAA,KACF;AAEJ;AAEA,MAAM,cAAc;;;AC5ClB,IAAAC,sBAAA;AAJF,IAAMC,MAAK,CAAC,cAAsB,aAAa,SAAS;AAGxD,IAAM,WAAW,MACf,8CAAC,SAAI,OAAM,8BAA6B,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACtF;AAAA,+CAAC,OAAE,UAAS,oBACV,uDAAC,UAAK,GAAE,ypBAAwpB,MAAK,WAAS,GAChrB;AAAA,EACA,6CAAC,UACC,uDAAC,cAAS,IAAG,cACX,uDAAC,UAAK,OAAM,MAAK,QAAO,MAAK,MAAK,SAAO,GAC3C,GACF;AAAA,GACF;AAIF,IAAM,eAAe,MACnB,8CAAC,SAAI,OAAM,8BAA6B,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACtF;AAAA,+CAAC,UACC,uDAAC,cAAS,IAAG,QACX,uDAAC,UAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,GAC3C,GACF;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACC,UAAS;AAAA,MACT,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,EACA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP;AAAA,GACF;AAIF,IAAM,gBAAgB,MACpB,8CAAC,SAAI,OAAM,8BAA6B,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACtF;AAAA,+CAAC,OAAE,UAAS,qBACV,uDAAC,UAAK,GAAE,wjCAAujC,MAAK,WAAS,GAC/kC;AAAA,EACA,6CAAC,UACC,uDAAC,cAAS,IAAG,eACX,uDAAC,UAAK,OAAM,MAAK,QAAO,MAAK,MAAK,SAAO,GAC3C,GACF;AAAA,GACF;AAGF,IAAM,SAAgC,CAAC;AAAA,EACrC,UAAU;AAAA,EACV;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,YAAY;AACd,MAAM;AAEJ,QAAM,eAAe,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,GAAG,QAAQ;AAG1D,QAAM,YAAY,KAAK,MAAM,YAAY;AACzC,QAAM,cAAc,eAAe,KAAK;AACxC,QAAM,aAAa,WAAW,aAAa,cAAc,IAAI;AAE7D,QAAM,cAAc,MAAM;AACxB,UAAM,cAAc;AAAA,MAClBA,IAAG,MAAM;AAAA,MACTA,IAAG,SAAS,IAAI,EAAE;AAAA,IACpB,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,UAAM,QAAQ,CAAC;AAGf,aAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,YAAM;AAAA,QACJ,6CAAC,UAAuB,WAAW,aACjC,uDAAC,YAAS,KADD,QAAQ,CAAC,EAEpB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,aAAa;AACf,YAAM;AAAA,QACJ,6CAAC,UAAgB,WAAW,aAC1B,uDAAC,gBAAa,KADN,MAEV;AAAA,MACF;AAAA,IACF;AAGA,aAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,YAAM;AAAA,QACJ,6CAAC,UAAwB,WAAW,aAClC,uDAAC,iBAAc,KADN,SAAS,CAAC,EAErB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAGA,MAAI,YAAY,SAAS;AACvB,UAAMC,oBAAmB,CAACD,IAAG,gBAAgB,GAAG,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAEnF,WACE,8CAAC,SAAI,WAAWC,mBACd;AAAA,mDAAC,SAAI,WAAWD,IAAG,eAAe,GAC/B,sBAAY,GACf;AAAA,MACC,aACC,6CAAC,UAAK,WAAWA,IAAG,cAAc,GAC/B,uBAAa,eAAe,OAAO,GACtC;AAAA,OAEJ;AAAA,EAEJ;AAGA,MAAI,YAAY,UAAU;AACxB,UAAMC,oBAAmB,CAACD,IAAG,iBAAiB,GAAG,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAEpF,WACE,8CAAC,SAAI,WAAWC,mBACd;AAAA,mDAAC,UAAK,WAAWD,IAAG,YAAY,GAAG,eAAC;AAAA,MACpC,6CAAC,SACE,sBAAY,GACf;AAAA,OACF;AAAA,EAEJ;AAGA,QAAM,mBAAmB,CAACA,IAAG,gBAAgB,GAAG,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAEnF,SACE,8CAAC,SAAI,WAAW,kBACd;AAAA,kDAAC,SAAI,WAAWA,IAAG,aAAa,GAC9B;AAAA,oDAAC,SAAI,WAAWA,IAAG,iBAAiB,GACjC;AAAA,gBAAQ,6CAAC,UAAK,WAAWA,IAAG,WAAW,GAAI,gBAAK;AAAA,QACjD,6CAAC,SACE,sBAAY,GACf;AAAA,SACF;AAAA,MACC,QAAQ,6CAAC,UAAK,WAAWA,IAAG,WAAW,GAAI,gBAAK;AAAA,OACnD;AAAA,IACC,SAAS,6CAAC,OAAE,WAAWA,IAAG,YAAY,GAAI,iBAAM;AAAA,KACnD;AAEJ;AAEA,OAAO,cAAc;;;AC9If,IAAAE,sBAAA;AAhBN,IAAMC,MAAK,CAAC,cAAsB,cAAc,SAAS;AAEzD,IAAM,UAAkC,CAAC;AAAA,EACvC;AAAA,EACA,cAAc;AAAA,EACd,YAAY;AACd,MAAM;AACJ,QAAM,eAAe,gBAAgB;AAErC,MAAI,CAAC,OAAO;AAEV,UAAMC,aAAY,eACdD,IAAG,4BAA4B,IAC/BA,IAAG,0BAA0B;AAEjC,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,CAACC,YAAW,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QAC1D,MAAK;AAAA,QACL,oBAAkB;AAAA;AAAA,IACpB;AAAA,EAEJ;AAGA,QAAM,iBAAiB,eACnBD,IAAG,uBAAuB,IAC1BA,IAAG,qBAAqB;AAE5B,QAAM,YAAY,eACdA,IAAG,kBAAkB,IACrBA,IAAG,gBAAgB;AAEvB,QAAM,mBAAmB;AAAA,IACvBA,IAAG,WAAW;AAAA,IACd;AAAA,IACA;AAAA,EACF,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX,MAAK;AAAA,MACL,oBAAkB;AAAA,MAClB,cAAY,OAAO,UAAU,WAAW,QAAQ;AAAA,MAEhD;AAAA,qDAAC,SAAI,WAAW,WAAW;AAAA,QAC3B,6CAAC,UAAK,WAAWA,IAAG,OAAO,GAAI,iBAAM;AAAA,QACrC,6CAAC,SAAI,WAAW,WAAW;AAAA;AAAA;AAAA,EAC7B;AAEJ;AAEA,QAAQ,cAAc;;;ACjDpB,IAAAE,sBAAA;AAJF,IAAMC,MAAK,CAAC,cAAsB,WAAW,SAAS;AAGtD,IAAM,YAAY,MAChB,8CAAC,SAAI,OAAM,8BAA6B,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACtF;AAAA,+CAAC,OAAE,UAAS,0BACV,uDAAC,UAAK,GAAE,kpCAAipC,MAAK,gBAAc,GAC9qC;AAAA,EACA,6CAAC,UACC,uDAAC,cAAS,IAAG,oBACX,uDAAC,UAAK,OAAM,MAAK,QAAO,MAAK,MAAK,SAAO,GAC3C,GACF;AAAA,GACF;AAGF,IAAM,OAA4B,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AACb,MAAM;AAEJ,QAAM,iBAAiB,WAAW,aAAa;AAG/C,QAAM,cAAc;AAAA,IAClBA,IAAG,MAAM;AAAA,IACTA,IAAG,SAAS,IAAI,EAAE;AAAA,IAClBA,IAAG,SAAS,cAAc,EAAE;AAAA,IAC5B;AAAA,EACF,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAG1B,QAAM,eAAe,CAACA,IAAG,OAAO,GAAGA,IAAG,UAAU,IAAI,EAAE,CAAC,EAAE,KAAK,GAAG;AAGjE,QAAM,oBAAoB,CAACA,IAAG,YAAY,GAAGA,IAAG,eAAe,IAAI,EAAE,CAAC,EAAE,KAAK,GAAG;AAEhF,QAAM,cAAc,MAAM;AACxB,QAAI,SAAU;AAEd,QAAI,aAAa,UAAU;AACzB,eAAS;AAAA,IACX,WAAW,SAAS;AAClB,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,MAA2B;AAChD,QAAI,SAAU;AACd,QAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,QAAE,eAAe;AACjB,UAAI,aAAa,UAAU;AACzB,iBAAS;AAAA,MACX,WAAW,SAAS;AAClB,gBAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX;AAAA,MACA,cAAY,YAAY,kBAAkB,KAAK,KAAK;AAAA,MAEpD;AAAA,qDAAC,UAAK,WAAW,cAAe,iBAAM;AAAA,QAErC,UAAU,UAAa,6CAAC,UAAK,WAAW,mBAAoB,iBAAM;AAAA,QAElE,aACC,6CAAC,UAAK,WAAWA,IAAG,WAAW,GAAG,eAAY,QAC5C,uDAAC,aAAU,GACb;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,KAAK,cAAc;;;AC5FnB,IAAAC,gBAAyB;AA6EnB,IAAAC,sBAAA;AAxEN,IAAMC,MAAK,CAAC,cAAsB,eAAe,SAAS;AAE1D,IAAM,WAAoC,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA,WAAW;AAAA,EACX,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,OAAO;AACT,MAAM;AACJ,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,cAAc;AAC/D,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAEhD,QAAM,gBAAgB,YAAY,SAAY,UAAU;AAExD,QAAM,eAAe,CAAC,MAA2C;AAC/D,UAAM,aAAa,EAAE,OAAO;AAC5B,QAAI,YAAY,QAAW;AACzB,sBAAgB,UAAU;AAAA,IAC5B;AACA,eAAW,UAAU;AAAA,EACvB;AAGA,QAAM,mBAAmB;AAAA,IACvBA,IAAG,WAAW;AAAA,IACd,YAAYA,IAAG,qBAAqB;AAAA,IACpC;AAAA,EACF,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAG1B,QAAM,iBAAiB;AAAA,IACrBA,IAAG,SAAS;AAAA,IACZA,IAAG,YAAY,IAAI,EAAE;AAAA,EACvB,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAG1B,QAAM,aAAa;AAAA,IACjBA,IAAG,KAAK;AAAA,IACRA,IAAG,QAAQ,IAAI,EAAE;AAAA,IACjB,iBAAiBA,IAAG,cAAc;AAAA,IAClC,YAAYA,IAAG,eAAe;AAAA,IAC9B,SAAS,CAAC,iBAAiBA,IAAG,YAAY;AAAA,IAC1C,aAAaA,IAAG,cAAc;AAAA,EAChC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAG1B,QAAM,eAAe;AAAA,IACnBA,IAAG,OAAO;AAAA,IACV,YAAYA,IAAG,iBAAiB;AAAA,EAClC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAG1B,QAAM,mBAAmB;AAAA,IACvBA,IAAG,WAAW;AAAA,IACdA,IAAG,cAAc,IAAI,EAAE;AAAA,IACvB,iBAAiBA,IAAG,oBAAoB;AAAA,EAC1C,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAG1B,QAAM,eAAe;AAAA,IACnBA,IAAG,OAAO;AAAA,IACV,YAAYA,IAAG,iBAAiB;AAAA,IAChC,SAAS,CAAC,YAAYA,IAAG,cAAc;AAAA,EACzC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACE,8CAAC,WAAM,WAAW,kBAChB;AAAA,kDAAC,SAAI,WAAW,gBACd;AAAA,mDAAC,SAAI,WAAW,YAAY;AAAA,MAC5B;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT,UAAU;AAAA,UACV;AAAA,UACA,WAAW;AAAA,UACX,SAAS,MAAM,aAAa,IAAI;AAAA,UAChC,QAAQ,MAAM,aAAa,KAAK;AAAA,UAChC,gBAAc;AAAA;AAAA,MAChB;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW;AAAA,UACX,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,OAAM;AAAA,UAEN;AAAA,YAAC;AAAA;AAAA,cACC,GAAE;AAAA,cACF,QAAO;AAAA,cACP,aAAY;AAAA,cACZ,eAAc;AAAA,cACd,gBAAe;AAAA;AAAA,UACjB;AAAA;AAAA,MACF;AAAA,OACF;AAAA,IACC,SAAS,6CAAC,UAAK,WAAW,cAAe,iBAAM;AAAA,KAClD;AAEJ;AAEA,SAAS,cAAc;;;AC/CjB,IAAAC,sBAAA;AA3DN,IAAMC,MAAK,CAAC,cAAsB,YAAY,SAAS;AAEvD,IAAM,cAA0C,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,YAAY;AAAA,EACZ;AAAA,EACA;AACF,MAAM;AACJ,QAAM,cAAc,MAAM;AACxB,QAAI,CAAC,YAAY,CAAC,SAAS;AACzB,eAAS,IAAI;AAAA,IACf;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,UAA+B;AACpD,QAAI,CAAC,aAAa,MAAM,QAAQ,WAAW,MAAM,QAAQ,MAAM;AAC7D,YAAM,eAAe;AACrB,UAAI,CAAC,SAAS;AACZ,iBAAS,IAAI;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAGA,QAAM,mBAAmB;AAAA,IACvBA,IAAG,WAAW;AAAA,IACd,YAAYA,IAAG,qBAAqB;AAAA,IACpC;AAAA,EACF,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAG1B,QAAM,qBAAqB;AAAA,IACzBA,IAAG,aAAa;AAAA,IAChB,WAAWA,IAAG,sBAAsB;AAAA,IACpC,YAAYA,IAAG,uBAAuB;AAAA,EACxC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAG1B,QAAM,kBAAkB;AAAA,IACtBA,IAAG,UAAU;AAAA,IACb,WAAWA,IAAG,mBAAmB;AAAA,EACnC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,gBAAc;AAAA,MACd,UAAU,WAAW,KAAK;AAAA,MAC1B,SAAS;AAAA,MACT,WAAW;AAAA,MACX,WAAW;AAAA,MACX,iBAAe;AAAA,MAGf;AAAA,sDAAC,SAAI,WAAWA,IAAG,SAAS,GAE1B;AAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,MAAK;AAAA,cACL;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,UAAU,MAAM;AAAA,cAAC;AAAA,cACjB,WAAWA,IAAG,aAAa;AAAA;AAAA,UAC7B;AAAA,UAGA,6CAAC,SAAI,WAAW,oBAAoB;AAAA,UAGpC,6CAAC,SAAI,WAAW,iBAAiB;AAAA,WACnC;AAAA,QAEC,SACC,6CAAC,WAAM,SAAS,IAAI,WAAWA,IAAG,OAAO,GACtC,iBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAEA,YAAY,cAAc;;;AC3EtB,IAAAC,sBAAA;AAfJ,IAAMC,MAAK,CAAC,cAAsB,cAAc,SAAS;AAGzD,IAAM,mBAAmB,MACvB;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,eAAc;AAAA,IACd,gBAAe;AAAA,IAEf,uDAAC,cAAS,QAAO,kBAAiB;AAAA;AACpC;AAGF,IAAM,gBAA8C,CAAC;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,MAAM;AACJ,QAAM,gBAAgB,CAACA,IAAG,QAAQ,GAAG,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAExE,SACE,8CAAC,SAAI,WAAW,eACd;AAAA,iDAAC,QAAG,WAAWA,IAAG,OAAO,GAAI,iBAAM;AAAA,IAClC,gBAAgB,kBACf,8CAAC,YAAO,WAAWA,IAAG,eAAe,GAAG,SAAS,gBAC/C;AAAA,mDAAC,UAAM,wBAAa;AAAA,MACpB,6CAAC,oBAAiB;AAAA,OACpB;AAAA,KAEJ;AAEJ;AAEA,cAAc,cAAc;;;AC5C5B,IAAAC,gBAAyC;AACzC,uBAA6B;AAUzB,IAAAC,uBAAA;AALJ,IAAMC,MAAK,CAAC,cAAsB,YAAY,SAAS;AAGvD,IAAMC,aAAY,MAChB,8CAAC,SAAI,OAAM,8BAA6B,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACtF;AAAA,EAAC;AAAA;AAAA,IACC,GAAE;AAAA,IACF,MAAK;AAAA;AACP,GACF;AAGF,IAAM,QAA8B,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,uBAAuB;AACzB,MAAM;AACJ,QAAM,eAAW,sBAAuB,IAAI;AAG5C,+BAAU,MAAM;AACd,UAAM,eAAe,CAAC,MAAqB;AACzC,UAAI,EAAE,QAAQ,YAAY,QAAQ;AAChC,gBAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,QAAQ;AACV,eAAS,iBAAiB,WAAW,YAAY;AACjD,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAEA,WAAO,MAAM;AACX,eAAS,oBAAoB,WAAW,YAAY;AACpD,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,QAAQ,OAAO,CAAC;AAGpB,QAAM,sBAAsB,CAAC,MAAwB;AACnD,QAAI,EAAE,WAAW,EAAE,iBAAiB,CAAC,sBAAsB;AACzD,cAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,eAAe,CAACD,IAAG,SAAS,GAAG,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAExE,QAAM,eACJ,8CAAC,SAAI,WAAWA,IAAG,UAAU,GAAG,SAAS,qBACvC;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL,WAAW;AAAA,MACX,OAAO,EAAE,UAAU,MAAM;AAAA,MAExB;AAAA,2BACC;AAAA,UAAC;AAAA;AAAA,YACC,WAAWA,IAAG,aAAa;AAAA,YAC3B,SAAS;AAAA,YACT,cAAW;AAAA,YAEX,wDAACC,YAAA,EAAU;AAAA;AAAA,QACb;AAAA,QAED;AAAA;AAAA;AAAA,EACH,GACF;AAIF,MAAI,OAAO,aAAa,aAAa;AACnC,eAAO,+BAAa,cAAc,SAAS,IAAI;AAAA,EACjD;AAEA,SAAO;AACT;AAEA,MAAM,cAAc;;;AC9ElB,IAAAC,uBAAA;AAJF,IAAMC,OAAK,CAAC,cAAsB,WAAW,SAAS;AAGtD,IAAMC,YAAW,MACf,+CAAC,SAAI,OAAM,8BAA6B,OAAM,KAAI,QAAO,KAAI,SAAQ,WAAU,MAAK,QAClF;AAAA,gDAAC,OAAE,UAAS,yBACV;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,MAAK;AAAA;AAAA,EACP,GACF;AAAA,EACA,8CAAC,UACC,wDAAC,cAAS,IAAG,mBACX,wDAAC,UAAK,OAAM,KAAI,QAAO,KAAI,MAAK,SAAQ,WAAU,gCAA+B,GACnF,GACF;AAAA,GACF;AAIF,IAAM,cAAc,MAClB,8CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,WAAU,WAAWD,KAAG,WAAW,GACtF,wDAAC,UAAK,GAAE,+EAA8E,GACxF;AAIF,IAAM,cACJ;AAGF,IAAM,SAAS,CAAC,GAAW,aACzB,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC;AAEjD,IAAM,OAA4B,CAAC;AAAA,EACjC;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,UAAU;AAAA,EACV;AAAA,EACA,cAAc;AAAA,EACd,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,kBAAkB;AACpB,MAAM;AACJ,QAAM,YAAY,YAAY;AAG9B,QAAM,mBAAmB;AAAA,IACvBA,KAAG,MAAM;AAAA,IACTA,KAAG,SAAS,OAAO,EAAE;AAAA,IACrB,WAAWA,KAAG,iBAAiB;AAAA,IAC/B,eAAeA,KAAG,mBAAmB;AAAA,IACrC,cAAcA,KAAG,kBAAkB;AAAA,IACnC;AAAA,EACF,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,QAAM,kBAAkB;AAAA,IACtBA,KAAG,UAAU;AAAA,IACb,YAAY,iBAAiBA,KAAG,iBAAiB;AAAA,EACnD,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,QAAM,eAAe;AAAA,IACnBA,KAAG,OAAO;AAAA,IACV,YAAYA,KAAG,gBAAgB,IAAIA,KAAG,eAAe;AAAA,IACrD,YAAY,iBAAiBA,KAAG,mBAAmB;AAAA,IACnD,CAAC,aAAa,YAAY,iBAAiBA,KAAG,uBAAuB;AAAA,IACrE,CAAC,aAAaA,KAAG,iBAAiB;AAAA,EACpC,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,QAAM,eAAe;AAAA,IACnBA,KAAG,OAAO;AAAA,IACV,YAAY,iBAAiB,aAAaA,KAAG,6BAA6B;AAAA,IAC1E,YAAY,iBAAiB,CAAC,aAAaA,KAAG,2BAA2B;AAAA,IACzE,YAAY,iBAAiB,CAAC,aAAaA,KAAG,iBAAiB;AAAA,IAC/D,YAAY,iBAAiB,aAAaA,KAAG,0BAA0B;AAAA,EACzE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,QAAM,eAAe,SAAS;AAE9B,QAAM,gBAAgB,CAAC,MAA2B;AAChD,QAAI,YAAY,EAAE,QAAQ,WAAW,EAAE,QAAQ,MAAM;AACnD,QAAE,eAAe;AACjB,cAAQ;AAAA,IACV;AAAA,EACF;AAGA,QAAM,mBAAmB,MAAM;AAC7B,QAAI,CAAC,WAAY,QAAO;AACxB,WACE,+CAAC,UAAK,WAAWA,KAAG,YAAY,GAC9B;AAAA,oDAAC,eAAY;AAAA,MACb,8CAAC,UAAK,WAAWA,KAAG,aAAa,GAAI,qBAAW,OAAM;AAAA,MACtD,8CAAC,UAAK,WAAWA,KAAG,aAAa,GAAI,qBAAW,OAAM;AAAA,OACxD;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX;AAAA,MACA,WAAW;AAAA,MACX,MAAM,UAAU,WAAW;AAAA,MAC3B,UAAU,UAAU,IAAI;AAAA,MAExB;AAAA,uDAAC,SAAI,WAAWA,KAAG,gBAAgB,GACjC;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL,KAAK;AAAA,cACL,WAAWA,KAAG,OAAO;AAAA,cACrB,SAAQ;AAAA;AAAA,UACV;AAAA,UACA,8CAAC,SAAI,WAAWA,KAAG,eAAe,GAAG;AAAA,UACpC,SACC,8CAAC,SAAI,WAAWA,KAAG,cAAc,GAC/B;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,MAAM,WAAW;AAAA,cACxB,MAAM,YAAY,UAAU;AAAA,cAE3B,gBAAM;AAAA;AAAA,UACT,GACF;AAAA,WAEJ;AAAA,QAEA,+CAAC,SAAI,WAAWA,KAAG,eAAe,GAEhC;AAAA,wDAAC,SAAI,WAAW,iBACb,oBAAU,UAAa,QAAQ,IAC9B,+EAEG,oBAAU,IACT,8CAAC,UAAK,WAAWA,KAAG,YAAY,GAAI,2BAAgB,IAEpD,+EACG,sBACC,gFACE;AAAA,2DAAC,SAAI,WAAWA,KAAG,gBAAgB,GAChC;AAAA,qBAAO,KAAK,MAAM,KAAK,GAAG,CAAC,MAC1B,8CAACC,WAAA,IAAc,CAAG,CACnB;AAAA,cACA,cACC,8CAAC,UAAK,WAAWD,KAAG,eAAe,GAAG,iBAAG;AAAA,eAE7C;AAAA,YACA,8CAAC,SAAK,2BAAiB,GAAE;AAAA,aAC3B,IAEA,gFACE;AAAA,0DAAC,SAAI,WAAWA,KAAG,gBAAgB,GAChC,iBAAO,KAAK,MAAM,KAAK,GAAG,CAAC,MAC1B,8CAACC,WAAA,IAAc,CAAG,CACnB,GACH;AAAA,YACC,cACC,8CAAC,UAAK,WAAWD,KAAG,eAAe,GAAG,iBAAG;AAAA,YAE1C,iBAAiB;AAAA,aACpB,GAEJ,GAEJ,IAEA,8CAAC,SAAI,WAAWA,KAAG,kBAAkB,GAAG,kBAAM,GAElD;AAAA,UACC,SAAS,8CAAC,SAAI,WAAW,cAAe,iBAAM;AAAA,UAC9C,SAAS,8CAAC,SAAI,WAAW,cAAe,iBAAM;AAAA,WACjD;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,KAAK,cAAc;;;AC7LnB,IAAAE,gBAAmD;AAU/C,IAAAC,uBAAA;AALJ,IAAMC,OAAK,CAAC,cAAsB,eAAe,SAAS;AAG1D,IAAM,cAAc,MAClB,8CAAC,SAAI,OAAM,MAAK,QAAO,KAAI,SAAQ,YAAW,MAAK,QACjD;AAAA,EAAC;AAAA;AAAA,IACC,GAAE;AAAA,IACF,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,eAAc;AAAA,IACd,gBAAe;AAAA;AACjB,GACF;AAGF,IAAM,WAAoC,CAAC;AAAA,EACzC,UAAU,CAAC;AAAA,EACX,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,cAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA,cAAc;AAChB,MAAM;AACJ,QAAM,CAAC,YAAY,aAAa,QAAI,wBAASA,iBAAgB,EAAE;AAC/D,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,KAAK;AAC1C,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,kBAAc,sBAAuB,IAAI;AAE/C,QAAM,cAAc,UAAU,SAAY,QAAQ;AAClD,QAAM,gBAAgB,QAAQ,KAAK,CAAC,MAAM,EAAE,UAAU,WAAW,GAAG,SAAS;AAG7E,+BAAU,MAAM;AACd,UAAM,qBAAqB,CAAC,UAAsB;AAChD,UAAI,YAAY,WAAW,CAAC,YAAY,QAAQ,SAAS,MAAM,MAAc,GAAG;AAC9E,kBAAU,KAAK;AAAA,MACjB;AAAA,IACF;AAEA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,EAC3E,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,CAAC,kBAA0B;AAC9C,QAAI,UAAU,QAAW;AACvB,oBAAc,aAAa;AAAA,IAC7B;AACA,eAAW,aAAa;AACxB,cAAU,KAAK;AAAA,EACjB;AAEA,QAAM,gBAAgB,CAAC,UAA+B;AACpD,QAAI,SAAU;AAEd,QAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,YAAM,eAAe;AACrB,gBAAU,CAAC,MAAM;AAAA,IACnB,WAAW,MAAM,QAAQ,UAAU;AACjC,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF;AAGA,QAAM,mBAAmB;AAAA,IACvBD,KAAG,WAAW;AAAA,IACd,YAAYA,KAAG,qBAAqB;AAAA,IACpC;AAAA,EACF,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAG1B,QAAM,gBAAgB;AAAA,IACpBA,KAAG,QAAQ;AAAA,IACX,SAASA,KAAG,eAAe;AAAA,IAC3B,aAAa,CAAC,SAASA,KAAG,eAAe;AAAA,IACzC,YAAYA,KAAG,kBAAkB;AAAA,IACjC,UAAUA,KAAG,cAAc;AAAA,EAC7B,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAG1B,QAAM,iBAAiB;AAAA,IACrBA,KAAG,SAAS;AAAA,IACZ,UAAUA,KAAG,eAAe;AAAA,EAC9B,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAG1B,QAAM,cAAc;AAAA,IAClBA,KAAG,MAAM;AAAA,IACT,UAAUA,KAAG,YAAY;AAAA,EAC3B,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACE,+CAAC,SAAI,KAAK,aAAa,WAAW,kBAChC;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,QACX,UAAU,WAAW,KAAK;AAAA,QAC1B,SAAS,MAAM,CAAC,YAAY,UAAU,CAAC,MAAM;AAAA,QAC7C,WAAW;AAAA,QACX,SAAS,MAAM,CAAC,YAAY,aAAa,IAAI;AAAA,QAC7C,QAAQ,MAAM,aAAa,KAAK;AAAA,QAChC,MAAK;AAAA,QACL,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,iBAAe;AAAA,QAEf;AAAA,wDAAC,UAAM,yBAAc;AAAA,UACrB,8CAAC,UAAK,WAAW,gBACf,wDAAC,eAAY,GACf;AAAA;AAAA;AAAA,IACF;AAAA,IAEA,8CAAC,QAAG,MAAK,WAAU,WAAW,aAC3B,kBAAQ,IAAI,CAAC,WACZ;AAAA,MAAC;AAAA;AAAA,QAEC,MAAK;AAAA,QACL,iBAAe,gBAAgB,OAAO;AAAA,QACtC,SAAS,MAAM,aAAa,OAAO,KAAK;AAAA,QACxC,WAAW,GAAGA,KAAG,QAAQ,CAAC,IACxB,gBAAgB,OAAO,QAAQA,KAAG,kBAAkB,IAAI,EAC1D;AAAA,QAEC,iBAAO;AAAA;AAAA,MARH,OAAO;AAAA,IASd,CACD,GACH;AAAA,IAGA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;AAAA,QAC5C;AAAA,QACA,WAAWA,KAAG,cAAc;AAAA,QAE3B;AAAA,WAAC,eAAe,8CAAC,YAAO,OAAM,IAAI,uBAAY;AAAA,UAC9C,QAAQ,IAAI,CAAC,QACZ,8CAAC,YAAuB,OAAO,IAAI,OAChC,cAAI,SADM,IAAI,KAEjB,CACD;AAAA;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;AAEA,SAAS,cAAc;;;AC3JvB,IAAAE,gBAAwC;AA4FhC,IAAAC,uBAAA;AAvFR,IAAMC,OAAK,CAAC,cAAsB,YAAY,SAAS;AAEvD,IAAM,QAA8B,CAAC;AAAA,EACnC;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,cAAAC,gBAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,YAAY;AAAA,EACZ,WAAW;AAAA,EACX;AACF,MAAM;AACJ,QAAM,CAAC,YAAY,aAAa,QAAI,wBAASA,aAAY;AACzD,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,eAAW,sBAAyB,IAAI;AAE9C,QAAM,cAAc,UAAU,SAAY,QAAQ;AAElD,QAAM,eAAe,CAAC,MAA2C;AAC/D,UAAM,WAAW,EAAE,OAAO;AAC1B,QAAI,UAAU,QAAW;AACvB,oBAAc,QAAQ;AAAA,IACxB;AACA,eAAW,QAAQ;AAAA,EACrB;AAEA,QAAM,cAAc,MAAM;AACxB,iBAAa,IAAI;AACjB,cAAU;AAAA,EACZ;AAEA,QAAM,aAAa,MAAM;AACvB,iBAAa,KAAK;AAClB,aAAS;AAAA,EACX;AAGA,QAAM,mBAAmB,CAACD,KAAG,WAAW,GAAG,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAG9E,QAAM,eAAe;AAAA,IACnBA,KAAG,OAAO;AAAA,KACT,YAAY,aAAaA,KAAG,iBAAiB;AAAA,EAChD,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAG1B,QAAM,iBAAiB;AAAA,IACrBA,KAAG,SAAS;AAAA,IACZ,aAAaA,KAAG,gBAAgB;AAAA,IAChC,SAASA,KAAG,gBAAgB;AAAA,KAC3B,YAAY,aAAaA,KAAG,mBAAmB;AAAA,IAChD;AAAA,EACF,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAG1B,QAAM,eAAe;AAAA,IACnBA,KAAG,OAAO;AAAA,KACT,YAAY,aAAaA,KAAG,iBAAiB;AAAA,IAC9C;AAAA,EACF,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAG1B,QAAM,gBAAgB;AAAA,IACpBA,KAAG,QAAQ;AAAA,IACX,SAASA,KAAG,eAAe;AAAA,KAC1B,YAAY,aAAaA,KAAG,kBAAkB;AAAA,EACjD,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACE,+CAAC,SAAI,WAAW,kBACb;AAAA,aACC,8CAAC,WAAM,SAAS,IAAI,WAAW,cAC5B,iBACH;AAAA,IAGF;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,QACX,SAAS,MAAM,CAAC,YAAY,CAAC,YAAY,SAAS,SAAS,MAAM;AAAA,QAEhE;AAAA,sBAAY,8CAAC,SAAI,WAAWA,KAAG,MAAM,GAAI,oBAAS;AAAA,UAElD,UAAU,8CAAC,SAAI,WAAWA,KAAG,QAAQ,GAAI,kBAAO;AAAA,UAEjD;AAAA,YAAC;AAAA;AAAA,cACC,KAAK;AAAA,cACL;AAAA,cACA;AAAA,cACA;AAAA,cACA,OAAO;AAAA,cACP,UAAU;AAAA,cACV,SAAS;AAAA,cACT,QAAQ;AAAA,cACR;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,WAAW;AAAA,cACV,GAAG;AAAA;AAAA,UACN;AAAA,UAEC,aAAa;AAAA;AAAA;AAAA,IAChB;AAAA,IAEC,UAAU,8CAAC,SAAI,WAAW,eAAgB,kBAAO;AAAA,KACpD;AAEJ;AAEA,MAAM,cAAc;;;AChFZ,IAAAE,uBAAA;AAjDR,IAAMC,OAAK,CAAC,cAAsB,YAAY,SAAS;AAqBvD,IAAM,QAA8B,CAAC;AAAA,EACnC,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,YAAY;AAAA,EACZ,YAAY;AACd,MAAM;AACJ,MAAI,YAAY,QAAQ;AACtB,UAAMC,oBAAmB;AAAA,MACvBD,KAAG,MAAM;AAAA,MACT,WAAWA,KAAG,iBAAiB;AAAA,MAC/B;AAAA,IACF,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,UAAM,qBAAqB,UAAU,YACjCA,KAAG,yBAAyB,IAC5BA,KAAG,2BAA2B;AAElC,WACE;AAAA,MAAC;AAAA;AAAA,QACC,WAAWC;AAAA,QACX;AAAA,QACA,MAAM,UAAU,WAAW;AAAA,QAC3B,UAAU,UAAU,IAAI;AAAA,QAExB;AAAA,wDAAC,SAAI,WAAW,oBACb,kBACH;AAAA,UACA,+CAAC,SAAI,WAAWD,KAAG,gBAAgB,GACjC;AAAA,0DAAC,SAAI,WAAWA,KAAG,YAAY,GAAI,iBAAM;AAAA,YACxC,eAAe,8CAAC,SAAI,WAAWA,KAAG,kBAAkB,GAAI,uBAAY;AAAA,aACvE;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AAGA,QAAM,mBAAmB;AAAA,IACvBA,KAAG,OAAO;AAAA,IACV,WAAWA,KAAG,kBAAkB;AAAA,IAChC;AAAA,EACF,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,MACX;AAAA,MACA,MAAM,UAAU,WAAW;AAAA,MAC3B,UAAU,UAAU,IAAI;AAAA,MAExB;AAAA,sDAAC,SAAI,WAAWA,KAAG,iBAAiB,GACjC,kBACH;AAAA,QACA,+CAAC,SAAI,WAAWA,KAAG,QAAQ,GACzB;AAAA,wDAAC,UAAK,WAAWA,KAAG,aAAa,GAAI,iBAAM;AAAA,UAC1C,aACC,8CAAC,UAAK,WAAWA,KAAG,OAAO,GAAG,oBAAC;AAAA,WAEnC;AAAA;AAAA;AAAA,EACF;AAEJ;AAEA,MAAM,cAAc;;;AC7Dd,IAAAE,uBAAA;AA1BN,IAAMC,OAAK,CAAC,cAAsB,aAAa,SAAS;AAexD,IAAM,aAAwC,CAAC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,mBAAmB,CAACA,KAAG,WAAW,GAAG,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE9E,SACE,+CAAC,SAAI,WAAW,kBACd;AAAA,kDAAC,SAAI,WAAWA,KAAG,MAAM,GAAI,gBAAK;AAAA,IAClC,+CAAC,SAAI,WAAWA,KAAG,OAAO,GACxB;AAAA,oDAAC,SAAI,WAAWA,KAAG,OAAO,GACxB,wDAAC,UAAO,SAAQ,SAAQ,OAAO,QAAQ,MAAK,UAAS,GACvD;AAAA,MACA,8CAAC,SAAI,WAAWA,KAAG,OAAO,GAAI,iBAAM;AAAA,OACtC;AAAA,IACA,8CAAC,SAAI,WAAWA,KAAG,MAAM,GAAI,gBAAK;AAAA,KACpC;AAEJ;AAEA,WAAW,cAAc;;;ACzCzB,IAAAC,gBAAyB;AAiCnB,IAAAC,uBAAA;AA7BN,IAAMC,OAAK,CAAC,cAAsB,UAAU,SAAS;AAcrD,IAAMC,eAAc,CAAC,EAAE,OAAO,MAA2B;AACvD,QAAM,cAAc;AAAA,IAClBD,KAAG,SAAS;AAAA,IACZ,UAAUA,KAAG,eAAe;AAAA,EAC9B,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MACN,WAAW;AAAA,MAEX;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA;AAAA,MACjB;AAAA;AAAA,EACF;AAEJ;AAEA,IAAM,MAA0B,CAAC;AAAA,EAC/B;AAAA,EACA,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB;AACF,MAAM;AACJ,QAAM,CAAC,aAAa,cAAc,QAAI;AAAA,IACpC,qBAAqB,OAAO,oBAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,oBAAI,IAAI;AAAA,EACpE;AAEA,QAAM,aAAa,CAAC,UAAkB;AACpC,mBAAe,UAAQ;AACrB,YAAM,SAAS,IAAI,IAAI,IAAI;AAC3B,UAAI,OAAO,IAAI,KAAK,GAAG;AACrB,eAAO,OAAO,KAAK;AAAA,MACrB,OAAO;AACL,YAAI,CAAC,eAAe;AAClB,iBAAO,MAAM;AAAA,QACf;AACA,eAAO,IAAI,KAAK;AAAA,MAClB;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,mBAAmB,CAACA,KAAG,WAAW,GAAG,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE9E,SACE,8CAAC,SAAI,WAAW,kBACb,gBAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,UAAM,SAAS,YAAY,IAAI,KAAK;AACpC,UAAM,gBAAgB,SAClBA,KAAG,cAAc,IACjBA,KAAG,QAAQ;AAEf,WACE,+CAAC,SAAgB,WAAWA,KAAG,MAAM,GACnC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,WAAWA,KAAG,cAAc;AAAA,UAC5B,SAAS,MAAM,WAAW,KAAK;AAAA,UAC/B,iBAAe;AAAA,UACf,iBAAe,cAAc,KAAK;AAAA,UAClC,WACE,8CAAC,SAAI,WAAWA,KAAG,gBAAgB,GACjC,wDAACC,cAAA,EAAY,QAAgB,GAC/B;AAAA,UAGF,wDAAC,UAAK,WAAWD,KAAG,eAAe,GAAI,eAAK,UAAS;AAAA;AAAA,MACvD;AAAA,MACA,8CAAC,SAAI,IAAI,cAAc,KAAK,IAAI,WAAW,eACzC,wDAAC,OAAE,WAAWA,KAAG,aAAa,GAAI,eAAK,QAAO,GAChD;AAAA,SAlBQ,KAmBV;AAAA,EAEJ,CAAC,GACH;AAEJ;AAEA,IAAI,cAAc;;;ACpDV,IAAAE,uBAAA;AAnDR,IAAMC,OAAK,CAAC,cAAsB,eAAe,SAAS;AAmB1D,IAAM,WAAoC,CAAC;AAAA,EACzC,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,WAAW;AAAA,IACT;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB;AAAA,EACA;AACF,MAAM;AACJ,QAAM,iBAAiB,CAACA,KAAG,SAAS,GAAG,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1E,SACE,8CAAC,aAAQ,WAAW,gBAClB,yDAAC,SAAI,WAAWA,KAAG,WAAW,GAC5B;AAAA,mDAAC,SAAI,WAAWA,KAAG,QAAQ,GACzB;AAAA,oDAAC,QAAG,WAAWA,KAAG,OAAO,GAAI,iBAAM;AAAA,MAClC,YAAY,8CAAC,OAAE,WAAWA,KAAG,UAAU,GAAI,oBAAS;AAAA,OACvD;AAAA,IAEA,8CAAC,SAAI,WAAWA,KAAG,MAAM,GACtB,mBAAS,IAAI,CAAC,SAAS,UACtB,+CAAC,SAAgB,WAAWA,KAAG,MAAM,GACnC;AAAA,oDAAC,QAAG,WAAWA,KAAG,YAAY,GAAI,kBAAQ,OAAM;AAAA,MAC/C,QAAQ,eACP,8CAAC,OAAE,WAAWA,KAAG,kBAAkB,GAAI,kBAAQ,aAAY;AAAA,SAHrD,KAKV,CACD,GACH;AAAA,IAEC,gBACC,+CAAC,SAAI,WAAWA,KAAG,cAAc,GAC/B;AAAA,oDAAC,QAAG,WAAWA,KAAG,eAAe,GAAI,wBAAa;AAAA,MACjD,sBACC,8CAAC,OAAE,WAAWA,KAAG,qBAAqB,GAAI,8BAAmB;AAAA,MAE9D,qBACC;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAWA,KAAG,aAAa;AAAA,UAE1B;AAAA;AAAA,MACH;AAAA,OAEJ;AAAA,KAEJ,GACF;AAEJ;AAEA,SAAS,cAAc;;;AC7FvB,IAAAC,gBAAkC;AAkC9B,IAAAC,uBAAA;AA/BJ,IAAMC,OAAK,CAAC,cAAsB,UAAU,SAAS;AAsBrD,IAAM,YAA8C,CAAC,EAAE,UAAU,MAC/D;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IAEN,wDAAC,UAAK,GAAE,6PAA4P;AAAA;AACtQ;AAIF,IAAM,WAA6C,CAAC,EAAE,UAAU,MAC9D;AAAA,EAAC;AAAA;AAAA,IACC;AAAA,IACA,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IAEN,wDAAC,UAAK,GAAE,qGAAoG;AAAA;AAC9G;AAmBF,IAAM,UAAM;AAAA,EACV,CACE;AAAA,IACE,UAAU;AAAA,IACV,SAAS;AAAA,IACT,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,WAAW;AAAA,IACX;AAAA,IACA,YAAY;AAAA,EACd,GACA,QACG;AAEH,UAAM,eAAe,SAAS,cAAc;AAG5C,UAAM,aAAa;AAAA,MACjBA,KAAG,KAAK;AAAA,MACRA,KAAG,YAAY;AAAA,MACf,YAAY,WAAWA,KAAG,OAAO;AAAA,MACjC;AAAA,IACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAGX,UAAM,iBACJ,OAAO,UAAU,WAAW,KAAK,MAAM,KAAK,EAAE,SAAS,IAAI;AAE7D,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAK;AAAA,QACL,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QAGA;AAAA,wDAAC,SAAI,WAAWA,KAAG,MAAM,GACtB,sBAAY,UACX,gFACE;AAAA,0DAAC,UAAK,WAAWA,KAAG,UAAU,GAAI,oBAAS;AAAA,YAC3C,8CAAC,UAAK,WAAWA,KAAG,OAAO,GAAI,0BAAe;AAAA,YAC7C,gBACC,8CAAC,SAAI,WAAWA,KAAG,oBAAoB,GACrC,wDAAC,aAAU,WAAWA,KAAG,eAAe,GAAG,GAC7C;AAAA,aAEJ,IAEA,8CAAC,YAAS,WAAWA,KAAG,YAAY,GAAG,GAE3C;AAAA,UAGA,8CAAC,SAAI,WAAWA,KAAG,SAAS,GAC1B,wDAAC,SAAI,WAAWA,KAAG,eAAe,GAAG,GACvC;AAAA;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AAEA,IAAI,cAAc;;;ACrIlB,IAAAC,iBAA4D;;;ACA5D,IAAAC,gBAAoC;AAE7B,IAAM,cAAc,CAAI,OAAU,UAAqB;AAC5D,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,wBAAY,KAAK;AAE7D,+BAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM,kBAAkB,KAAK,GAAG,KAAK;AAC9D,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,OAAO,KAAK,CAAC;AAEjB,SAAO;AACT;;;ACXA,IAAAC,iBAAoC;AAmB7B,IAAM,gBAAgB,MAAM;AACjC,QAAM,CAAC,OAAO,QAAQ,QAAI;AAAA,IACxB,OAAO,WAAW,cAAc,OAAO,aAAa;AAAA,EACtD;AAEA,gCAAU,MAAM;AACd,UAAM,eAAe,MAAM;AACzB,eAAS,OAAO,UAAU;AAAA,IAC5B;AAEA,iBAAa;AACb,WAAO,iBAAiB,UAAU,YAAY;AAC9C,WAAO,MAAM,OAAO,oBAAoB,UAAU,YAAY;AAAA,EAChE,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL,WAAW,SAAS;AAAA,EACtB;AACF;;;ACxBO,IAAM,gBAAgB,MAAM;AACjC,QAAM,EAAE,QAAQ,SAAS,IAAI,aAAa;AAC1C,SAAO,EAAE,QAAQ,SAAS;AAC5B;;;AChBA,2BAAqD;AAgB9C,IAAM,iBAAiB,CAAC,cAAkC;AAC/D,QAAM,EAAE,GAAG,OAAO,KAAK,QAAI,qBAAAC,gBAAmB,SAAS;AAIvD,QAAM,IAAuB,CAAC,KAAK,SAAS,aAAa;AACvD,UAAM,SAAU,MAAgD,KAAK,WAAW,CAAC,CAAC;AAClF,UAAM,YAAY,OAAO,MAAM;AAG/B,QAAI,cAAc,OAAO,aAAa,QAAW;AAC/C,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,SAAO,EAAE,GAAG,KAAK;AACnB;;;ACjCA,IAAAC,iBAA2C;;;ACA3C,IAAAC,iBAAgC;AAoFhB,IAAAC,uBAAA;AA/EhB,IAAMC,OAAK,CAAC,SAAiB,mBAAmB,OAAO,KAAK,IAAI,KAAK,EAAE;AACvE,IAAM,QAAQ,CAAC,MAAc,QAAgB,qBAAqB,IAAI,KAAK,GAAG;AAU9E,IAAM,eAA4C,CAAC;AAAA,EACjD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AACX,MAAM;AACJ,QAAM,EAAE,UAAU,IAAI,cAAc;AACpC,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,oBAAI,KAAK,CAAC;AAE3D,QAAM,cAAc,CAAC,YAAoB,cAAc;AACvD,QAAM,YAAY,CAAC,YAAoB,YAAY;AACnD,QAAM,YAAY,CAAC,YAAoB;AACrC,QAAI,CAAC,aAAa,CAAC,QAAS,QAAO;AACnC,WAAO,UAAU,aAAa,UAAU;AAAA,EAC1C;AAEA,QAAM,aAAa,CAAC,SAAe,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC;AAEtF,QAAM,iBAAiB,CAAC,SAAe;AACrC,WAAO,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,EAAE,QAAQ;AAAA,EACtE;AAEA,QAAM,qBAAqB,CAAC,SAAe;AACzC,UAAM,MAAM,IAAI,KAAK,KAAK,YAAY,GAAG,KAAK,SAAS,GAAG,CAAC,EAAE,OAAO;AACpE,WAAO,QAAQ,IAAI,IAAI,MAAM;AAAA,EAC/B;AAEA,QAAM,kBAAkB,CAAC,SAAe;AACtC,WAAO,KAAK,mBAAmB,QAAQ,EAAE,OAAO,QAAQ,MAAM,UAAU,CAAC;AAAA,EAC3E;AAEA,QAAM,cAAc,MAAM;AACxB,UAAM,OAAO,CAAC;AACd,UAAM,WAAW,IAAI,KAAK,MAAM,GAAG,CAAC;AACpC,aAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,YAAM,OAAO,IAAI,KAAK,QAAQ;AAC9B,WAAK,QAAQ,SAAS,QAAQ,IAAI,CAAC;AACnC,WAAK,KAAK,KAAK,mBAAmB,QAAQ,EAAE,SAAS,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,IAC7E;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,YAAY;AAE7B,QAAM,iBAAiB,CAAC,YAAoB;AAC1C,UAAMC,SAAQ,oBAAI,KAAK;AACvB,UAAM,mBAAmB,IAAI,KAAKA,OAAM,YAAY,IAAI,GAAGA,OAAM,SAAS,GAAGA,OAAM,QAAQ,CAAC;AAC5F,UAAM,YAAY,QAAQ,MAAM,GAAG,EAAE,IAAI,MAAM;AAC/C,UAAM,OAAO,IAAI,KAAK,UAAU,CAAC,GAAG,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC,CAAC;AAElE,QAAI,SAAS;AACX,YAAM,WAAW,QAAQ,MAAM,GAAG,EAAE,IAAI,MAAM;AAC9C,YAAM,MAAM,IAAI,KAAK,SAAS,CAAC,GAAG,SAAS,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC;AAC9D,UAAI,OAAO,IAAK,QAAO;AAAA,IACzB;AAEA,QAAI,OAAO,iBAAkB,QAAO;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,CAAC,gBAAwB;AAChD,UAAM,OAAO,IAAI,KAAK,aAAa,YAAY,GAAG,aAAa,SAAS,IAAI,aAAa,CAAC;AAC1F,UAAM,cAAc,eAAe,IAAI;AACvC,UAAM,WAAW,mBAAmB,IAAI;AACxC,UAAM,OAAO,CAAC;AAEd,aAAS,IAAI,GAAG,IAAI,UAAU,KAAK;AACjC,WAAK,KAAK,8CAAC,SAAuB,WAAWD,KAAG,KAAK,KAAjC,SAAS,CAAC,EAA0B,CAAE;AAAA,IAC5D;AAEA,aAAS,MAAM,GAAG,OAAO,aAAa,OAAO;AAC3C,YAAM,UAAU,GAAG,KAAK,YAAY,CAAC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,OAAO,GAAG,EAAE,SAAS,GAAG,GAAG,CAAC;AACrH,YAAM,WAAW,eAAe,OAAO;AACvC,YAAM,QAAQ,YAAY,OAAO;AACjC,YAAM,MAAM,UAAU,OAAO;AAC7B,YAAM,UAAU,UAAU,OAAO;AAEjC,YAAM,UAAU;AAAA,QACdA,KAAG,KAAK;AAAA,QACRA,KAAG,YAAY;AAAA,QACf,YAAY,MAAM,cAAc,UAAU;AAAA,QAC1C,SAAS,MAAM,cAAc,OAAO;AAAA,QACpC,OAAO,MAAM,cAAc,KAAK;AAAA,QAChC,WAAW,MAAM,cAAc,UAAU;AAAA,MAC3C,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,WAAK;AAAA,QACH;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAW;AAAA,YACX,SAAS,MAAM,CAAC,YAAY,aAAa,OAAO;AAAA,YAChD;AAAA,YAEC;AAAA;AAAA,UANI;AAAA,QAOP;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,MAAM;AAC5B,oBAAgB,IAAI,KAAK,aAAa,YAAY,GAAG,aAAa,SAAS,IAAI,GAAG,CAAC,CAAC;AAAA,EACtF;AAEA,QAAM,kBAAkB,MAAM;AAC5B,oBAAgB,IAAI,KAAK,aAAa,YAAY,GAAG,aAAa,SAAS,IAAI,GAAG,CAAC,CAAC;AAAA,EACtF;AAEA,QAAM,YAAY,IAAI,KAAK,aAAa,YAAY,GAAG,aAAa,SAAS,IAAI,GAAG,CAAC;AACrF,QAAM,iBAAiB,UAAU,WAAW,SAAS,IAAI,IAAI,KAAK,OAAO,IAAI;AAC7E,QAAM,QAAQ,oBAAI,KAAK;AACvB,QAAM,WAAW,IAAI,KAAK,MAAM,YAAY,IAAI,GAAG,MAAM,SAAS,GAAG,CAAC;AACtE,QAAM,YAAY,IAAI,KAAK,aAAa,YAAY,GAAG,aAAa,SAAS,IAAI,GAAG,CAAC;AACrF,QAAM,iBAAiB,aAAa;AAEpC,QAAM,YAAY,MAChB,8CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD,wDAAC,UAAK,GAAE,mUAAkU,MAAK,WAAS,GAC1V;AAGF,QAAM,YAAY,MAChB,8CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD,wDAAC,UAAK,GAAE,sUAAqU,MAAK,WAAS,GAC7V;AAGF,QAAM,mBAAmB,CAAC,aAAsB;AAAA,IAC9CA,KAAG,YAAY;AAAA,IACf,YAAY,MAAM,cAAc,UAAU;AAAA,EAC5C,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACE,+CAAC,SAAI,WAAW,GAAGA,KAAG,EAAE,CAAC,IAAI,CAAC,YAAY,MAAM,IAAI,QAAQ,IAAI,EAAE,IAE/D;AAAA,KAAC,aACA,+CAAC,SAAI,WAAWA,KAAG,YAAY,GAC7B;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW,iBAAiB,cAAc;AAAA,UAC1C,SAAS;AAAA,UACT,UAAU;AAAA,UAEV,wDAAC,aAAU;AAAA;AAAA,MACb;AAAA,MACA,8CAAC,QAAG,WAAW,GAAGA,KAAG,aAAa,CAAC,IAAIA,KAAG,qBAAqB,CAAC,IAC7D,0BAAgB,YAAY,GAC/B;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW,iBAAiB,cAAc;AAAA,UAC1C,SAAS;AAAA,UACT,UAAU;AAAA,UAEV,wDAAC,aAAU;AAAA;AAAA,MACb;AAAA,OACF;AAAA,IAID,YACC,+CAAC,SAAI,WAAWA,KAAG,gBAAgB,GACjC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW,iBAAiB,cAAc;AAAA,UAC1C,SAAS;AAAA,UACT,UAAU;AAAA,UAEV,wDAAC,aAAU;AAAA;AAAA,MACb;AAAA,MAEA,+CAAC,SAAI,WAAWA,KAAG,WAAW,GAE5B;AAAA,uDAAC,SAAI,WAAWA,KAAG,UAAU,GAC3B;AAAA,wDAAC,QAAG,WAAWA,KAAG,aAAa,GAAI,0BAAgB,YAAY,GAAE;AAAA,UACjE,8CAAC,SAAI,WAAWA,KAAG,UAAU,GAC1B,mBAAS,IAAI,CAAC,KAAK,MAClB,8CAAC,SAAc,WAAW,GAAGA,KAAG,SAAS,CAAC,IAAI,KAAK,IAAI,MAAM,WAAW,SAAS,IAAI,EAAE,IACpF,iBADO,GAEV,CACD,GACH;AAAA,UACA,8CAAC,SAAI,WAAWA,KAAG,MAAM,GAAI,2BAAiB,CAAC,GAAE;AAAA,WACnD;AAAA,QAGA,+CAAC,SAAI,WAAWA,KAAG,UAAU,GAC3B;AAAA,wDAAC,QAAG,WAAWA,KAAG,aAAa,GAAI,0BAAgB,SAAS,GAAE;AAAA,UAC9D,8CAAC,SAAI,WAAWA,KAAG,UAAU,GAC1B,mBAAS,IAAI,CAAC,KAAK,MAClB,8CAAC,SAAc,WAAW,GAAGA,KAAG,SAAS,CAAC,IAAI,KAAK,IAAI,MAAM,WAAW,SAAS,IAAI,EAAE,IACpF,iBADO,GAEV,CACD,GACH;AAAA,UACA,8CAAC,SAAI,WAAWA,KAAG,MAAM,GAAI,2BAAiB,CAAC,GAAE;AAAA,WACnD;AAAA,SACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW,iBAAiB,cAAc;AAAA,UAC1C,SAAS;AAAA,UACT,UAAU;AAAA,UAEV,wDAAC,aAAU;AAAA;AAAA,MACb;AAAA,OACF;AAAA;AAAA,MAGA,8CAAC,SAAI,WAAW,GAAGA,KAAG,WAAW,CAAC,IAAI,MAAM,aAAa,QAAQ,CAAC,IAChE,yDAAC,SAAI,WAAWA,KAAG,UAAU,GAC3B;AAAA,sDAAC,SAAI,WAAWA,KAAG,UAAU,GAC1B,mBAAS,IAAI,CAAC,KAAK,MAClB,8CAAC,SAAc,WAAW,GAAGA,KAAG,SAAS,CAAC,IAAI,KAAK,IAAI,MAAM,WAAW,SAAS,IAAI,EAAE,IACpF,iBADO,GAEV,CACD,GACH;AAAA,QACA,8CAAC,SAAI,WAAWA,KAAG,MAAM,GAAI,2BAAiB,CAAC,GAAE;AAAA,SACnD,GACF;AAAA;AAAA,KAEJ;AAEJ;;;ADpBQ,IAAAE,uBAAA;AAxNR,IAAMC,OAAK,CAAC,SAAiB,kBAAkB,OAAO,KAAK,IAAI,KAAK,EAAE;AACtE,IAAMC,SAAQ,CAAC,MAAc,QAAgB,oBAAoB,IAAI,KAAK,GAAG;AAG7E,IAAM,gBAAgB,CAAC,WAA2B;AAChD,QAAM,YAAoC;AAAA,IACxC,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AACA,SAAO,UAAU,MAAM,KAAK;AAC9B;AAuCO,IAAM,cAA0C,CAAC;AAAA,EACtD,mBAAmB,EAAE,OAAO,MAAM,KAAK,KAAK;AAAA,EAC5C,qBAAqB;AAAA,EACrB;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB;AAAA,EACA,YAAY;AAAA,EACZ,QAAQ;AACV,MAAM;AACJ,QAAM,EAAE,QAAQ,cAAc,IAAI,cAAc;AAChD,QAAM,EAAE,UAAU,IAAI,cAAc;AACpC,QAAM,EAAE,EAAE,IAAI,aAAa;AAE3B,QAAM,SAAS,cAAc;AAC7B,QAAM,aAAa,cAAc,MAAM;AAGvC,QAAM,SAAS;AAAA,IACb,MAAM,EAAE,cAAc,MAAM;AAAA,IAC5B,OAAO,EAAE,eAAe,OAAO;AAAA,IAC/B,UAAU,EAAE,kBAAkB,UAAU;AAAA,IACxC,OAAO,EAAE,iBAAiB,OAAO;AAAA,IACjC,cAAc,EAAE,uBAAuB,eAAe;AAAA,IACtD,SAAS,EAAE,iBAAiB,SAAS;AAAA,EACvC;AAEA,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAoB,gBAAgB;AACtE,QAAM,CAAC,MAAM,OAAO,QAAI;AAAA,IACtB,iBAAiB,QAAQ,UAAU;AAAA,EACrC;AAEA,QAAM,iBAAiB,sBAAsB,CAAC;AAC9C,QAAM,oBAAoB,eAAe,WAAW;AAGpD,gCAAU,MAAM;AACd,QAAI,iBAAiB,SAAS,iBAAiB,KAAK;AAClD,mBAAa,gBAAgB;AAC7B,cAAQ,OAAO;AAAA,IACjB,OAAO;AACL,mBAAa,gBAAgB;AAC7B,UAAI,sBAAsB,mBAAmB,SAAS,GAAG;AACvD,gBAAQ,SAAS;AAAA,MACnB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,kBAAkB,kBAAkB,CAAC;AAGzC,QAAM,iBAAiB,MAAM;AAC3B,UAAMC,UAAS,CAAC;AAChB,UAAM,MAAM,oBAAI,KAAK;AAErB,aAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,YAAM,OAAO,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC;AAC9D,MAAAA,QAAO,KAAK;AAAA,QACV,OAAO,KAAK,mBAAmB,YAAY,EAAE,OAAO,OAAO,CAAC;AAAA,QAC5D,MAAM,KAAK,YAAY;AAAA,QACvB,OAAO,GAAG,KAAK,YAAY,CAAC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,QAC5E,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,WAAOA;AAAA,EACT;AAEA,QAAM,SAAS,eAAe;AAE9B,QAAM,qBAAqB,MAAM;AAC/B,iBAAa,EAAE,OAAO,MAAM,KAAK,KAAK,CAAC;AACvC,eAAW,IAAI;AACf,0BAAsB,IAAI;AAAA,EAC5B;AAEA,QAAM,oBAAoB,CAAC,eAAuB;AAChD,UAAM,oBAAoB,eAAe,SAAS,UAAU,IACxD,eAAe,OAAO,CAAC,MAAM,MAAM,UAAU,IAC7C,CAAC,GAAG,gBAAgB,UAAU;AAElC,iBAAa,EAAE,OAAO,MAAM,KAAK,KAAK,CAAC;AACvC,eAAW,IAAI;AAEf,QAAI,kBAAkB,WAAW,GAAG;AAClC,4BAAsB,IAAI;AAAA,IAC5B,OAAO;AACL,4BAAsB,iBAAiB;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,cAAc,MAAM;AACxB,QAAI,SAAS,WAAW;AACtB,UAAI,eAAe,WAAW,GAAG;AAC/B,mBAAW,IAAI;AAAA,MACjB;AAAA,IACF,OAAO;AACL,UAAI,UAAU,SAAS,UAAU,KAAK;AACpC,mBAAW,SAAS;AAAA,MACtB;AAAA,IACF;AACA,cAAU;AAAA,EACZ;AAEA,QAAM,mBAAmB,CAAC,YAAiC;AACzD,YAAQ,OAAO;AACf,QAAI,YAAY,WAAW;AACzB,mBAAa,EAAE,OAAO,MAAM,KAAK,KAAK,CAAC;AACvC,iBAAW,IAAI;AACf,4BAAsB,IAAI;AAAA,IAC5B,OAAO;AACL,4BAAsB,IAAI;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,eAAe,MAAM;AACzB,YAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,EAC9C;AAEA,QAAM,cAAc,CAAC,eAA+B;AAClD,UAAM,OAAO,IAAI,KAAK,UAAU;AAChC,SAAK,QAAQ,KAAK,QAAQ,IAAI,CAAC;AAC/B,WAAO,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,EACxC;AAEA,QAAM,mBAAmB,CAAC,SAAiB;AACzC,QAAI,CAAC,UAAU,SAAU,UAAU,SAAS,UAAU,KAAM;AAC1D,YAAM,WAAW,EAAE,OAAO,MAAM,KAAK,KAAK;AAC1C,mBAAa,QAAQ;AACrB,iBAAW,QAAQ;AAAA,IACrB,WAAW,SAAS,UAAU,OAAO;AACnC,YAAM,WAAW,YAAY,IAAI;AACjC,YAAM,WAAW,EAAE,OAAO,UAAU,OAAO,KAAK,SAAS;AACzD,mBAAa,QAAQ;AACrB,iBAAW,QAAQ;AAAA,IACrB,WAAW,OAAO,UAAU,OAAO;AACjC,YAAM,WAAW,EAAE,OAAO,UAAU,OAAO,KAAK,KAAK;AACrD,mBAAa,QAAQ;AACrB,iBAAW,QAAQ;AAAA,IACrB,OAAO;AACL,YAAM,WAAW,EAAE,OAAO,MAAM,KAAK,KAAK;AAC1C,mBAAa,QAAQ;AACrB,iBAAW,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,mBAAmB;AAAA,IACvBF,KAAG,EAAE;AAAA,IACL,YAAY,cAAcC,OAAM,IAAI,UAAU;AAAA,IAC9C;AAAA,EACF,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,QAAM,mBAAmB;AAAA,IACvBD,KAAG,YAAY;AAAA,IACf,CAAC,aAAaC,OAAM,cAAc,QAAQ;AAAA,EAC5C,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,QAAM,iBAAiB;AAAA,IACrBD,KAAG,SAAS;AAAA,IACZ,SAAS,WAAWC,OAAM,WAAW,OAAO;AAAA,EAC9C,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACE,+CAAC,SAAI,WAAW,kBAEb;AAAA,gBAAY,cACX,8CAAC,QAAG,WAAWD,KAAG,eAAe,GAAI,iBAAO,MAAK;AAAA,IAInD,+CAAC,SAAI,WAAWA,KAAG,QAAQ,GACzB;AAAA,qDAAC,SAAI,WAAWA,KAAG,MAAM,GACvB;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW,GAAGA,KAAG,KAAK,CAAC,IAAI,SAAS,UAAUC,OAAM,OAAO,QAAQ,IAAI,EAAE;AAAA,YACzE,SAAS,MAAM,iBAAiB,OAAO;AAAA,YAEtC,iBAAO;AAAA;AAAA,QACV;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW,GAAGD,KAAG,KAAK,CAAC,IAAI,SAAS,YAAYC,OAAM,OAAO,QAAQ,IAAI,EAAE;AAAA,YAC3E,SAAS,MAAM,iBAAiB,SAAS;AAAA,YAExC,iBAAO;AAAA;AAAA,QACV;AAAA,SACF;AAAA,MACC,mBACC,8CAAC,SAAI,WAAWD,KAAG,OAAO,GACxB,wDAAC,UAAO,SAAQ,aAAY,MAAK,UAAS,SAAS,aAChD,iBAAO,OACV,GACF;AAAA,OAEJ;AAAA,IAGA,8CAAC,SAAI,WAAW,gBACb,mBAAS,YACR,+CAAC,SAAI,WAAWA,KAAG,UAAU,GAC3B;AAAA,oDAAC,QAAG,WAAWA,KAAG,SAAS,GAAI,iBAAO,cAAa;AAAA,MACnD,+CAAC,SAAI,WAAW,kBAEd;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAW,GAAGA,KAAG,cAAc,CAAC,IAAIA,KAAG,gBAAgB,CAAC,IACtD,oBAAoBC,OAAM,gBAAgB,UAAU,IAAI,EAC1D;AAAA,YACA,SAAS;AAAA,YAET,wDAAC,UAAK,WAAWD,KAAG,aAAa,GAAI,iBAAO,SAAQ;AAAA;AAAA,QACtD;AAAA,QAEC,OAAO,IAAI,CAAC,UACX;AAAA,UAAC;AAAA;AAAA,YAEC,MAAK;AAAA,YACL,WAAW,GAAGA,KAAG,cAAc,CAAC,IAC9B,eAAe,SAAS,MAAM,KAAK,IAAIC,OAAM,gBAAgB,UAAU,IAAI,EAC7E,IAAI,MAAM,WAAWA,OAAM,gBAAgB,UAAU,IAAI,EAAE;AAAA,YAC3D,SAAS,MAAM,CAAC,MAAM,YAAY,kBAAkB,MAAM,KAAK;AAAA,YAC/D,UAAU,MAAM;AAAA,YAEhB;AAAA,4DAAC,UAAK,WAAWD,KAAG,aAAa,GAAI,gBAAM,OAAM;AAAA,cACjD,8CAAC,UAAK,WAAWA,KAAG,YAAY,GAAI,gBAAM,MAAK;AAAA;AAAA;AAAA,UAT1C,MAAM;AAAA,QAUb,CACD;AAAA,SACH;AAAA,OACF,IAEA,8CAAC,SAAI,WAAWA,KAAG,OAAO,GACxB;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,UAAU;AAAA,QACrB,SAAS,UAAU;AAAA,QACnB,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,SAAS,aAAa;AAAA;AAAA,IACxB,GACF,GAEJ;AAAA,KACF;AAEJ;;;ALrRI,IAAAG,uBAAA;AAjBJ,IAAMC,OAAK,CAAC,SAAiB,mBAAmB,OAAO,KAAK,IAAI,KAAK,EAAE;AACvE,IAAMC,SAAQ,CAAC,MAAc,QAAgB,qBAAqB,IAAI,KAAK,GAAG;AAG9E,IAAMC,iBAAgB,CAAC,WAA2B;AAChD,QAAM,YAAoC;AAAA,IACxC,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AACA,SAAO,UAAU,MAAM,KAAK;AAC9B;AAGA,IAAM,eAAe,MACnB,8CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACnD;AAAA,EAAC;AAAA;AAAA,IACC,GAAE;AAAA,IACF,MAAK;AAAA;AACP,GACF;AAyBF,IAAM,eAA4C,CAAC;AAAA,EACjD,mBAAmB,EAAE,OAAO,MAAM,KAAK,KAAK;AAAA,EAC5C,qBAAqB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,EAAE,IAAI,aAAa;AAC3B,QAAM,EAAE,OAAO,IAAI,cAAc;AACjC,QAAM,EAAE,UAAU,IAAI,cAAc;AACpC,QAAM,aAAaA,eAAc,MAAM;AAEvC,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAoB,gBAAgB;AACtE,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAS,KAAK;AAC1C,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,yBAAmB,sBAAsB,CAAC,CAAC;AACvF,QAAM,kBAAc,uBAAuB,IAAI;AAG/C,gCAAU,MAAM;AACd,iBAAa,CAAC,SAAS;AACrB,UAAI,KAAK,UAAU,iBAAiB,SAAS,KAAK,QAAQ,iBAAiB,KAAK;AAC9E,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAED,sBAAkB,CAAC,SAAS;AAC1B,YAAM,OAAO,sBAAsB,CAAC;AACpC,UAAI,KAAK,WAAW,KAAK,UAAU,KAAK,MAAM,CAAC,GAAG,MAAM,MAAM,KAAK,CAAC,CAAC,GAAG;AACtE,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,iBAAiB,OAAO,iBAAiB,KAAK,kBAAkB,CAAC;AAGrE,gCAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AAEb,UAAM,oBAAoB,CAAC,UAAwB;AACjD,UAAI,CAAC,YAAY,QAAS;AAE1B,UAAI,CAAC,YAAY,QAAQ,SAAS,MAAM,MAAc,GAAG;AACvD,cAAM,eAAgB,UAAU,SAAS,UAAU,MAAO,YAAY;AACtE,cAAM,iBAAiB,eAAe,SAAS,iBAAiB;AAEhE,mBAAW,YAAY;AACvB,8BAAsB,cAAc;AACpC,kBAAU,KAAK;AACf,kBAAU,cAAc,cAAc;AAAA,MACxC;AAAA,IACF;AAEA,aAAS,iBAAiB,eAAe,iBAAiB;AAC1D,WAAO,MAAM,SAAS,oBAAoB,eAAe,iBAAiB;AAAA,EAC5E,GAAG,CAAC,QAAQ,WAAW,gBAAgB,UAAU,qBAAqB,OAAO,CAAC;AAG9E,QAAM,aAAS,wBAAQ,MAAM;AAC3B,UAAM,MAAM,oBAAI,KAAK;AACrB,WAAO,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAAC,GAAG,MAAM;AAC1C,YAAM,OAAO,IAAI,KAAK,IAAI,YAAY,GAAG,IAAI,SAAS,IAAI,GAAG,CAAC;AAC9D,aAAO;AAAA,QACL,OAAO,KAAK,mBAAmB,YAAY,EAAE,OAAO,OAAO,CAAC;AAAA,QAC5D,MAAM,KAAK,YAAY;AAAA,QACvB,OAAO,GAAG,KAAK,YAAY,CAAC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,MAC9E;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,UAAU,CAAC;AAGf,QAAM,oBAAoB,MAAM;AAC9B,QAAI,UAAU,SAAS,UAAU,KAAK;AACpC,YAAMC,UAAS,CAAC,MACd,IAAI,KAAK,CAAC,EAAE,mBAAmB,YAAY,EAAE,OAAO,SAAS,KAAK,UAAU,CAAC;AAC/E,aAAO,GAAGA,QAAO,UAAU,KAAK,CAAC,MAAMA,QAAO,UAAU,GAAG,CAAC;AAAA,IAC9D;AAEA,QAAI,eAAe,WAAW,GAAG;AAC/B,YAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,UAAU,eAAe,CAAC,CAAC;AAC9D,aAAO,QAAQ,GAAG,MAAM,KAAK,IAAI,MAAM,IAAI,KAAK,EAAE,kBAAkB,UAAU;AAAA,IAChF;AAEA,QAAI,eAAe,SAAS,GAAG;AAC7B,aAAO,GAAG,eAAe,MAAM;AAAA,IACjC;AAEA,WAAO,EAAE,kBAAkB,UAAU;AAAA,EACvC;AAEA,QAAM,wBAAwB,CAAC,UAA4B;AACzD,iBAAa,SAAS,EAAE,OAAO,MAAM,KAAK,KAAK,CAAC;AAAA,EAClD;AAEA,QAAM,0BAA0B,CAACC,YAA4B;AAC3D,sBAAkBA,WAAU,CAAC,CAAC;AAAA,EAChC;AAEA,QAAM,cAAc,MAAM;AACxB,QAAI,UAAU,SAAS,UAAU,KAAK;AACpC,iBAAW,SAAS;AAAA,IACtB,OAAO;AACL,iBAAW,IAAI;AAAA,IACjB;AACA,0BAAsB,eAAe,SAAS,iBAAiB,IAAI;AACnE,cAAU,KAAK;AAAA,EACjB;AAEA,QAAM,sBAAsB,MAAM;AAChC,UAAM,eAAgB,UAAU,SAAS,UAAU,MAAO,YAAY;AACtE,UAAM,iBAAiB,eAAe,SAAS,iBAAiB;AAEhE,eAAW,YAAY;AACvB,0BAAsB,cAAc;AACpC,cAAU,KAAK;AACf,cAAU,cAAc,cAAc;AAAA,EACxC;AAEA,QAAM,gBAAgB;AAAA,IACpBJ,KAAG,QAAQ;AAAA,IACX,YAAYC,OAAM,UAAU,UAAU;AAAA,IACtC;AAAA,EACF,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,QAAM,kBAAkB;AAAA,IACtBD,KAAG,UAAU;AAAA,IACb,UAAUC,OAAM,YAAY,MAAM;AAAA,IAClC,CAAC,aAAaA,OAAM,YAAY,QAAQ;AAAA,EAC1C,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE1B,SACE,+CAAC,SAAI,KAAK,aAAa,WAAWD,KAAG,EAAE,GACrC;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW;AAAA,QACX,SAAS,MAAM,CAAC,YAAY,UAAU,CAAC,MAAM,CAAC,CAAC;AAAA,QAC/C;AAAA,QAEA;AAAA,wDAAC,UAAK,WAAWA,KAAG,MAAM,GAAI,kBAAQ,8CAAC,gBAAa,GAAG;AAAA,UACvD,8CAAC,UAAK,WAAWA,KAAG,OAAO,GAAI,4BAAkB,GAAE;AAAA;AAAA;AAAA,IACrD;AAAA,IAGC,UACC,8CAAC,SAAI,WAAWA,KAAG,UAAU,GAAG,SAAS,qBAAqB,eAAY,QAAO;AAAA,IAGnF,8CAAC,SAAI,WAAW,iBACd;AAAA,MAAC;AAAA;AAAA,QACC,kBAAkB;AAAA,QAClB,oBAAoB,eAAe,SAAS,iBAAiB;AAAA,QAC7D,UAAU;AAAA,QACV,qBAAqB;AAAA,QACrB,SAAQ;AAAA,QACR,iBAAe;AAAA,QACf,SAAS;AAAA;AAAA,IACX,GACF;AAAA,KACF;AAEJ;AAEA,aAAa,cAAc;;;AOnNvB,IAAAK,uBAAA;AAFJ,IAAM,YAAY,MAChB,8CAAC,SAAI,OAAM,8BAA6B,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACtF,wDAAC,UAAK,GAAE,8KAA6K,MAAK,gBAAc,GAC1M;AAGF,IAAM,WAAW,MACf,8CAAC,SAAI,OAAM,8BAA6B,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACtF,wDAAC,UAAK,GAAE,0YAAyY,MAAK,gBAAc,GACta;AAGF,IAAM,eAAe,MACnB;AAAA,EAAC;AAAA;AAAA,IACC,WAAU;AAAA,IACV,OAAM;AAAA,IACN,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IAEL;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,MAAK;AAAA;AAAA,IACP;AAAA;AACF;AA2CK,IAAM,eAA4C,CAAC;AAAA,EACxD;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,iBAAiB,CAAC;AAAA,EAClB;AACF,MAAM;AACJ,QAAM,EAAE,EAAE,IAAI,aAAa;AAG3B,QAAM,SAAS;AAAA,IACb,QAAQ,EAAE,eAAe,QAAQ;AAAA,IACjC,UAAU,EAAE,iBAAiB,UAAU;AAAA,IACvC,KAAK,EAAE,YAAY,KAAK;AAAA,IACxB,YAAY,EAAE,qBAAqB,cAAc;AAAA,IACjD,KAAK,EAAE,YAAY,KAAK;AAAA,IACxB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,YAAY;AAAA,EACd;AAGA,QAAM,eAAe,MAAM,QAAQ,OAAO,YAAY,IAAI,OAAO,eAAe,CAAC;AAEjF,QAAM,kBAAkB,CAAC,SAAgC;AACvD,QAAI,SAAS,cAAc,OAAO,YAAY,EAAG;AACjD,QAAI,SAAS,YAAY,OAAO,UAAU,GAAI;AAE9C,UAAM,kBAAkB,SAAS,aAC7B,CAAC,GAAG,cAAc,IAAI,IACtB;AAEJ,aAAS;AAAA,MACP,GAAG;AAAA,MACH,CAAC,IAAI,GAAG,OAAO,IAAI,IAAI;AAAA,MACvB,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAEA,QAAM,kBAAkB,CAAC,SAAgC;AACvD,QAAI,SAAS,YAAY,OAAO,UAAU,EAAG;AAC7C,QAAI,SAAS,cAAc,OAAO,YAAY,EAAG;AAEjD,UAAM,kBAAkB,SAAS,aAC7B,aAAa,MAAM,GAAG,EAAE,IACxB;AAEJ,aAAS;AAAA,MACP,GAAG;AAAA,MACH,CAAC,IAAI,GAAG,OAAO,IAAI,IAAI;AAAA,MACvB,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAEA,QAAM,kBAAkB,CAAC,OAAe,UAAkB;AACxD,UAAM,kBAAkB,CAAC,GAAG,YAAY;AACxC,oBAAgB,KAAK,IAAI,UAAU,KAAK,OAAO,SAAS,OAAO,EAAE;AACjE,aAAS;AAAA,MACP,GAAG;AAAA,MACH,cAAc;AAAA,IAChB,CAAC;AAED,mBAAe,KAAK;AAAA,EACtB;AAEA,QAAM,mBAAmB,CAAC,oBAAoB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAEjF,SACE,+CAAC,SAAI,WAAW,kBAEd;AAAA,mDAAC,SAAI,WAAU,yBACb;AAAA,oDAAC,SAAI,WAAU,2BACb,wDAAC,UAAK,WAAU,0BAA0B,iBAAO,QAAO,GAC1D;AAAA,MACA,+CAAC,SAAI,WAAU,6BACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,gBAAgB,QAAQ;AAAA,YACvC,UAAU,OAAO,UAAU;AAAA,YAC3B,cAAY,OAAO;AAAA,YAEnB,wDAAC,aAAU;AAAA;AAAA,QACb;AAAA,QACA,8CAAC,UAAK,WAAU,mCAAmC,iBAAO,QAAO;AAAA,QACjE;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAU;AAAA,YACV,SAAS,MAAM,gBAAgB,QAAQ;AAAA,YACvC,UAAU,OAAO,UAAU;AAAA,YAC3B,cAAY,OAAO;AAAA,YAEnB,wDAAC,YAAS;AAAA;AAAA,QACZ;AAAA,SACF;AAAA,OACF;AAAA,IAGA,+CAAC,SAAI,WAAU,yDACb;AAAA,qDAAC,SAAI,WAAU,gCACb;AAAA,sDAAC,SAAI,WAAU,2BACb,wDAAC,UAAK,WAAU,0BAA0B,iBAAO,UAAS,GAC5D;AAAA,QACA,+CAAC,SAAI,WAAU,6BACb;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,MAAM,gBAAgB,UAAU;AAAA,cACzC,UAAU,OAAO,YAAY;AAAA,cAC7B,cAAY,OAAO;AAAA,cAEnB,wDAAC,aAAU;AAAA;AAAA,UACb;AAAA,UACA,8CAAC,UAAK,WAAU,mCAAmC,iBAAO,UAAS;AAAA,UACnE;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAU;AAAA,cACV,SAAS,MAAM,gBAAgB,UAAU;AAAA,cACzC,UAAU,OAAO,YAAY;AAAA,cAC7B,cAAY,OAAO;AAAA,cAEnB,wDAAC,YAAS;AAAA;AAAA,UACZ;AAAA,WACF;AAAA,SACF;AAAA,MAGC,OAAO,WAAW,KACjB;AAAA,QAAC;AAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO;AAAA,YACL,qBAAqB,OAAO,aAAa,IAAI,QAAQ;AAAA,UACvD;AAAA,UAEC,gBAAM,KAAK,EAAE,QAAQ,OAAO,SAAS,CAAC,EAAE,IAAI,CAAC,GAAG,UAAU;AACzD,kBAAM,aAAa,aAAa,KAAK;AACrC,kBAAM,WAAW,eAAe,KAAK,WAAS,MAAM,UAAU,KAAK;AACnE,kBAAM,eAAe,eAAe,KAAK,WAAS,MAAM,UAAU,KAAK,GAAG;AAE1E,mBACE,+CAAC,SAAgB,WAAU,oCACzB;AAAA,4DAAC,WAAM,SAAS,aAAa,KAAK,IAC/B,iBAAO,YACV;AAAA,cACA,+CAAC,SAAI,WAAU,oCACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,IAAI,aAAa,KAAK;AAAA,oBACtB,OAAO,eAAe,QAAQ,eAAe,SAAY,KAAK;AAAA,oBAC9D,UAAU,CAAC,MAAM,gBAAgB,OAAO,EAAE,OAAO,KAAK;AAAA,oBACtD,WAAW,4BAA4B,WAAW,oCAAoC,EAAE;AAAA,oBACxF,gBAAc;AAAA,oBACd,oBAAkB,WAAW,SAAS,KAAK,KAAK;AAAA,oBAEhD;AAAA,oEAAC,YAAO,OAAM,IAAI,iBAAO,KAAI;AAAA,sBAC5B,MAAM,KAAK,EAAE,QAAQ,GAAG,GAAG,CAACC,IAAG,QAC9B,8CAAC,YAAiB,OAAO,KACtB,iBADU,GAEb,CACD;AAAA;AAAA;AAAA,gBACH;AAAA,gBACA,8CAAC,gBAAa;AAAA,iBAChB;AAAA,cACC,YACC,8CAAC,UAAK,IAAI,SAAS,KAAK,IAAI,WAAU,gCACnC,wBACH;AAAA,iBAzBM,KA2BV;AAAA,UAEJ,CAAC;AAAA;AAAA,MACH;AAAA,OAEJ;AAAA,IAGC,iBACC,+CAAC,SAAI,WAAU,yBACb;AAAA,oDAAC,SAAI,WAAU,2BACb,wDAAC,UAAK,WAAU,0BAA0B,iBAAO,KAAI,GACvD;AAAA,MACA,8CAAC,SAAI,WAAU,oCACb,yDAAC,WAAM,WAAU,4BACf;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,cAAc;AAAA,YACvB,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,UAAU,IAAI,CAAC;AAAA,YACvD,cAAY,OAAO;AAAA;AAAA,QACrB;AAAA,QACA,8CAAC,UAAK,WAAU,4BAA2B;AAAA,SAC7C,GACF;AAAA,OACF;AAAA,KAEJ;AAEJ;;;ACjRA,IAAAC,iBAAwC;AAYtC,IAAAC,uBAAA;AARF,IAAM,aAAa;AACnB,IAAM,kBAAkB;AAGxB,IAAM,oBAAoB;AAG1B,IAAM,eAAe,MACnB,+CAAC,SAAI,OAAM,8BAA6B,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACtF;AAAA,gDAAC,OAAE,UAAS,wBACV,wDAAC,UAAK,GAAE,gqCAA+pC,MAAK,SAAO,GACrrC;AAAA,EACA,8CAAC,UACC,wDAAC,cAAS,IAAG,kBACX,wDAAC,UAAK,OAAM,MAAK,QAAO,MAAK,MAAK,SAAO,GAC3C,GACF;AAAA,GACF;AAIF,IAAM,gBAAgB,MACpB,8CAAC,SAAI,OAAM,8BAA6B,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACtF,wDAAC,UAAK,GAAE,0BAAyB,QAAO,WAAU,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAO,GAChH;AAGF,IAAM,iBAAiB,MACrB,8CAAC,SAAI,OAAM,8BAA6B,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACtF,wDAAC,UAAK,GAAE,yBAAwB,QAAO,WAAU,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAO,GAC/G;AAIF,IAAMC,aAAY,CAAC,EAAE,OAAO,MAC1B;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IACN,WAAW,SAAS,sCAAsC;AAAA,IAE1D;AAAA,qDAAC,OAAE,UAAS,qBACV;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,GAAE;AAAA,YACF,MAAK;AAAA;AAAA,QACP;AAAA,SACF;AAAA,MACA,8CAAC,UACC,wDAAC,cAAS,IAAG,eACX,wDAAC,UAAK,OAAM,MAAK,QAAO,MAAK,MAAK,SAAQ,GAC5C,GACF;AAAA;AAAA;AACF;AAGK,IAAM,iBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AAEJ,QAAM,SAAS;AAAA,IACb,qBAAqB;AAAA,IACrB,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,WAAW;AAAA,EACb;AACA,QAAM,gBAAgB,OAAO,MAAM,GAAG,UAAU;AAChD,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,yBAAS,CAAC;AAC5D,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAsB,oBAAI,IAAI,CAAC;AACvE,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAwB,IAAI;AAChE,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAwB,IAAI;AAC5D,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAClD,QAAM,eAAW,uBAAuB,IAAI;AAE5C,QAAM,mBAAmB,CAAC,UAAkB;AAC1C,oBAAgB,UAAQ,IAAI,IAAI,IAAI,EAAE,IAAI,KAAK,CAAC;AAAA,EAClD;AAEA,QAAM,cAAc,CAAC,UAAkB;AACrC,QAAI,aAAa,IAAI,KAAK,EAAG,QAAO;AACpC,WAAO,cAAc,KAAK,KAAK;AAAA,EACjC;AAEA,QAAM,oBAAoB,MAAM;AAC9B,yBAAqB,UAAQ,SAAS,IAAI,cAAc,SAAS,IAAI,OAAO,CAAC;AAAA,EAC/E;AAEA,QAAM,gBAAgB,MAAM;AAC1B,yBAAqB,UAAQ,SAAS,cAAc,SAAS,IAAI,IAAI,OAAO,CAAC;AAAA,EAC/E;AAEA,QAAM,kBAAkB,CAAC,MAAwB;AAC/C,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,sBAAkB;AAAA,EACpB;AAEA,QAAM,kBAAkB,CAAC,MAAwB;AAC/C,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,kBAAc;AAAA,EAChB;AAGA,QAAM,mBAAmB,CAAC,MAAwB;AAChD,MAAE,gBAAgB;AAClB,gBAAY,IAAI;AAChB,kBAAc,EAAE,cAAc,CAAC,EAAE,OAAO;AACxC,kBAAc,IAAI;AAAA,EACpB;AAEA,QAAM,kBAAkB,CAAC,MAAwB;AAC/C,MAAE,gBAAgB;AAClB,QAAI,CAAC,WAAY;AACjB,gBAAY,EAAE,cAAc,CAAC,EAAE,OAAO;AAAA,EACxC;AAEA,QAAM,iBAAiB,CAAC,MAAwB;AAC9C,MAAE,gBAAgB;AAClB,kBAAc,KAAK;AACnB,QAAI,CAAC,cAAc,CAAC,SAAU;AAE9B,UAAM,WAAW,aAAa;AAC9B,QAAI,WAAW,gBAAiB,eAAc;AAAA,aACrC,WAAW,CAAC,gBAAiB,mBAAkB;AAExD,kBAAc,IAAI;AAClB,gBAAY,IAAI;AAAA,EAClB;AAEA,QAAM,iBAAiB,CAAC,MAAwB;AAC9C,MAAE,eAAe;AACjB,MAAE,gBAAgB;AAClB,oBAAgB;AAAA,EAClB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,KAAK;AAAA,MACL,cAAc;AAAA,MACd,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,OAAO,EAAE,QAAQ,aAAa,aAAa,OAAO;AAAA,MAElD;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,KAAK,YAAY,iBAAiB;AAAA,YAClC,KAAK,GAAG,SAAS,YAAY,oBAAoB,CAAC,OAAO,cAAc,MAAM;AAAA,YAC7E,WAAU;AAAA,YACV,SAAQ;AAAA,YACR,SAAS,MAAM,iBAAiB,iBAAiB;AAAA,YACjD,WAAU;AAAA;AAAA,QACZ;AAAA,QAEA,8CAAC,SAAI,WAAU,gCAA+B;AAAA,QAE9C,+CAAC,SAAI,WAAU,8BACb;AAAA,wDAAC,SAAI,WAAU,gCACZ,kBAAQ,IAAI,CAAC,OAAO,UACnB,+CAAC,SAAgB,WAAU,4BACzB;AAAA,0DAAC,gBAAa;AAAA,YACd,8CAAC,UAAM,iBAAM;AAAA,eAFL,KAGV,CACD,GACH;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS;AAAA,cACT,cAAY,aAAa,OAAO,sBAAsB,OAAO;AAAA,cAC7D,MAAK;AAAA,cAEL,wDAACA,YAAA,EAAU,QAAQ,YAAY;AAAA;AAAA,UACjC;AAAA,WACF;AAAA,QAEC,cAAc,SAAS,KACtB,gFACE;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS;AAAA,cACT,cAAY,OAAO;AAAA,cACnB,MAAK;AAAA,cAEL,wDAAC,iBAAc;AAAA;AAAA,UACjB;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS;AAAA,cACT,cAAY,OAAO;AAAA,cACnB,MAAK;AAAA,cAEL,wDAAC,kBAAe;AAAA;AAAA,UAClB;AAAA,UAEA,8CAAC,SAAI,WAAU,kCACZ,wBAAc,IAAI,CAAC,GAAG,UACrB;AAAA,YAAC;AAAA;AAAA,cAEC,WAAW,gCACT,UAAU,oBAAoB,yCAAyC,EACzE;AAAA;AAAA,YAHK;AAAA,UAIP,CACD,GACH;AAAA,WACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;ACxNE,IAAAC,uBAAA;AADF,IAAMC,YAAW,MACf,+CAAC,SAAI,OAAM,8BAA6B,OAAM,KAAI,QAAO,KAAI,SAAQ,WAAU,MAAK,QAClF;AAAA,gDAAC,OAAE,UAAS,oBACV,wDAAC,UAAK,GAAE,oqBAAmqB,MAAK,WAAS,GAC3rB;AAAA,EACA,8CAAC,UACC,wDAAC,cAAS,IAAG,cACX,wDAAC,UAAK,OAAM,KAAI,QAAO,KAAI,MAAK,SAAQ,WAAU,gCAA8B,GAClF,GACF;AAAA,GACF;AAIF,IAAM,UAAU,MACd,8CAAC,SAAI,OAAM,8BAA6B,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACtF,wDAAC,UAAK,GAAE,mPAAkP,MAAK,WAAS,GAC1Q;AAIF,IAAM,gBAAgB,MACpB,+CAAC,SAAI,OAAM,8BAA6B,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACtF;AAAA,gDAAC,OAAE,UAAS,yBACV,wDAAC,UAAK,GAAE,21BAA01B,MAAK,WAAS,GACl3B;AAAA,EACA,8CAAC,UACC,wDAAC,cAAS,IAAG,mBACX,wDAAC,UAAK,OAAM,MAAK,QAAO,MAAK,MAAK,SAAO,GAC3C,GACF;AAAA,GACF;AAIF,IAAM,uBAAuB,MAC3B,8CAAC,SAAI,OAAM,8BAA6B,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACtF,wDAAC,UAAK,GAAE,4oDAA2oD,MAAK,WAAS,GACnqD;AAIF,IAAM,gBAAgB,MACpB,8CAAC,SAAI,OAAM,8BAA6B,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACtF,wDAAC,UAAK,GAAE,0BAAyB,QAAO,WAAU,aAAY,KAAI,eAAc,SAAQ,gBAAe,SAAO,GAChH;AAIF,IAAM,iBAAiB,MACrB,8CAAC,SAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,WAAU,WAAU,kCACvE,wDAAC,UAAK,GAAE,+EAA6E,GACvF;AAGK,IAAM,mBAAoD,CAAC;AAAA,EAChE;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,cAAc;AAAA,EACd;AACF,MAAM;AACJ,QAAM,EAAE,EAAE,IAAI,aAAa;AAG3B,QAAM,SAAS;AAAA,IACb,iBAAiB,EAAE,0BAA0B,WAAW;AAAA,IACxD,gBAAgB,EAAE,0BAA0B,WAAW;AAAA,IACvD,YAAY,EAAE,qBAAqB,MAAM;AAAA,IACzC,YAAY,EAAE,qBAAqB,MAAM;AAAA,IACzC,QAAQ,EAAE,gBAAgB,QAAQ;AAAA,IAClC,WAAW,EAAE,wBAAwB,uBAAuB;AAAA,IAC5D,cAAc,EAAE,yCAAyC,eAAe;AAAA,IACxE,YAAY;AAAA,EACd;AAEA,QAAM,oBAAoB,CAAC,UAA0B;AACnD,QAAI,SAAS,IAAK,QAAO,OAAO;AAChC,QAAI,SAAS,IAAK,QAAO,OAAO;AAChC,QAAI,SAAS,IAAK,QAAO,OAAO;AAChC,QAAI,SAAS,IAAK,QAAO,OAAO;AAChC,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,iBAAiB,CAAC,cAAsB;AAC5C,YAAQ,WAAW;AAAA,MACjB,KAAK;AACH,eAAO,8CAAC,iBAAc;AAAA,MACxB,KAAK;AACH,eAAO,8CAAC,wBAAqB;AAAA,MAC/B;AACE,eAAO,8CAAC,iBAAc;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,eAAuB;AAC5C,QAAI,CAAC,cAAc,cAAc,EAAG,QAAO;AAC3C,QAAI,eAAe,EAAG,QAAO,8CAAC,UAAK,WAAU,8BAA8B,iBAAO,YAAW;AAE7F,UAAM,YAAY,KAAK,IAAI,KAAK,MAAM,UAAU,GAAG,CAAC;AACpD,WACE,+EACG,gBAAM,KAAK,EAAE,QAAQ,UAAU,GAAG,CAAC,GAAG,UACrC,8CAACA,WAAA,IAAc,KAAO,CACvB,GACH;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV;AAAA,MACA,OAAO,EAAE,QAAQ,UAAU,YAAY,OAAU;AAAA,MAGjD;AAAA,uDAAC,SAAI,WAAU,iCACb;AAAA,yDAAC,SAAI,WAAU,iCACb;AAAA,2DAAC,SAAI,WAAU,wBACZ;AAAA,4BAAc,KAAK;AAAA,cACnB,cAAc,8CAAC,UAAK,WAAU,kCAAiC,iBAAG;AAAA,eACrE;AAAA,YAEC,SAAS,KACR,+CAAC,SAAI,WAAU,iCACb;AAAA,4DAAC,UAAK,WAAU,8BAA8B,4BAAkB,MAAM,GAAE;AAAA,cACxE,+CAAC,SAAI,WAAU,+BACb;AAAA,8DAAC,kBAAe;AAAA,gBAChB,8CAAC,UAAK,WAAU,gCAAgC,iBAAO,QAAQ,CAAC,GAAE;AAAA,iBACpE;AAAA,eACF;AAAA,aAEJ;AAAA,UAEA,8CAAC,QAAG,WAAU,6BAA6B,gBAAK;AAAA,WAClD;AAAA,QAGA,+CAAC,SAAI,WAAU,mCACb;AAAA,wDAAC,UAAK,WAAU,2BAA0B,wDAAC,WAAQ,GAAE;AAAA,UACrD,8CAAC,UAAK,WAAU,2BAA2B,oBAAS;AAAA,WACtD;AAAA,QAGA,+CAAC,SAAI,WAAU,uCAEZ;AAAA,mBAAS,SAAS,KACjB,8CAAC,SAAI,WAAU,mCACZ,mBAAS,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,SAAS,UAClC,+CAAC,SAAgB,WAAU,0BACzB;AAAA,0DAAC,UAAK,WAAU,+BACb,yBAAe,QAAQ,EAAE,GAC5B;AAAA,YACA,8CAAC,UAAK,WAAU,+BAA+B,kBAAQ,OAAM;AAAA,eAJrD,KAKV,CACD,GACH;AAAA,UAIF,+CAAC,SAAI,WAAU,kCACZ;AAAA,2BACC,8CAAC,SAAI,WAAU,8BAA8B,iBAAO,WAAU;AAAA,YAG/D,CAAC,eACA,8CAAC,SAAI,WAAU,gCAAgC,iBAAO,cAAa;AAAA,YAGpE,eACC,+CAAC,SAAI,WAAU,kCACb;AAAA,4DAAC,UAAK,WAAU,gCAAgC,aAAG,QAAQ,IAAI,MAAM,OAAO,IAAG;AAAA,cAC9E,MAAM,YAAY,MAAM,WAAW,MAAM,WACxC,8CAAC,UAAK,WAAU,iCAAiC,aAAG,QAAQ,IAAI,MAAM,QAAQ,IAAG;AAAA,cAElF,MAAM,YAAY,MAAM,WAAW,KAClC,+CAAC,UAAK,WAAU,iCAAgC;AAAA;AAAA,gBAAE,MAAM;AAAA,gBAAS;AAAA,iBAAE;AAAA,eAEvE;AAAA,aAEJ;AAAA,WACF;AAAA;AAAA;AAAA,EACF;AAEJ;;;ACtKI,IAAAC,uBAAA;AAPG,IAAM,YAAsC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,SACE,+CAAC,SAAI,WAAW,iBAAiB,aAAa,EAAE,IAC9C;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,MAAM;AAAA,QACd,WAAW,MAAM;AAAA,QACjB,QAAQ,MAAM;AAAA,QACd,YAAY,MAAM;AAAA,QAClB;AAAA;AAAA,IACF;AAAA,IAEC,MAAM,OACL,8CAAC,SAAI,WAAU,6BAA6B,gBAAM,KAAI;AAAA,IAGxD;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,MAAM;AAAA,QACZ,OAAO,MAAM;AAAA,QACb,YAAY,MAAM;AAAA,QAClB,QAAQ,MAAM;AAAA,QACd,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,OAAO,MAAM;AAAA,QACb,UAAU,MAAM;AAAA,QAChB,aAAa,MAAM;AAAA,QACnB,SAAS;AAAA;AAAA,IACX;AAAA,KACF;AAEJ;;;ACxDA;;;AC6CQ,IAAAC,uBAAA;AAjBD,IAAM,qBAAwD,CAAC;AAAA,EACpE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,YAAY;AAAA,EACZ;AACF,MAAM;AACJ,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,2BAAO,SAAS,IAAI,WAAW,2BAAO,oBAAoB,EAAE,IAAI,SAAS;AAAA,MACvF,UAAU,WAAW,KAAK;AAAA,MAC1B,cAAY;AAAA,MAEZ;AAAA,uDAAC,SAAI,WAAW,2BAAO,eACrB;AAAA,yDAAC,SAAI,WAAW,2BAAO,gBACrB;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,MAAK;AAAA,gBACL,WAAW,2BAAO;AAAA,gBAClB;AAAA,gBACA;AAAA,gBACA;AAAA;AAAA,YACF;AAAA,YACA,8CAAC,UAAK,WAAW,GAAG,2BAAO,WAAW,IAAI,WAAW,2BAAO,sBAAsB,EAAE,IACjF,qBACC,8CAAC,SAAI,SAAQ,aAAY,MAAK,QAAO,WAAW,2BAAO,WACrD;AAAA,cAAC;AAAA;AAAA,gBACC,GAAE;AAAA,gBACF,QAAO;AAAA,gBACP,aAAY;AAAA,gBACZ,eAAc;AAAA,gBACd,gBAAe;AAAA;AAAA,YACjB,GACF,GAEJ;AAAA,aACF;AAAA,UAEA,8CAAC,UAAK,WAAW,GAAG,2BAAO,WAAW,IAAI,WAAW,2BAAO,sBAAsB,EAAE,IACjF,iBACH;AAAA,WACF;AAAA,QAEC,UAAU,UACT,8CAAC,UAAK,WAAW,GAAG,2BAAO,WAAW,IAAI,WAAW,2BAAO,sBAAsB,EAAE,IACjF,iBACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;ACjFA,IAAAC,iBAA2C;;;ACA3C;;;ADoEM,IAAAC,uBAAA;AA3CC,IAAM,2BAAoE,CAAC;AAAA,EAChF;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,qBAAqB;AAAA,EACrB,YAAY;AACd,MAAM;AACJ,QAAM,EAAE,EAAE,IAAI,aAAa;AAC3B,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,eAAe;AAC5D,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAG5C,QAAM,sBAAsB,eAAe,EAAE,mBAAmB,UAAU;AAC1E,QAAM,uBAAuB,gBAAgB,EAAE,oBAAoB,WAAW;AAI9E,gCAAU,MAAM;AACd,QAAI,mBAAmB,CAAC,YAAY;AAClC,oBAAc,IAAI;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,iBAAiB,MAAM;AAC3B,kBAAc,CAAC,UAAU;AAAA,EAC3B;AAEA,QAAM,gBAAgB,MAAM;AAC1B,eAAW,CAAC,OAAO;AAAA,EACrB;AAGA,QAAM,gBAAgB,eAAAC,QAAM,SAAS,QAAQ,QAAQ;AACrD,QAAM,mBAAmB,cAAc,cAAc,SAAS;AAC9D,QAAM,oBAAoB,oBAAoB,CAAC,UAC3C,cAAc,MAAM,GAAG,kBAAkB,IACzC;AAEJ,SACE,+CAAC,SAAI,WAAW,GAAG,iCAAO,OAAO,IAAI,SAAS,IAC5C;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW,iCAAO;AAAA,QAClB,SAAS;AAAA,QACT,iBAAe;AAAA,QAEf;AAAA,wDAAC,UAAK,WAAW,iCAAO,OAAQ,iBAAM;AAAA,UACtC;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,GAAG,iCAAO,OAAO,IAAI,aAAa,iCAAO,kBAAkB,EAAE;AAAA,cACxE,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,eAAY;AAAA,cAEZ;AAAA,gBAAC;AAAA;AAAA,kBACC,GAAE;AAAA,kBACF,QAAO;AAAA,kBACP,aAAY;AAAA,kBACZ,eAAc;AAAA,kBACd,gBAAe;AAAA;AAAA,cACjB;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IACF;AAAA,IAEA;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,GAAG,iCAAO,OAAO,IAAI,aAAa,iCAAO,kBAAkB,EAAE;AAAA,QACxE,eAAa,CAAC;AAAA,QAEd,yDAAC,SAAI,WAAW,iCAAO,cACpB;AAAA;AAAA,UAEA,oBACC;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAW,iCAAO;AAAA,cAClB,SAAS;AAAA,cAER;AAAA,0BAAU,uBAAuB;AAAA,gBAClC;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW,GAAG,iCAAO,cAAc,IAAI,UAAU,iCAAO,mBAAmB,EAAE;AAAA,oBAC7E,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,eAAY;AAAA,oBAEZ;AAAA,sBAAC;AAAA;AAAA,wBACC,GAAE;AAAA,wBACF,QAAO;AAAA,wBACP,aAAY;AAAA,wBACZ,eAAc;AAAA,wBACd,gBAAe;AAAA;AAAA,oBACjB;AAAA;AAAA,gBACF;AAAA;AAAA;AAAA,UACF;AAAA,WAEJ;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;;;AE7HA,IAAAC,iBAAgE;;;ACAhE;;;AD6OM,IAAAC,uBAAA;AAxON,IAAM,oBAAoB;AAAA,EACxB;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAG;AAAA,EAAG;AAAA,EAAG;AAAA,EAAG;AAAA,EAAG;AACzE;AAkBO,IAAM,mBAAoD,CAAC;AAAA,EAChE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAClB,MAAM;AACJ,QAAM,EAAE,GAAG,UAAU,gBAAgB,IAAI,aAAa;AACtD,QAAM,kBAAkB,YAAY;AAEpC,QAAM,gBAAY,uBAAuB,IAAI;AAC7C,QAAM,CAAC,YAAY,aAAa,QAAI,yBAA+B,IAAI;AACvE,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,yBAAS,KAAK;AAGlE,QAAM,mBAAe,uBAAO,KAAK;AACjC,QAAM,iBAAa,uBAA8B,IAAI;AAGrD,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,EAAE;AACrD,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,EAAE;AACrD,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAS,KAAK;AAC5D,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAS,KAAK;AAG5D,QAAM,QAAQ,WAAW;AACzB,QAAM,aAAa,QAAQ,KAAM,MAAM,MAAM,YAAY,QAAS,MAAM;AACxE,QAAM,aAAa,QAAQ,KAAM,MAAM,MAAM,YAAY,QAAS,MAAM;AAGxE,QAAM,oBAAoB,KAAK,IAAI,GAAG,WAAW,CAAC;AAGlD,QAAM,mBAAe,4BAAY,CAAC,UAAkB;AAClD,UAAM,kBAAmB,QAAQ,UAAU,SAAU;AACrD,UAAM,iBAAkB,QAAQ,KAAK,UAAU,SAAU;AACzD,WAAO,kBAAkB,cAAc,gBAAgB;AAAA,EACzD,GAAG,CAAC,UAAU,QAAQ,YAAY,UAAU,CAAC;AAG7C,QAAM,aAAa;AAGnB,QAAM,qBAAiB,4BAAY,CAAC,aAA2C;AAC7E,QAAI,CAAC,QAAS;AAGd,QAAI,WAAW,SAAS;AACtB,mBAAa,WAAW,OAAO;AAAA,IACjC;AAGA,eAAW,UAAU,WAAW,MAAM;AACpC,cAAQ,QAAQ;AAAA,IAClB,GAAG,aAAa;AAAA,EAClB,GAAG,CAAC,SAAS,aAAa,CAAC;AAG3B,QAAM,iBAAa,4BAAY,CAAC,YAAoB;AAClD,QAAI,CAAC,UAAU,WAAW,CAAC,WAAY;AAEvC,UAAM,OAAO,UAAU,QAAQ,sBAAsB;AACrD,UAAM,aAAa,KAAK,QAAS,aAAa;AAC9C,UAAM,YAAY,KAAK,OAAO;AAC9B,UAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,MAAO,UAAU,aAAa,aAAc,GAAG,CAAC;AACrF,UAAM,WAAW,KAAK,MAAM,WAAY,UAAU,MAAO,KAAK;AAE9D,QAAI,SAAS,MAAM;AACnB,QAAI,SAAS,MAAM;AAEnB,QAAI,eAAe,OAAO;AACxB,YAAM,eAAe,KAAK,IAAI,UAAU,MAAM,MAAM,CAAC;AACrD,eAAS,KAAK,IAAI,UAAU,YAAY;AAAA,IAC1C,OAAO;AACL,YAAM,eAAe,KAAK,IAAI,UAAU,MAAM,MAAM,CAAC;AACrD,eAAS,KAAK,IAAI,UAAU,YAAY;AAAA,IAC1C;AAGA,UAAM,WAAW,EAAE,KAAK,QAAQ,KAAK,OAAO;AAC5C,aAAS,QAAQ;AAGjB,iBAAa,UAAU;AAGvB,QAAI,CAAC,oBAAoB;AACvB,qBAAe,QAAQ;AAAA,IACzB;AAAA,EACF,GAAG,CAAC,YAAY,UAAU,UAAU,OAAO,OAAO,UAAU,oBAAoB,cAAc,CAAC;AAG/F,QAAM,kBAAkB,CAAC,WAA0B,CAAC,MAAwB;AAC1E,MAAE,eAAe;AACjB,kBAAc,MAAM;AACpB,0BAAsB,IAAI;AAC1B,kBAAc;AAAA,EAChB;AAGA,QAAM,mBAAmB,CAAC,WAA0B,CAAC,MAAwB;AAC3E,MAAE,eAAe;AACjB,kBAAc,MAAM;AACpB,0BAAsB,IAAI;AAC1B,kBAAc;AAAA,EAChB;AAGA,QAAM,oBAAgB,4BAAY,MAAM;AACtC,QAAI,sBAAsB,SAAS;AACjC,cAAQ,aAAa,OAAO;AAAA,IAC9B;AACA,kBAAc,IAAI;AAClB,0BAAsB,KAAK;AAC3B,gBAAY;AAAA,EACd,GAAG,CAAC,oBAAoB,SAAS,SAAS,CAAC;AAG3C,gCAAU,MAAM;AACd,QAAI,CAAC,WAAY;AAEjB,UAAM,kBAAkB,CAAC,MAAkB;AACzC,iBAAW,EAAE,OAAO;AAAA,IACtB;AAEA,UAAM,kBAAkB,CAAC,MAAkB;AACzC,UAAI,EAAE,QAAQ,SAAS,GAAG;AACxB,mBAAW,EAAE,QAAQ,CAAC,EAAE,OAAO;AAAA,MACjC;AAAA,IACF;AAEA,aAAS,iBAAiB,aAAa,eAAe;AACtD,aAAS,iBAAiB,WAAW,aAAa;AAClD,aAAS,iBAAiB,aAAa,iBAAiB,EAAE,SAAS,MAAM,CAAC;AAC1E,aAAS,iBAAiB,YAAY,aAAa;AAEnD,WAAO,MAAM;AACX,eAAS,oBAAoB,aAAa,eAAe;AACzD,eAAS,oBAAoB,WAAW,aAAa;AACrD,eAAS,oBAAoB,aAAa,eAAe;AACzD,eAAS,oBAAoB,YAAY,aAAa;AAEtD,UAAI,WAAW,SAAS;AACtB,qBAAa,WAAW,OAAO;AAAA,MACjC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,YAAY,YAAY,aAAa,CAAC;AAG1C,QAAM,sBAAsB,MAAM;AAChC,uBAAmB,IAAI;AACvB,qBAAiB,MAAM,IAAI,SAAS,CAAC;AAAA,EACvC;AAEA,QAAM,sBAAsB,MAAM;AAChC,uBAAmB,IAAI;AACvB,qBAAiB,MAAM,IAAI,SAAS,CAAC;AAAA,EACvC;AAEA,QAAM,uBAAuB,CAAC,MAA2C;AACvE,UAAM,MAAM,EAAE,OAAO,MAAM,QAAQ,WAAW,EAAE;AAChD,qBAAiB,GAAG;AAAA,EACtB;AAEA,QAAM,uBAAuB,CAAC,MAA2C;AACvE,UAAM,MAAM,EAAE,OAAO,MAAM,QAAQ,WAAW,EAAE;AAChD,qBAAiB,GAAG;AAAA,EACtB;AAEA,QAAM,qBAAqB,MAAM;AAC/B,uBAAmB,KAAK;AACxB,UAAM,WAAW,SAAS,eAAe,EAAE;AAC3C,QAAI,CAAC,MAAM,QAAQ,GAAG;AACpB,YAAM,eAAe,KAAK,IAAI,UAAU,KAAK,IAAI,UAAU,MAAM,MAAM,CAAC,CAAC;AACzE,YAAM,WAAW,EAAE,KAAK,cAAc,KAAK,MAAM,IAAI;AACrD,eAAS,QAAQ;AACjB,UAAI,SAAS;AACX,uBAAe,QAAQ;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,qBAAqB,MAAM;AAC/B,uBAAmB,KAAK;AACxB,UAAM,WAAW,SAAS,eAAe,EAAE;AAC3C,QAAI,CAAC,MAAM,QAAQ,GAAG;AACpB,YAAM,eAAe,KAAK,IAAI,UAAU,KAAK,IAAI,UAAU,MAAM,MAAM,CAAC,CAAC;AACzE,YAAM,WAAW,EAAE,KAAK,MAAM,KAAK,KAAK,aAAa;AACrD,eAAS,QAAQ;AACjB,UAAI,SAAS;AACX,uBAAe,QAAQ;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAGA,gCAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,WAAW,SAAS;AACtB,qBAAa,WAAW,OAAO;AAAA,MACjC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SACE,+CAAC,SAAI,WAAW,yBAAO,mBAErB;AAAA,mDAAC,SAAI,WAAW,yBAAO,aACrB;AAAA,oDAAC,SAAI,WAAW,yBAAO,mBACrB;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,WAAW,yBAAO;AAAA,UAClB,OAAO,kBAAkB,gBAAgB,GAAG,eAAe,IAAI,MAAM,GAAG;AAAA,UACxE,UAAU;AAAA,UACV,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,cAAY,EAAE,oBAAoB,eAAe;AAAA;AAAA,MACnD,GACF;AAAA,MACA,8CAAC,SAAI,WAAW,yBAAO,mBAAmB,oBAAC;AAAA,MAC3C,8CAAC,SAAI,WAAW,yBAAO,mBACrB;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,WAAW,yBAAO;AAAA,UAClB,OAAO,kBAAkB,gBAAgB,GAAG,eAAe,IAAI,MAAM,GAAG;AAAA,UACxE,UAAU;AAAA,UACV,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,cAAY,EAAE,oBAAoB,eAAe;AAAA;AAAA,MACnD,GACF;AAAA,OACF;AAAA,IAGA,8CAAC,SAAI,WAAW,yBAAO,WACpB,oBAAU,IAAI,CAAC,WAAW,UAAU;AACnC,YAAM,SAAU,YAAY,oBAAqB;AACjD,YAAM,WAAW,aAAa,KAAK;AACnC,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,WAAW,GAAG,yBAAO,YAAY,IAAI,WAAW,yBAAO,qBAAqB,EAAE;AAAA,UAC9E,OAAO,EAAE,QAAQ,GAAG,KAAK,IAAI,QAAQ,EAAE,CAAC,IAAI;AAAA;AAAA,QAFvC;AAAA,MAGP;AAAA,IAEJ,CAAC,GACH;AAAA,IAGA,+CAAC,SAAI,WAAW,yBAAO,iBAAiB,KAAK,WAC3C;AAAA,oDAAC,SAAI,WAAW,yBAAO,aAAa;AAAA,MACpC;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,yBAAO;AAAA,UAClB,OAAO;AAAA,YACL,MAAM,+BAA+B,aAAa,GAAG;AAAA,YACrD,OAAO,yBAAyB,aAAa,cAAc,GAAG;AAAA,UAChE;AAAA;AAAA,MACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,GAAG,yBAAO,YAAY,IAAI,eAAe,QAAQ,yBAAO,qBAAqB,EAAE;AAAA,UAC1F,OAAO,EAAE,MAAM,+BAA+B,aAAa,GAAG,IAAI;AAAA,UAClE,aAAa,gBAAgB,KAAK;AAAA,UAClC,cAAc,iBAAiB,KAAK;AAAA,UACpC,MAAK;AAAA,UACL,cAAY,EAAE,oBAAoB,eAAe;AAAA,UACjD,iBAAe,MAAM;AAAA,UACrB,iBAAe;AAAA,UACf,iBAAe,MAAM;AAAA,UACrB,UAAU;AAAA;AAAA,MACZ;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,GAAG,yBAAO,YAAY,IAAI,eAAe,QAAQ,yBAAO,qBAAqB,EAAE;AAAA,UAC1F,OAAO,EAAE,MAAM,+BAA+B,aAAa,GAAG,IAAI;AAAA,UAClE,aAAa,gBAAgB,KAAK;AAAA,UAClC,cAAc,iBAAiB,KAAK;AAAA,UACpC,MAAK;AAAA,UACL,cAAY,EAAE,oBAAoB,eAAe;AAAA,UACjD,iBAAe,MAAM;AAAA,UACrB,iBAAe,MAAM;AAAA,UACrB,iBAAe;AAAA,UACf,UAAU;AAAA;AAAA,MACZ;AAAA,OACF;AAAA,KACF;AAEJ;;;AE7TA;;;AC2DI,IAAAC,uBAAA;AAzCG,IAAM,mBAAqC;AAAA,EAChD,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,KAAK;AAAA,EACpC,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,KAAK;AAAA,EACpC,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,KAAK;AAAA,EACpC,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,KAAK;AAAA,EACpC,EAAE,OAAO,eAAe,OAAO,GAAG,OAAO,cAAc;AAAA,EACvD,EAAE,OAAO,kBAAkB,OAAO,GAAG,OAAO,cAAc;AAC5D;AASO,IAAM,sBAA0D,CAAC;AAAA,EACtE;AAAA,EACA,SAAS,CAAC;AAAA,EACV;AAAA,EACA,YAAY;AACd,MAAM;AACJ,QAAM,EAAE,EAAE,IAAI,aAAa;AAE3B,QAAM,eAAe,CAAC,UAAkB;AACtC,QAAI,SAAS,SAAS,KAAK,GAAG;AAC5B,eAAS,SAAS,OAAO,OAAK,MAAM,KAAK,CAAC;AAAA,IAC5C,OAAO;AACL,eAAS,CAAC,GAAG,UAAU,KAAK,CAAC;AAAA,IAC/B;AAAA,EACF;AAGA,QAAM,WAAW,CAAC,WAA2B;AAC3C,QAAI,OAAO,QAAQ,EAAG,QAAO;AAC7B,QAAI,OAAO,UAAU,cAAe,QAAO,EAAE,sBAAsB,aAAa;AAChF,QAAI,OAAO,UAAU,iBAAkB,QAAO,EAAE,sBAAsB,aAAa;AACnF,WAAO,OAAO;AAAA,EAChB;AAEA,SACE,+CAAC,SAAI,WACH;AAAA,kDAAC,SAAI,WAAW,4BAAO,YACpB,2BAAiB,IAAI,CAAC,WAAW;AAChC,YAAM,QAAQ,OAAO,OAAO,KAAK;AACjC,YAAM,aAAa,UAAU,KAAK,CAAC,SAAS,SAAS,OAAO,KAAK;AACjE,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,IAAI,YAAY,OAAO,KAAK;AAAA,UAC5B,OACE,OAAO,QAAQ,IACb,8CAAC,SAAI,WAAW,4BAAO,gBACpB,gBAAM,KAAK,EAAE,QAAQ,OAAO,MAAM,CAAC,EAAE,IAAI,CAAC,GAAG,MAC5C,8CAAC,SAAY,WAAW,4BAAO,UAAU,SAAQ,aAAY,MAAK,gBAChE,wDAAC,UAAK,GAAE,yIAAwI,KADxI,CAEV,CACD,GACH,IAEA,SAAS,MAAM;AAAA,UAGnB;AAAA,UACA,SAAS,SAAS,SAAS,OAAO,KAAK;AAAA,UACvC,UAAU;AAAA,UACV,UAAU,MAAM,aAAa,OAAO,KAAK;AAAA,UACzC,WAAW,mBAAmB,OAAO,KAAK;AAAA;AAAA,QAnBrC,OAAO;AAAA,MAoBd;AAAA,IAEJ,CAAC,GACH;AAAA,IACA,8CAAC,SAAI,WAAW,4BAAO,QACrB,wDAAC,UAAK,WAAW,4BAAO,YACrB,YAAE,4BAA4B,iCAAiC,GAClE,GACF;AAAA,KACF;AAEJ;;;ACjGA;;;ACwEY,IAAAC,uBAAA;AArDL,IAAM,iBAAiC;AAAA,EAC5C,EAAE,OAAO,aAAa,UAAU,oBAAoB,OAAO,SAAS;AAAA,EACpE,EAAE,OAAO,aAAa,UAAU,oBAAoB,OAAO,mBAAc;AAAA,EACzE,EAAE,OAAO,QAAQ,UAAU,eAAe,OAAO,mBAAc;AAAA,EAC/D,EAAE,OAAO,QAAQ,UAAU,eAAe,OAAO,mBAAc;AAAA,EAC/D,EAAE,OAAO,aAAa,UAAU,eAAe,OAAO,GAAG;AAC3D;AAUO,IAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA,SAAS,CAAC;AAAA,EACV;AAAA,EACA,YAAY;AAAA,EACZ,sBAAsB;AACxB,MAAM;AACJ,QAAM,EAAE,EAAE,IAAI,aAAa;AAE3B,QAAM,eAAe,CAAC,UAAkB;AACtC,QAAI,SAAS,SAAS,KAAK,GAAG;AAC5B,eAAS,SAAS,OAAO,OAAK,MAAM,KAAK,CAAC;AAAA,IAC5C,OAAO;AACL,eAAS,CAAC,GAAG,UAAU,KAAK,CAAC;AAAA,IAC/B;AAAA,EACF;AAGA,QAAM,iBAAiB,CAAC,aAAqB;AAC3C,UAAM,WAAmC;AAAA,MACvC,oBAAoB,EAAE,0BAA0B,WAAW;AAAA,MAC3D,oBAAoB,EAAE,0BAA0B,WAAW;AAAA,MAC3D,eAAe,EAAE,qBAAqB,MAAM;AAAA,MAC5C,eAAe,EAAE,qBAAqB,MAAM;AAAA,MAC5C,eAAe,EAAE,qBAAqB,WAAW;AAAA,IACnD;AACA,WAAO,SAAS,QAAQ,KAAK;AAAA,EAC/B;AAEA,SACE,+CAAC,SAAI,WACH;AAAA,kDAAC,SAAI,WAAW,sBAAO,YACpB,yBAAe,IAAI,CAAC,WAAW;AAC9B,YAAM,QAAQ,OAAO,OAAO,KAAK;AACjC,YAAM,aACJ,CAAC,uBAAuB,UAAU,KAAK,CAAC,SAAS,SAAS,OAAO,KAAK;AACxE,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,IAAI,UAAU,OAAO,KAAK;AAAA,UAC1B,OACE,gFACG;AAAA,2BAAe,OAAO,QAAQ;AAAA,YAC9B,OAAO,SACN,+CAAC,UAAK,WAAW,sBAAO,aAAa;AAAA;AAAA,cAAE,OAAO;AAAA,eAAM;AAAA,aAExD;AAAA,UAEF;AAAA,UACA,SAAS,SAAS,SAAS,OAAO,KAAK;AAAA,UACvC,UAAU;AAAA,UACV,UAAU,MAAM,aAAa,OAAO,KAAK;AAAA,UACzC,WAAW,iBAAiB,OAAO,KAAK;AAAA;AAAA,QAdnC,OAAO;AAAA,MAed;AAAA,IAEJ,CAAC,GACH;AAAA,IACA,8CAAC,SAAI,WAAW,sBAAO,QACrB,wDAAC,UAAK,WAAW,sBAAO,YACrB,YAAE,mBAAmB,2BAAwB,GAChD,GACF;AAAA,KACF;AAEJ;;;ACnGA,IAAAC,iBAAgC;;;ACAhC;;;AD0DU,IAAAC,uBAAA;AAhCH,IAAM,mBAAoD,CAAC;AAAA,EAChE;AAAA,EACA,SAAS,CAAC;AAAA,EACV;AAAA,EACA,YAAY;AACd,MAAM;AACJ,QAAM,EAAE,EAAE,IAAI,aAAa;AAC3B,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,KAAK;AAG9C,QAAM,gBAAgB,WAAW,SAAS,OAAO,MAAM,GAAG,CAAC;AAC3D,QAAM,gBAAgB,OAAO,SAAS;AAEtC,QAAM,eAAe,CAAC,UAAkB;AACtC,QAAI,SAAS,SAAS,KAAK,GAAG;AAC5B,eAAS,SAAS,OAAO,OAAK,MAAM,KAAK,CAAC;AAAA,IAC5C,OAAO;AACL,eAAS,CAAC,GAAG,UAAU,KAAK,CAAC;AAAA,IAC/B;AAAA,EACF;AAGA,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,SACE,+CAAC,SAAI,WAAW,GAAG,yBAAO,UAAU,IAAI,SAAS,IAC9C;AAAA,kBAAc,IAAI,CAAC,UAAU;AAC5B,YAAM,aAAa,OAAO,MAAM,EAAE;AAClC,YAAM,aAAa,MAAM,UAAU,KAAK,CAAC,SAAS,SAAS,UAAU;AACrE,aACE;AAAA,QAAC;AAAA;AAAA,UAEC,IAAI,cAAc,MAAM,EAAE;AAAA,UAC1B,OAAO,MAAM;AAAA,UACb,OAAO,MAAM,QAAQ,IAAI,MAAM,QAAQ;AAAA,UACvC,SAAS,SAAS,SAAS,UAAU;AAAA,UACrC,UAAU;AAAA,UACV,UAAU,MAAM,aAAa,UAAU;AAAA,UACvC,WAAW,qBAAqB,MAAM,EAAE;AAAA;AAAA,QAPnC,MAAM;AAAA,MAQb;AAAA,IAEJ,CAAC;AAAA,IAEA,iBACC;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW,yBAAO;AAAA,QAClB,SAAS,MAAM,YAAY,CAAC,QAAQ;AAAA,QAEnC;AAAA,qBACG,EAAE,oBAAoB,WAAW,IACjC,EAAE,mBAAmB,UAAU;AAAA,UACnC,8CAAC,UAAK,WAAW,GAAG,yBAAO,SAAS,IAAI,WAAW,yBAAO,UAAU,EAAE,IACpE,wDAAC,SAAI,OAAM,8BAA6B,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACtF,wDAAC,UAAK,GAAE,yUAAwU,MAAK,gBAAc,GACrW,GACF;AAAA;AAAA;AAAA,IACF;AAAA,KAEJ;AAEJ;;;AEzFA,IAAAC,iBAAmD;;;ACAnD;;;ADyGc,IAAAC,uBAAA;AA3EP,IAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,sBAAsB;AACxB,MAAM;AACJ,QAAM,EAAE,EAAE,IAAI,aAAa;AAG3B,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,yBAAsB,oBAAI,IAAI,CAAC,aAAa,CAAC,CAAC;AAGhG,QAAM,wBAAoB,uBAAO,KAAK;AAGtC,gCAAU,MAAM;AACd,QAAI,kBAAkB,QAAS;AAC/B,QAAI,QAAQ,WAAW,KAAK,SAAS,WAAW,EAAG;AAEnD,UAAM,+BAA+B,oBAAI,IAAY;AACrD,YAAQ,QAAQ,YAAU;AACxB,UAAI,OAAO,YAAY,KAAK,SAAO,SAAS,SAAS,IAAI,KAAK,CAAC,GAAG;AAChE,qCAA6B,IAAI,OAAO,KAAK;AAAA,MAC/C;AAAA,IACF,CAAC;AAED,QAAI,6BAA6B,OAAO,GAAG;AACzC,2BAAqB,4BAA4B;AACjD,wBAAkB,UAAU;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,SAAS,QAAQ,CAAC;AAGtB,QAAM,sBAAsB,CAAC,iBAAyB;AACpD,yBAAqB,UAAQ;AAC3B,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,UAAI,KAAK,IAAI,YAAY,GAAG;AAC1B,aAAK,OAAO,YAAY;AAAA,MAC1B,OAAO;AACL,aAAK,IAAI,YAAY;AAAA,MACvB;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAGA,QAAM,qBAAqB,CAAC,gBAAwB;AAClD,QAAI,SAAS,SAAS,WAAW,GAAG;AAClC,eAAS,SAAS,OAAO,OAAK,MAAM,WAAW,CAAC;AAAA,IAClD,OAAO;AACL,eAAS,CAAC,GAAG,UAAU,WAAW,CAAC;AAAA,IACrC;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SACE,8CAAC,SAAI,WAAW,GAAG,sBAAO,UAAU,IAAI,SAAS,IAC9C,kBAAQ,IAAI,CAAC,WAAW;AACvB,UAAM,gBAAgB,OAAO,cAAc,OAAO,WAAW,SAAS;AACtE,UAAM,aAAa,kBAAkB,IAAI,OAAO,KAAK;AAErD,WACE,+CAAC,SAAuB,WAAW,sBAAO,YAExC;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAW,GAAG,sBAAO,UAAU,IAAI,aAAa,sBAAO,qBAAqB,EAAE;AAAA,UAC9E,SAAS,MAAM,oBAAoB,OAAO,KAAK;AAAA,UAC/C,iBAAe;AAAA,UACf,UAAU;AAAA,UAEV;AAAA,2DAAC,SAAI,WAAW,sBAAO,aACrB;AAAA,4DAAC,UAAK,WAAW,sBAAO,aACrB,iBAAO,OACV;AAAA,cAEC,OAAO,UAAU,UAChB,8CAAC,UAAK,WAAW,sBAAO,YAAa,iBAAO,OAAM;AAAA,eAEtD;AAAA,YAEC,iBACC;AAAA,cAAC;AAAA;AAAA,gBACC,OAAM;AAAA,gBACN,OAAM;AAAA,gBAAK,QAAO;AAAA,gBAAK,SAAQ;AAAA,gBAAY,MAAK;AAAA,gBAChD,WAAW,GAAG,sBAAO,OAAO,IAAI,aAAa,sBAAO,kBAAkB,EAAE;AAAA,gBAExE,wDAAC,UAAK,GAAE,oUAAmU,MAAK,WAAS;AAAA;AAAA,YAC3V;AAAA;AAAA;AAAA,MAEJ;AAAA,MAGC,iBAAiB,eAAe,MAAM;AACrC,cAAM,uBAAuB,OAAO,WAAY;AAAA,UAC9C,QAAM,GAAG,UAAU,UAAa,GAAG,QAAQ;AAAA,QAC7C;AACA,cAAM,YAAY,OAAO,WAAY,IAAI,QAAM,GAAG,KAAK;AACvD,cAAM,qBAAqB,UAAU,KAAK,OAAK,SAAS,SAAS,CAAC,CAAC;AACnE,eACA,+CAAC,SAAI,WAAW,sBAAO,wBACrB;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAW,sBAAO;AAAA,cAClB,UAAU,CAAC;AAAA,cACX,SAAS,MAAM;AACb,sBAAM,sBAAsB,OAAO,WAChC,OAAO,QAAM,GAAG,UAAU,UAAa,GAAG,QAAQ,CAAC,EACnD,IAAI,QAAM,GAAG,KAAK;AACrB,sBAAM,SAAS,MAAM,KAAK,oBAAI,IAAI,CAAC,GAAG,UAAU,GAAG,mBAAmB,CAAC,CAAC;AACxE,yBAAS,MAAM;AAAA,cACjB;AAAA,cAEC,YAAE,qBAAqB,YAAY;AAAA;AAAA,UACtC;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAW,sBAAO;AAAA,cAClB,UAAU,CAAC;AAAA,cACX,SAAS,MAAM;AACb,yBAAS,SAAS,OAAO,OAAK,CAAC,UAAU,SAAS,CAAC,CAAC,CAAC;AAAA,cACvD;AAAA,cAEC,YAAE,gBAAgB,OAAO;AAAA;AAAA,UAC5B;AAAA,WACF;AAAA,MAEF,GAAG;AAAA,MAGF,iBAAiB,cAChB,8CAAC,SAAI,WAAW,sBAAO,YACpB,iBAAO,WAAY,IAAI,CAAC,cAAc;AACrC,cAAM,aACH,UAAU,UAAU,KAAK,CAAC,SAAS,SAAS,UAAU,KAAK,KAC3D,uBAAuB,CAAC,SAAS,SAAS,UAAU,KAAK;AAC5D,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,IAAI,UAAU,UAAU,KAAK;AAAA,YAC7B,OAAO,UAAU;AAAA,YACjB,OAAO,UAAU;AAAA,YACjB,SAAS,SAAS,SAAS,UAAU,KAAK;AAAA,YAC1C,UAAU;AAAA,YACV,UAAU,MAAM,mBAAmB,UAAU,KAAK;AAAA,YAClD,WAAW,iBAAiB,UAAU,KAAK;AAAA;AAAA,UAPtC,UAAU;AAAA,QAQjB;AAAA,MAEJ,CAAC,GACH;AAAA,SAxFM,OAAO,KA0FjB;AAAA,EAEJ,CAAC,GACH;AAEJ;;;AE/LA;;;ACuDU,IAAAC,uBAAA;AA3BH,IAAM,iBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA,SAAS,CAAC;AAAA,EACV,UAAU,CAAC;AAAA,EACX;AAAA,EACA,YAAY;AAAA,EACZ,cAAc;AAChB,MAAM;AACJ,QAAM,eAAe,CAAC,UAAkB;AACtC,QAAI,SAAS,SAAS,KAAK,GAAG;AAC5B,eAAS,SAAS,OAAO,OAAK,MAAM,KAAK,CAAC;AAAA,IAC5C,OAAO;AACL,eAAS,CAAC,GAAG,UAAU,KAAK,CAAC;AAAA,IAC/B;AAAA,EACF;AAGA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SACE,8CAAC,SAAI,WAAW,GAAG,uBAAO,UAAU,IAAI,SAAS,IAC9C,kBAAQ,IAAI,CAAC,WAAW;AACvB,UAAM,QAAQ,OAAO,OAAO,GAAG;AAC/B,UAAM,aAAa,UAAU,KAAK,CAAC,SAAS,SAAS,OAAO,GAAG;AAC/D,WACE;AAAA,MAAC;AAAA;AAAA,QAEC,IAAI,GAAG,WAAW,IAAI,OAAO,GAAG;AAAA,QAChC,OAAO,OAAO;AAAA,QACd;AAAA,QACA,SAAS,SAAS,SAAS,OAAO,GAAG;AAAA,QACrC,UAAU;AAAA,QACV,UAAU,MAAM,aAAa,OAAO,GAAG;AAAA,QACvC,WAAW,UAAU,WAAW,IAAI,OAAO,GAAG;AAAA;AAAA,MAPzC,OAAO;AAAA,IAQd;AAAA,EAEJ,CAAC,GACH;AAEJ;AAGO,IAAM,cAAc,CAAC,UAC1B,8CAAC,kBAAgB,GAAG,OAAO,aAAY,SAAQ;AAG1C,IAAM,kBAAkB,CAAC,UAC9B,8CAAC,kBAAgB,GAAG,OAAO,aAAY,aAAY;AAG9C,IAAM,iBAAiB,CAAC,UAC7B,8CAAC,kBAAgB,GAAG,OAAO,aAAY,YAAW;;;ACjFpD;;;AC6CQ,IAAAC,uBAAA;AAfD,IAAM,qBAAwD,CAAC;AAAA,EACpE;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,MAAM;AACJ,QAAM,EAAE,EAAE,IAAI,aAAa;AAE3B,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SACE,8CAAC,SAAI,WAAW,GAAG,2BAAO,SAAS,IAAI,SAAS,IAC9C,yDAAC,SAAI,WAAW,2BAAO,cACrB;AAAA,mDAAC,OAAE,WAAW,2BAAO,cAAe;AAAA,QAAE,mBAAmB,WAAW;AAAA,MAAE;AAAA,OAAC;AAAA,IACvE,+CAAC,SAAI,WAAW,2BAAO,OACpB;AAAA,cAAQ,IAAI,CAAC,WACZ;AAAA,QAAC;AAAA;AAAA,UAEC,OAAO,OAAO;AAAA,UACd,MAAK;AAAA,UACL,OAAM;AAAA,UACN,WAAS;AAAA,UACT,UAAU,MAAM,SAAS,MAAM;AAAA;AAAA,QAL1B,OAAO;AAAA,MAMd,CACD;AAAA,MACA,cACC;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,WAAW,2BAAO;AAAA,UAClB,SAAS;AAAA,UAER,YAAE,oBAAoB,WAAW;AAAA;AAAA,MACpC;AAAA,OAEJ;AAAA,KACF,GACF;AAEJ;;;ACtEA,IAAAC,iBAAgE;;;ACAhE;;;AD4PU,IAAAC,uBAAA;AAhLV,IAAM,mBAAmB;AAAA,EACvB,EAAE,OAAO,MAAM,OAAO,MAAM;AAAA,EAC5B,EAAE,OAAO,MAAM,OAAO,MAAM;AAAA,EAC5B,EAAE,OAAO,MAAM,OAAO,MAAM;AAC9B;AAGA,IAAM,iBAAiB;AAAA,EACrB,EAAE,OAAO,mBAAmB,UAAU,yBAAyB;AACjE;AAEO,IAAM,cAA0C,CAAC;AAAA,EACtD;AAAA,EACA,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU,CAAC;AAAA,EACX,iBAAiB,CAAC;AAAA,EAClB,gBAAgB,CAAC;AAAA,EACjB,iBAAiB,CAAC;AAAA,EAClB,SAAS,CAAC;AAAA,EACV,cAAc,CAAC;AAAA,EACf,gBAAgB,CAAC;AAAA,EACjB,kBAAkB,CAAC;AAAA,EACnB,iBAAiB,CAAC;AAAA,EAClB,iBAAiB,CAAC;AAAA,EAClB;AAAA,EACA,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,oBAAoB;AACtB,MAAM;AACJ,QAAM,EAAE,GAAG,SAAS,IAAI,aAAa;AAErC,QAAM,wBAAoB,uBAAO,KAAK;AAEtC,MAAI,CAAC,kBAAkB,SAAS;AAC9B,QAAI,QAAQ,SAAS,KAChB,kBAAkB,eAAe,SAAS,KAC3C,OAAO,KAAK,cAAc,EAAE,SAAS,KACrC,OAAO,KAAK,cAAc,EAAE,SAAS,GAAG;AAC1C,wBAAkB,UAAU;AAAA,IAC9B;AAAA,EACF;AAGA,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,oBAAoB,OAAO,QAAQ;AAC5E,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,oBAAoB,OAAO,QAAQ;AAG5E,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAmB,mBAAmB,CAAC,CAAC;AACtF,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,yBAAmB,qBAAqB,CAAC,CAAC;AAC5F,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAmB,mBAAmB,CAAC,CAAC;AACtF,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,yBAAmB,sBAAsB,CAAC,CAAC;AAC/F,QAAM,CAAC,qBAAqB,sBAAsB,QAAI,yBAAmB,uBAAuB,CAAC,CAAC;AAClG,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAmB,iBAAiB,CAAC,CAAC;AAChF,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAmB,mBAAmB,CAAC,CAAC;AACtF,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,yBAAmB,qBAAqB,CAAC,CAAC;AAC5F,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,yBAAmB,oBAAoB,CAAC,CAAC;AACzF,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,yBAAmB,oBAAoB,CAAC,CAAC;AAGzF,gCAAU,MAAM;AACd,QAAI,oBAAoB;AACtB,kBAAY,mBAAmB,GAAG;AAClC,kBAAY,mBAAmB,GAAG;AAAA,IACpC,OAAO;AACL,kBAAY,QAAQ;AACpB,kBAAY,QAAQ;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,oBAAoB,UAAU,QAAQ,CAAC;AAE3C,gCAAU,MAAM;AAAE,QAAI,sBAAsB,OAAW,sBAAqB,iBAAiB;AAAA,EAAG,GAAG,CAAC,iBAAiB,CAAC;AACtH,gCAAU,MAAM;AAAE,QAAI,oBAAoB,OAAW,oBAAmB,eAAe;AAAA,EAAG,GAAG,CAAC,eAAe,CAAC;AAC9G,gCAAU,MAAM;AAAE,QAAI,wBAAwB,OAAW,wBAAuB,mBAAmB;AAAA,EAAG,GAAG,CAAC,mBAAmB,CAAC;AAC9H,gCAAU,MAAM;AAAE,QAAI,oBAAoB,OAAW,oBAAmB,eAAe;AAAA,EAAG,GAAG,CAAC,eAAe,CAAC;AAC9G,gCAAU,MAAM;AAAE,QAAI,uBAAuB,OAAW,uBAAsB,kBAAkB;AAAA,EAAG,GAAG,CAAC,kBAAkB,CAAC;AAC1H,gCAAU,MAAM;AAAE,QAAI,kBAAkB,OAAW,kBAAiB,aAAa;AAAA,EAAG,GAAG,CAAC,aAAa,CAAC;AACtG,gCAAU,MAAM;AAAE,QAAI,oBAAoB,OAAW,oBAAmB,eAAe;AAAA,EAAG,GAAG,CAAC,eAAe,CAAC;AAC9G,gCAAU,MAAM;AAAE,QAAI,sBAAsB,OAAW,sBAAqB,iBAAiB;AAAA,EAAG,GAAG,CAAC,iBAAiB,CAAC;AACtH,gCAAU,MAAM;AAAE,QAAI,qBAAqB,OAAW,qBAAoB,gBAAgB;AAAA,EAAG,GAAG,CAAC,gBAAgB,CAAC;AAClH,gCAAU,MAAM;AAAE,QAAI,qBAAqB,OAAW,qBAAoB,gBAAgB;AAAA,EAAG,GAAG,CAAC,gBAAgB,CAAC;AAGlH,QAAM,oBAAoB,CAAC,UAAwC;AACjE,gBAAY,MAAM,GAAG;AACrB,gBAAY,MAAM,GAAG;AAAA,EACvB;AAEA,QAAM,wBAAoB,4BAAY,OAAO,UAAwC;AACnF,UAAM,iBAAiB,EAAE,YAAY,MAAM,CAAC;AAAA,EAC9C,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,iBAAiB,YAAY,mBAAmB,GAAG;AAEzD,QAAM,mBAAmB,CAAC,UAAwC;AAChE,mBAAe,KAAK;AAAA,EACtB;AAEA,QAAM,uBAAuB,CAAC,kBAA0B;AACtD,yBAAqB,UAAQ;AAC3B,YAAM,eAAe,KAAK,SAAS,aAAa,IAC5C,KAAK,OAAO,OAAK,MAAM,aAAa,IACpC,CAAC,GAAG,MAAM,aAAa;AAC3B,uBAAiB,EAAE,WAAW,aAAa,CAAC;AAC5C,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,qBAAqB,CAAC,gBAAwB;AAClD,uBAAmB,UAAQ;AACzB,YAAM,aAAa,KAAK,SAAS,WAAW,IACxC,KAAK,OAAO,OAAK,MAAM,WAAW,IAClC,CAAC,GAAG,MAAM,WAAW;AACzB,uBAAiB,EAAE,SAAS,WAAW,CAAC;AACxC,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,uBAAuB,CAAC,WAAqB;AACjD,wBAAoB,MAAM;AAC1B,qBAAiB,EAAE,UAAU,OAAO,CAAC;AAAA,EACvC;AAEA,QAAM,sBAAsB,CAAC,WAAqB;AAChD,uBAAmB,MAAM;AACzB,qBAAiB,EAAE,SAAS,OAAO,CAAC;AAAA,EACtC;AAEA,QAAM,yBAAyB,CAAC,WAAqB;AACnD,2BAAuB,MAAM;AAC7B,qBAAiB,EAAE,aAAa,OAAO,CAAC;AAAA,EAC1C;AAEA,QAAM,yBAAyB,CAAC,WAAqB;AACnD,0BAAsB,MAAM;AAC5B,qBAAiB,EAAE,YAAY,OAAO,CAAC;AAAA,EACzC;AAEA,QAAM,oBAAoB,CAAC,WAAqB;AAC9C,qBAAiB,MAAM;AACvB,qBAAiB,EAAE,OAAO,OAAO,CAAC;AAAA,EACpC;AAEA,QAAM,sBAAsB,CAAC,WAAqB;AAChD,uBAAmB,MAAM;AACzB,qBAAiB,EAAE,SAAS,OAAO,CAAC;AAAA,EACtC;AAEA,QAAM,wBAAwB,CAAC,WAAqB;AAClD,yBAAqB,MAAM;AAC3B,qBAAiB,EAAE,WAAW,OAAO,CAAC;AAAA,EACxC;AAEA,QAAM,uBAAuB,CAAC,WAAqB;AACjD,wBAAoB,MAAM;AAC1B,qBAAiB,EAAE,UAAU,OAAO,CAAC;AAAA,EACvC;AAEA,SACE,8CAAC,WAAM,WAAW,GAAG,oBAAO,WAAW,IAAI,SAAS,IAClD,yDAAC,SAAI,WAAW,oBAAO,SAErB;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,sBAAsB,aAAa;AAAA,QAC5C,iBAAiB;AAAA,QAEjB;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,UAAU;AAAA,YACV,UAAU;AAAA;AAAA,QACZ;AAAA;AAAA,IACF;AAAA,IAGA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,qBAAqB,YAAY;AAAA,QAC1C,iBAAiB,oBAAoB,SAAS;AAAA,QAE9C;AAAA,UAAC;AAAA;AAAA,YACC,UAAU;AAAA,YACV;AAAA,YACA,UAAU;AAAA;AAAA,QACZ;AAAA;AAAA,IACF;AAAA,IAGA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,gBAAgB,OAAO;AAAA,QAChC,iBAAiB;AAAA,QAEjB;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,OAAO,EAAE,KAAK,UAAU,KAAK,SAAS;AAAA,YACtC,UAAU;AAAA,YACV,SAAS;AAAA,YACT,WAAW;AAAA,YACX;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAGA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,mBAAmB,UAAU;AAAA,QACtC,iBAAiB;AAAA,QAEjB,wDAAC,SAAI,WAAW,oBAAO,cACpB,2BAAiB,IAAI,YAAU;AAC9B,gBAAM,QAAQ,eAAe,OAAO,KAAK;AACzC,gBAAM,aAAa,UAAU,KAAK,CAAC,kBAAkB,SAAS,OAAO,KAAK;AAC1E,iBACE;AAAA,YAAC;AAAA;AAAA,cAEC,IAAI,YAAY,OAAO,KAAK;AAAA,cAC5B,OAAO,OAAO;AAAA,cACd;AAAA,cACA,SAAS,kBAAkB,SAAS,OAAO,KAAK;AAAA,cAChD,UAAU;AAAA,cACV,UAAU,MAAM,qBAAqB,OAAO,KAAK;AAAA;AAAA,YAN5C,OAAO;AAAA,UAOd;AAAA,QAEJ,CAAC,GACH;AAAA;AAAA,IACF;AAAA,IAGA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,kBAAkB,SAAS;AAAA,QACpC,iBAAiB,gBAAgB,SAAS,KAAK,iBAAiB,SAAS;AAAA,QAEzE,yDAAC,SAAI,WAAW,oBAAO,cACpB;AAAA,yBAAe,IAAI,YAAU;AAC5B,kBAAM,QAAQ,cAAc,OAAO,KAAK;AACxC,kBAAM,aAAa,UAAU,KAAK,CAAC,gBAAgB,SAAS,OAAO,KAAK;AACxE,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,IAAI,UAAU,OAAO,KAAK;AAAA,gBAC1B,OAAO,EAAE,OAAO,UAAU,oBAAoB;AAAA,gBAC9C;AAAA,gBACA,SAAS,gBAAgB,SAAS,OAAO,KAAK;AAAA,gBAC9C,UAAU;AAAA,gBACV,UAAU,MAAM,mBAAmB,OAAO,KAAK;AAAA;AAAA,cAN1C,OAAO;AAAA,YAOd;AAAA,UAEJ,CAAC;AAAA,UACA,eAAe,UAAU,IAAI,YAAU;AACtC,kBAAM,QAAQ,eAAe,OAAO,GAAG;AACvC,kBAAM,aAAa,UAAU,KAAK,CAAC,iBAAiB,SAAS,OAAO,GAAG;AACvE,mBACE;AAAA,cAAC;AAAA;AAAA,gBAEC,IAAI,WAAW,OAAO,GAAG;AAAA,gBACzB,OAAO,OAAO;AAAA,gBACd;AAAA,gBACA,SAAS,iBAAiB,SAAS,OAAO,GAAG;AAAA,gBAC7C,UAAU;AAAA,gBACV,UAAU,MAAM;AAAA,kBACd,iBAAiB,SAAS,OAAO,GAAG,IAChC,iBAAiB,OAAO,OAAK,MAAM,OAAO,GAAG,IAC7C,CAAC,GAAG,kBAAkB,OAAO,GAAG;AAAA,gBACtC;AAAA;AAAA,cAVK,OAAO;AAAA,YAWd;AAAA,UAEJ,CAAC;AAAA,WACH;AAAA;AAAA,IACF;AAAA,IAGC,eAAe,SAAS,cAAc,MAAM,SAAS,KACpD;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,gBAAgB,OAAO;AAAA,QAChC,iBAAiB,cAAc,SAAS;AAAA,QAExC;AAAA,UAAC;AAAA;AAAA,YACC,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,SAAS,cAAc;AAAA,YACvB,UAAU;AAAA;AAAA,QACZ;AAAA;AAAA,IACF;AAAA,IAIF;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,yBAAyB,gBAAgB;AAAA,QAClD,iBAAiB;AAAA,QAEjB;AAAA,UAAC;AAAA;AAAA,YACC,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,UAAU;AAAA;AAAA,QACZ;AAAA;AAAA,IACF;AAAA,IAGA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,kBAAkB,SAAS;AAAA,QACpC,iBAAiB,gBAAgB,SAAS;AAAA,QAE1C;AAAA,UAAC;AAAA;AAAA,YACC,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,UAAU;AAAA;AAAA,QACZ;AAAA;AAAA,IACF;AAAA,IAGC,eAAe,aAAa,cAAc,UAAU,SAAS,KAC5D;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,mBAAmB,UAAU;AAAA,QACtC,iBAAiB,kBAAkB,SAAS;AAAA,QAE5C;AAAA,UAAC;AAAA;AAAA,YACC,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,SAAS,cAAc;AAAA,YACvB,UAAU;AAAA;AAAA,QACZ;AAAA;AAAA,IACF;AAAA,IAID,eAAe,YAAY,cAAc,SAAS,SAAS,KAC1D;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,uBAAuB,gBAAgB;AAAA,QAChD,iBAAiB,iBAAiB,SAAS;AAAA,QAE3C;AAAA,UAAC;AAAA;AAAA,YACC,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,SAAS,cAAc;AAAA,YACvB,UAAU;AAAA;AAAA,QACZ;AAAA;AAAA,IACF;AAAA,KAEJ,GACF;AAEJ;;;AEzaA,IAAAC,iBAAiC;;;ACAjC;;;ADiCI,IAAAC,uBAAA;AAFJ,IAAMC,aAAY,MAChB,8CAAC,SAAI,OAAM,8BAA6B,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QACtF,wDAAC,UAAK,GAAE,wjBAAujB,MAAK,WAAS,GAC/kB;AAGK,IAAM,cAA0C,CAAC;AAAA,EACtD;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,kBAAkB,CAAC;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA,oBAAoB,CAAC;AAAA,EACrB,kBAAkB,CAAC;AAAA,EACnB,qBAAqB,CAAC;AAAA,EACtB,sBAAsB,CAAC;AAAA,EACvB,kBAAkB,CAAC;AAAA,EACnB,gBAAgB,CAAC;AAAA,EACjB,mBAAmB,CAAC;AAAA,EACpB,mBAAmB,CAAC;AAAA,EACpB,oBAAoB,CAAC;AAAA,EACrB,kBAAkB,CAAC;AAAA,EACnB;AAAA,EACA,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU,CAAC;AAAA,EACX,GAAG;AACL,MAAM;AACJ,QAAM,EAAE,EAAE,IAAI,aAAa;AAC3B,QAAM,qBAAqB,gBAAgB,SAAS;AAGpD,gCAAU,MAAM;AACd,QAAI,QAAQ;AACV,eAAS,KAAK,MAAM,WAAW;AAC/B,aAAO,MAAM;AACX,iBAAS,KAAK,MAAM,WAAW;AAAA,MACjC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,MAAI,CAAC,OAAQ,QAAO;AAEpB,SACE,8CAAC,SAAI,WAAW,oBAAO,SACrB,yDAAC,SAAI,WAAW,oBAAO,OAErB;AAAA,mDAAC,SAAI,WAAW,oBAAO,QACrB;AAAA,oDAAC,QAAG,WAAW,oBAAO,OACnB,YAAE,kBAAkB,SAAS,GAChC;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,UAAQ;AAAA,UACR,SAAS;AAAA,UACT,cAAY,EAAE,gBAAgB,OAAO;AAAA,UAErC,wDAACA,YAAA,EAAU;AAAA;AAAA,MACb;AAAA,OACF;AAAA,IAGA,+CAAC,SAAI,WAAW,oBAAO,SAEpB;AAAA,sBAAgB,SAAS,KAAK,kBAAkB,qBAC7C,8CAAC,SAAI,WAAW,oBAAO,iBACrB;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,UAAU;AAAA,UACV,YAAY;AAAA;AAAA,MACd,GACF;AAAA,MAEJ;AAAA,QAAC;AAAA;AAAA,UACE,GAAG;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,oBAAO;AAAA;AAAA,MACpB;AAAA,OACF;AAAA,IAGA,+CAAC,SAAI,WAAW,oBAAO,QACpB;AAAA,2BACC;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,WAAW,oBAAO;AAAA,UAClB,SAAS;AAAA,UACT,UAAU,CAAC;AAAA,UAEV,YAAE,oBAAoB,WAAW;AAAA;AAAA,MACpC;AAAA,MAEF;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,SAAS;AAAA,UAER,YAAE,uBAAuB,sBAAsB,EAAE,QAAQ,WAAW,OAAO,WAAW,CAAC;AAAA;AAAA,MAC1F;AAAA,OACF;AAAA,KACF,GACF;AAEJ;;;AErII,IAAAC,uBAAA;AAZG,IAAMC,aAAY,CAAC,EAAE,SAAS,OAAO,YAAY,IAAI,OAAO,GAAG,MACpE;AAAA,EAAC;AAAA;AAAA,IACC,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR;AAAA,IACA,MAAM,SAAS,iBAAiB;AAAA,IAChC,QAAO;AAAA,IACP,aAAa;AAAA,IACb,eAAc;AAAA,IACd,gBAAe;AAAA,IAEf,wDAAC,UAAK,GAAE,4IAA2I;AAAA;AACrJ;AAGFA,WAAU,cAAc;;;ACdtB,IAAAC,uBAAA;AADK,IAAMC,YAAW,CAAC,EAAE,SAAS,MAAM,YAAY,IAAI,OAAO,EAAE,MACjE;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IACL;AAAA,IAEA;AAAA,oDAAC,OAAE,UAAS,yBACV;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,MAAM,SAAS,YAAY;AAAA;AAAA,MAC7B,GACF;AAAA,MACA,8CAAC,UACC,wDAAC,cAAS,IAAG,mBACX,wDAAC,UAAK,OAAM,KAAI,QAAO,KAAI,MAAK,SAAQ,WAAU,gCAA+B,GACnF,GACF;AAAA;AAAA;AACF;AAGFA,UAAS,cAAc;;;ACZnB,IAAAC,uBAAA;AAbG,IAAM,kBAAkB,CAAC,EAAE,YAAY,IAAI,OAAO,GAAG,MAC1D;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,QAAO;AAAA,IACP,aAAa;AAAA,IACb,eAAc;AAAA,IACd,gBAAe;AAAA,IACf;AAAA,IAEA,wDAAC,cAAS,QAAO,mBAAkB;AAAA;AACrC;AAGF,gBAAgB,cAAc;;;ACJ1B,IAAAC,uBAAA;AAbG,IAAMC,oBAAmB,CAAC,EAAE,YAAY,IAAI,OAAO,GAAG,MAC3D;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,QAAO;AAAA,IACP,aAAa;AAAA,IACb,eAAc;AAAA,IACd,gBAAe;AAAA,IACf;AAAA,IAEA,wDAAC,cAAS,QAAO,kBAAiB;AAAA;AACpC;AAGFA,kBAAiB,cAAc;;;AChB7B,IAAAC,uBAAA;AADK,IAAMC,WAAU,CAAC,EAAE,YAAY,IAAI,OAAO,GAAG,MAClD;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAQ;AAAA,IACR,MAAK;AAAA,IACL;AAAA,IAEA;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,UAAS;AAAA,UACT,UAAS;AAAA,UACT,GAAE;AAAA,UACF,MAAK;AAAA;AAAA,MACP;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,UAAS;AAAA,UACT,UAAS;AAAA,UACT,GAAE;AAAA,UACF,MAAK;AAAA;AAAA,MACP;AAAA;AAAA;AACF;AAGFA,SAAQ,cAAc;;;AC7Bf,IAAM,cAAc,CACzB,QACA,WAAmB,OACnB,SAAiB,YACN;AACX,SAAO,IAAI,KAAK,aAAa,QAAQ;AAAA,IACnC,OAAO;AAAA,IACP;AAAA,IACA,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,EACzB,CAAC,EAAE,OAAO,MAAM;AAClB;;;ACXA,sBAA8C;AAC9C,oBAAiC;AAEjC,IAAM,UAAkC,EAAE,sBAAI,IAAI,oBAAM,sBAAI,qBAAG;AAExD,IAAM,aAAa,CACxB,MACA,YAAoB,gBACpB,SAAiB,SACN;AACX,QAAM,IAAI,OAAO,SAAS,eAAW,0BAAS,IAAI,IAAI;AACtD,aAAO,wBAAO,GAAG,WAAW,EAAE,QAAQ,QAAQ,MAAM,KAAK,iBAAG,CAAC;AAC/D;AAEO,IAAM,kBAAkB,CAC7B,SACA,UACA,SAAiB,SACN;AACX,QAAM,QAAQ,WAAW,SAAS,OAAO,MAAM;AAC/C,QAAM,MAAM,WAAW,UAAU,gBAAgB,MAAM;AACvD,SAAO,GAAG,KAAK,MAAM,GAAG;AAC1B;;;ACtBO,IAAM,oBAAoB,CAC/B,eACA,oBACW;AACX,MAAI,iBAAiB,EAAG,QAAO;AAC/B,SAAO,KAAK,OAAQ,gBAAgB,mBAAmB,gBAAiB,GAAG;AAC7E;","names":["ChevronRightIcon","HeartIcon","PinIcon","StarIcon","import_react","import_jsx_runtime","import_jsx_runtime","cx","import_jsx_runtime","cx","containerClasses","import_jsx_runtime","cx","lineClass","import_jsx_runtime","cx","import_react","import_jsx_runtime","cx","import_jsx_runtime","cx","import_jsx_runtime","cx","import_react","import_jsx_runtime","cx","CloseIcon","import_jsx_runtime","cx","StarIcon","import_react","import_jsx_runtime","cx","defaultValue","import_react","import_jsx_runtime","cx","defaultValue","import_jsx_runtime","cx","containerClasses","import_jsx_runtime","cx","import_react","import_jsx_runtime","cx","ChevronIcon","import_jsx_runtime","cx","import_react","import_jsx_runtime","cx","import_react","import_react","import_react","useI18nTranslation","import_react","import_react","import_jsx_runtime","cx","today","import_jsx_runtime","cx","cxMod","months","import_jsx_runtime","cx","cxMod","getDateLocale","format","months","import_jsx_runtime","_","import_react","import_jsx_runtime","HeartIcon","import_jsx_runtime","StarIcon","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","CloseIcon","import_jsx_runtime","HeartIcon","import_jsx_runtime","StarIcon","import_jsx_runtime","import_jsx_runtime","ChevronRightIcon","import_jsx_runtime","PinIcon"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/context/UIContext.tsx","../src/locales/de.json","../src/locales/en.json","../src/locales/fr.json","../src/locales/it.json","../src/locales/index.ts","../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/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/DateSelector/DateSelector.tsx","../src/hooks/useDebounce.ts","../src/hooks/useResponsive.ts","../src/hooks/useWindowData.ts","../src/hooks/useTranslation.ts","../src/components/DateSelector/WhenContent.tsx","../src/components/DateSelector/DualCalendar.tsx","../src/components/GuestSelector/GuestContent.tsx","../src/components/HotelCard/HotelCardImage.tsx","../src/components/HotelCard/HotelCardContent.tsx","../src/components/HotelCard/HotelCard.tsx","../src/components/Filters/FilterCheckboxItem.module.css","../src/components/Filters/FilterCheckboxItem.tsx","../src/components/Filters/CollapsibleFilterSection.tsx","../src/components/Filters/CollapsibleFilterSection.module.css","../src/components/Filters/PriceRangeFilter.tsx","../src/components/Filters/PriceRangeFilter.module.css","../src/components/Filters/HotelCategoryFilter.module.css","../src/components/Filters/HotelCategoryFilter.tsx","../src/components/Filters/ReviewsFilter.module.css","../src/components/Filters/ReviewsFilter.tsx","../src/components/Filters/ExperienceFilter.tsx","../src/components/Filters/ExperienceFilter.module.css","../src/components/Filters/RegionsFilter.tsx","../src/components/Filters/RegionsFilter.module.css","../src/components/Filters/CheckboxFilter.module.css","../src/components/Filters/CheckboxFilter.tsx","../src/components/Filters/SelectedFiltersRow.module.css","../src/components/Filters/SelectedFiltersRow.tsx","../src/components/Filters/FilterPanel.tsx","../src/components/Filters/FilterPanel.module.css","../src/components/Filters/FilterModal.tsx","../src/components/Filters/FilterModal.module.css","../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","../src/utils/formatDate.ts","../src/utils/calculateDiscount.ts"],"sourcesContent":["// @hotelcard/ui - Shared UI Components\n// Version: 0.0.18\n\n// =================================================================\n// CONTEXT / PROVIDER\n// =================================================================\n\nexport {\n HotelCardUIProvider,\n useUIContext,\n type UIContextValue,\n type HotelCardUIProviderProps,\n type TranslateFunction,\n} from './context';\n\n// =================================================================\n// COMPONENTS\n// =================================================================\n\n// Button\nexport { Button } from './components/Button';\nexport type { ButtonProps } from './components/Button';\n\n// Badge\nexport { Badge } from './components/Badge';\nexport type { BadgeProps } from './components/Badge';\n\n// Rating\nexport { Rating } from './components/Rating';\nexport type { RatingProps } from './components/Rating';\n\n// Divider\nexport { Divider } from './components/Divider';\nexport type { DividerProps } from './components/Divider';\n\n// Chip\nexport { Chip } from './components/Chip';\nexport type { ChipProps, ChipSize, ChipState } from './components/Chip';\n\n// Checkbox\nexport { Checkbox } from './components/Checkbox';\nexport type { CheckboxProps, CheckboxSize } from './components/Checkbox';\n\n// RadioButton\nexport { RadioButton } from './components/RadioButton';\nexport type { RadioButtonProps } from './components/RadioButton';\n\n// SectionHeader\nexport { SectionHeader } from './components/SectionHeader';\nexport type { SectionHeaderProps } from './components/SectionHeader';\n\n// Modal\nexport { Modal } from './components/Modal';\nexport type { ModalProps } from './components/Modal';\n\n// Card\nexport { Card } from './components/Card';\nexport type { CardProps, CardBadge, CardRatingInfo } from './components/Card';\n\n// Dropdown\nexport { Dropdown } from './components/Dropdown';\nexport type { DropdownProps, DropdownOption } from './components/Dropdown';\n\n// Input\nexport { Input } from './components/Input';\nexport type { InputProps, InputType } from './components/Input';\n\n// Block\nexport { Block } from './components/Block';\nexport type { BlockProps } from './components/Block';\n\n// ReviewCard\nexport { ReviewCard } from './components/ReviewCard';\nexport type { ReviewCardProps } from './components/ReviewCard';\n\n// FAQ\nexport { FAQ } from './components/FAQ';\nexport type { FAQProps, FAQItem } from './components/FAQ';\n\n// Benefits\nexport { Benefits } from './components/Benefits';\nexport type { BenefitsProps, BenefitItem } from './components/Benefits';\n\n// Pin\nexport { Pin } from './components/Pin';\nexport type { PinProps } from './components/Pin';\n\n// DateSelector\nexport { DateSelector, WhenContent, DualCalendar } from './components/DateSelector';\nexport type { DateSelectorProps, DateRange, WhenContentProps } from './components/DateSelector';\n\n// GuestSelector\nexport { GuestContent } from './components/GuestSelector';\nexport type { GuestContentProps, GuestCounts, ChildAgeError } from './components/GuestSelector';\n\n// HotelCard\nexport { HotelCard, HotelCardImage, HotelCardContent } from './components/HotelCard';\nexport type {\n HotelCardProps,\n HotelCardHotel,\n HotelCardImageProps,\n HotelCardContentProps,\n} from './components/HotelCard';\n\n// Filters\nexport {\n // Base components\n FilterCheckboxItem,\n CollapsibleFilterSection,\n // Specific filters\n PriceRangeFilter,\n HotelCategoryFilter,\n CATEGORY_OPTIONS,\n ReviewsFilter,\n REVIEW_OPTIONS,\n ExperienceFilter,\n RegionsFilter,\n // Generic checkbox filter\n CheckboxFilter,\n MealsFilter,\n TransportFilter,\n WellnessFilter,\n // Selected filters display\n SelectedFiltersRow,\n // Complete panel and modal\n FilterPanel,\n FilterModal,\n} from './components/Filters';\nexport type {\n FilterCheckboxItemProps,\n CollapsibleFilterSectionProps,\n PriceRangeFilterProps,\n HotelCategoryFilterProps,\n CategoryOption,\n ReviewsFilterProps,\n ReviewOption,\n ExperienceFilterProps,\n ThemeAggregation,\n RegionsFilterProps,\n RegionOption,\n CheckboxFilterProps,\n FilterOption,\n SelectedFiltersRowProps,\n SelectedFilter,\n // Panel and modal types\n FilterPanelProps,\n FilterState,\n FilterOptions,\n FilterModalProps,\n} from './components/Filters';\n\n// =================================================================\n// ICONS\n// =================================================================\n\nexport { HeartIcon, StarIcon, ChevronLeftIcon, ChevronRightIcon, PinIcon } from './components/icons';\n\n// =================================================================\n// HOOKS\n// =================================================================\n\nexport { useDebounce, useResponsive, useWindowData, useTranslation } from './hooks';\n\n// =================================================================\n// UTILS\n// =================================================================\n\nexport { formatPrice } from './utils';\nexport { formatDate, formatDateRange } from './utils';\nexport { calculateDiscount } from './utils';\n\n// =================================================================\n// TYPES\n// =================================================================\n\nexport type { Hotel } from './types';\nexport type { Booking } from './types';\nexport type { User, Address, Membership } from './types';\nexport type { SearchParams, SearchFilters } from './types';\n\n// =================================================================\n// TRANSLATIONS\n// =================================================================\n\nexport { translations, type Locale, type TranslationKeys } from './locales';\n","import React, { createContext, useContext, ReactNode, useMemo } from 'react';\nimport { translations, type Locale } from '../locales';\n\n/** Translation function type */\nexport type TranslateFunction = (key: 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 /** 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 * 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, fallback?: string): string => {\n const value = getNestedValue(localeTranslations as Record<string, unknown>, key);\n return value ?? fallback ?? key;\n };\n}\n\nconst defaultT = createTranslateFunction('de');\n\nconst defaultValue: UIContextValue = {\n locale: 'de',\n currency: 'CHF',\n isDesktop: false,\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 /** 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 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, t }),\n [locale, currency, isDesktop, 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","{\n \"button\": {\n \"order\": \"Bestellen\",\n \"order-navigation\": \"Bestellen\",\n \"order-hc\": \"HotelCard bestellen\",\n \"my-account\": \"Mein Konto\",\n \"search\": \"Suchen\",\n \"back-to-top\": \"Nach oben\"\n },\n \"link\": {\n \"member-benefits\": \"Member Benefits\",\n \"view-all-hotels\": \"Alle Hoteldeals ansehen\",\n \"search-by-map\": \"Kartenansicht\",\n \"search-by-region\": \"Hotels nach Region\",\n \"search-by-experience\": \"Hotels nach Erlebnis\",\n \"travel-inspiration\": \"Reiseinspiration\",\n \"booking-tips-and-tricks\": \"Buchungstipps\",\n \"home\": \"Startseite\",\n \"all-hotel-deals\": \"Alle Hotelangebote\",\n \"search-results\": \"Suchergebnisse\"\n },\n \"general\": {\n \"signed-out\": \"Anmelden und buchen\",\n \"room-price\": \"ab CHF xxx / Zimmer\",\n \"guarantee\": \"14 Tage Geld-zurück-Garantie\",\n \"contact\": \"Weitere Fragen? Kontaktieren Sie uns.\",\n \"breakfast-included\": \"Frühstück inbegriffen\",\n \"free-cancellation\": \"Kostenlose Stornierung\",\n \"suggested-destinations\": \"Vorgeschlagene Reiseziele\",\n \"when-months\": \"Wann möchtest du reisen?\",\n \"hotel-deals-found\": \"Hotelangebote gefunden\",\n \"no-results\": \"Probieren Sie andere Reiseziele, ändern Sie Ihre Daten oder entfernen Sie einige Filter.\",\n \"unavailable-for-selected-days\": \"Für die ausgewählten Daten nicht verfügbar.\",\n \"cant-accommodate-all\": \"Das Hotel kann nicht alle Gäste beherbergen.\",\n \"reset-destination\": \"Zielsuche zurücksetzen, um Regionen zu filtern\"\n },\n \"label\": {\n \"price-from\": \"ab \",\n \"price-for\": \"/ Zimmer\",\n \"per-room-night\": \"pro Zimmer & Nacht ab\",\n \"new\": \"Neu\",\n \"anytime\": \"Jederzeit\",\n \"anywhere\": \"Alle Reiseziele\",\n \"dates\": \"Datum\",\n \"flexible\": \"Flexibel\",\n \"where\": \"Wohin\",\n \"when\": \"Wann\",\n \"who\": \"Wer\",\n \"nearby\": \"In der Nähe\",\n \"hotels\": \"Hotel\",\n \"filter\": \"Filter\",\n \"sort\": \"Sortieren\",\n \"map\": \"Karte\",\n \"rating\": \"Bewertung\",\n \"rating-excellent\": \"Ausgezeichnet\",\n \"rating-very-good\": \"Sehr gut\",\n \"rating-good\": \"Gut\",\n \"rating-fair\": \"Ansprechend\",\n \"rating-none\": \"Keine Bewertung\"\n },\n \"product\": {\n \"6m\": \"6-Monatsabo\",\n \"1y\": \"1-Jahresabo\",\n \"2y\": \"2-Jahresabo\",\n \"3y\": \"3-Jahresabo\",\n \"price-6m\": \"79.-\",\n \"price-6m-disc\": \"59.-\",\n \"price-1y\": \"99.-\",\n \"price-1y-disc\": \"79.-\",\n \"price-2y\": \"198.-\",\n \"price-2y-disc\": \"173.-\",\n \"price-3y\": \"297.-\",\n \"price-3y-disc\": \"247.-\",\n \"price-gift\": \"99.-\",\n \"price-gift-disc\": \"59.-\"\n },\n \"subheadline\": {\n \"your-hc\": \"Ihre HotelCard\",\n \"popular-hotels\": \"Beliebte Hotelangebote\",\n \"no-results\": \"Probieren Sie andere Reiseziele, ändern Sie Ihre Daten oder entfernen Sie einige Filter.\",\n \"sort-by\": \"Sortieren nach\"\n },\n \"form\": {\n \"guests\": \"Gäste\",\n \"guest\": \"Gast\",\n \"adults\": \"Erwachsene\",\n \"children\": \"Kinder\",\n \"pet\": \"Haustier\",\n \"age-of-child\": \"Alter des Kindes\",\n \"age\": \"Alter\",\n \"age-error\": \"Bitte wählen Sie das Alter aus\"\n },\n \"filter\": {\n \"filters\": \"Filter\",\n \"destination\": \"Reiseziel\",\n \"experience\": \"Erlebnis\",\n \"show-all\": \"Alle anzeigen\",\n \"price\": \"Preis\",\n \"discount\": \"Rabatt\",\n \"services\": \"Leistungen\",\n \"meals\": \"Verpflegung\",\n \"hotel-category\": \"Hotelkategorie\",\n \"reviews\": \"Bewertungen\",\n \"mobility\": \"Mobilität\",\n \"wellness-spa\": \"Wellness & Spa\",\n \"price-high-low\": \"Preis: absteigend\",\n \"price-low-high\": \"Preis: aufsteigend\",\n \"best-rating\": \"Beste Bewertung\",\n \"most-popular\": \"Beliebt\",\n \"newest-hotels\": \"Neueste\",\n \"relevance\": \"Relevanz\",\n \"selected\": \"String value\",\n \"clear-all\": \"Alles löschen\",\n \"options\": \"Leistungen\",\n \"hotellerie-suisse\": \"Klassifikation HotellerieSuisse\",\n \"trustyou\": \"Bewertungen von Reisenden auf Trust You®\",\n \"select-all\": \"Alle auswählen\",\n \"reset\": \"Zurücksetzen\",\n \"breakfast-included\": \"Frühstück inbegriffen\"\n },\n \"headline\": {\n \"no-results\": \"Zurzeit entsprechen keine Aufenthalte Ihrer Suche\"\n }\n}\n","{\n \"button\": {\n \"order\": \"Order\",\n \"order-navigation\": \"Join\",\n \"order-hc\": \"Order HotelCard\",\n \"my-account\": \"My account\",\n \"search\": \"Search\",\n \"back-to-top\": \"Back to top\"\n },\n \"link\": {\n \"member-benefits\": \"Member Benefits\",\n \"view-all-hotels\": \"View all hotel deals\",\n \"search-by-map\": \"Map search\",\n \"search-by-region\": \"Hotels by region\",\n \"search-by-experience\": \"Hotels by experience\",\n \"travel-inspiration\": \"Travel inspiration\",\n \"booking-tips-and-tricks\": \"Booking tips\",\n \"home\": \"Home\",\n \"all-hotel-deals\": \"All hotel deals\",\n \"search-results\": \"Search results\"\n },\n \"general\": {\n \"signed-out\": \"Log in and book\",\n \"room-price\": \"from CHF xxx / room\",\n \"guarantee\": \"14-day money-back guarantee\",\n \"contact\": \"More questions? Contact us.\",\n \"breakfast-included\": \"Breakfast included\",\n \"free-cancellation\": \"Free cancellation\",\n \"suggested-destinations\": \"Not sure where to travel next?\",\n \"when-months\": \"When do you want to go?\",\n \"hotel-deals-found\": \"hotel deals found\",\n \"no-results\": \"Explore different destinations, change your dates, or remove some filters.\",\n \"unavailable-for-selected-days\": \"Unavailable for selected dates.\",\n \"cant-accommodate-all\": \"Hotel can’t accommodate all guests.\",\n \"reset-destination\": \"Reset destination search to use region filters.\"\n },\n \"label\": {\n \"price-from\": \"from \",\n \"price-for\": \"/ room\",\n \"per-room-night\": \"per room & night from\",\n \"new\": \"New\",\n \"anytime\": \"Anytime\",\n \"anywhere\": \"All destinations\",\n \"dates\": \"Dates\",\n \"flexible\": \"Flexible\",\n \"where\": \"Where\",\n \"when\": \"When\",\n \"who\": \"Who\",\n \"nearby\": \"Nearby\",\n \"hotels\": \"Hotel\",\n \"filter\": \"Filter\",\n \"sort\": \"Sort\",\n \"map\": \"Map\",\n \"rating\": \"Rating\",\n \"rating-excellent\": \"Excellent\",\n \"rating-very-good\": \"Very good\",\n \"rating-good\": \"Good\",\n \"rating-fair\": \"Fair\",\n \"rating-none\": \"No rating\"\n },\n \"product\": {\n \"6m\": \"6-month subscription\",\n \"1y\": \"1-year subscription\",\n \"2y\": \"2-year subscription\",\n \"3y\": \"3-year subscription\",\n \"price-6m\": \"79.-\",\n \"price-6m-disc\": \"59.-\",\n \"price-1y\": \"99.-\",\n \"price-1y-disc\": \"79.-\",\n \"price-2y\": \"198.-\",\n \"price-2y-disc\": \"173.-\",\n \"price-3y\": \"297.-\",\n \"price-3y-disc\": \"247.-\",\n \"price-gift\": \"99.-\",\n \"price-gift-disc\": \"59.-\"\n },\n \"subheadline\": {\n \"your-hc\": \"Your HotelCard\",\n \"popular-hotels\": \"Popular hotel deals\",\n \"no-results\": \"Explore different destinations, change your dates, or remove some filters.\",\n \"sort-by\": \"Sort by\"\n },\n \"form\": {\n \"guests\": \"guests\",\n \"guest\": \"guest\",\n \"adults\": \"Adults\",\n \"children\": \"Children\",\n \"pet\": \"Pet\",\n \"age-of-child\": \"Child’s age\",\n \"age\": \"Age\",\n \"age-error\": \"Please select age\"\n },\n \"filter\": {\n \"filters\": \"Filters\",\n \"destination\": \"Destination\",\n \"experience\": \"Experience\",\n \"show-all\": \"Show all\",\n \"price\": \"Price\",\n \"discount\": \"Discount\",\n \"services\": \"Services\",\n \"meals\": \"Meals\",\n \"hotel-category\": \"Hotel category\",\n \"reviews\": \"Reviews\",\n \"mobility\": \"Mobility\",\n \"wellness-spa\": \"Wellness & Spa\",\n \"price-high-low\": \"Price high to low\",\n \"price-low-high\": \"Price low to high\",\n \"best-rating\": \"Best guest rating\",\n \"most-popular\": \"Most popular\",\n \"newest-hotels\": \"Newest\",\n \"relevance\": \"Relevance\",\n \"selected\": \"Selected\",\n \"clear-all\": \"Clear all\",\n \"options\": \"Options\",\n \"hotellerie-suisse\": \"Classification HotellerieSuisse\",\n \"trustyou\": \"Reviews from travelers on TrustYou®\",\n \"select-all\": \"Select all\",\n \"reset\": \"Reset\",\n \"breakfast-included\": \"Breakfast included\"\n },\n \"headline\": {\n \"no-results\": \"No stays match your search right now\"\n }\n}\n","{\n \"button\": {\n \"order\": \"Commander\",\n \"order-navigation\": \"Commander\",\n \"order-hc\": \"Commander l'HotelCard\",\n \"my-account\": \"Mon compte\",\n \"search\": \"Rechercher\",\n \"back-to-top\": \"Haut de page\"\n },\n \"link\": {\n \"member-benefits\": \"Member Benefits\",\n \"view-all-hotels\": \"Découvrez toutes nos offres\",\n \"search-by-map\": \"Recherche sur la carte\",\n \"search-by-region\": \"Hôtels par région\",\n \"search-by-experience\": \"Hôtels par expérience\",\n \"travel-inspiration\": \"Inspiration voyage\",\n \"booking-tips-and-tricks\": \"Conseils réservation\",\n \"home\": \"Accueil\",\n \"all-hotel-deals\": \"Toutes les offres d’hôtels\",\n \"search-results\": \"Résultats de recherche\"\n },\n \"general\": {\n \"signed-out\": \"Se connecter et réserver\",\n \"room-price\": \"à partir de CHF XXX par chambre\",\n \"guarantee\": \"Garantie de remboursement de 14 jours\",\n \"contact\": \"D’autres questions ? Contactez-nous.\",\n \"breakfast-included\": \"Petit-déjeuner inclus\",\n \"free-cancellation\": \"Annulation gratuite\",\n \"suggested-destinations\": \"Suggestions de destinations\",\n \"when-months\": \"Quand souhaitez-vous partir ?\",\n \"hotel-deals-found\": \"offres d’hôtel trouvées\",\n \"no-results\": \"Explorez d’autres destinations, modifiez vos dates ou retirez certains filtres.\",\n \"unavailable-for-selected-days\": \"Indisponible aux dates sélectionnées.\",\n \"cant-accommodate-all\": \"L’hôtel ne peut pas accueillir tous les voyageurs.\",\n \"reset-destination\": \"Réinitialiser la destination et filtrer par région\"\n },\n \"label\": {\n \"price-from\": \"à partir de \",\n \"price-for\": \"par chambre\",\n \"per-room-night\": \"par chambre & nuit dès\",\n \"new\": \"Nouveau\",\n \"anytime\": \"À tout moment\",\n \"anywhere\": \"Toutes les destinations\",\n \"dates\": \"Dates\",\n \"flexible\": \"Flexible\",\n \"where\": \"Destination\",\n \"when\": \"Quand\",\n \"who\": \"Voyageurs\",\n \"nearby\": \"À proximité\",\n \"hotels\": \"Hôtel\",\n \"filter\": \"Filtrer\",\n \"sort\": \"Trier\",\n \"map\": \"Carte\",\n \"rating\": \"Note\",\n \"rating-excellent\": \"Excellent\",\n \"rating-very-good\": \"Très bien\",\n \"rating-good\": \"Bien\",\n \"rating-fair\": \"Moyen\",\n \"rating-none\": \"Aucune notation\"\n },\n \"product\": {\n \"6m\": \"Abonnement de 6 mois\",\n \"1y\": \"Abonnement 1 an\",\n \"2y\": \"Abonnement 2 ans\",\n \"3y\": \"Abonnement 3 ans\",\n \"price-6m\": \"79.-\",\n \"price-6m-disc\": \"59.-\",\n \"price-1y\": \"99.-\",\n \"price-1y-disc\": \"79.-\",\n \"price-2y\": \"198.-\",\n \"price-2y-disc\": \"173.-\",\n \"price-3y\": \"297.-\",\n \"price-3y-disc\": \"247.-\",\n \"price-gift\": \"99.-\",\n \"price-gift-disc\": \"59.-\"\n },\n \"subheadline\": {\n \"your-hc\": \"Votre HotelCard\",\n \"popular-hotels\": \"Offres d’hôtels populaires\",\n \"no-results\": \"Explorez d’autres destinations, modifiez vos dates ou retirez certains filtres.\",\n \"sort-by\": \"Trier par\"\n },\n \"form\": {\n \"guests\": \"personnes\",\n \"guest\": \"personne\",\n \"adults\": \"Adultes\",\n \"children\": \"Enfants\",\n \"pet\": \"Animal domestique\",\n \"age-of-child\": \"Âge de l’enfant\",\n \"age\": \"Âge\",\n \"age-error\": \"Veuillez sélectionner l’âge\"\n },\n \"filter\": {\n \"filters\": \"Filtres\",\n \"destination\": \"Destination\",\n \"experience\": \"Expérience\",\n \"show-all\": \"Tout afficher\",\n \"price\": \"Prix\",\n \"discount\": \"Réduction\",\n \"services\": \"Services\",\n \"meals\": \"Repas\",\n \"hotel-category\": \"Catégorie d’hôtel\",\n \"reviews\": \"Avis\",\n \"mobility\": \"Mobilité\",\n \"wellness-spa\": \"Bien-être & Spa\",\n \"price-high-low\": \"Prix : du plus bas\",\n \"price-low-high\": \"Prix : du plus élevé\",\n \"best-rating\": \"Meilleure note\",\n \"most-popular\": \"Plus populaires\",\n \"newest-hotels\": \"Plus récents\",\n \"relevance\": \"Pertinence\",\n \"selected\": \"String value\",\n \"clear-all\": \"Tout effacer\",\n \"options\": \"Services\",\n \"hotellerie-suisse\": \"Classification HotellerieSuisse\",\n \"trustyou\": \"Avis de voyageurs sur TrustYou®\",\n \"select-all\": \"Tout sélectionner\",\n \"reset\": \"Réinitialiser\",\n \"breakfast-included\": \"Petit-déjeuner inclus\"\n },\n \"headline\": {\n \"no-results\": \"Aucun séjour ne correspond à votre recherche pour le moment\"\n }\n}\n","{\n \"button\": {\n \"order\": \"Ordina ora\",\n \"order-navigation\": \"Ordina ora\",\n \"order-hc\": \"Ordina HotelCard\",\n \"my-account\": \"Il mio profilo\",\n \"search\": \"Cerca\",\n \"back-to-top\": \"Torna su\"\n },\n \"link\": {\n \"member-benefits\": \"Member Benefits\",\n \"view-all-hotels\": \"Tutte le offerte hotel\",\n \"search-by-map\": \"Ricerca sulla mappa\",\n \"search-by-region\": \"Hotel per regione\",\n \"search-by-experience\": \"Hotel per esperienza\",\n \"travel-inspiration\": \"Ispirazioni di viaggio\",\n \"booking-tips-and-tricks\": \"Consigli prenotazione\",\n \"home\": \"Home\",\n \"all-hotel-deals\": \"Tutte le offerte hotel\",\n \"search-results\": \"Risultati di ricerca\"\n },\n \"general\": {\n \"signed-out\": \"Accedi e prenota\",\n \"room-price\": \"a partire da CHF xxx per camera\",\n \"guarantee\": \"Garanzia di rimborso di 14 giorni\",\n \"contact\": \"Altre domande? Contattaci.\",\n \"breakfast-included\": \"Colazione inclusa\",\n \"free-cancellation\": \"Cancellazione gratuita\",\n \"suggested-destinations\": \"Destinazioni suggerite\",\n \"when-months\": \"Quando vuoi viaggiare?\",\n \"hotel-deals-found\": \"offerte hotel trovate\",\n \"no-results\": \"Prova altre destinazioni, cambia le date o rimuovi qualche filtro.\",\n \"unavailable-for-selected-days\": \"Non disponibile per le date selezionate.\",\n \"cant-accommodate-all\": \"L’hotel non può accogliere tutti gli ospiti.\",\n \"reset-destination\": \"Reimposta la destinazione e filtra per regione\"\n },\n \"label\": {\n \"price-from\": \"a partire da \",\n \"price-for\": \"per camera\",\n \"per-room-night\": \"per camera e notte da\",\n \"new\": \"Nuovo\",\n \"anytime\": \"In qualsiasi momento\",\n \"anywhere\": \"Tutte le destinazioni\",\n \"dates\": \"Date\",\n \"flexible\": \"Flessibile\",\n \"where\": \"Dove\",\n \"when\": \"Date\",\n \"who\": \"Chi\",\n \"nearby\": \"Nelle vicinanze\",\n \"hotels\": \"Hotel\",\n \"filter\": \"Filtra\",\n \"sort\": \"Ordina\",\n \"map\": \"Mappa\",\n \"rating\": \"Rating\",\n \"rating-excellent\": \"Eccellente\",\n \"rating-very-good\": \"Ottimo\",\n \"rating-good\": \"Buono\",\n \"rating-fair\": \"Sufficiente\",\n \"rating-none\": \"Nessun voto\"\n },\n \"product\": {\n \"6m\": \"Abbonamento di 6 mesi\",\n \"1y\": \"Abbonamento 1 anno\",\n \"2y\": \"Abbonamento 2 anni\",\n \"3y\": \"Abbonamento 3 anni\",\n \"price-6m\": \"79.-\",\n \"price-6m-disc\": \"59.-\",\n \"price-1y\": \"99.-\",\n \"price-1y-disc\": \"79.-\",\n \"price-2y\": \"198.-\",\n \"price-2y-disc\": \"173.-\",\n \"price-3y\": \"297.-\",\n \"price-3y-disc\": \"247.-\",\n \"price-gift\": \"99.-\",\n \"price-gift-disc\": \"59.-\"\n },\n \"subheadline\": {\n \"your-hc\": \"La sua HotelCard\",\n \"popular-hotels\": \"Offerte hotel popolari\",\n \"no-results\": \"Prova altre destinazioni, cambia le date o rimuovi qualche filtro.\",\n \"sort-by\": \"Ordina per\"\n },\n \"form\": {\n \"guests\": \"ospiti\",\n \"guest\": \"ospite\",\n \"adults\": \"Adulti\",\n \"children\": \"Bambini\",\n \"pet\": \"Animale domestico\",\n \"age-of-child\": \"L'età del bambino\",\n \"age\": \"L'età\",\n \"age-error\": \"Seleziona l’età\"\n },\n \"filter\": {\n \"filters\": \"Filtri\",\n \"destination\": \"Destinazione\",\n \"experience\": \"Esperienza\",\n \"show-all\": \"Mostra tutto\",\n \"price\": \"Prezzo\",\n \"discount\": \"Sconto\",\n \"services\": \"Servizi\",\n \"meals\": \"Pasti\",\n \"hotel-category\": \"Categoria hotel\",\n \"reviews\": \"Recensioni\",\n \"mobility\": \"Mobilità\",\n \"wellness-spa\": \"Wellness & Spa\",\n \"price-high-low\": \"Prezzo: dal più basso\",\n \"price-low-high\": \"Prezzo: dal più alto\",\n \"best-rating\": \"Miglior voto\",\n \"most-popular\": \"Più popolari\",\n \"newest-hotels\": \"Più recenti\",\n \"relevance\": \"Rilevanza\",\n \"selected\": \"String value\",\n \"clear-all\": \"Cancella tutto\",\n \"options\": \"Servizi\",\n \"hotellerie-suisse\": \"Classificazione HotellerieSuisse\",\n \"trustyou\": \"Recensioni dei viaggiatori su TrustYou®\",\n \"select-all\": \"Seleziona tutto\",\n \"reset\": \"Reimposta\",\n \"breakfast-included\": \"Colazione inclusa\"\n },\n \"headline\": {\n \"no-results\": \"Al momento nessun soggiorno corrisponde alla tua ricerca\"\n }\n}\n","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 { 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, 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, { useState, useRef, useEffect, useMemo } from 'react';\nimport { useWindowData, useResponsive } from '../../hooks';\nimport { useUIContext } from '../../context';\nimport { WhenContent, type DateRange } from './WhenContent';\nimport './DateSelector.css';\n\n// CSS class prefix\nconst cx = (name: string) => `hc-date-selector${name ? `__${name}` : ''}`;\nconst cxMod = (base: string, mod: string) => `hc-date-selector__${base}--${mod}`;\n\n// Map app locale to BCP 47 locale tag\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\n// Default calendar icon\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\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 */\n onClose?: (dateRange: DateRange | null, monthFilter: string[] | null) => void;\n disabled?: boolean;\n className?: string;\n icon?: React.ReactNode;\n}\n\n/**\n * DateSelector - Date range and flexible month picker\n *\n * Features:\n * - Calendar for specific date range\n * - Month chips for flexible dates\n * - \"Anytime\" option\n * - Desktop: centered dropdown\n * - Mobile: bottom sheet\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\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 state when parent changes\n useEffect(() => {\n setDateRange((prev) => {\n if (prev.start === initialDateRange.start && prev.end === initialDateRange.end) {\n return prev;\n }\n return initialDateRange;\n });\n\n setSelectedMonths((prev) => {\n const next = initialMonthFilter || [];\n if (prev.length === next.length && prev.every((m, i) => m === next[i])) {\n return prev;\n }\n return next;\n });\n }, [initialDateRange.start, initialDateRange.end, initialMonthFilter]);\n\n // Close dropdown on outside click\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 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 };\n\n document.addEventListener('pointerdown', handlePointerDown);\n return () => document.removeEventListener('pointerdown', handlePointerDown);\n }, [isOpen, dateRange, selectedMonths, onChange, onMonthFilterChange, onClose]);\n\n // Generate months for display\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 // Display label\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 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', 'Flexible');\n }\n\n if (selectedMonths.length > 1) {\n return `${selectedMonths.length} months`;\n }\n\n return t('label.flexible', 'Flexible');\n };\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 const handleApply = () => {\n if (dateRange.start && dateRange.end) {\n onChange?.(dateRange);\n } else {\n onChange?.(null);\n }\n onMonthFilterChange?.(selectedMonths.length ? selectedMonths : null);\n setIsOpen(false);\n };\n\n const handleBackdropClick = () => {\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\n const buttonClasses = [\n cx('button'),\n disabled && cxMod('button', 'disabled'),\n className,\n ].filter(Boolean).join(' ');\n\n const dropdownClasses = [\n cx('dropdown'),\n isOpen && cxMod('dropdown', 'open'),\n !isDesktop && cxMod('dropdown', 'mobile'),\n ].filter(Boolean).join(' ');\n\n return (\n <div ref={dropdownRef} className={cx('')}>\n <button\n type=\"button\"\n className={buttonClasses}\n onClick={() => !disabled && setIsOpen((v) => !v)}\n disabled={disabled}\n >\n <span className={cx('icon')}>{icon || <CalendarIcon />}</span>\n <span className={cx('label')}>{formatDateDisplay()}</span>\n </button>\n\n {/* Backdrop */}\n {isOpen && (\n <div className={cx('backdrop')} onClick={handleBackdropClick} aria-hidden=\"true\" />\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\nDateSelector.displayName = 'DateSelector';\n\nexport { DateSelector };\nexport type { DateRange };\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, options?: 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 * @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, options, fallback) => {\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 && fallback !== undefined) {\n return fallback;\n }\n return resultStr;\n };\n\n return { t, i18n };\n};\n","import React, { useState, useEffect } from 'react';\nimport { useWindowData, useResponsive } from '../../hooks';\nimport { useUIContext } from '../../context';\nimport { Button } from '../Button';\nimport { DualCalendar } from './DualCalendar';\nimport './WhenContent.css';\n\n// CSS class prefix\nconst cx = (name: string) => `hc-when-content${name ? `__${name}` : ''}`;\nconst cxMod = (base: string, mod: string) => `hc-when-content__${base}--${mod}`;\n\n// Map app locale to BCP 47 locale tag\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 /** Override locale for date formatting (defaults to context locale) */\n locale?: string;\n}\n\n/**\n * WhenContent - Shared date/time selection UI\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 *\n * Translations handled internally via UIContext.\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 locale: localeProp,\n}) => {\n const { locale: contextLocale } = useWindowData();\n const { isDesktop } = useResponsive();\n const { t } = useUIContext();\n\n const locale = localeProp || contextLocale;\n const dateLocale = getDateLocale(locale);\n\n // Get translations from context\n const labels = {\n when: t('label.when', 'When'),\n dates: t('label.dates', 'Dates'),\n flexible: t('label.flexible', 'Flexible'),\n apply: t('button.search', 'Apply'),\n selectMonths: t('general.when-months', 'Select months'),\n anytime: t('label.anytime', 'Anytime'),\n };\n\n const [dateRange, setDateRange] = useState<DateRange>(initialDateRange);\n const [mode, setMode] = useState<'anytime' | 'dates'>(\n initialDateRange.start ? 'dates' : 'anytime'\n );\n\n const selectedMonths = initialMonthFilter || [];\n const isAnytimeSelected = selectedMonths.length === 0;\n\n // Sync 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 return new Date().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 cx(''),\n variant === 'expanded' && cxMod('', 'expanded'),\n className,\n ].filter(Boolean).join(' ');\n\n const monthGridClasses = [\n cx('month-grid'),\n !isDesktop && cxMod('month-grid', 'mobile'),\n ].filter(Boolean).join(' ');\n\n const contentClasses = [\n cx('content'),\n mode === 'dates' && cxMod('content', 'dates'),\n ].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n {/* Section title - only in expanded variant */}\n {variant === 'expanded' && (\n <h2 className={cx('section-title')}>{labels.when}</h2>\n )}\n\n {/* Header with tabs and apply button */}\n <div className={cx('header')}>\n <div className={cx('tabs')}>\n <button\n type=\"button\"\n className={`${cx('tab')} ${mode === 'dates' ? cxMod('tab', 'active') : ''}`}\n onClick={() => handleModeSwitch('dates')}\n >\n {labels.dates}\n </button>\n <button\n type=\"button\"\n className={`${cx('tab')} ${mode === 'anytime' ? cxMod('tab', 'active') : ''}`}\n onClick={() => handleModeSwitch('anytime')}\n >\n {labels.flexible}\n </button>\n </div>\n {showApplyButton && (\n <div className={cx('apply')}>\n <Button variant=\"secondary\" size=\"medium\" onClick={handleApply}>\n {labels.apply}\n </Button>\n </div>\n )}\n </div>\n\n {/* Content */}\n <div className={contentClasses}>\n {mode === 'anytime' ? (\n <div className={cx('flexible')}>\n <h3 className={cx('heading')}>{labels.selectMonths}</h3>\n <div className={monthGridClasses}>\n {/* Anytime button */}\n <button\n type=\"button\"\n className={`${cx('month-button')} ${cx('anytime-button')} ${\n isAnytimeSelected ? cxMod('month-button', 'selected') : ''\n }`}\n onClick={handleAnytimeClick}\n >\n <span className={cx('month-label')}>{labels.anytime}</span>\n </button>\n {/* Month buttons */}\n {months.map((month) => (\n <button\n key={month.value}\n type=\"button\"\n className={`${cx('month-button')} ${\n selectedMonths.includes(month.value) ? cxMod('month-button', 'selected') : ''\n } ${month.disabled ? cxMod('month-button', 'disabled') : ''}`}\n onClick={() => !month.disabled && handleMonthToggle(month.value)}\n disabled={month.disabled}\n >\n <span className={cx('month-label')}>{month.label}</span>\n <span className={cx('month-year')}>{month.year}</span>\n </button>\n ))}\n </div>\n </div>\n ) : (\n <div className={cx('dates')}>\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 } from 'react';\nimport { useResponsive } from '../../hooks';\nimport './DualCalendar.css';\n\n// CSS class prefix\nconst cx = (name: string) => `hc-dual-calendar${name ? `__${name}` : ''}`;\nconst cxMod = (base: string, mod: string) => `hc-dual-calendar__${base}--${mod}`;\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\n const isStartDate = (dateStr: string) => startDate === dateStr;\n const isEndDate = (dateStr: string) => endDate === dateStr;\n const isMidDate = (dateStr: string) => {\n if (!startDate || !endDate) return false;\n return dateStr > startDate && dateStr < endDate;\n };\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 const day = new Date(date.getFullYear(), date.getMonth(), 1).getDay();\n return day === 0 ? 6 : day - 1; // Monday = 0\n };\n\n const formatMonthYear = (date: Date) => {\n return date.toLocaleDateString(locale, { month: 'long', year: 'numeric' });\n };\n\n const getWeekDays = () => {\n const days = [];\n const baseDate = new Date(2020, 0, 6); // Monday\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\n const isDateDisabled = (dateStr: string) => {\n const today = new Date();\n const oneYearFromToday = new Date(today.getFullYear() + 1, today.getMonth(), today.getDate());\n const dateParts = dateStr.split('-').map(Number);\n const date = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]);\n\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 if (date > oneYearFromToday) return true;\n return false;\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 for (let i = 0; i < firstDay; i++) {\n days.push(<div key={`empty-${i}`} className={cx('day')} />);\n }\n\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 classes = [\n cx('day'),\n cx('day-button'),\n disabled && cxMod('day-button', 'disabled'),\n start && cxMod('day-button', 'start'),\n end && cxMod('day-button', 'end'),\n inRange && cxMod('day-button', 'in-range'),\n ].filter(Boolean).join(' ');\n\n days.push(\n <button\n key={day}\n type=\"button\"\n className={classes}\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 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 const nextMonth = new Date(currentMonth.getFullYear(), currentMonth.getMonth() + 1, 1);\n const isNextDisabled = nextMonth >= maxMonth;\n\n const PrevArrow = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\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 const NextArrow = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\">\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 const navButtonClasses = (disabled: boolean) => [\n cx('nav-button'),\n disabled && cxMod('nav-button', 'disabled'),\n ].filter(Boolean).join(' ');\n\n return (\n <div className={`${cx('')} ${!isDesktop ? cxMod('', 'mobile') : ''}`}>\n {/* Mobile: Navigation row at top */}\n {!isDesktop && (\n <div className={cx('navigation')}>\n <button\n type=\"button\"\n className={navButtonClasses(isPrevDisabled)}\n onClick={handlePrevMonth}\n disabled={isPrevDisabled}\n >\n <PrevArrow />\n </button>\n <h3 className={`${cx('month-title')} ${cx('month-title--mobile')}`}>\n {formatMonthYear(currentMonth)}\n </h3>\n <button\n type=\"button\"\n className={navButtonClasses(isNextDisabled)}\n onClick={handleNextMonth}\n disabled={isNextDisabled}\n >\n <NextArrow />\n </button>\n </div>\n )}\n\n {/* Desktop: Dual calendar with nav on sides */}\n {isDesktop ? (\n <div className={cx('desktop-layout')}>\n <button\n type=\"button\"\n className={navButtonClasses(isPrevDisabled)}\n onClick={handlePrevMonth}\n disabled={isPrevDisabled}\n >\n <PrevArrow />\n </button>\n\n <div className={cx('calendars')}>\n {/* First Calendar */}\n <div className={cx('calendar')}>\n <h3 className={cx('month-title')}>{formatMonthYear(currentMonth)}</h3>\n <div className={cx('weekdays')}>\n {weekDays.map((day, i) => (\n <div key={day} className={`${cx('weekday')} ${i >= 5 ? cxMod('weekday', 'weekend') : ''}`}>\n {day}\n </div>\n ))}\n </div>\n <div className={cx('days')}>{generateCalendar(0)}</div>\n </div>\n\n {/* Second Calendar */}\n <div className={cx('calendar')}>\n <h3 className={cx('month-title')}>{formatMonthYear(nextMonth)}</h3>\n <div className={cx('weekdays')}>\n {weekDays.map((day, i) => (\n <div key={day} className={`${cx('weekday')} ${i >= 5 ? cxMod('weekday', 'weekend') : ''}`}>\n {day}\n </div>\n ))}\n </div>\n <div className={cx('days')}>{generateCalendar(1)}</div>\n </div>\n </div>\n\n <button\n type=\"button\"\n className={navButtonClasses(isNextDisabled)}\n onClick={handleNextMonth}\n disabled={isNextDisabled}\n >\n <NextArrow />\n </button>\n </div>\n ) : (\n /* Mobile: Single calendar */\n <div className={`${cx('calendars')} ${cxMod('calendars', 'mobile')}`}>\n <div className={cx('calendar')}>\n <div className={cx('weekdays')}>\n {weekDays.map((day, i) => (\n <div key={day} className={`${cx('weekday')} ${i >= 5 ? cxMod('weekday', 'weekend') : ''}`}>\n {day}\n </div>\n ))}\n </div>\n <div className={cx('days')}>{generateCalendar(0)}</div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\nexport { DualCalendar };\nexport default DualCalendar;\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 } 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 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\">{benefit.label}</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 { 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 * 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 <div className={`hc-hotel-card ${className || ''}`}>\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 </div>\n );\n};\n","/**\n * FilterCheckboxItem Styles\n *\n * States: idle, hover, active (checked), focused, disabled\n */\n\n/* Filter checkbox row */\n.filterRow {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: var(--size-rem-0-625, 10px) 0;\n background-color: var(--background-action-secondary-idle, #fff);\n cursor: pointer;\n user-select: none;\n transition: background-color 0.15s ease;\n border-radius: var(--radius-sm, 4px);\n position: relative;\n}\n\n/* Hover state - gray background */\n.filterRow:hover:not(.filterRowDisabled) {\n background-color: var(--background-action-secondary-hover, #e5e7eb);\n}\n\n/* Active state - pressed feedback */\n.filterRow:active:not(.filterRowDisabled) {\n background-color: var(--background-action-secondary-hover, #e5e7eb);\n}\n\n/* Focus state - blue glow when item has focus */\n.filterRow:focus {\n background-color: var(--background-action-secondary-idle, #fff);\n box-shadow:\n 0 0 0 2px var(--misc-focus, #3474DA),\n 0 0 16px 4px var(--misc-focus, #3474DA);\n outline: none;\n z-index: 1;\n}\n\n/* Disabled state */\n.filterRowDisabled {\n cursor: not-allowed;\n}\n\n.checkboxLabel {\n display: flex;\n align-items: center;\n gap: var(--size-rem-0-5, 8px);\n flex: 1;\n}\n\n.checkboxButton {\n width: 24px;\n height: 24px;\n position: relative;\n overflow: hidden;\n flex-shrink: 0;\n}\n\n/* Visually hidden but still focusable */\n.checkbox {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n.checkboxBox {\n position: absolute;\n top: 2px;\n left: 2px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n background-color: var(--background-general-primary, #fff);\n border: 1px solid var(--border-general-tertiary, #d1d5db);\n border-radius: 4px;\n transition: all 0.15s ease;\n}\n\n/* Checked state - blue background */\n.checkbox:checked + .checkboxBox {\n background-color: var(--background-action-highlight-idle, #3474DA);\n border-color: var(--background-action-highlight-idle, #3474DA);\n}\n\n/* Disabled checkbox */\n.checkboxBoxDisabled {\n background-color: var(--background-action-disabled-idle, #f3f4f6);\n border-color: var(--border-action-disabled-idle, #e5e7eb);\n}\n\n.checkbox:checked + .checkboxBoxDisabled {\n background-color: var(--background-action-disabled-idle, #f3f4f6);\n border-color: var(--border-action-disabled-idle, #e5e7eb);\n}\n\n.checkIcon {\n width: 12px;\n height: 10px;\n color: var(--content-action-primary-inverse-idle, #fff);\n}\n\n.checkboxBoxDisabled .checkIcon {\n color: var(--content-action-disabled-idle, #9ca3af);\n}\n\n.filterLabel {\n color: var(--content-general-primary, #111827);\n font-family: var(--text-label-medium-font-family, inherit);\n font-size: var(--text-label-medium-font-size, 14px);\n font-style: normal;\n font-weight: 500;\n line-height: var(--text-label-medium-line-height, 1.5);\n}\n\n.filterLabelDisabled {\n color: var(--content-action-disabled-idle, #9ca3af);\n}\n\n.filterCount {\n color: var(--content-general-tertiary, #6b7280);\n font-family: var(--text-label-medium-font-family, inherit);\n font-size: var(--text-label-medium-font-size, 14px);\n font-style: normal;\n font-weight: 500;\n line-height: var(--text-label-medium-line-height, 1.5);\n}\n\n.filterCountDisabled {\n color: var(--content-action-disabled-idle, #9ca3af);\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 * States: idle, hover, active (checked), focused, disabled\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, useEffect } from 'react';\nimport { useUIContext } from '../../context';\nimport styles from './CollapsibleFilterSection.module.css';\n\n/**\n * CollapsibleFilterSection - Wrapper for expandable/collapsible filter sections\n *\n * Features:\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\nexport interface 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,\n showLessText,\n hasShowAll = false,\n initialItemsToShow = 5,\n className = '',\n}) => {\n const { t } = useUIContext();\n const [isExpanded, setIsExpanded] = useState(defaultExpanded);\n const [showAll, setShowAll] = useState(false);\n\n // Resolve labels with fallbacks\n const resolvedShowAllText = showAllText ?? t('filter.show-all', 'Show all');\n const resolvedShowLessText = showLessText ?? t('filter.show-less', 'Show less');\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 ? resolvedShowLessText : resolvedShowAllText}\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","/**\n * CollapsibleFilterSection Styles\n */\n\n.section {\n border-bottom: 1px solid var(--border-general-secondary, #e5e7eb);\n}\n\n.header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n padding: var(--size-rem-1, 16px) 0;\n background: transparent;\n border: none;\n cursor: pointer;\n text-align: left;\n}\n\n.title {\n color: var(--content-general-primary, #111827);\n font-family: var(--text-heading-small-font-family, inherit);\n font-size: var(--text-heading-small-font-size, 16px);\n font-weight: 600;\n line-height: var(--text-heading-small-line-height, 1.5);\n}\n\n.chevron {\n width: 20px;\n height: 20px;\n color: var(--content-general-secondary, #6b7280);\n transition: transform 0.2s ease;\n transform: rotate(0deg);\n}\n\n.chevronExpanded {\n transform: rotate(180deg);\n}\n\n.content {\n max-height: 0;\n overflow: hidden;\n transition: max-height 0.3s ease;\n}\n\n.contentExpanded {\n max-height: 2000px; /* Large enough to contain any filter content */\n}\n\n.contentInner {\n padding-bottom: var(--size-rem-1, 16px);\n}\n\n.showAllButton {\n display: flex;\n align-items: center;\n gap: var(--size-rem-0-25, 4px);\n margin-top: var(--size-rem-0-5, 8px);\n padding: var(--size-rem-0-5, 8px) 0;\n background: transparent;\n border: none;\n cursor: pointer;\n color: var(--content-action-highlight-idle, #3474DA);\n font-family: var(--text-label-medium-font-family, inherit);\n font-size: var(--text-label-medium-font-size, 14px);\n font-weight: 500;\n line-height: var(--text-label-medium-line-height, 1.5);\n}\n\n.showAllButton:hover {\n color: var(--content-action-highlight-hover, #2563eb);\n}\n\n.showAllChevron {\n width: 16px;\n height: 16px;\n transition: transform 0.2s ease;\n transform: rotate(0deg);\n}\n\n.showAllChevronUp {\n transform: rotate(180deg);\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\nexport interface PriceRangeFilterProps {\n minPrice: number;\n maxPrice: number;\n value: { min: number; max: number };\n onChange: (value: { min: number; max: number }) => void;\n /** 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 */\n onDragStart?: () => void;\n onDragEnd?: () => void;\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 values\n const maxHistogramValue = Math.max(...histogram, 1);\n\n // Check if histogram bar is in the selected range\n const getBarActive = useCallback((index: number) => {\n const barStartPercent = (index / histogram.length) * 100;\n const barEndPercent = ((index + 1) / histogram.length) * 100;\n return barStartPercent < maxPercent && barEndPercent > minPercent;\n }, [histogram.length, minPercent, maxPercent]);\n\n // Track is inset by 12px on each side\n const trackInset = 12;\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 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\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 const handleTouchStart = (handle: 'min' | 'max') => (e: React.TouchEvent) => {\n e.preventDefault();\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 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 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 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 */}\n <div className={styles.histogram}>\n {histogram.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 {/* 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(12px + (100% - 24px) * ${minPercent / 100})`,\n width: `calc((100% - 24px) * ${(maxPercent - minPercent) / 100})`\n }}\n />\n <div\n className={`${styles.sliderHandle} ${isDragging === 'min' ? styles.sliderHandleActive : ''}`}\n style={{ left: `calc(12px + (100% - 24px) * ${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(12px + (100% - 24px) * ${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","/**\n * PriceRangeFilter Styles\n */\n\n.priceRangeWrapper {\n display: flex;\n flex-direction: column;\n gap: var(--size-rem-1, 16px);\n}\n\n/* Price Inputs */\n.priceInputs {\n display: flex;\n align-items: center;\n gap: var(--size-rem-0-5, 8px);\n}\n\n.priceInputWrapper {\n flex: 1;\n}\n\n.priceInput {\n width: 100%;\n padding: var(--size-rem-0-75, 12px);\n border: 1px solid var(--border-general-secondary, #e5e7eb);\n border-radius: var(--radius-md, 8px);\n background-color: var(--background-general-primary, #fff);\n color: var(--content-general-primary, #111827);\n font-family: var(--text-body-medium-font-family, inherit);\n font-size: var(--text-body-medium-font-size, 14px);\n line-height: var(--text-body-medium-line-height, 1.5);\n text-align: center;\n}\n\n.priceInput:focus {\n outline: none;\n border-color: var(--border-action-highlight-idle, #3474DA);\n box-shadow: 0 0 0 2px var(--misc-focus-light, rgba(52, 116, 218, 0.2));\n}\n\n.priceInputDivider {\n color: var(--content-general-tertiary, #6b7280);\n font-size: 14px;\n flex-shrink: 0;\n}\n\n/* Histogram */\n.histogram {\n display: flex;\n align-items: flex-end;\n gap: 2px;\n height: 48px;\n padding: 0 12px;\n}\n\n.histogramBar {\n flex: 1;\n background-color: var(--background-action-secondary-idle, #e5e7eb);\n border-radius: 2px 2px 0 0;\n transition: background-color 0.15s ease;\n min-height: 4px;\n}\n\n.histogramBarActive {\n background-color: var(--background-action-highlight-idle, #3474DA);\n}\n\n/* Slider */\n.sliderContainer {\n position: relative;\n height: 24px;\n touch-action: none;\n}\n\n.sliderTrack {\n position: absolute;\n top: 50%;\n left: 12px;\n right: 12px;\n height: 4px;\n background-color: var(--background-action-secondary-idle, #e5e7eb);\n border-radius: 2px;\n transform: translateY(-50%);\n}\n\n.sliderActiveTrack {\n position: absolute;\n top: 50%;\n height: 4px;\n background-color: var(--background-action-highlight-idle, #3474DA);\n border-radius: 2px;\n transform: translateY(-50%);\n}\n\n.sliderHandle {\n position: absolute;\n top: 50%;\n width: 24px;\n height: 24px;\n background-color: var(--background-general-primary, #fff);\n border: 2px solid var(--border-action-highlight-idle, #3474DA);\n border-radius: 50%;\n transform: translate(-50%, -50%);\n cursor: grab;\n touch-action: none;\n transition: box-shadow 0.15s ease;\n z-index: 1;\n}\n\n.sliderHandle:hover {\n box-shadow: 0 0 0 4px var(--misc-focus-light, rgba(52, 116, 218, 0.2));\n}\n\n.sliderHandle:focus {\n outline: none;\n box-shadow: 0 0 0 4px var(--misc-focus-light, rgba(52, 116, 218, 0.2));\n}\n\n.sliderHandleActive {\n cursor: grabbing;\n box-shadow: 0 0 0 6px var(--misc-focus-light, rgba(52, 116, 218, 0.3));\n}\n","/**\n * HotelCategoryFilter Styles\n */\n\n.filterList {\n display: flex;\n flex-direction: column;\n}\n\n.starsContainer {\n display: flex;\n align-items: center;\n gap: 2px;\n}\n\n.starIcon {\n width: 16px;\n height: 16px;\n color: var(--content-general-primary, #111827);\n}\n\n.footer {\n margin-top: var(--size-rem-0-75, 12px);\n padding-top: var(--size-rem-0-75, 12px);\n border-top: 1px solid var(--border-general-secondary, #e5e7eb);\n}\n\n.footerText {\n color: var(--content-general-tertiary, #6b7280);\n font-family: var(--text-caption-font-family, inherit);\n font-size: var(--text-caption-font-size, 12px);\n font-style: normal;\n font-weight: 400;\n line-height: var(--text-caption-line-height, 1.5);\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 * Options: 5★, 4★, 3★, 2★, Swiss Lodge, No category\n * Footer with HotellerieSuisse attribution\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\nexport interface 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 // Translation key mapping for labels\n const getLabel = (option: CategoryOption) => {\n if (option.stars > 0) return null; // Will render stars\n if (option.value === 'swiss_lodge') return t('filter.swiss-lodge', 'Swiss Lodge');\n if (option.value === 'not_classified') return t('filter.no-category', 'No category');\n return option.label;\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 getLabel(option)\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 HotellerieSuisse')}\n </span>\n </div>\n </div>\n );\n};\n","/**\n * ReviewsFilter Styles\n */\n\n.filterList {\n display: flex;\n flex-direction: column;\n}\n\n.filterRange {\n color: var(--content-general-tertiary, #6b7280);\n font-weight: 400;\n}\n\n.footer {\n margin-top: var(--size-rem-0-75, 12px);\n padding-top: var(--size-rem-0-75, 12px);\n border-top: 1px solid var(--border-general-secondary, #e5e7eb);\n}\n\n.footerText {\n color: var(--content-general-tertiary, #6b7280);\n font-family: var(--text-caption-font-family, inherit);\n font-size: var(--text-caption-font-size, 12px);\n font-style: normal;\n font-weight: 400;\n line-height: var(--text-caption-line-height, 1.5);\n}\n","import React from 'react';\nimport { useUIContext } from '../../context';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport styles from './ReviewsFilter.module.css';\n\n/**\n * ReviewsFilter - Checkbox list for filtering by review rating\n *\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\nexport const REVIEW_OPTIONS: ReviewOption[] = [\n { value: 'excellent', labelKey: 'rating-excellent', range: '(4.4+)' },\n { value: 'very_good', labelKey: 'rating-very-good', range: '(4.1 – 4.3)' },\n { value: 'good', labelKey: 'rating-good', range: '(3.8 – 4.0)' },\n { value: 'fair', labelKey: 'rating-fair', range: '(3.5 – 3.7)' },\n { value: 'no_rating', labelKey: 'rating-none', range: '' },\n];\n\nexport interface 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 // Map translation keys to labels\n const getRatingLabel = (labelKey: string) => {\n const labelMap: Record<string, string> = {\n 'rating-excellent': t('label.rating-excellent', 'Excellent'),\n 'rating-very-good': t('label.rating-very-good', 'Very Good'),\n 'rating-good': t('label.rating-good', 'Good'),\n 'rating-fair': t('label.rating-fair', 'Fair'),\n 'rating-none': t('label.rating-none', 'No rating'),\n };\n return labelMap[labelKey] ?? labelKey;\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 {getRatingLabel(option.labelKey)}\n {option.range && (\n <span className={styles.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={styles.footer}>\n <span className={styles.footerText}>\n {t('filter.trustyou', 'Reviews from TrustYou®')}\n </span>\n </div>\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { useUIContext } from '../../context';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport styles from './ExperienceFilter.module.css';\n\n/**\n * ExperienceFilter - Checkbox list for experience/theme types\n *\n * Options come from API with pre-translated names\n * Expandable with \"Show all\" if more than 5 options\n */\n\nexport interface ThemeAggregation {\n id: number;\n name: string;\n count: number;\n}\n\nexport interface ExperienceFilterProps {\n selected: string[];\n /** Theme aggregations from API with pre-translated names */\n themes?: ThemeAggregation[];\n onChange: (values: string[]) => void;\n className?: string;\n}\n\nexport const ExperienceFilter: React.FC<ExperienceFilterProps> = ({\n selected,\n themes = [],\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 className={`${styles.arrowIcon} ${expanded ? styles.arrowUp : ''}`}>\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=\"currentColor\"/>\n </svg>\n </span>\n </button>\n )}\n </div>\n );\n};\n","/**\n * ExperienceFilter Styles\n */\n\n.filterList {\n display: flex;\n flex-direction: column;\n}\n\n.showMoreBtn {\n display: flex;\n align-items: center;\n gap: var(--size-rem-0-25, 4px);\n margin-top: var(--size-rem-0-5, 8px);\n padding: var(--size-rem-0-5, 8px) 0;\n background: transparent;\n border: none;\n cursor: pointer;\n color: var(--content-action-highlight-idle, #3474DA);\n font-family: var(--text-label-medium-font-family, inherit);\n font-size: var(--text-label-medium-font-size, 14px);\n font-weight: 500;\n line-height: var(--text-label-medium-line-height, 1.5);\n}\n\n.showMoreBtn:hover {\n color: var(--content-action-highlight-hover, #2563eb);\n}\n\n.arrowIcon {\n display: flex;\n align-items: center;\n transition: transform 0.2s ease;\n}\n\n.arrowIcon svg {\n width: 20px;\n height: 20px;\n}\n\n.arrowUp {\n transform: rotate(180deg);\n}\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 * Features:\n * - Country rows are accordion headers (NO checkbox on country)\n * - Clicking country row expands/collapses accordion\n * - Sub-regions appear as checkbox list when country is expanded\n * - Mobile-friendly \"Select All\" / \"Reset\" actions\n */\n\nexport interface RegionOption {\n value: string;\n label: string;\n count?: number;\n subRegions?: RegionOption[];\n}\n\nexport interface 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 */}\n {hasSubRegions && isExpanded && (() => {\n const hasSelectableRegions = region.subRegions!.some(\n sr => sr.count === undefined || sr.count > 0\n );\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 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 (subRegion.count === 0 && !selected.includes(subRegion.value)) ||\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 * RegionsFilter Styles (Destinations)\n *\n * - Country row: 56px height, gray background, 12px border-radius\n * - No checkbox on country row (accordion header only)\n * - Count badge: pill shape, gray background\n * - Chevron: 20x20px, rotates on expand\n */\n\n.filterList {\n display: flex;\n flex-direction: column;\n gap: var(--size-rem-0-25, 4px);\n}\n\n.regionItem {\n display: flex;\n flex-direction: column;\n}\n\n/* Country row - accordion header (no checkbox) */\n.countryRow {\n display: flex;\n justify-content: space-between;\n align-items: center;\n height: 56px;\n padding: 14px var(--size-rem-0-75, 12px);\n background-color: var(--background-general-secondary-light, #f9fafb);\n border: 1px solid transparent;\n border-radius: var(--size-rem-0-75, 12px);\n cursor: pointer;\n user-select: none;\n transition: background-color 0.15s ease;\n gap: var(--size-rem-0-75, 12px);\n}\n\n.countryRowExpanded {\n border-radius: var(--size-rem-0-75, 12px);\n border: 1px solid var(--border-action-secondary-active, #d1d5db);\n background: var(--background-general-primary, #fff) !important;\n border-bottom: none;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.countryInfo {\n display: flex;\n align-items: center;\n flex: 1 1 0;\n justify-content: space-between;\n}\n\n.countryName {\n color: var(--content-general-primary, #111827);\n font-family: var(--text-label-large-font-family, inherit);\n font-size: var(--text-label-large-font-size, 16px);\n font-weight: var(--text-label-large-font-weight, 600);\n line-height: var(--text-label-large-line-height, 1.55);\n}\n\n.countBadge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 24px;\n height: 24px;\n padding: 0 var(--size-rem-0-5, 8px);\n border-radius: 9999px;\n background: var(--background-general-secondary, #e5e7eb) !important;\n color: var(--content-general-primary, #111827);\n text-align: center;\n font-family: var(--text-label-medium-font-family, inherit);\n font-size: var(--text-label-medium-font-size, 14px);\n font-weight: 500;\n line-height: var(--text-label-medium-line-height, 1.5);\n white-space: nowrap;\n}\n\n.chevron {\n width: 20px;\n height: 20px;\n color: var(--content-general-tertiary, #6b7280);\n flex-shrink: 0;\n transition: transform 0.2s ease;\n}\n\n.chevronExpanded {\n transform: rotate(180deg);\n}\n\n/* Sub-regions container */\n.subRegions {\n display: flex;\n flex-direction: column;\n padding: 0 var(--size-rem-0-75, 12px) var(--size-rem-0-875, 14px) var(--size-rem-0-75, 12px);\n border-radius: var(--size-rem-0-75, 12px);\n border: 1px solid var(--border-action-secondary-active, #d1d5db);\n background: var(--background-general-primary, #fff);\n border-top: none;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.mobileSelectAllActions {\n display: flex;\n align-items: center;\n gap: var(--size-rem-1, 16px);\n height: 44px;\n padding: 0 var(--size-rem-0-75, 12px);\n border-top: none;\n border-bottom: none;\n border-right: 1px solid var(--border-action-secondary-active, #d1d5db);\n border-left: 1px solid var(--border-action-secondary-active, #d1d5db);\n background: var(--background-general-primary, #fff);\n}\n\n.selectAllBtn,\n.resetAllBtn {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 0;\n border: none;\n background: transparent;\n font-family: var(--text-label-medium-font-family, inherit);\n font-size: var(--text-label-medium-font-size, 14px);\n font-weight: 500;\n line-height: var(--text-label-medium-line-height, 1.5);\n text-decoration: underline;\n cursor: pointer;\n}\n\n.selectAllBtn {\n color: var(--content-action-link-idle, #3474DA);\n}\n\n.selectAllBtn:disabled {\n color: var(--content-action-disabled-idle, #9ca3af);\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.resetAllBtn {\n color: var(--content-action-disabled-idle, #6b7280);\n}\n\n.resetAllBtn:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.selectAllBtn:focus-visible,\n.resetAllBtn:focus-visible {\n outline: 2px solid var(--misc-focus, #3474DA);\n outline-offset: 2px;\n border-radius: 2px;\n}\n","/**\n * CheckboxFilter Styles\n */\n\n.filterList {\n display: flex;\n flex-direction: column;\n}\n","import React from 'react';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport styles from './CheckboxFilter.module.css';\n\n/**\n * CheckboxFilter - Generic checkbox list filter\n *\n * Used for: Meals, Transport, Wellness, and other dynamic filter options\n * Options come from API with pre-translated names\n */\n\nexport interface FilterOption {\n id: number;\n key: string;\n name: string;\n}\n\nexport interface CheckboxFilterProps {\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 /** Prefix for track names (e.g., 'meals', 'transport', 'wellness') */\n trackPrefix?: string;\n}\n\nexport const CheckboxFilter: React.FC<CheckboxFilterProps> = ({\n selected,\n counts = {},\n options = [],\n onChange,\n className = '',\n trackPrefix = 'filter',\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={`${trackPrefix}-${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-${trackPrefix}-${option.key}`}\n />\n );\n })}\n </div>\n );\n};\n\n// Convenience alias components for specific filter types\nexport const MealsFilter = (props: Omit<CheckboxFilterProps, 'trackPrefix'>) => (\n <CheckboxFilter {...props} trackPrefix=\"meals\" />\n);\n\nexport const TransportFilter = (props: Omit<CheckboxFilterProps, 'trackPrefix'>) => (\n <CheckboxFilter {...props} trackPrefix=\"transport\" />\n);\n\nexport const WellnessFilter = (props: Omit<CheckboxFilterProps, 'trackPrefix'>) => (\n <CheckboxFilter {...props} trackPrefix=\"wellness\" />\n);\n","/**\n * SelectedFiltersRow Styles\n */\n\n.container {\n padding: var(--size-rem-0-75, 12px) 0;\n border-bottom: 1px solid var(--border-general-secondary, #e5e7eb);\n}\n\n.chipsWrapper {\n display: flex;\n align-items: flex-start;\n gap: var(--size-rem-0-5, 8px);\n}\n\n.selectedText {\n margin: 0;\n padding-top: var(--size-rem-0-25, 4px);\n color: var(--content-general-secondary, #6b7280);\n font-family: var(--text-label-medium-font-family, inherit);\n font-size: var(--text-label-medium-font-size, 14px);\n font-weight: 500;\n line-height: var(--text-label-medium-line-height, 1.5);\n white-space: nowrap;\n}\n\n.chips {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--size-rem-0-5, 8px);\n}\n\n.clearAllBtn {\n margin-left: var(--size-rem-0-5, 8px);\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 * Features:\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\nexport interface 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\n if (filters.length === 0) {\n return null;\n }\n\n return (\n <div className={`${styles.container} ${className}`}>\n <div className={styles.chipsWrapper}>\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.clearAllBtn}\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, { useState, useEffect, useRef, useCallback } from 'react';\nimport { useUIContext } from '../../context';\nimport { useDebounce } from '../../hooks';\nimport { CollapsibleFilterSection } from './CollapsibleFilterSection';\nimport { FilterCheckboxItem } from './FilterCheckboxItem';\nimport { PriceRangeFilter } from './PriceRangeFilter';\nimport { HotelCategoryFilter } from './HotelCategoryFilter';\nimport { ReviewsFilter } from './ReviewsFilter';\nimport { ExperienceFilter, type ThemeAggregation } from './ExperienceFilter';\nimport { RegionsFilter, type RegionOption } from './RegionsFilter';\nimport { MealsFilter, TransportFilter, WellnessFilter, type FilterOption } from './CheckboxFilter';\nimport styles from './FilterPanel.module.css';\n\n/**\n * FilterPanel - Sidebar/modal filters for search results\n *\n * Desktop: Fixed sidebar\n * Mobile: Full-screen modal (use with FilterModal wrapper)\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\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 onViewMap?: () => void;\n className?: string;\n isLoading?: boolean;\n priceHistogram?: number[];\n minPrice?: number;\n maxPrice?: number;\n regions?: RegionOption[];\n discountCounts?: Record<string, number>;\n optionsCounts?: Record<string, number>;\n categoryCounts?: Record<string, number>;\n experienceCounts?: Record<string, number>;\n themes?: ThemeAggregation[];\n mealsCounts?: Record<string, number>;\n reviewsCounts?: Record<string, number>;\n transportCounts?: Record<string, number>;\n wellnessCounts?: Record<string, number>;\n servicesCounts?: Record<string, number>;\n filterOptions?: FilterOptions;\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 selectedPriceRange?: { min: number; max: number } | null;\n mapCenter?: { lat: number; lng: number };\n}\n\n// Discount filter options\nconst DISCOUNT_OPTIONS = [\n { value: '50', label: '50%' },\n { value: '30', label: '30%' },\n { value: '10', label: '10%' },\n];\n\n// Options filter\nconst OPTIONS_FILTER = [\n { value: 'instant_booking', labelKey: 'filter.instant-booking' },\n];\n\nexport const FilterPanel: React.FC<FilterPanelProps> = ({\n onFilterChange,\n className = '',\n isLoading = false,\n priceHistogram,\n minPrice = 50,\n maxPrice = 500,\n regions = [],\n discountCounts = {},\n optionsCounts = {},\n categoryCounts = {},\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}) => {\n const { t, currency } = useUIContext();\n\n const hasInitialLoadRef = useRef(false);\n\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\n const [priceMin, setPriceMin] = useState(externalPriceRange?.min ?? minPrice);\n const [priceMax, setPriceMax] = useState(externalPriceRange?.max ?? maxPrice);\n\n // Filter states\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 external props\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 useEffect(() => { if (externalDiscounts !== undefined) setSelectedDiscounts(externalDiscounts); }, [externalDiscounts]);\n useEffect(() => { if (externalOptions !== undefined) setSelectedOptions(externalOptions); }, [externalOptions]);\n useEffect(() => { if (externalExperiences !== undefined) setSelectedExperiences(externalExperiences); }, [externalExperiences]);\n useEffect(() => { if (externalRegions !== undefined) setSelectedRegions(externalRegions); }, [externalRegions]);\n useEffect(() => { if (externalCategories !== undefined) setSelectedCategories(externalCategories); }, [externalCategories]);\n useEffect(() => { if (externalMeals !== undefined) setSelectedMeals(externalMeals); }, [externalMeals]);\n useEffect(() => { if (externalReviews !== undefined) setSelectedReviews(externalReviews); }, [externalReviews]);\n useEffect(() => { if (externalTransport !== undefined) setSelectedTransport(externalTransport); }, [externalTransport]);\n useEffect(() => { if (externalWellness !== undefined) setSelectedWellness(externalWellness); }, [externalWellness]);\n useEffect(() => { if (externalServices !== undefined) setSelectedServices(externalServices); }, [externalServices]);\n\n // Handlers\n const handlePriceChange = (value: { min: number; max: number }) => {\n setPriceMin(value.min);\n setPriceMax(value.max);\n };\n\n const handlePriceSearch = useCallback(async (range: { min: number; max: number }) => {\n await onFilterChange?.({ priceRange: range });\n }, [onFilterChange]);\n\n const debouncedFetch = useDebounce(handlePriceSearch, 500);\n\n const handlePriceApply = (range: { min: number; max: number }) => {\n debouncedFetch(range);\n };\n\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 handleServicesChange = (values: string[]) => {\n setSelectedServices(values);\n onFilterChange?.({ services: 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 handleCategoriesChange = (values: string[]) => {\n setSelectedCategories(values);\n onFilterChange?.({ categories: 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 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 {/* Destinations Filter */}\n <CollapsibleFilterSection\n title={t('filter.destination', 'Destination')}\n defaultExpanded={true}\n >\n <RegionsFilter\n regions={regions}\n selected={selectedRegions}\n onChange={handleRegionsChange}\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 onChange={handleExperienceChange}\n />\n </CollapsibleFilterSection>\n\n {/* Price Range Filter */}\n <CollapsibleFilterSection\n title={t('filter.price', 'Price')}\n defaultExpanded={true}\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 </CollapsibleFilterSection>\n\n {/* Discount Filter */}\n <CollapsibleFilterSection\n title={t('filter.discount', 'Discount')}\n defaultExpanded={true}\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 </CollapsibleFilterSection>\n\n {/* Options Filter */}\n <CollapsibleFilterSection\n title={t('filter.options', 'Options')}\n defaultExpanded={selectedOptions.length > 0 || selectedServices.length > 0}\n >\n <div className={styles.discountList}>\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, 'Instantly bookable')}\n count={count}\n checked={selectedOptions.includes(option.value)}\n disabled={isDisabled}\n onChange={() => handleOptionToggle(option.value)}\n />\n );\n })}\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 <HotelCategoryFilter\n selected={selectedCategories}\n counts={categoryCounts}\n onChange={handleCategoriesChange}\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 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 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 </div>\n </aside>\n );\n};\n","/**\n * FilterPanel Styles\n *\n * Desktop: Fixed sidebar (306px width per Figma)\n * Mobile: Full-screen modal (use with FilterModal wrapper)\n */\n\n/* ============================================\n Desktop: Sidebar Layout\n ============================================ */\n\n.filterPanel {\n display: flex;\n flex-direction: column;\n width: 100%;\n background: var(--background-general-primary);\n}\n\n.content {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n}\n\n/* ============================================\n Filter Section - Common Styles\n ============================================ */\n\n.filterSection {\n padding: 24px 0;\n border-bottom: 1px solid var(--border-general-divider);\n}\n\n.filterTitle {\n font-family: var(--font-primary);\n font-size: var(--text-label-large-font-size);\n font-weight: var(--font-weight-medium);\n line-height: var(--text-label-large-line-height);\n color: var(--content-general-secondary);\n margin: 0 0 16px 0;\n}\n\n/* ============================================\n Price Range Filter - Wrapper for alignment\n ============================================ */\n\n.priceRangeWrapper {\n position: relative;\n /* Add horizontal padding to account for slider handle width (26px / 2 = 13px) + extra breathing room */\n padding: 0 16px;\n}\n\n/* ============================================\n Price Range Filter - Histogram\n ============================================ */\n\n.histogram {\n display: flex;\n align-items: flex-end;\n height: 45px;\n width: 100%;\n}\n\n.histogramBar {\n flex: 1;\n min-width: 1px;\n background-color: var(--border-general-divider);\n /* Use border for gap instead of flex gap - more precise */\n border-right: 1px solid var(--background-general-primary);\n transition: background-color 0.15s ease;\n}\n\n.histogramBar:last-child {\n border-right: none;\n}\n\n.histogramBarActive {\n background-color: var(--content-action-highlight-idle);\n}\n\n/* ============================================\n Price Range Filter - Slider\n ============================================ */\n\n.sliderContainer {\n position: relative;\n height: 44px;\n display: flex;\n align-items: center;\n user-select: none;\n}\n\n.sliderTrack {\n position: absolute;\n left: 0;\n right: 0;\n height: 4px;\n background-color: var(--border-general-divider);\n border-radius: 2px;\n}\n\n.sliderActiveTrack {\n position: absolute;\n height: 4px;\n background-color: var(--content-action-highlight-idle);\n border-radius: 2px;\n pointer-events: none;\n}\n\n.sliderHandle {\n position: absolute;\n width: 26px;\n height: 26px;\n background-color: var(--background-general-primary);\n border-radius: 50%;\n box-shadow: 0px 0.5px 4px 0px rgba(0, 0, 0, 0.12),\n 0px 6px 13px 0px rgba(0, 0, 0, 0.12);\n cursor: grab;\n transform: translateX(-50%);\n z-index: 2;\n transition: box-shadow 0.15s ease;\n}\n\n.sliderHandle:hover {\n box-shadow: 0px 0.5px 4px 0px rgba(0, 0, 0, 0.16),\n 0px 6px 16px 0px rgba(0, 0, 0, 0.16);\n}\n\n.sliderHandleActive {\n cursor: grabbing;\n box-shadow: 0px 0.5px 4px 0px rgba(0, 0, 0, 0.2),\n 0px 8px 18px 0px rgba(0, 0, 0, 0.2);\n}\n\n.sliderHandle:focus {\n outline: none;\n box-shadow: 0px 0.5px 4px 0px rgba(0, 0, 0, 0.12),\n 0px 6px 13px 0px rgba(0, 0, 0, 0.12),\n 0 0 0 2px var(--content-action-highlight-idle);\n}\n\n/* ============================================\n Price Range Filter - Inputs\n ============================================ */\n\n.priceInputs {\n display: flex;\n align-items: center;\n gap: 20px;\n margin-top: 16px;\n}\n\n.priceInputWrapper {\n flex: 1;\n}\n\n.priceInput {\n width: 100%;\n height: 45px;\n padding: 12px;\n background-color: var(--background-general-primary);\n border: 1px solid var(--content-general-tertiary);\n border-radius: 4px;\n font-family: var(--font-primary);\n font-size: var(--text-paragraph-base-font-size);\n font-weight: var(--font-weight-regular);\n line-height: 1.4;\n color: var(--content-general-primary);\n box-sizing: border-box;\n}\n\n.priceInput:hover {\n border-radius: var(--size-rem-0-5);\n border: 1px solid var(--border-action-secondary-hover);\n background: var(--background-general-primary);\n color: var(--content-general-secondary);\n /* paragraph/base */\n font-family: var(--text-paragraph-base-font-family) !important;\n font-size: var(--text-paragraph-base-font-size) !important;\n font-style: normal;\n font-weight: var(--text-paragraph-base-font-weight) !important;\n line-height: var(--text-paragraph-base-line-height) !important; /* 150% */\n}\n\n.priceInput:focus {\n outline: none;\n border-radius: var(--size-rem-0-5);\n border: 1px solid var(--misc-focus);\n background: var(--background-general-primary);\n /* focus */\n box-shadow: 0 0 0 2px var(--misc-focus), 0 0 16px 4px var(--misc-focus);\n color: var(--content-general-primary) !important;\n /* paragraph/base */\n font-family: var(--text-paragraph-base-font-family) !important;\n font-size: var(--text-paragraph-base-font-size)!important;\n font-style: normal;\n font-weight: var(--text-paragraph-base-font-weight) !important;\n line-height: var(--text-paragraph-base-line-height) !important; /* 150% */\n}\n\n.priceInputDivider {\n width: 12px;\n height: 1px;\n background-color: var(--content-general-primary);\n flex-shrink: 0;\n}\n\n/* ============================================\n Discount Filter - Figma Design\n ============================================ */\n\n.discountList {\n display: flex;\n flex-direction: column;\n padding: var(--size-rem-0-75) var(--size-rem-0-875) var(--size-rem-0-75);\n}\n\n.discountRow {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 10px 0; /* py-2.5 from Figma */\n}\n\n.discountCheckboxLabel {\n display: flex;\n align-items: center;\n gap: 8px; /* gap-2 from Figma */\n cursor: pointer;\n user-select: none;\n}\n\n.checkboxButton {\n width: 24px; /* size-6 from Figma */\n height: 24px;\n position: relative;\n overflow: hidden;\n}\n\n.checkbox {\n /* Hide native checkbox */\n position: absolute;\n opacity: 0;\n width: 0;\n height: 0;\n}\n\n.checkboxBox {\n position: absolute;\n top: 2px;\n left: 2px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px; /* size-5 from Figma */\n height: 20px;\n background-color: var(--background-general-primary);\n border: 1px solid var(--border-general-divider);\n border-radius: 2px; /* rounded-sm from Figma */\n transition: all 0.15s ease;\n}\n\n.checkbox:checked + .checkboxBox {\n background-color: var(--background-action-highlight-idle);\n}\n\n.checkbox:focus + .checkboxBox {\n box-shadow: none !important;\n}\n\n.discountCheckboxLabel:hover .checkboxBox {\n border-color: var(--content-action-highlight-idle);\n}\n\n.checkIcon {\n width: 12px;\n height: 10px;\n color: var(--background-general-primary);\n}\n\n.discountLabel {\n color: var(--content-general-primary);\n /* label/medium */\n font-family: var(--text-label-medium-font-family);\n font-size: var(--text-label-medium-font-size);\n font-style: normal;\n font-weight: 500;\n line-height: var(--text-label-medium-line-height); /* 150% */\n}\n\n.discountCount {\n color: var(--content-general-tertiary);\n /* label/medium */\n font-family: var(--text-label-medium-font-family);\n font-size: var(--text-label-medium-font-size);\n font-style: normal;\n font-weight: 500;\n line-height: var(--text-label-medium-line-height); /* 150% */\n}\n\n/* Disabled state for inline checkboxes */\n.discountRowDisabled {\n opacity: 0.5;\n pointer-events: none;\n cursor: not-allowed;\n}\n\n.discountRowDisabled .discountCheckboxLabel {\n cursor: not-allowed;\n}\n\n.discountRowDisabled .checkboxBox {\n background-color: var(--background-general-secondary);\n}\n\n/* ============================================\n Hotel Category Filter - Chip Style\n ============================================ */\n\n.categoryChips {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n\n.categoryChip {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 8px 8px 16px;\n background-color: var(--background-general-primary);\n border: 2px solid var(--border-general-divider);\n border-radius: 9999px;\n cursor: pointer;\n transition: all 0.15s ease;\n user-select: none;\n}\n\n.categoryChip:hover {\n border-color: var(--content-action-highlight-idle);\n}\n\n.categoryChipSelected {\n background-color: var(--background-action-secondary-idle);\n border-color: var(--content-action-highlight-idle);\n}\n\n.categoryStars {\n display: flex;\n align-items: center;\n gap: 0;\n}\n\n.categoryStar {\n width: 16px;\n height: 16px;\n color: var(--content-general-tertiary);\n}\n\n.categoryChipSelected .categoryStar {\n color: var(--content-action-highlight-idle);\n}\n\n.categoryLabel {\n font-family: var(--font-primary);\n font-size: var(--text-paragraph-base-font-size);\n font-weight: var(--font-weight-medium);\n line-height: 24px;\n color: var(--content-general-primary);\n white-space: nowrap;\n}\n\n.categoryCount {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 8px;\n min-width: 28px;\n height: 28px;\n background-color: var(--background-general-secondary);\n border-radius: 9999px;\n font-family: var(--font-primary);\n font-size: var(--text-label-large-font-size);\n font-weight: var(--font-weight-medium);\n line-height: 28px;\n color: var(--content-general-primary);\n}\n\n.categoryFooter {\n margin-top: 16px;\n}\n\n.categoryFooterText {\n font-family: var(--font-primary);\n font-size: var(--text-label-small-font-size);\n font-weight: var(--font-weight-medium);\n line-height: 16px;\n color: var(--content-general-tertiary);\n}\n\n.categoryFooterLink {\n color: var(--content-action-link-idle);\n text-decoration: underline;\n}\n\n.categoryFooterLink:hover {\n color: var(--content-action-link-hover);\n}\n\n/* ============================================\n Clear All Section\n ============================================ */\n\n.clearSection {\n padding: 24px 0;\n}\n\n.clearAllLink {\n font-family: var(--font-primary);\n font-size: var(--text-paragraph-base-font-size);\n font-weight: var(--font-weight-medium);\n line-height: 24px;\n color: var(--content-action-link-idle);\n text-decoration: underline;\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n}\n\n.clearAllLink:hover {\n color: var(--content-action-link-hover);\n}\n\n/* ============================================\n Desktop: Show sidebar at 1024px+\n ============================================ */\n\n/* Hidden state for loading */\n.hidden {\n display: none;\n}\n\n@media (min-width: 1024px) {\n .filterPanel {\n display: flex;\n width: 100%; /* Fill parent .filterColumn (306px per Figma) */\n flex-shrink: 0;\n }\n}\n\n/* ============================================\n Mobile: Modal overlay (future phase)\n ============================================ */\n\n/* Modal styles will be added when implementing mobile filter modal */\n","import React, { useEffect } from 'react';\nimport { useUIContext } from '../../context';\nimport { Button } from '../Button';\nimport { FilterPanel, FilterPanelProps } from './FilterPanel';\nimport { SelectedFiltersRow, SelectedFilter } from './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('filter.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('filter.show-results', 'Show {count} results').replace('{count}', String(resultCount))}\n </Button>\n </div>\n </div>\n </div>\n );\n};\n\nexport default FilterModal;\n","/**\n * FilterModal - Modal wrapper for FilterPanel\n *\n * Figma: 632:51682 (mobile fullscreen), 702-76591 (map view centered)\n * Used for mobile list view and map view (both desktop and mobile)\n */\n\n/* Backdrop overlay - semi-transparent background */\n.overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n width: 100%;\n height: 100%;\n height: 100dvh; /* Dynamic viewport height for mobile */\n z-index: 9999; /* Above everything including TopBar */\n background-color: rgba(0, 0, 0, 0.5); /* Semi-transparent backdrop */\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-rem-4, 64px); /* 64px = 4rem spacing around modal */\n box-sizing: border-box;\n animation: fadeIn 0.2s ease-out;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* Centered modal container */\n.modal {\n position: relative;\n width: 100%;\n max-width: 560px; /* Narrower modal per Figma - approx (1440 - 409*2)px */\n height: 100%;\n max-height: calc(100vh - var(--size-rem-8, 128px)); /* Account for top/bottom padding */\n background-color: var(--background-general-primary);\n display: flex;\n flex-direction: column;\n border-radius: var(--radius-xl, 16px); /* Rounded corners */\n box-shadow: 0 20px 50px -10px rgba(0, 0, 0, 0.25);\n animation: slideUp 0.3s ease-out;\n overflow: hidden;\n}\n\n@keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Mobile: Full-screen modal */\n@media (max-width: 767px) {\n .overlay {\n background-color: var(--background-general-primary);\n padding: 0;\n }\n\n .modal {\n width: 100%;\n max-width: 100%;\n height: 100%;\n max-height: 100%;\n border-radius: 0;\n box-shadow: none;\n /* Handle iOS safe areas */\n padding-top: env(safe-area-inset-top);\n padding-bottom: env(safe-area-inset-bottom);\n }\n}\n\n/* Header with title and close button - Figma: 76px height */\n.header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--size-rem-1, 16px); /* 16px */\n height: 76px;\n flex-shrink: 0;\n border-bottom: 1px solid var(--border-general-divider);\n background-color: var(--background-general-primary);\n}\n\n/* Selected filters chips area - below header */\n.selectedFilters {\n padding: var(--size-rem-0, 0) var(--size-rem-3, 48px) var(--size-rem-1-5, 24px) var(--size-rem-3, 48px);\n background-color: var(--background-general-primary);\n flex-shrink: 0;\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n@media (max-width: 1023px) {\n .selectedFilters {\n border-bottom: unset !important;\n padding: var(--size-rem-0, 0) var(--size-rem-1, 16px);\n }\n}\n\n.title {\n flex: 1;\n margin: 0;\n color: var(--content-general-primary);\n text-align: center;\n /* heading/small */\n font-family: var(--text-heading-small-font-family, inherit);\n font-size: var(--text-heading-small-font-size, 18px);\n font-style: normal;\n font-weight: 500;\n line-height: var(--text-heading-small-line-height, 1.33); /* 133.333% */\n letter-spacing: -0.6px;\n}\n\n@media (max-width: 1023px) {\n .title {\n text-align: left;\n }\n}\n\n/* Scrollable content area - contains FilterPanel */\n.content {\n flex: 1;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n/* FilterPanel styling within modal - override desktop width */\n.filterPanel {\n /* Remove any default padding/margin from FilterPanel */\n padding: var(--size-rem-0, 0) var(--size-rem-3, 48px) var(--size-rem-1-5, 24px) var(--size-rem-3, 48px);\n margin: 0;\n width: 100% !important; /* Override desktop 280px width */\n display: flex !important; /* Ensure visibility */\n}\n\n@media (max-width: 1023px) {\n .filterPanel {\n padding: var(--size-rem-0, 0) var(--size-rem-1, 16px);\n }\n}\n\n/* Fixed footer - Figma: 92px height */\n.footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--size-rem-1-5, 24px) var(--size-rem-3, 48px) var(--size-rem-1-5, 24px) var(--size-rem-3, 48px);\n height: 92px;\n flex-shrink: 0;\n border-top: 1px solid var(--border-general-divider);\n background-color: var(--background-general-primary);\n}\n\n@media (max-width: 1023px) {\n .footer {\n padding: var(--size-rem-1-5, 24px) var(--size-rem-1, 16px);\n }\n}\n\n.footerLink {\n transition: color 0.15s ease;\n color: var(--content-action-link-idle);\n /* label-link/large */\n font-family: var(--text-label-large-font-family, inherit);\n font-size: var(--text-label-large-font-size, 16px);\n font-style: normal;\n font-weight: 500;\n line-height: var(--text-label-large-line-height, 1.55); /* 155.556% */\n text-decoration-line: underline;\n text-decoration-style: solid;\n text-decoration-skip-ink: none;\n text-decoration-thickness: auto;\n text-underline-offset: auto;\n text-underline-position: from-font;\n cursor: pointer;\n}\n\n.footerLink:focus {\n outline: none;\n box-shadow: none;\n}\n\n/* Disabled state */\n.footerLink:disabled {\n color: var(--content-action-disabled-idle);\n cursor: not-allowed;\n}\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","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"],"mappings":"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","names":["ChevronRightIcon","HeartIcon","PinIcon","StarIcon","import_react","import_jsx_runtime","import_jsx_runtime","cx","import_jsx_runtime","cx","containerClasses","import_jsx_runtime","cx","lineClass","import_jsx_runtime","cx","import_react","import_jsx_runtime","cx","import_jsx_runtime","cx","import_jsx_runtime","cx","import_react","import_jsx_runtime","cx","CloseIcon","import_jsx_runtime","cx","StarIcon","import_react","import_jsx_runtime","cx","defaultValue","import_react","import_jsx_runtime","cx","defaultValue","import_jsx_runtime","cx","containerClasses","import_jsx_runtime","cx","import_react","import_jsx_runtime","cx","ChevronIcon","import_jsx_runtime","cx","import_react","import_jsx_runtime","cx","import_react","import_react","import_react","useI18nTranslation","import_react","import_react","import_jsx_runtime","cx","today","import_jsx_runtime","cx","cxMod","months","import_jsx_runtime","cx","cxMod","getDateLocale","format","months","import_jsx_runtime","_","import_react","import_jsx_runtime","HeartIcon","import_jsx_runtime","StarIcon","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","CloseIcon","import_jsx_runtime","HeartIcon","import_jsx_runtime","StarIcon","import_jsx_runtime","import_jsx_runtime","ChevronRightIcon","import_jsx_runtime","PinIcon"]}