@hotelcard/ui 1.0.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,74 @@
1
+ # @hotelcard/ui
2
+
3
+ Shared UI component library for HotelCard applications. Built with React, CSS Modules, and design tokens from Figma.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @hotelcard/ui
9
+ # or
10
+ pnpm add @hotelcard/ui
11
+ ```
12
+
13
+ ## Setup
14
+
15
+ Wrap your app with the provider and import the styles:
16
+
17
+ ```tsx
18
+ import { HotelCardUIProvider } from '@hotelcard/ui';
19
+ import '@hotelcard/ui/styles.css';
20
+ import '@hotelcard/ui/tokens.css';
21
+
22
+ function App() {
23
+ return (
24
+ <HotelCardUIProvider locale="en" t={(key) => key}>
25
+ {/* your app */}
26
+ </HotelCardUIProvider>
27
+ );
28
+ }
29
+ ```
30
+
31
+ ## Components
32
+
33
+ | Component | Description |
34
+ |-----------|-------------|
35
+ | `Button` | Primary, secondary, and text buttons |
36
+ | `Badge` | Status and label badges |
37
+ | `Block` | Content block container |
38
+ | `Card` | Hotel card with image, rating, badges |
39
+ | `Checkbox` | Checkbox input |
40
+ | `Chip` | Filter chips |
41
+ | `Divider` | Horizontal divider |
42
+ | `Dropdown` | Dropdown select |
43
+ | `Input` | Text input with variants (default, dropdown, phone) |
44
+ | `Pin` | Map pin marker |
45
+ | `RadioButton` | Radio button input |
46
+ | `Rating` | Star rating display |
47
+ | `HotelCardSkeleton` | Loading skeleton for hotel cards |
48
+
49
+ ## Hooks
50
+
51
+ | Hook | Description |
52
+ |------|-------------|
53
+ | `useResponsive()` | Returns `{ isMobile, isTablet, isDesktop }` based on breakpoints |
54
+ | `useDebounce(value, delay)` | Debounces a value |
55
+
56
+ ## Design Tokens
57
+
58
+ Import `@hotelcard/ui/tokens.css` for CSS custom properties:
59
+
60
+ - `--color-*` — Colors
61
+ - `--size-rem-*` — Spacing
62
+ - `--text-*` — Typography
63
+ - `--radius-*` — Border radius
64
+ - `--general-*` — General tokens
65
+
66
+ ## Peer Dependencies
67
+
68
+ - `react` ^18.0.0
69
+ - `react-dom` ^18.0.0
70
+ - `react-i18next` ^14.0.0 || ^15.0.0 || ^16.0.0
71
+
72
+ ## License
73
+
74
+ MIT - HotelCard AG
package/dist/index.cjs ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),m=require("react"),we={order:"Bestellen","order-navigation":"Bestellen","order-hc":"HotelCard bestellen","my-account":"Mein Konto",search:"Suchen","back-to-top":"Nach oben"},ke={"member-benefits":"Member Benefits","view-all-hotels":"Alle Hoteldeals ansehen","search-by-map":"Kartenansicht","search-by-region":"Hotels nach Region","search-by-experience":"Hotels nach Erlebnis","travel-inspiration":"Reiseinspiration","booking-tips-and-tricks":"Buchungstipps",home:"Startseite","all-hotel-deals":"Alle Hotelangebote","search-results":"Suchergebnisse"},je={"signed-out":"Anmelden und buchen","room-price":"ab CHF xxx / Zimmer",guarantee:"14 Tage Geld-zurück-Garantie",contact:"Weitere Fragen? Kontaktieren Sie uns.","breakfast-included":"Frühstück inbegriffen","free-cancellation":"Kostenlose Stornierung","suggested-destinations":"Vorgeschlagene Reiseziele","when-months":"Wann möchtest du reisen?","hotel-deals-found":"Hotelangebote gefunden","no-results":"Probieren Sie andere Reiseziele, ändern Sie Ihre Daten oder entfernen Sie einige Filter.","unavailable-for-selected-days":"Für die ausgewählten Daten nicht verfügbar.","cant-accommodate-all":"Das Hotel kann nicht alle Gäste beherbergen.","reset-destination":"Zielsuche zurücksetzen, um Regionen zu filtern"},Ne={"price-from":"ab ","price-for":"/ Zimmer","per-room-night":"pro Zimmer & Nacht ab",new:"Neu",anytime:"Jederzeit",anywhere:"Alle Reiseziele",dates:"Datum",flexible:"Flexibel",where:"Wohin",when:"Wann",who:"Wer",nearby:"In der Nähe",hotels:"Hotel",filter:"Filter",sort:"Sortieren",map:"Karte",rating:"Bewertung","rating-excellent":"Ausgezeichnet","rating-very-good":"Sehr gut","rating-good":"Gut","rating-fair":"Ansprechend","rating-none":"Keine Bewertung",clear:"Löschen",months:"Monate"},Le={"6m":"6-Monatsabo","1y":"1-Jahresabo","2y":"2-Jahresabo","3y":"3-Jahresabo","price-6m":"79.-","price-6m-disc":"59.-","price-1y":"99.-","price-1y-disc":"79.-","price-2y":"198.-","price-2y-disc":"173.-","price-3y":"297.-","price-3y-disc":"247.-","price-gift":"99.-","price-gift-disc":"59.-","1y-chc":"1-Jahresabo","price-1y-chc":"199.-","price-1y-disc-chc":"199.-"},ze={"your-hc":"Ihre HotelCard","popular-hotels":"Beliebte Hotelangebote","no-results":"Probieren Sie andere Reiseziele, ändern Sie Ihre Daten oder entfernen Sie einige Filter.","sort-by":"Sortieren nach"},Se={guests:"Gäste",guest:"Gast",adults:"Erwachsene",children:"Kinder",pet:"Haustier","age-of-child":"Alter des Kindes",age:"Alter","age-error":"Bitte wählen Sie das Alter aus"},$e={filters:"Filter",destination:"Reiseziel",experience:"Erlebnis","show-all":"Alle anzeigen",price:"Preis",discount:"Rabatt",services:"Leistungen",meals:"Verpflegung","hotel-category":"Hotelkategorie",reviews:"Bewertungen",mobility:"Mobilität","wellness-spa":"Wellness & Spa","price-high-low":"Preis: absteigend","price-low-high":"Preis: aufsteigend","best-rating":"Beste Bewertung","most-popular":"Beliebt","newest-hotels":"Neueste",relevance:"Relevanz",selected:"Ausgewählt:","clear-all":"Alles löschen",options:"Leistungen","hotellerie-suisse":"Klassifikation HotellerieSuisse",trustyou:"Bewertungen von Reisenden auf Trust You®","select-all":"Alle auswählen",reset:"Zurücksetzen","breakfast-included":"Frühstück inbegriffen","min-price":"Mindestpreis","max-price":"Höchstpreis","show-less":"Weniger anzeigen"},He={"no-results":"Zurzeit entsprechen keine Aufenthalte Ihrer Suche"},Be="Hotels suchen - HotelCard",Re="Suchen Sie nach Hotels nach Stadt, Region oder Hotelname",Ie="Suche",Pe={close:"Schließen"},We="Hotels werden geladen...",Ae="Erneut versuchen",Me="Karte schließen",Fe={default_title:"Hoteldeals suchen - HotelCard",location_title:"Hotels in {{location}}",region_title:"Hotels in {{region}}",experience_title:"{{experience}} Hotels",default_description:"Entdecken Sie {{count}} Hotels mit exklusiven HotelCard-Rabatten.",location_description:"Finden Sie {{count}} Hotels in {{location}} mit exklusiven Rabatten von bis zu 50%."},De={close_search:"Suche schließen",placeholder_anywhere:"Überall",recent_searches:"Letzte Suchen",remove_recent:"Aus letzten Suchen entfernen",all_destinations:"Alle Reiseziele"},Ee={open_search:"Suche öffnen",open_filters:"Filter öffnen",switch_to_list:"Zur Listenansicht wechseln",zoom_in:"Vergrößern",zoom_out:"Verkleinern",no_location_data:"Keine Hotels mit Standortdaten verfügbar",hotels_missing_coordinates:"{{count}} Hotels gefunden, aber Koordinaten fehlen",no_hotels_in_area:"Keine Hotels in diesem Gebiet gefunden"},Ve={list:"Liste"},Oe={properties_found:"{{count}} Unterkünfte gefunden",properties_found_location:"{{location}}: {{count}} Unterkünfte gefunden"},qe={search_results_breadcrumb:"Suchergebnisse",close:"Schließen",previous_image:"Vorheriges Bild",next_image:"Nächstes Bild",add_to_favorites:"Zu Favoriten hinzufügen",remove_from_favorites:"Aus Favoriten entfernen",list_view:"Zur Listenansicht wechseln",map_view:"Zur Kartenansicht wechseln"},Ze={home:"Startseite"},Ke={decrease_adults:"Erwachsene verringern",increase_adults:"Erwachsene erhöhen",decrease_children:"Kinder verringern",increase_children:"Kinder erhöhen",decrease_infants:"Kleinkinder verringern",increase_infants:"Kleinkinder erhöhen",toggle_infants:"Haustiere umschalten"},Te={location_placeholder:"Hotels, Städte, Regionen suchen...",distance_any:"- km",distance_5:"+ 5 km",distance_10:"+ 10 km",distance_20:"+ 20 km",distance_30:"+ 30 km",distance_50:"+ 50 km",searching:"Suche läuft...",reset_filters:"Filter zurücksetzen"},Ge={hotels:"Hotels",cities:"Städte",regions:"Regionen",countries:"Länder","no-results":"Keine Ergebnisse gefunden"},Ue={show_filters:"Filter anzeigen",open_filters:"Filter öffnen",filter_by:"Filtern nach:",hotel_rating:"Hotelbewertung",show_results:"{{count}} Ergebnisse anzeigen",apply_filters:"Filter anwenden",close_filters:"Filter schließen",view_in_map:"Auf der Karte anzeigen",popular_filters:"Beliebte Filter",destinations:"Reiseziele",options_title:"Optionen",options:{instant_booking:"Sofort buchbar",pets_allowed:"Haustiere erlaubt",free_cancellation:"Kostenlose Stornierung"},category:{footer_prefix:"Hotelklassifikation gemäss "},show_less:"Weniger anzeigen",selected:"Ausgewählt",clear_all:"Alle löschen"},Qe={apply:"Anwenden",months_selected:"{{count}} Monate"},Je={"5_stars":"5 Sterne","4_stars":"4 Sterne","3_stars":"3 Sterne","2_stars":"2 Sterne",not_classified:"Nicht klassifiziert",swiss_lodge:"Swiss Lodge"},Ye={hotels_found:"{{count}} Hotels gefunden",load_more:"Mehr laden",loading:"Laden...",end_of_results:"Sie haben das Ende der Ergebnisse erreicht",no_results:"Keine Hotels gefunden",try_different_search:"Versuchen Sie, Ihre Suchkriterien anzupassen",unavailable_banner_title:"Weitere Hotels, die Sie interessieren könnten",unavailable_banner_description:"Diese Hotels haben derzeit keine Verfügbarkeit, die Ihren Suchkriterien entspricht."},Xe={title:"Derzeit sind keine Unterkünfte verfügbar, die Ihren Suchkriterien entsprechen.",subtitle:"Versuchen Sie, Ihre Suchkriterien anzupassen oder die Filter zurückzusetzen",description:"Entdecken Sie verschiedene Reiseziele, ändern Sie Ihre Reisedaten oder entfernen Sie einige Filter.",description_with_filters:"Entdecken Sie verschiedene Reiseziele, ändern Sie Ihre Reisedaten oder entfernen Sie einige Filter.",clear_filters:"Filter zurücksetzen"},et={search_failed:"Suche fehlgeschlagen",load_more_failed:"Weitere Hotels konnten nicht geladen werden"},tt={title:"Etwas ist schiefgelaufen",description:"Die Hotels konnten nicht geladen werden. Bitte versuchen Sie es erneut.",retry:"Erneut versuchen"},st={label:"Seitennavigation",previous:"Vorherige Seite",previous_short:"Zurück",next:"Nächste Seite",next_short:"Weiter",page:"Seite {{page}}"},it={rating:"Bewertung",price_from:"pro Zimmer & Nacht ab",not_available:"Nicht verfügbar für Ihre Suchkriterien"},nt={new:"Neu"},at={countdown_days:"Tage",card_directions:"Wegbeschreibung",card_message_from_hotel:"Nachricht vom Hotel",card_more_about_booking:"Mehr zu dieser Buchung",card_book_again:"Erneut buchen",countdown_add_to_calendar:"Zum Kalender hinzufügen",status_confirmed:"Bestätigt",status_completed:"Abgeschlossen",status_cancelled:"Storniert",details_check_in:"Check-in",details_check_out:"Check-out",details_guests:"Gäste",details_room:"Zimmername",details_breakfast:"Frühstück",details_cancellation:"Stornierung",details_cancel_booking:"Buchung stornieren",details_booked:"Gebucht",details_room_price:"Zimmerpreis",details_saved_with_hotelcard:"Mit HotelCard gespart",details_total_cost:"Gesamtkosten"},ot={valid_thru:"Gültigkeit"},rt={button:we,link:ke,general:je,label:Ne,product:Le,subheadline:ze,form:Se,filter:$e,headline:He,meta_title:Be,meta_description:Re,title:Ie,common:Pe,loading:We,retry:Ae,close_map:Me,seo:Fe,modal:De,map:Ee,view:Ve,breadcrumb:Oe,aria:qe,breadcrumb_nav:Ze,guest_selector:Ke,search_form:Te,dropdown:Ge,filters:Ue,date_selector:Qe,star_rating:Je,results:Ye,no_results:Xe,errors:et,error:tt,pagination:st,hotel_card:it,badges:nt,booking:at,membership:ot},lt={order:"Order","order-navigation":"Join","order-hc":"Order HotelCard","my-account":"My account",search:"Search","back-to-top":"Back to top"},ct={"member-benefits":"Member Benefits","view-all-hotels":"View all hotel deals","search-by-map":"Map search","search-by-region":"Hotels by region","search-by-experience":"Hotels by experience","travel-inspiration":"Travel inspiration","booking-tips-and-tricks":"Booking tips",home:"Home","all-hotel-deals":"All hotel deals","search-results":"Search results"},dt={"signed-out":"Log in and book","room-price":"from CHF xxx / room",guarantee:"14-day money-back guarantee",contact:"More questions? Contact us.","breakfast-included":"Breakfast included","free-cancellation":"Free cancellation","suggested-destinations":"Not sure where to travel next?","when-months":"When do you want to go?","hotel-deals-found":"hotel deals found","no-results":"Explore different destinations, change your dates, or remove some filters.","unavailable-for-selected-days":"Unavailable for selected dates.","cant-accommodate-all":"Hotel can’t accommodate all guests.","reset-destination":"Reset destination search to use region filters."},_t={"price-from":"from ","price-for":"/ room","per-room-night":"per room & night from",new:"New",anytime:"Anytime",anywhere:"All destinations",dates:"Dates",flexible:"Flexible",where:"Where",when:"When",who:"Who",nearby:"Nearby",hotels:"Hotel",filter:"Filter",sort:"Sort",map:"Map",rating:"Rating","rating-excellent":"Excellent","rating-very-good":"Very good","rating-good":"Good","rating-fair":"Fair","rating-none":"No rating",clear:"Clear",months:"Months"},ut={"6m":"6-month subscription","1y":"1-year subscription","2y":"2-year subscription","3y":"3-year subscription","price-6m":"79.-","price-6m-disc":"59.-","price-1y":"99.-","price-1y-disc":"79.-","price-2y":"198.-","price-2y-disc":"173.-","price-3y":"297.-","price-3y-disc":"247.-","price-gift":"99.-","price-gift-disc":"59.-","1y-chc":"1-year subscription","price-1y-chc":"199.-","price-1y-disc-chc":"199.-"},ht={"your-hc":"Your HotelCard","popular-hotels":"Popular hotel deals","no-results":"Explore different destinations, change your dates, or remove some filters.","sort-by":"Sort by"},pt={guests:"guests",guest:"guest",adults:"Adults",children:"Children",pet:"Pet","age-of-child":"Child’s age",age:"Age","age-error":"Please select age"},mt={filters:"Filters",destination:"Destination",experience:"Experience","show-all":"Show all",price:"Price",discount:"Discount",services:"Services",meals:"Meals","hotel-category":"Hotel category",reviews:"Reviews",mobility:"Mobility","wellness-spa":"Wellness & Spa","price-high-low":"Price high to low","price-low-high":"Price low to high","best-rating":"Best guest rating","most-popular":"Most popular","newest-hotels":"Newest",relevance:"Relevance",selected:"Selected:","clear-all":"Clear all",options:"Options","hotellerie-suisse":"Classification HotellerieSuisse",trustyou:"Reviews from travelers on TrustYou®","select-all":"Select all",reset:"Reset","breakfast-included":"Breakfast included","min-price":"Minimum price","max-price":"Maximum price","show-less":"Show less"},ft={"no-results":"No stays match your search right now"},gt="Search Hotels - HotelCard",bt="Search for hotels by city, region, or hotel name",vt="Search",xt={close:"Close"},yt="Loading hotels...",Ct="Retry",wt="Close map",kt={default_title:"Search Hotel Deals - HotelCard",location_title:"Hotels in {{location}}",region_title:"Hotels in {{region}}",experience_title:"{{experience}} Hotels",default_description:"Discover {{count}} hotels with exclusive HotelCard discounts.",location_description:"Find {{count}} hotels in {{location}} with exclusive discounts up to 50% off."},jt={close_search:"Close search",placeholder_anywhere:"Anywhere",recent_searches:"Recent searches",remove_recent:"Remove from recent searches",all_destinations:"All destinations"},Nt={open_search:"Open search",open_filters:"Open filters",switch_to_list:"Switch to list view",zoom_in:"Zoom in",zoom_out:"Zoom out",no_location_data:"No hotels with location data available",hotels_missing_coordinates:"{{count}} hotels found but missing coordinates",no_hotels_in_area:"No hotels found in this area"},Lt={list:"List"},zt={properties_found:"{{count}} properties found",properties_found_location:"{{location}}: {{count}} properties found"},St={search_results_breadcrumb:"Search results",close:"Close",previous_image:"Previous image",next_image:"Next image",add_to_favorites:"Add to favorites",remove_from_favorites:"Remove from favorites",list_view:"Switch to list view",map_view:"Switch to map view"},$t={home:"Home"},Ht={adults_description:"Ages 13 or above",children_description:"Ages 2-12",infants_description:"Under 2",decrease_adults:"Decrease adults",increase_adults:"Increase adults",decrease_children:"Decrease children",increase_children:"Increase children",decrease_infants:"Decrease infants",increase_infants:"Increase infants",toggle_infants:"Toggle pet"},Bt={location_placeholder:"Search for hotels, cities, regions...",distance_any:"- km",distance_5:"+ 5 km",distance_10:"+ 10 km",distance_20:"+ 20 km",distance_30:"+ 30 km",distance_50:"+ 50 km",searching:"Searching...",reset_filters:"Reset"},Rt={hotels:"Hotels",cities:"Cities",regions:"Regions",countries:"Countries","no-results":"No results found"},It={show_filters:"Show filters",open_filters:"Open filters",filter_by:"Filter by:",hotel_rating:"Hotel rating",show_results:"Show {{count}} results",apply_filters:"Apply filters",close_filters:"Close filters",view_in_map:"View in a Map",popular_filters:"Popular filters",show_less:"Show less",selected:"Selected",clear_all:"Clear all",options:{instant_booking:"Immediately bookable",pets_allowed:"Pets allowed",free_cancellation:"Free cancellation"}},Pt={apply:"Apply",months_selected:"{{count}} months"},Wt={"5_stars":"5 stars","4_stars":"4 stars","3_stars":"3 stars","2_stars":"2 stars",not_classified:"Not classified",swiss_lodge:"Swiss Lodge"},At={hotels_found:"{{count}} hotels found",load_more:"Load more",loading:"Loading...",end_of_results:"You've reached the end of results",no_results:"No hotels found",try_different_search:"Try adjusting your search criteria",unavailable_banner_title:"More hotels that might interest you",unavailable_banner_description:"These hotels don't currently have availability matching your search criteria."},Mt={search_failed:"Search failed",load_more_failed:"Failed to load more hotels"},Ft={title:"Something went wrong",description:"We couldn't load the hotels. Please try again.",retry:"Try again"},Dt={title:"No stays match your search right now.",description:"Explore different destinations, change your dates, or remove some filters.",description_with_filters:"Explore different destinations, change your dates, or remove some filters.",clear_filters:"Clear all filters"},Et={label:"Pagination",previous:"Previous page",previous_short:"Previous",next:"Next page",next_short:"Next",page:"Page {{page}}"},Vt={rating:"Rating",price_from:"per room & night from",not_available:"Not available for your search criteria"},Ot={new:"New"},qt="Clear location",Zt="Clear date",Kt="Clear guests",Tt={countdown_days:"days",card_directions:"Directions",card_message_from_hotel:"Message from the hotel",card_more_about_booking:"More about this booking",card_book_again:"Book again",countdown_add_to_calendar:"Add to calendar",status_confirmed:"Confirmed",status_completed:"Completed",status_cancelled:"Cancelled",details_check_in:"Check-in",details_check_out:"Check-out",details_guests:"Guests",details_room:"Room name",details_breakfast:"Breakfast",details_cancellation:"Cancellation",details_cancel_booking:"Cancel booking",details_booked:"Booked",details_room_price:"Room price",details_saved_with_hotelcard:"Saved with HotelCard",details_total_cost:"Total cost"},Gt={valid_thru:"Validity"},Ut={button:lt,link:ct,general:dt,label:_t,product:ut,subheadline:ht,form:pt,filter:mt,headline:ft,meta_title:gt,meta_description:bt,title:vt,common:xt,loading:yt,retry:Ct,close_map:wt,seo:kt,modal:jt,map:Nt,view:Lt,breadcrumb:zt,aria:St,breadcrumb_nav:$t,guest_selector:Ht,search_form:Bt,dropdown:Rt,filters:It,date_selector:Pt,star_rating:Wt,results:At,errors:Mt,error:Ft,no_results:Dt,pagination:Et,hotel_card:Vt,badges:Ot,clear_location:qt,clear_date:Zt,clear_guests:Kt,booking:Tt,membership:Gt},Qt={order:"Commander","order-navigation":"Commander","order-hc":"Commander l'HotelCard","my-account":"Mon compte",search:"Rechercher","back-to-top":"Haut de page"},Jt={"member-benefits":"Member Benefits","view-all-hotels":"Découvrez toutes nos offres","search-by-map":"Recherche sur la carte","search-by-region":"Hôtels par région","search-by-experience":"Hôtels par expérience","travel-inspiration":"Inspiration voyage","booking-tips-and-tricks":"Conseils réservation",home:"Accueil","all-hotel-deals":"Toutes les offres d’hôtels","search-results":"Résultats de recherche"},Yt={"signed-out":"Se connecter et réserver","room-price":"à partir de CHF XXX par chambre",guarantee:"Garantie de remboursement de 14 jours",contact:"D’autres questions ? Contactez-nous.","breakfast-included":"Petit-déjeuner inclus","free-cancellation":"Annulation gratuite","suggested-destinations":"Suggestions de destinations","when-months":"Quand souhaitez-vous partir ?","hotel-deals-found":"offres d’hôtel trouvées","no-results":"Explorez d’autres destinations, modifiez vos dates ou retirez certains filtres.","unavailable-for-selected-days":"Indisponible aux dates sélectionnées.","cant-accommodate-all":"L’hôtel ne peut pas accueillir tous les voyageurs.","reset-destination":"Réinitialiser la destination et filtrer par région"},Xt={"price-from":"à partir de ","price-for":"par chambre","per-room-night":"par chambre & nuit dès",new:"Nouveau",anytime:"À tout moment",anywhere:"Toutes les destinations",dates:"Dates",flexible:"Flexible",where:"Destination",when:"Quand",who:"Voyageurs",nearby:"À proximité",hotels:"Hôtel",filter:"Filtrer",sort:"Trier",map:"Carte",rating:"Note","rating-excellent":"Excellent","rating-very-good":"Très bien","rating-good":"Bien","rating-fair":"Moyen","rating-none":"Aucune notation",clear:"Effacer",months:"Mois"},es={"6m":"Abonnement de 6 mois","1y":"Abonnement 1 an","2y":"Abonnement 2 ans","3y":"Abonnement 3 ans","price-6m":"79.-","price-6m-disc":"59.-","price-1y":"99.-","price-1y-disc":"79.-","price-2y":"198.-","price-2y-disc":"173.-","price-3y":"297.-","price-3y-disc":"247.-","price-gift":"99.-","price-gift-disc":"59.-","1y-chc":"Abonnement 1 an","price-1y-chc":"199.-","price-1y-disc-chc":"199.-"},ts={"your-hc":"Votre HotelCard","popular-hotels":"Offres d’hôtels populaires","no-results":"Explorez d’autres destinations, modifiez vos dates ou retirez certains filtres.","sort-by":"Trier par"},ss={guests:"personnes",guest:"personne",adults:"Adultes",children:"Enfants",pet:"Animal domestique","age-of-child":"Âge de l’enfant",age:"Âge","age-error":"Veuillez sélectionner l’âge"},is={filters:"Filtres",destination:"Destination",experience:"Expérience","show-all":"Tout afficher",price:"Prix",discount:"Réduction",services:"Services",meals:"Repas","hotel-category":"Catégorie d’hôtel",reviews:"Avis",mobility:"Mobilité","wellness-spa":"Bien-être & Spa","price-high-low":"Prix : du plus bas","price-low-high":"Prix : du plus élevé","best-rating":"Meilleure note","most-popular":"Plus populaires","newest-hotels":"Plus récents",relevance:"Pertinence",selected:"Sélectionné:","clear-all":"Tout effacer",options:"Services","hotellerie-suisse":"Classification HotellerieSuisse",trustyou:"Avis de voyageurs sur TrustYou®","select-all":"Tout sélectionner",reset:"Réinitialiser","breakfast-included":"Petit-déjeuner inclus","min-price":"Prix minimum","max-price":"Prix maximum","show-less":"Afficher moins"},ns={"no-results":"Aucun séjour ne correspond à votre recherche pour le moment"},as="Rechercher des hôtels - HotelCard",os="Recherchez des hôtels par ville, région ou nom d'hôtel",rs="Recherche",ls={close:"Fermer"},cs="Chargement des hôtels...",ds="Réessayer",_s="Fermer la carte",us={default_title:"Rechercher des offres d'hôtels - HotelCard",location_title:"Hôtels à {{location}}",region_title:"Hôtels en {{region}}",experience_title:"Hôtels {{experience}}",default_description:"Découvrez {{count}} hôtels avec des réductions exclusives HotelCard.",location_description:"Trouvez {{count}} hôtels à {{location}} avec des réductions exclusives jusqu'à 50%."},hs={close_search:"Fermer la recherche",placeholder_anywhere:"Partout",recent_searches:"Recherches récentes",remove_recent:"Supprimer des recherches récentes",all_destinations:"Toutes les destinations"},ps={open_search:"Ouvrir la recherche",open_filters:"Ouvrir les filtres",switch_to_list:"Passer à la vue liste",zoom_in:"Agrandir",zoom_out:"Réduire",no_location_data:"Aucun hôtel avec données de localisation",hotels_missing_coordinates:"{{count}} hôtels trouvés mais coordonnées manquantes",no_hotels_in_area:"Aucun hôtel trouvé dans cette zone"},ms={list:"Liste"},fs={properties_found:"{{count}} hébergements trouvés",properties_found_location:"{{location}}: {{count}} hébergements trouvés"},gs={search_results_breadcrumb:"Résultats de la recherche",close:"Fermer",previous_image:"Image précédente",next_image:"Image suivante",add_to_favorites:"Ajouter aux favoris",remove_from_favorites:"Retirer des favoris",list_view:"Passer à la vue liste",map_view:"Passer à la vue carte"},bs={home:"Accueil"},vs={decrease_adults:"Diminuer les adultes",increase_adults:"Augmenter les adultes",decrease_children:"Diminuer les enfants",increase_children:"Augmenter les enfants",decrease_infants:"Diminuer les bébés",increase_infants:"Augmenter les bébés",toggle_infants:"Basculer les animaux"},xs={location_placeholder:"Rechercher des hôtels, villes, régions...",distance_any:"- km",distance_5:"+ 5 km",distance_10:"+ 10 km",distance_20:"+ 20 km",distance_30:"+ 30 km",distance_50:"+ 50 km",searching:"Recherche en cours...",reset_filters:"Réinitialiser les filtres"},ys={hotels:"Hôtels",cities:"Villes",regions:"Régions",countries:"Pays","no-results":"Aucun résultat trouvé"},Cs={show_filters:"Afficher les filtres",open_filters:"Ouvrir les filtres",filter_by:"Filtrer par:",hotel_rating:"Classement de l'hôtel",show_results:"Afficher {{count}} résultats",apply_filters:"Appliquer les filtres",close_filters:"Fermer les filtres",view_in_map:"Voir sur la carte",popular_filters:"Filtres populaires",destinations:"Destinations",options_title:"Options",options:{instant_booking:"Réservation immédiate",pets_allowed:"Animaux acceptés",free_cancellation:"Annulation gratuite"},category:{footer_prefix:"Classification hôtelière selon "},show_less:"Afficher moins",selected:"Sélectionné",clear_all:"Tout effacer"},ws={apply:"Appliquer",months_selected:"{{count}} mois"},ks={"5_stars":"5 étoiles","4_stars":"4 étoiles","3_stars":"3 étoiles","2_stars":"2 étoiles",not_classified:"Non classé",swiss_lodge:"Swiss Lodge"},js={hotels_found:"{{count}} hôtels trouvés",load_more:"Charger plus",loading:"Chargement...",end_of_results:"Vous avez atteint la fin des résultats",no_results:"Aucun hôtel trouvé",try_different_search:"Essayez d'ajuster vos critères de recherche",unavailable_banner_title:"D'autres hôtels qui pourraient vous intéresser",unavailable_banner_description:"Ces hôtels n'ont actuellement pas de disponibilité correspondant à vos critères de recherche."},Ns={title:"Aucun hébergement ne correspond à votre recherche pour le moment.",subtitle:"Essayez d'ajuster vos critères de recherche ou réinitialisez les filtres",description:"Explorez différentes destinations, modifiez vos dates ou supprimez certains filtres.",description_with_filters:"Explorez différentes destinations, modifiez vos dates ou supprimez certains filtres.",clear_filters:"Réinitialiser les filtres"},Ls={search_failed:"La recherche a échoué",load_more_failed:"Impossible de charger plus d'hôtels"},zs={title:"Une erreur s'est produite",description:"Les hôtels n'ont pas pu être chargés. Veuillez réessayer.",retry:"Réessayer"},Ss={label:"Pagination",previous:"Page précédente",previous_short:"Précédent",next:"Page suivante",next_short:"Suivant",page:"Page {{page}}"},$s={rating:"Note",price_from:"par chambre & nuit dès",not_available:"Non disponible selon vos critères de recherche"},Hs={new:"Nouveau"},Bs={countdown_days:"jours",card_directions:"Itinéraire",card_message_from_hotel:"Message de l'hôtel",card_more_about_booking:"Plus sur cette réservation",card_book_again:"Réserver à nouveau",countdown_add_to_calendar:"Ajouter au calendrier",status_confirmed:"Confirmée",status_completed:"Terminée",status_cancelled:"Annulée",details_check_in:"Arrivée",details_check_out:"Départ",details_guests:"Voyageurs",details_room:"Nom de la chambre",details_breakfast:"Petit-déjeuner",details_cancellation:"Annulation",details_cancel_booking:"Annuler la réservation",details_booked:"Réservé",details_room_price:"Prix de la chambre",details_saved_with_hotelcard:"Économisé avec HotelCard",details_total_cost:"Coût total"},Rs={valid_thru:"Validité"},Is={button:Qt,link:Jt,general:Yt,label:Xt,product:es,subheadline:ts,form:ss,filter:is,headline:ns,meta_title:as,meta_description:os,title:rs,common:ls,loading:cs,retry:ds,close_map:_s,seo:us,modal:hs,map:ps,view:ms,breadcrumb:fs,aria:gs,breadcrumb_nav:bs,guest_selector:vs,search_form:xs,dropdown:ys,filters:Cs,date_selector:ws,star_rating:ks,results:js,no_results:Ns,errors:Ls,error:zs,pagination:Ss,hotel_card:$s,badges:Hs,booking:Bs,membership:Rs},Ps={order:"Ordina ora","order-navigation":"Ordina ora","order-hc":"Ordina HotelCard","my-account":"Il mio profilo",search:"Cerca","back-to-top":"Torna su"},Ws={"member-benefits":"Member Benefits","view-all-hotels":"Tutte le offerte hotel","search-by-map":"Ricerca sulla mappa","search-by-region":"Hotel per regione","search-by-experience":"Hotel per esperienza","travel-inspiration":"Ispirazioni di viaggio","booking-tips-and-tricks":"Consigli prenotazione",home:"Home","all-hotel-deals":"Tutte le offerte hotel","search-results":"Risultati di ricerca"},As={"signed-out":"Accedi e prenota","room-price":"a partire da CHF xxx per camera",guarantee:"Garanzia di rimborso di 14 giorni",contact:"Altre domande? Contattaci.","breakfast-included":"Colazione inclusa","free-cancellation":"Cancellazione gratuita","suggested-destinations":"Destinazioni suggerite","when-months":"Quando vuoi viaggiare?","hotel-deals-found":"offerte hotel trovate","no-results":"Prova altre destinazioni, cambia le date o rimuovi qualche filtro.","unavailable-for-selected-days":"Non disponibile per le date selezionate.","cant-accommodate-all":"L’hotel non può accogliere tutti gli ospiti.","reset-destination":"Reimposta la destinazione e filtra per regione"},Ms={"price-from":"a partire da ","price-for":"per camera","per-room-night":"per camera e notte da",new:"Nuovo",anytime:"In qualsiasi momento",anywhere:"Tutte le destinazioni",dates:"Date",flexible:"Flessibile",where:"Dove",when:"Date",who:"Chi",nearby:"Nelle vicinanze",hotels:"Hotel",filter:"Filtra",sort:"Ordina",map:"Mappa",rating:"Rating","rating-excellent":"Eccellente","rating-very-good":"Ottimo","rating-good":"Buono","rating-fair":"Sufficiente","rating-none":"Nessun voto",clear:"Cancella",months:"Mesi"},Fs={"6m":"Abbonamento di 6 mesi","1y":"Abbonamento 1 anno","2y":"Abbonamento 2 anni","3y":"Abbonamento 3 anni","price-6m":"79.-","price-6m-disc":"59.-","price-1y":"99.-","price-1y-disc":"79.-","price-2y":"198.-","price-2y-disc":"173.-","price-3y":"297.-","price-3y-disc":"247.-","price-gift":"99.-","price-gift-disc":"59.-","1y-chc":"Abbonamento 1 anno","price-1y-chc":"199.-","price-1y-disc-chc":"199.-"},Ds={"your-hc":"La sua HotelCard","popular-hotels":"Offerte hotel popolari","no-results":"Prova altre destinazioni, cambia le date o rimuovi qualche filtro.","sort-by":"Ordina per"},Es={guests:"ospiti",guest:"ospite",adults:"Adulti",children:"Bambini",pet:"Animale domestico","age-of-child":"L'età del bambino",age:"L'età","age-error":"Seleziona l’età"},Vs={filters:"Filtri",destination:"Destinazione",experience:"Esperienza","show-all":"Mostra tutto",price:"Prezzo",discount:"Sconto",services:"Servizi",meals:"Pasti","hotel-category":"Categoria hotel",reviews:"Recensioni",mobility:"Mobilità","wellness-spa":"Wellness & Spa","price-high-low":"Prezzo: dal più basso","price-low-high":"Prezzo: dal più alto","best-rating":"Miglior voto","most-popular":"Più popolari","newest-hotels":"Più recenti",relevance:"Rilevanza",selected:"Selezionato:","clear-all":"Cancella tutto",options:"Servizi","hotellerie-suisse":"Classificazione HotellerieSuisse",trustyou:"Recensioni dei viaggiatori su TrustYou®","select-all":"Seleziona tutto",reset:"Reimposta","breakfast-included":"Colazione inclusa","min-price":"Prezzo minimo","max-price":"Prezzo massimo","show-less":"Mostra meno"},Os={"no-results":"Al momento nessun soggiorno corrisponde alla tua ricerca"},qs="Cerca Hotel - HotelCard",Zs="Cerca hotel per città, regione o nome dell'hotel",Ks="Ricerca",Ts={close:"Chiudi"},Gs="Caricamento hotel...",Us="Riprova",Qs="Chiudi mappa",Js={default_title:"Cerca offerte hotel - HotelCard",location_title:"Hotel a {{location}}",region_title:"Hotel in {{region}}",experience_title:"Hotel {{experience}}",default_description:"Scopri {{count}} hotel con sconti esclusivi HotelCard.",location_description:"Trova {{count}} hotel a {{location}} con sconti esclusivi fino al 50%."},Ys={close_search:"Chiudi ricerca",placeholder_anywhere:"Ovunque",recent_searches:"Ricerche recenti",remove_recent:"Rimuovi dalle ricerche recenti",all_destinations:"Tutte le destinazioni"},Xs={open_search:"Apri ricerca",open_filters:"Apri filtri",switch_to_list:"Passa alla vista elenco",zoom_in:"Ingrandisci",zoom_out:"Riduci",no_location_data:"Nessun hotel con dati di posizione",hotels_missing_coordinates:"{{count}} hotel trovati ma coordinate mancanti",no_hotels_in_area:"Nessun hotel trovato in questa zona"},ei={list:"Lista"},ti={properties_found:"{{count}} strutture trovate",properties_found_location:"{{location}}: {{count}} strutture trovate"},si={search_results_breadcrumb:"Risultati della ricerca",close:"Chiudi",previous_image:"Immagine precedente",next_image:"Immagine successiva",add_to_favorites:"Aggiungi ai preferiti",remove_from_favorites:"Rimuovi dai preferiti",list_view:"Passa alla vista elenco",map_view:"Passa alla vista mappa"},ii={home:"Home"},ni={decrease_adults:"Diminuisci adulti",increase_adults:"Aumenta adulti",decrease_children:"Diminuisci bambini",increase_children:"Aumenta bambini",decrease_infants:"Diminuisci neonati",increase_infants:"Aumenta neonati",toggle_infants:"Attiva/disattiva animali"},ai={location_placeholder:"Cerca hotel, città, regioni...",distance_any:"- km",distance_5:"+ 5 km",distance_10:"+ 10 km",distance_20:"+ 20 km",distance_30:"+ 30 km",distance_50:"+ 50 km",searching:"Ricerca in corso...",reset_filters:"Ripristina filtri"},oi={hotels:"Hotel",cities:"Città",regions:"Regioni",countries:"Paesi","no-results":"Nessun risultato trovato"},ri={show_filters:"Mostra filtri",open_filters:"Apri filtri",filter_by:"Filtra per:",hotel_rating:"Categoria hotel",show_results:"Mostra {{count}} risultati",apply_filters:"Applica filtri",close_filters:"Chiudi filtri",view_in_map:"Visualizza sulla mappa",popular_filters:"Filtri popolari",destinations:"Destinazioni",options_title:"Opzioni",options:{instant_booking:"Prenotazione immediata",pets_allowed:"Animali ammessi",free_cancellation:"Cancellazione gratuita"},category:{footer_prefix:"Classificazione alberghiera secondo "},show_less:"Mostra meno",selected:"Selezionato",clear_all:"Cancella tutto"},li={apply:"Applica",months_selected:"{{count}} mesi"},ci={"5_stars":"5 stelle","4_stars":"4 stelle","3_stars":"3 stelle","2_stars":"2 stelle",not_classified:"Non classificato",swiss_lodge:"Swiss Lodge"},di={hotels_found:"{{count}} hotel trovati",load_more:"Carica altri",loading:"Caricamento...",end_of_results:"Hai raggiunto la fine dei risultati",no_results:"Nessun hotel trovato",try_different_search:"Prova a modificare i criteri di ricerca",unavailable_banner_title:"Altri hotel che potrebbero interessarti",unavailable_banner_description:"Questi hotel non hanno attualmente disponibilità corrispondente ai tuoi criteri di ricerca."},_i={title:"Al momento non ci sono alloggi che corrispondono ai criteri di ricerca.",subtitle:"Prova a modificare i criteri di ricerca o ripristina i filtri",description:"Esplora diverse destinazioni, modifica le date o rimuovi alcuni filtri.",description_with_filters:"Esplora diverse destinazioni, modifica le date o rimuovi alcuni filtri.",clear_filters:"Ripristina filtri"},ui={search_failed:"Ricerca fallita",load_more_failed:"Impossibile caricare altri hotel"},hi={title:"Qualcosa è andato storto",description:"Non è stato possibile caricare gli hotel. Riprova.",retry:"Riprova"},pi={label:"Paginazione",previous:"Pagina precedente",previous_short:"Precedente",next:"Pagina successiva",next_short:"Successivo",page:"Pagina {{page}}"},mi={rating:"Valutazione",price_from:"per camera e notte da",not_available:"Non disponibile per i tuoi criteri di ricerca"},fi={new:"Nuovo"},gi={countdown_days:"giorni",card_directions:"Indicazioni",card_message_from_hotel:"Messaggio dall'hotel",card_more_about_booking:"Maggiori informazioni",card_book_again:"Prenota di nuovo",countdown_add_to_calendar:"Aggiungi al calendario",status_confirmed:"Confermata",status_completed:"Completata",status_cancelled:"Annullata",details_check_in:"Check-in",details_check_out:"Check-out",details_guests:"Ospiti",details_room:"Nome camera",details_breakfast:"Colazione",details_cancellation:"Cancellazione",details_cancel_booking:"Annulla prenotazione",details_booked:"Prenotato",details_room_price:"Prezzo camera",details_saved_with_hotelcard:"Risparmiato con HotelCard",details_total_cost:"Costo totale"},bi={valid_thru:"Validità"},vi={button:Ps,link:Ws,general:As,label:Ms,product:Fs,subheadline:Ds,form:Es,filter:Vs,headline:Os,meta_title:qs,meta_description:Zs,title:Ks,common:Ts,loading:Gs,retry:Us,close_map:Qs,seo:Js,modal:Ys,map:Xs,view:ei,breadcrumb:ti,aria:si,breadcrumb_nav:ii,guest_selector:ni,search_form:ai,dropdown:oi,filters:ri,date_selector:li,star_rating:ci,results:di,no_results:_i,errors:ui,error:hi,pagination:pi,hotel_card:mi,badges:fi,booking:gi,membership:bi},ae={de:rt,en:Ut,fr:Is,it:vi};function xi(t,i){const o=i.split(".");let a=t;for(const n of o){if(a==null||typeof a!="object")return;a=a[n]}return typeof a=="string"?a:void 0}function yi(t,i){return t.replace(/\{\{(\w+)\}\}/g,(o,a)=>{const n=i[a];return n!==void 0?String(n):`{{${a}}}`})}function oe(t){const i=ae[t]||ae.en;return(o,a,n)=>{const s=xi(i,o),l=a&&typeof a=="object",c=l?a:void 0,r=s??(l?n:a)??o;return c?yi(r,c):r}}const Ci=oe("de"),wi={locale:"de",currency:"CHF",isDesktop:!1,apiBaseUrl:"",t:Ci},re=m.createContext(wi),ki=({locale:t="de",currency:i="CHF",isDesktop:o=!1,apiBaseUrl:a="",t:n,children:s})=>{const l=m.useMemo(()=>n??oe(t),[t,n]),c=m.useMemo(()=>({locale:t,currency:i,isDesktop:o,apiBaseUrl:a,t:l}),[t,i,o,a,l]);return e.jsx(re.Provider,{value:c,children:s})},le=()=>m.useContext(re);function ji(t,i){const o=m.useRef(null);return m.useCallback((...a)=>{o.current&&clearTimeout(o.current),o.current=setTimeout(()=>{t(...a)},i)},[t,i])}const Ni={mobile:767,tablet:1023,desktop:1024},ce=()=>{const[t,i]=m.useState(1024);return m.useEffect(()=>{i(window.innerWidth);const o=()=>{i(window.innerWidth)};return window.addEventListener("resize",o),()=>window.removeEventListener("resize",o)},[]),{isDesktop:t>=1024,isMobile:t<768,isTablet:t>=768&&t<1024,isLargeDesktop:t>=1024,width:t}},Li="_button_1frbd_7",zi="_standard_1frbd_23",Si="_medium_1frbd_28",$i="_small_1frbd_41",Hi="_primary_1frbd_53",Bi="_secondary_1frbd_77",Ri="_link_1frbd_105",Ii="_iconOnly_1frbd_148",Pi="_iconWrapper_1frbd_219",Wi="_textWrapper_1frbd_233",A={button:Li,standard:zi,medium:Si,small:$i,primary:Hi,secondary:Bi,link:Ri,iconOnly:Ii,iconWrapper:Pi,textWrapper:Wi},de=m.forwardRef(({variant:t="primary",size:i="medium",leftIcon:o,rightIcon:a,children:n,className:s="",disabled:l,iconOnly:c=!1,style:_,...r},h)=>{const C=()=>{const f=[A.button];return t==="link"?(f.push(A.link),f.push(A[i]),f.filter(Boolean).join(" ")):c?(f.push(A.iconOnly),f.push(A[i]),f.push(A[t]),f.filter(Boolean).join(" ")):(f.push(A.standard),f.push(A[i]),f.push(A[t]),f.filter(Boolean).join(" "))};return e.jsx("button",{ref:h,style:_,className:`${C()} ${s}`,disabled:l,...r,children:c?n:e.jsxs(e.Fragment,{children:[o&&e.jsx("span",{className:A.iconWrapper,children:o}),e.jsx("span",{className:A.textWrapper,children:n}),a&&e.jsx("span",{className:A.iconWrapper,children:a})]})})});de.displayName="Button";const Ai="_badge_gwd5q_9",Mi="_icon_gwd5q_112",Fi="_text_gwd5q_130",T={badge:Ai,"badge--large":"_badge--large_gwd5q_19","badge--small":"_badge--small_gwd5q_31","badge--primaryHeavy":"_badge--primaryHeavy_gwd5q_48","badge--primaryLight":"_badge--primaryLight_gwd5q_54","badge--secondaryHeavy":"_badge--secondaryHeavy_gwd5q_61","badge--secondaryLight":"_badge--secondaryLight_gwd5q_67","badge--neutralHeavy":"_badge--neutralHeavy_gwd5q_74","badge--neutralLight":"_badge--neutralLight_gwd5q_80","badge--successHeavy":"_badge--successHeavy_gwd5q_87","badge--successLight":"_badge--successLight_gwd5q_93","badge--warningHeavy":"_badge--warningHeavy_gwd5q_100","badge--warningLight":"_badge--warningLight_gwd5q_106",icon:Mi,"icon--large":"_icon--large_gwd5q_118","icon--small":"_icon--small_gwd5q_124",text:Fi,"text--largeWithIcon":"_text--largeWithIcon_gwd5q_139"},ne=({color:t="primary",size:i="large",style:o="heavy",icon:a=!1,children:n,className:s=""})=>{const l=`${t}${o.charAt(0).toUpperCase()}${o.slice(1)}`,c=[T.badge,T[`badge--${i}`],T[`badge--${l}`],s].filter(Boolean).join(" "),_=[T.icon,T[`icon--${i}`]].join(" "),r=[T.text,i==="large"&&a&&T["text--largeWithIcon"]].filter(Boolean).join(" ");return e.jsxs("div",{className:c,children:[a&&e.jsx("div",{className:_}),e.jsx("div",{className:r,children:n})]})};ne.displayName="Badge";const Di="_blockIcon_zrymo_13",Ei="_textContainer_zrymo_75",Vi="_iconLabel_zrymo_82",Oi="_iconDescription_zrymo_91",qi="_blockImage_zrymo_104",Zi="_imageContainer_zrymo_124",Ki="_footer_zrymo_134",Ti="_imageLabel_zrymo_149",Gi="_arrow_zrymo_162",I={blockIcon:Di,"blockIcon--clickable":"_blockIcon--clickable_zrymo_29","iconContainer--primary":"_iconContainer--primary_zrymo_39","iconContainer--secondary":"_iconContainer--secondary_zrymo_57",textContainer:Ei,iconLabel:Vi,iconDescription:Oi,blockImage:qi,"blockImage--clickable":"_blockImage--clickable_zrymo_119",imageContainer:Zi,footer:Ki,imageLabel:Ti,arrow:Gi},_e=({variant:t="icon",visual:i,label:o,description:a,style:n="primary",onClick:s,showArrow:l=!0,className:c=""})=>{if(t==="icon"){const r=[I.blockIcon,s&&I["blockIcon--clickable"],c].filter(Boolean).join(" "),h=n==="primary"?I["iconContainer--primary"]:I["iconContainer--secondary"];return e.jsxs("div",{className:r,onClick:s,role:s?"button":void 0,tabIndex:s?0:void 0,children:[e.jsx("div",{className:h,children:i}),e.jsxs("div",{className:I.textContainer,children:[e.jsx("div",{className:I.iconLabel,children:o}),a&&e.jsx("div",{className:I.iconDescription,children:a})]})]})}const _=[I.blockImage,s&&I["blockImage--clickable"],c].filter(Boolean).join(" ");return e.jsxs("div",{className:_,onClick:s,role:s?"button":void 0,tabIndex:s?0:void 0,children:[e.jsx("div",{className:I.imageContainer,children:i}),e.jsxs("div",{className:I.footer,children:[e.jsx("span",{className:I.imageLabel,children:o}),l&&e.jsx("span",{className:I.arrow,children:"→"})]})]})};_e.displayName="Block";const Ui="_container_1x4z5_9",Qi="_checkboxWrapper_1x4z5_23",Ji="_checkboxBox_1x4z5_44",Yi="_input_1x4z5_92",Xi="_checkmark_1x4z5_106",en="_label_1x4z5_137",S={container:Ui,"container--disabled":"_container--disabled_1x4z5_18",checkboxWrapper:Qi,"checkboxWrapper--medium":"_checkboxWrapper--medium_1x4z5_32","checkboxWrapper--small":"_checkboxWrapper--small_1x4z5_38",checkboxBox:Ji,"checkboxBox--medium":"_checkboxBox--medium_1x4z5_54","checkboxBox--small":"_checkboxBox--small_1x4z5_62","checkboxBox--checked":"_checkboxBox--checked_1x4z5_70","checkboxBox--disabled":"_checkboxBox--disabled_1x4z5_76","checkboxBox--error":"_checkboxBox--error_1x4z5_82","checkboxBox--focused":"_checkboxBox--focused_1x4z5_87",input:Yi,"input--disabled":"_input--disabled_1x4z5_101",checkmark:Xi,"checkmark--medium":"_checkmark--medium_1x4z5_115","checkmark--small":"_checkmark--small_1x4z5_123","checkmark--checked":"_checkmark--checked_1x4z5_131",label:en,"label--disabled":"_label--disabled_1x4z5_146","label--error":"_label--error_1x4z5_151"},ue=({label:t,checked:i,defaultChecked:o=!1,onChange:a,disabled:n=!1,error:s=!1,name:l,id:c,className:_,size:r="medium"})=>{const[h,C]=m.useState(o),[f,k]=m.useState(!1),g=i!==void 0?i:h,w=p=>{const L=p.target.checked;i===void 0&&C(L),a==null||a(L)},j=[S.container,n&&S["container--disabled"],_].filter(Boolean).join(" "),$=[S.checkboxWrapper,S[`checkboxWrapper--${r}`]].filter(Boolean).join(" "),x=[S.checkboxBox,S[`checkboxBox--${r}`],g&&S["checkboxBox--checked"],n&&S["checkboxBox--disabled"],s&&!g&&S["checkboxBox--error"],f&&S["checkboxBox--focused"]].filter(Boolean).join(" "),N=[S.input,n&&S["input--disabled"]].filter(Boolean).join(" "),v=[S.checkmark,S[`checkmark--${r}`],g&&S["checkmark--checked"]].filter(Boolean).join(" "),z=[S.label,n&&S["label--disabled"],s&&!n&&S["label--error"]].filter(Boolean).join(" ");return e.jsxs("label",{className:j,children:[e.jsxs("div",{className:$,children:[e.jsx("div",{className:x}),e.jsx("input",{type:"checkbox",id:c,name:l,checked:g,onChange:w,disabled:n,className:N,onFocus:()=>k(!0),onBlur:()=>k(!1),"aria-invalid":s}),e.jsx("svg",{className:v,viewBox:"0 0 12 12",fill:"none",xmlns:"http://www.w3.org/2000/svg",children:e.jsx("path",{d:"M2.5 6L5 8.5L9.5 3.5",stroke:"var(--content-action-highlight-inverse-idle)",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})]}),t&&e.jsx("span",{className:z,children:t})]})};ue.displayName="Checkbox";const tn="_chip_mwn6a_17",sn="_label_mwn6a_88",nn="_countBadge_mwn6a_124",an="_closeIcon_mwn6a_168",on="_mobileLabel_mwn6a_200",Z={chip:tn,"chip--medium":"_chip--medium_mwn6a_42","chip--small":"_chip--small_mwn6a_48","chip--idle":"_chip--idle_mwn6a_58","chip--active":"_chip--active_mwn6a_70","chip--disabled":"_chip--disabled_mwn6a_79",label:sn,"label--medium":"_label--medium_mwn6a_96","label--small":"_label--small_mwn6a_102",countBadge:nn,"countBadge--medium":"_countBadge--medium_mwn6a_137","countBadge--small":"_countBadge--small_mwn6a_143",closeIcon:an,mobileLabel:on},he=({label:t,count:i,size:o="small",state:a="idle",removable:n=!0,onClick:s,onRemove:l,className:c="",disabled:_=!1})=>{const r=_?"disabled":a,h=[Z.chip,Z[`chip--${o}`],Z[`chip--${r}`],c].filter(Boolean).join(" "),C=[Z.label,Z[`label--${o}`]].join(" "),f=[Z.countBadge,Z[`countBadge--${o}`]].join(" "),k=w=>{_||(n&&l?l():s&&s())},g=w=>{_||(w.key==="Enter"||w.key===" ")&&(w.preventDefault(),n&&l?l():s&&s())};return e.jsxs("button",{type:"button",className:h,onClick:k,onKeyDown:g,disabled:_,"aria-label":n?`Remove filter: ${t}`:t,children:[e.jsx("span",{className:C,children:t}),i!==void 0&&e.jsx("span",{className:f,children:i}),n&&e.jsx("span",{className:Z.closeIcon,"aria-hidden":"true",children:e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",children:[e.jsx("g",{clipPath:"url(#clip0_1054_71341)",children:e.jsx("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:"#4B5563"})}),e.jsx("defs",{children:e.jsx("clipPath",{id:"clip0_1054_71341",children:e.jsx("rect",{width:"24",height:"24",fill:"white"})})})]})})]})};he.displayName="Chip";const rn="_container_9xihk_9",ln="_label_9xihk_68",K={container:rn,"container--horizontal":"_container--horizontal_9xihk_15","container--vertical":"_container--vertical_9xihk_23","line--horizontal":"_line--horizontal_9xihk_38","line--vertical":"_line--vertical_9xihk_44","lineStandalone--horizontal":"_lineStandalone--horizontal_9xihk_50","lineStandalone--vertical":"_lineStandalone--vertical_9xihk_59",label:ln},pe=({label:t,orientation:i="horizontal",className:o="",variant:a})=>{const n=i==="horizontal";if(!t){const _=n?K["lineStandalone--horizontal"]:K["lineStandalone--vertical"];return e.jsx("div",{className:[_,o].filter(Boolean).join(" "),role:"separator","aria-orientation":i})}const s=n?K["container--horizontal"]:K["container--vertical"],l=n?K["line--horizontal"]:K["line--vertical"],c=[K.container,s,o].filter(Boolean).join(" ");return e.jsxs("div",{className:c,role:"separator","aria-orientation":i,"aria-label":typeof t=="string"?t:void 0,children:[e.jsx("div",{className:l}),e.jsx("span",{className:K.label,children:t}),e.jsx("div",{className:l})]})};pe.displayName="Divider";const cn="_container_198od_9",dn="_button_198od_24",_n="_dropdownList_198od_61",un="_option_198od_83",hn="_hiddenSelect_198od_103",F={container:cn,"container--disabled":"_container--disabled_198od_19",button:dn,"button--focus":"_button--focus_198od_45","button--error":"_button--error_198od_50","button--disabled":"_button--disabled_198od_55",dropdownList:_n,"dropdownList--open":"_dropdownList--open_198od_78",option:un,"option--selected":"_option--selected_198od_96",hiddenSelect:hn},me=({options:t=[{value:"1",label:"Today"},{value:"2",label:"This weekend"},{value:"3",label:"Choose a date"}],disabled:i=!1,error:o=!1,defaultValue:a=t[0].value,onChange:n,className:s,name:l,id:c})=>{var z;const[_,r]=m.useState(a),[h,C]=m.useState(!1),[f,k]=m.useState(!1),g=m.useRef(null),w=((z=t.find(p=>p.value===_))==null?void 0:z.label)||"",j=p=>{r(p),n==null||n(p),C(!1)},$=[F.container,i&&F["container--disabled"],s].filter(Boolean).join(" "),x=[F.button,o&&F["button--error"],f&&!o&&F["button--focus"],i&&F["button--disabled"]].filter(Boolean).join(" "),N=[F.dropdownList,h&&F["dropdownList--open"]].filter(Boolean).join(" "),v=p=>[F.option,p&&F["option--selected"]].filter(Boolean).join(" ");return e.jsxs("div",{ref:g,className:$,children:[e.jsxs("div",{className:x,tabIndex:i?-1:0,onClick:()=>!i&&C(!h),onFocus:()=>!i&&k(!0),onBlur:()=>{setTimeout(()=>k(!1),100)},role:"button","aria-haspopup":"listbox","aria-expanded":h,"aria-disabled":i,children:[e.jsx("span",{children:w}),e.jsx("svg",{width:"12",height:"8",viewBox:"0 0 12 8",fill:"none",children:e.jsx("path",{d:"M1 1L6 6L11 1",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round"})})]}),e.jsx("ul",{role:"listbox",className:N,children:t.map(p=>e.jsx("li",{role:"option","aria-selected":_===p.value,onClick:()=>j(p.value),className:v(_===p.value),children:p.label},p.value))}),e.jsx("select",{id:c,name:l,value:_,onChange:p=>j(p.target.value),disabled:i,className:F.hiddenSelect,children:t.map(p=>e.jsx("option",{value:p.value,children:p.label},p.value))})]})};me.displayName="Dropdown";const pn="_container_jdbye_12",mn="_label_jdbye_27",fn="_inputWrapper_jdbye_45",gn="_input_jdbye_45",bn="_icon_jdbye_132",vn="_prefix_jdbye_162",xn="_helper_jdbye_177",yn="_phoneContainer_jdbye_206",Cn="_phonePrefixWrapper_jdbye_214",wn="_phonePrefixInput_jdbye_251",kn="_dropdownContainer_jdbye_275",jn="_dropdownIcon_jdbye_281",Nn="_dropdownBody_jdbye_299",Ln="_dropdownItem_jdbye_324",zn="_dropdownItemText_jdbye_342",d={container:pn,label:mn,"label--disabled":"_label--disabled_jdbye_37",inputWrapper:fn,"inputWrapper--focus":"_inputWrapper--focus_jdbye_65","inputWrapper--error":"_inputWrapper--error_jdbye_70","inputWrapper--disabled":"_inputWrapper--disabled_jdbye_75","inputWrapper--dropdown":"_inputWrapper--dropdown_jdbye_82","inputWrapper--phone":"_inputWrapper--phone_jdbye_87",input:gn,"input--disabled":"_input--disabled_jdbye_109",icon:bn,prefix:vn,helper:xn,"helper--error":"_helper--error_jdbye_193","helper--disabled":"_helper--disabled_jdbye_198",phoneContainer:yn,phonePrefixWrapper:Cn,"phonePrefixWrapper--focus":"_phonePrefixWrapper--focus_jdbye_234","phonePrefixWrapper--error":"_phonePrefixWrapper--error_jdbye_239","phonePrefixWrapper--disabled":"_phonePrefixWrapper--disabled_jdbye_244",phonePrefixInput:wn,"phonePrefixInput--disabled":"_phonePrefixInput--disabled_jdbye_266",dropdownContainer:kn,dropdownIcon:jn,"dropdownIcon--open":"_dropdownIcon--open_jdbye_294",dropdownBody:Nn,"dropdownBody--open":"_dropdownBody--open_jdbye_319",dropdownItem:Ln,dropdownItemText:zn},Sn=({value:t,onChange:i,onFocus:o,onBlur:a,type:n="text",placeholder:s="Placeholder",error:l=!1,disabled:c=!1,leftIcon:_,rightIcon:r,prefix:h,inputClassName:C,wrapperClassName:f,name:k,id:g,required:w=!1,autoComplete:j,autoFocus:$=!1,readOnly:x=!1,uniqueId:N,inputProps:v})=>{const[z,p]=m.useState(!1),L=m.useRef(null),H=B=>{i(B.target.value)},M=()=>{p(!0),o==null||o()},E=()=>{p(!1),a==null||a()},V=[d.inputWrapper,z&&d["inputWrapper--focus"],l&&d["inputWrapper--error"],(c||x)&&d["inputWrapper--disabled"],f].filter(Boolean).join(" "),q=[d.input,(c||x)&&d["input--disabled"],C].filter(Boolean).join(" ");return e.jsxs("div",{className:V,onClick:()=>{var B;return!c&&((B=L.current)==null?void 0:B.focus())},children:[_&&e.jsx("div",{className:d.icon,children:_}),h&&e.jsx("div",{className:d.prefix,children:h}),e.jsx("input",{ref:L,type:n,id:g,name:k,value:t,onChange:H,onFocus:M,onBlur:E,placeholder:s,disabled:c,required:w,autoComplete:j,autoFocus:$,readOnly:x,className:q,...v}),r&&r]})},$n=({value:t,onChange:i,phonePrefix:o,onPhonePrefixChange:a,onPhonePrefixBlur:n,onFocus:s,onBlur:l,placeholder:c="Placeholder",error:_=!1,disabled:r=!1,inputClassName:h,name:C,id:f,required:k=!1,autoComplete:g,autoFocus:w=!1,readOnly:j=!1,uniqueId:$})=>{const[x,N]=m.useState(!1),[v,z]=m.useState(!1),p=m.useRef(null),L=m.useRef(null),H=R=>{i(R.target.value)},M=()=>{N(!0),s==null||s()},E=()=>{N(!1),l==null||l()},V=R=>{a(R.target.value)},q=()=>{z(!0)},B=()=>{z(!1),n==null||n()},G=[d.phonePrefixWrapper,v&&d["phonePrefixWrapper--focus"],_&&d["phonePrefixWrapper--error"],r&&d["phonePrefixWrapper--disabled"]].filter(Boolean).join(" "),U=[d.phonePrefixInput,r&&d["phonePrefixInput--disabled"]].filter(Boolean).join(" "),Q=[d.inputWrapper,d["inputWrapper--phone"],x&&d["inputWrapper--focus"],_&&d["inputWrapper--error"],r&&d["inputWrapper--disabled"]].filter(Boolean).join(" "),J=[d.input,r&&d["input--disabled"],h].filter(Boolean).join(" ");return e.jsxs("div",{className:d.phoneContainer+" checkout-input-phone",children:[e.jsx("div",{className:G+" checkout-phone-code",onClick:()=>{var R;return!r&&((R=L.current)==null?void 0:R.focus())},children:e.jsx("input",{ref:L,type:"text",name:"country_code",autoComplete:"tel-country-code",value:o,onChange:V,onFocus:q,onBlur:B,disabled:r,className:U})}),e.jsx("div",{className:Q,onClick:()=>{var R;return!r&&((R=p.current)==null?void 0:R.focus())},children:e.jsx("input",{ref:p,type:"tel",id:f,name:C,value:t,onChange:H,onFocus:M,onBlur:E,placeholder:c,disabled:r,required:k,autoComplete:g,autoFocus:w,readOnly:j,className:J})})]})},Hn=({value:t,onChange:i,options:o=[],onSelect:a,dropdownOpen:n,onDropdownToggle:s,onFocus:l,onBlur:c,placeholder:_="Placeholder",error:r=!1,disabled:h=!1,inputClassName:C,name:f,id:k,required:g=!1,autoFocus:w=!1,uniqueId:j})=>{const[$,x]=m.useState(!1),[N,v]=m.useState(!1),[z,p]=m.useState(""),[L,H]=m.useState(null),[M,E]=m.useState(""),V=m.useRef(null),q=m.useRef(null);t&&t.length>0;const B=n!==void 0?n:N,G=()=>{x(!0),l==null||l()},U=()=>{x(!1),c==null||c(),setTimeout(()=>{n===void 0&&v(!1),s==null||s(!1)},200)},Q=()=>{var b;if(!h){const W=!B;n===void 0&&v(W),s==null||s(W),W&&((b=V.current)==null||b.focus(),E(""))}},J=b=>{const W=b.target.value;E(W),!B&&W&&(n===void 0&&v(!0),s==null||s(!0))},R=b=>{i(b.value),p(b.label),H(b.icon||null),E(""),a==null||a(b.value),n===void 0&&v(!1),s==null||s(!1)};m.useEffect(()=>{if(t&&o.length>0){const b=o.find(W=>W.value===t);b&&(p(b.label),H(b.icon||null))}},[t,o]),m.useEffect(()=>{if(B){const b=W=>{const ie=W.target;q.current&&!q.current.contains(ie)&&(n===void 0&&v(!1),s==null||s(!1))};return document.addEventListener("mousedown",b),()=>{document.removeEventListener("mousedown",b)}}},[B,n,s]);const te=[d.inputWrapper,d["inputWrapper--dropdown"],$&&d["inputWrapper--focus"],r&&d["inputWrapper--error"],h&&d["inputWrapper--disabled"]].filter(Boolean).join(" "),Y=[d.input,h&&d["input--disabled"],C].filter(Boolean).join(" "),X=[d.dropdownIcon,B&&d["dropdownIcon--open"]].filter(Boolean).join(" "),se=[d.dropdownBody,B&&d["dropdownBody--open"]].filter(Boolean).join(" ");return e.jsxs("div",{className:d.dropdownContainer,ref:q,children:[e.jsxs("div",{className:te,onClick:Q,children:[L&&e.jsx("div",{className:d.icon,children:L}),e.jsx("input",{ref:V,type:"text",id:k,name:f,value:B?M:z||t||"",onChange:J,onFocus:G,onBlur:U,placeholder:_,disabled:h,required:g,autoComplete:"off",readOnly:!1,className:Y}),e.jsx("div",{className:X,children:e.jsx("svg",{width:"16",height:"9",viewBox:"0 0 16 9",fill:"none",className:d.icon,children:e.jsx("path",{d:"M1 1L8 8L15 1",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})})})]}),e.jsx("div",{className:se,children:o.filter(b=>M?b.label.toLowerCase().includes(M.toLowerCase()):!0).map(b=>e.jsxs("div",{className:d.dropdownItem,onClick:()=>R(b),children:[b.icon&&e.jsx("div",{className:d.icon,children:b.icon}),e.jsx("span",{className:d.dropdownItemText,children:b.label})]},b.value))})]})};let Bn=0;const fe=({label:t,placeholder:i="Placeholder",helper:o,value:a,defaultValue:n,onChange:s,onFocus:l,onBlur:c,type:_="text",error:r=!1,disabled:h=!1,leftIcon:C,rightIcon:f,prefix:k,className:g,inputClassName:w,name:j,id:$,required:x=!1,autoComplete:N,autoFocus:v=!1,readOnly:z=!1,variant:p="default",phonePrefix:L,onPhonePrefixChange:H,onPhonePrefixBlur:M,options:E=[],onSelect:V,dropdownOpen:q,onDropdownToggle:B,wrapperClassName:G,inputProps:U})=>{const[Q,J]=m.useState(n||""),[R,te]=m.useState(L||"+000"),[Y]=m.useState(()=>`input-${++Bn}`),X=a!==void 0?a:Q,se=L!==void 0?L:R,b=ee=>{a===void 0&&J(ee),s==null||s(ee)},W=ee=>{L===void 0&&te(ee),H==null||H(ee)},ie=[d.container,g].filter(Boolean).join(" "),ye=[d.label,(h||z)&&d["label--disabled"]].filter(Boolean).join(" "),Ce=[d.helper,r&&d["helper--error"],(h||z)&&d["helper--disabled"]].filter(Boolean).join(" ");return e.jsxs("div",{className:ie,children:[t&&e.jsx("label",{htmlFor:$,className:ye,children:t}),p==="phone"?e.jsx($n,{value:X,onChange:b,phonePrefix:se,onPhonePrefixChange:W,onPhonePrefixBlur:M,onFocus:l,onBlur:c,placeholder:i,error:r,disabled:h,inputClassName:w,name:j,id:$,required:x,autoComplete:N,autoFocus:v,readOnly:z,uniqueId:Y}):p==="dropdown"?e.jsx(Hn,{value:X,onChange:b,options:E,onSelect:V,dropdownOpen:q,onDropdownToggle:B,onFocus:l,onBlur:c,placeholder:i,error:r,disabled:h,inputClassName:w,name:j,id:$,required:x,autoFocus:v,uniqueId:Y}):e.jsx(Sn,{value:X,onChange:b,onFocus:l,onBlur:c,type:_,placeholder:i,error:r,disabled:h,leftIcon:C,rightIcon:f,prefix:k,inputClassName:w,wrapperClassName:G,name:j,id:$,required:x,autoComplete:N,autoFocus:v,readOnly:z,uniqueId:Y,inputProps:U}),o&&e.jsx("div",{className:Ce,children:o})]})};fe.displayName="Input";const Rn="_pin_1ayf0_12",In="_body_1ayf0_33",Pn="_hotel_1ayf0_46",Wn="_pointer_1ayf0_55",An="_pointerInner_1ayf0_67",Mn="_currency_1ayf0_79",Fn="_price_1ayf0_87",Dn="_favoriteContainer_1ayf0_99",En="_favoriteIcon_1ayf0_105",Vn="_hotelIcon_1ayf0_115",On="_primary_1ayf0_126",qn="_secondary_1ayf0_201",D={pin:Rn,body:In,hotel:Pn,pointer:Wn,pointerInner:An,currency:Mn,price:Fn,favoriteContainer:Dn,favoriteIcon:En,hotelIcon:Vn,primary:On,secondary:qn},Zn=({className:t})=>e.jsx("svg",{className:t,width:"16",height:"16",viewBox:"0 0 16 16",fill:"currentColor",xmlns:"http://www.w3.org/2000/svg",children:e.jsx("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"})}),Kn=({className:t})=>e.jsx("svg",{className:t,width:"16",height:"16",viewBox:"0 0 16 16",fill:"currentColor",xmlns:"http://www.w3.org/2000/svg",children:e.jsx("path",{d:"M6.66667 13.3333V9.33333H9.33333V13.3333H12.6667V8H14.6667L8 2L1.33333 8H3.33333V13.3333H6.66667Z"})}),ge=m.forwardRef(({variant:t="price",viewed:i=!1,currency:o="CHF",price:a=0,showFavorite:n=!1,disabled:s=!1,onClick:l,className:c=""},_)=>{const r=i?"secondary":"primary",h=[D.pin,D[r],t==="hotel"&&D.hotel,c].filter(Boolean).join(" "),C=typeof a=="number"?Math.round(a).toString():a;return e.jsxs("button",{ref:_,type:"button",className:h,disabled:s,onClick:l,children:[e.jsx("div",{className:D.body,children:t==="price"?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:D.currency,children:o}),e.jsx("span",{className:D.price,children:C}),n&&e.jsx("div",{className:D.favoriteContainer,children:e.jsx(Zn,{className:D.favoriteIcon})})]}):e.jsx(Kn,{className:D.hotelIcon})}),e.jsx("div",{className:D.pointer,children:e.jsx("div",{className:D.pointerInner})})]})});ge.displayName="Pin";const Tn="_container_xll77_9",Gn="_radioWrapper_xll77_21",Un="_outerCircle_xll77_29",Qn="_innerDot_xll77_71",Jn="_hiddenInput_xll77_91",Yn="_label_xll77_96",O={container:Tn,"container--disabled":"_container--disabled_xll77_16",radioWrapper:Gn,outerCircle:Un,"outerCircle--checked":"_outerCircle--checked_xll77_55","outerCircle--disabled":"_outerCircle--disabled_xll77_66",innerDot:Qn,"innerDot--checked":"_innerDot--checked_xll77_85",hiddenInput:Jn,label:Yn},be=({id:t,checked:i,onChange:o,name:a,value:n,disabled:s=!1,className:l="",label:c,autoComplete:_})=>{const r=()=>{!s&&!i&&o(!0)},h=g=>{!s&&(g.key==="Enter"||g.key===" ")&&(g.preventDefault(),i||o(!0))},C=[O.container,s&&O["container--disabled"],l].filter(Boolean).join(" "),f=[O.outerCircle,i&&O["outerCircle--checked"],s&&O["outerCircle--disabled"]].filter(Boolean).join(" "),k=[O.innerDot,i&&O["innerDot--checked"]].filter(Boolean).join(" ");return e.jsxs("div",{role:"radio","aria-checked":i,tabIndex:s?-1:0,onClick:r,onKeyDown:h,className:C,"aria-disabled":s,children:[e.jsxs("div",{className:O.radioWrapper,children:[e.jsx("input",{id:t,type:"radio",name:a,value:n,checked:i,disabled:s,autoComplete:_,onChange:()=>{},className:O.hiddenInput}),e.jsx("div",{className:f}),e.jsx("div",{className:k})]}),c&&e.jsx("label",{htmlFor:t,className:O.label,children:c})]})};be.displayName="RadioButton";const Xn="_starsContainer_ifx1z_13",ea="_starContainer_ifx1z_21",ta="_valueDisplay_ifx1z_26",sa="_resultContainer_ifx1z_37",ia="_resultChar_ifx1z_45",na="_blockContainer_ifx1z_56",aa="_blockHeader_ifx1z_69",oa="_blockHeaderLeft_ifx1z_76",ra="_blockName_ifx1z_83",la="_blockDate_ifx1z_90",ca="_blockQuote_ifx1z_97",da="_star_ifx1z_13",_a="_halfStarWrapper_ifx1z_142",ua="_halfStarOverlay_ifx1z_150",P={starsContainer:Xn,starContainer:ea,valueDisplay:ta,resultContainer:sa,resultChar:ia,blockContainer:na,blockHeader:aa,blockHeaderLeft:oa,blockName:ra,blockDate:la,blockQuote:ca,star:da,"star--small":"_star--small_ifx1z_115","star--medium":"_star--medium_ifx1z_120","star--large":"_star--large_ifx1z_125","star--active":"_star--active_ifx1z_131","star--inactive":"_star--inactive_ifx1z_137",halfStarWrapper:_a,halfStarOverlay:ua},ve=({variant:t="stars",value:i,maxValue:o=5,showValue:a=!1,name:n,date:s,quote:l,size:c="medium",className:_=""})=>{const r=Math.min(Math.max(0,i),o),h=Math.floor(r),C=r%1>=.5,f=o-h-(C?1:0),k=()=>e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",children:[e.jsxs("g",{clipPath:"url(#clip0_2938_4605)",children:[e.jsx("g",{clipPath:"url(#clip1_2938_4605)",children:e.jsx("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"})}),e.jsx("g",{clipPath:"url(#clip2_2938_4605)",children:e.jsx("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"})})]}),e.jsxs("defs",{children:[e.jsx("clipPath",{id:"clip0_2938_4605",children:e.jsx("rect",{width:"24",height:"24",fill:"white"})}),e.jsx("clipPath",{id:"clip1_2938_4605",children:e.jsx("rect",{width:"24",height:"24",fill:"white"})}),e.jsx("clipPath",{id:"clip2_2938_4605",children:e.jsx("rect",{width:"24",height:"24",fill:"white"})})]})]}),g=()=>e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",children:[e.jsx("defs",{children:e.jsx("clipPath",{id:"half",children:e.jsx("rect",{x:"0",y:"0",width:"12",height:"24"})})}),e.jsx("path",{clipPath:"url(#half)",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"}),e.jsx("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"})]}),w=()=>e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",children:[e.jsx("g",{clipPath:"url(#clip0_2938_4609)",children:e.jsx("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"})}),e.jsx("defs",{children:e.jsx("clipPath",{id:"clip0_2938_4609",children:e.jsx("rect",{width:"24",height:"24",fill:"white"})})})]}),j=()=>{const x=[P.star,P[`star--${c}`]].filter(Boolean).join(" "),N=[];for(let v=0;v<h;v++)N.push(e.jsx("span",{className:x,children:e.jsx(k,{})},`full-${v}`));C&&N.push(e.jsx("span",{className:x,children:e.jsx(g,{})},"half"));for(let v=0;v<f;v++)N.push(e.jsx("span",{className:x,children:e.jsx(w,{})},`empty-${v}`));return N};if(t==="stars"){const x=[P.starsContainer,_].filter(Boolean).join(" ");return e.jsxs("div",{className:x,children:[e.jsx("div",{className:P.starContainer,children:j()}),a&&e.jsx("span",{className:P.valueDisplay,children:r.toLocaleString("de-CH")})]})}if(t==="result"){const x=[P.resultContainer,_].filter(Boolean).join(" ");return e.jsxs("div",{className:x,children:[e.jsx("span",{className:P.resultChar,children:"N"}),e.jsx("div",{children:j()})]})}const $=[P.blockContainer,_].filter(Boolean).join(" ");return e.jsxs("div",{className:$,children:[e.jsxs("div",{className:P.blockHeader,children:[e.jsxs("div",{className:P.blockHeaderLeft,children:[n&&e.jsx("span",{className:P.blockName,children:n}),e.jsx("div",{children:j()})]}),s&&e.jsx("span",{className:P.blockDate,children:s})]}),l&&e.jsx("p",{className:P.blockQuote,children:l})]})};ve.displayName="Rating";const ha="_card_1o2eu_1",pa="_cardClickable_1o2eu_12",ma="_cardWithPadding_1o2eu_16",fa="_cardWithHeight_1o2eu_20",ga="_imageContainer_1o2eu_30",ba="_image_1o2eu_30",va="_shadowOverlay_1o2eu_53",xa="_badgeWrapper_1o2eu_65",ya="_textContainer_1o2eu_70",Ca="_starsRow_1o2eu_79",wa="_starsRowFixed_1o2eu_87",ka="_starsContainer_1o2eu_91",ja="_superiorBadge_1o2eu_97",Na="_swissLodge_1o2eu_109",La="_ratingInfo_1o2eu_120",za="_ratingSvg_1o2eu_124",Sa="_ratingLabel_1o2eu_130",$a="_ratingValue_1o2eu_138",Ha="_starsPlaceholder_1o2eu_151",Ba="_label_1o2eu_161",Ra="_labelDesktop_1o2eu_169",Ia="_labelMobile_1o2eu_175",Pa="_labelHotelDeals_1o2eu_182",Wa="_labelMobileOverflow_1o2eu_193",Aa="_labelNoRating_1o2eu_197",Ma="_price_1o2eu_207",Fa="_priceHotelDealsWithRating_1o2eu_217",Da="_priceHotelDealsNoRating_1o2eu_222",Ea="_priceNoRating_1o2eu_227",Va="_priceRegularWithRating_1o2eu_238",u={card:ha,cardClickable:pa,cardWithPadding:ma,cardWithHeight:fa,imageContainer:ga,image:ba,shadowOverlay:va,badgeWrapper:xa,textContainer:ya,starsRow:Ca,starsRowFixed:wa,starsContainer:ka,superiorBadge:ja,swissLodge:Na,ratingInfo:La,ratingSvg:za,ratingLabel:Sa,ratingValue:$a,starsPlaceholder:Ha,label:Ba,labelDesktop:Ra,labelMobile:Ia,labelHotelDeals:Pa,labelMobileOverflow:Wa,labelNoRating:Aa,price:Ma,priceHotelDealsWithRating:Fa,priceHotelDealsNoRating:Da,priceNoRating:Ea,priceRegularWithRating:Va},xe=({image:t,imageAlt:i="",label:o,price:a,stars:n,isSuperior:s=!1,badge:l,onClick:c,className:_,hasRating:r,variant:h="desktop",withPadding:C=!1,withHeight:f=!1,isRatingComments:k=!1,context:g})=>{const{isDesktop:w}=ce(),{t:j}=le(),$=[u.card,c&&u.cardClickable,C&&u.cardWithPadding,f&&u.cardWithHeight,_].filter(Boolean).join(" "),x=[u.starsRow,g==="hotel-deals"&&u.starsRowFixed].filter(Boolean).join(" "),N=[u.label,w?u.labelDesktop:u.labelMobile,g==="hotel-deals"&&u.labelHotelDeals,!w&&g!=="hotel-deals"&&u.labelMobileOverflow,!r&&u.labelNoRating].filter(Boolean).join(" "),v=[u.price,g==="hotel-deals"&&r&&u.priceHotelDealsWithRating,g==="hotel-deals"&&!r&&u.priceHotelDealsNoRating,g!=="hotel-deals"&&!r&&u.priceNoRating,g!=="hotel-deals"&&r&&u.priceRegularWithRating].filter(Boolean).join(" "),z=t||'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',p=()=>e.jsxs("svg",{xmlns:"http://www.w3.org/2000/svg",width:"9",height:"9",viewBox:"0 0 9 9",fill:"none",children:[e.jsx("g",{clipPath:"url(#clip0_1590_1299)",children:e.jsx("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"})}),e.jsx("defs",{children:e.jsx("clipPath",{id:"clip0_1590_1299",children:e.jsx("rect",{width:"8",height:"8",fill:"white",transform:"translate(0.800049 0.199951)"})})})]}),L=(H,M)=>Array.from({length:H},(E,V)=>M(V));return e.jsxs("div",{className:$,onClick:c,role:c?"button":void 0,tabIndex:c?0:void 0,children:[e.jsxs("div",{className:u.imageContainer,children:[e.jsx("img",{src:z,alt:i,className:u.image}),e.jsx("div",{className:u.shadowOverlay}),l&&e.jsx("div",{className:u.badgeWrapper,children:e.jsx(ne,{variant:l.variant||"primary",size:w?"large":"small",children:l.text})})]}),e.jsxs("div",{className:u.textContainer,children:[e.jsx("div",{className:x,children:n!==void 0&&n>0?e.jsx(e.Fragment,{children:n===6?e.jsx("span",{className:u.swissLodge,children:j("star_rating.swiss_lodge",{},"Swiss Lodge")}):e.jsx(e.Fragment,{children:w?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:u.starsContainer,children:[L(Math.floor(n),H=>e.jsx(p,{},H)),s&&e.jsx("span",{className:u.superiorBadge,children:"(s)"})]}),e.jsx("div",{children:k&&e.jsxs("span",{className:u.ratingInfo,children:[e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 36 38",fill:"#478EFA",className:u.ratingSvg,children:e.jsx("path",{d:"M4 0C1.79086 0 0 1.79086 0 4V32V38L9 32H32C34.2091 32 36 30.2091 36 28V0H4Z"})}),e.jsx("span",{className:u.ratingLabel,children:"Excellent"}),e.jsx("span",{className:u.ratingValue,children:"4.5"})]})})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:u.starsContainer,children:L(Math.floor(n),H=>e.jsx(p,{},H))}),s&&e.jsx("span",{className:u.superiorBadge,children:"(s)"}),k&&e.jsxs("span",{className:u.ratingInfo,children:[e.jsx("svg",{width:"24",height:"24",viewBox:"0 0 36 38",fill:"#478EFA",className:u.ratingSvg,children:e.jsx("path",{d:"M4 0C1.79086 0 0 1.79086 0 4V32V38L9 32H32C34.2091 32 36 30.2091 36 28V0H4Z"})}),e.jsx("span",{className:u.ratingLabel,children:"Excellent"}),e.jsx("span",{className:u.ratingValue,children:"4.5"})]})]})})}):e.jsx("div",{className:u.starsPlaceholder,children:" "})}),o&&e.jsx("div",{className:N,children:o}),a&&e.jsx("div",{className:v,children:a})]})]})};xe.displayName="Card";const Oa="_skeleton_5alsb_11",qa="_card_5alsb_24",Za="_benefitsAndPricing_5alsb_37",Ka="_benefitsSection_5alsb_38",Ta="_priceLabel_5alsb_39",Ga="_imageSection_5alsb_48",Ua="_originalPrice_5alsb_76",Qa="_priceContainer_5alsb_79",Ja="_content_5alsb_84",Ya="_ratingRow_5alsb_91",Xa="_hotelName_5alsb_96",eo="_location_5alsb_101",to="_uspBadge_5alsb_106",so="_benefit_5alsb_37",io="_badge_5alsb_164",no="_currentPrice_5alsb_172",y={skeleton:Oa,card:qa,benefitsAndPricing:Za,benefitsSection:Ka,priceLabel:Ta,imageSection:Ga,originalPrice:Ua,priceContainer:Qa,content:Ja,ratingRow:Ya,hotelName:Xa,location:eo,uspBadge:to,benefit:so,badge:io,currentPrice:no},ao=()=>e.jsxs("div",{className:y.card,children:[e.jsx("div",{className:`${y.imageSection} ${y.skeleton}`}),e.jsxs("div",{className:y.content,children:[e.jsx("div",{className:`${y.ratingRow} ${y.skeleton}`}),e.jsx("div",{className:`${y.hotelName} ${y.skeleton}`}),e.jsx("div",{className:`${y.location} ${y.skeleton}`}),e.jsx("div",{className:`${y.uspBadge} ${y.skeleton}`}),e.jsxs("div",{className:y.benefitsAndPricing,children:[e.jsx("div",{className:y.benefitsSection,children:e.jsx("div",{className:`${y.benefit} ${y.skeleton}`})}),e.jsxs("div",{className:y.pricingSection,children:[e.jsx("div",{className:`${y.priceLabel} ${y.skeleton}`}),e.jsx("div",{className:`${y.originalPrice} ${y.skeleton}`}),e.jsxs("div",{className:y.priceContainer,children:[e.jsx("div",{className:`${y.badge} ${y.skeleton}`}),e.jsx("div",{className:`${y.currentPrice} ${y.skeleton}`})]})]})]})]})]}),oo="0.1.0";exports.BREAKPOINTS=Ni;exports.Badge=ne;exports.Block=_e;exports.Button=de;exports.Card=xe;exports.Checkbox=ue;exports.Chip=he;exports.Divider=pe;exports.Dropdown=me;exports.HotelCardSkeleton=ao;exports.HotelCardUIProvider=ki;exports.Input=fe;exports.Pin=ge;exports.RadioButton=be;exports.Rating=ve;exports.VERSION=oo;exports.useDebounce=ji;exports.useResponsive=ce;exports.useUIContext=le;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../src/locales/index.ts","../src/context/UIContext.tsx","../src/hooks/useDebounce.ts","../src/hooks/useResponsive.ts","../src/components/Button/Button.tsx","../src/components/Badge/Badge.tsx","../src/components/Block/Block.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Chip/Chip.tsx","../src/components/Divider/Divider.tsx","../src/components/Dropdown/Dropdown.tsx","../src/components/Input/variants/DefaultInput.tsx","../src/components/Input/variants/PhoneInput.tsx","../src/components/Input/variants/DropdownInput.tsx","../src/components/Input/Input.tsx","../src/components/Pin/Pin.tsx","../src/components/RadioButton/RadioButton.tsx","../src/components/Rating/Rating.tsx","../src/components/Card/Card.tsx","../src/components/HotelCardSkeleton/HotelCardSkeleton.tsx","../src/index.ts"],"sourcesContent":["import de from './de.json';\nimport en from './en.json';\nimport fr from './fr.json';\nimport it from './it.json';\n\nexport const translations = { de, en, fr, it } as const;\n\nexport type Locale = keyof typeof translations;\nexport type TranslationKeys = typeof en;\n","import React, { createContext, useContext, ReactNode, useMemo } from 'react';\nimport { translations, type Locale } from '../locales';\n\n/** Translation options for interpolation */\nexport interface TranslateOptions {\n [key: string]: string | number;\n}\n\n/** Translation function type */\nexport type TranslateFunction = (key: string, optionsOrFallback?: TranslateOptions | string, fallback?: string) => string;\n\nexport interface UIContextValue {\n /** Current locale (e.g., 'de', 'en', 'fr', 'it') */\n locale: Locale;\n /** Currency code (e.g., 'CHF', 'EUR') */\n currency: string;\n /** Whether the app is running on desktop (default: false for mobile-first) */\n isDesktop: boolean;\n /** Base URL for API calls (e.g., 'https://hotelcard.ch') */\n apiBaseUrl: string;\n /** Translation function - looks up keys from internal translations */\n t: TranslateFunction;\n}\n\n/**\n * Get nested value from object using dot notation\n * e.g., getNestedValue({ a: { b: 'value' } }, 'a.b') => 'value'\n */\nfunction getNestedValue(obj: Record<string, unknown>, path: string): string | undefined {\n const keys = path.split('.');\n let current: unknown = obj;\n\n for (const key of keys) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[key];\n }\n\n return typeof current === 'string' ? current : undefined;\n}\n\n/**\n * Interpolate variables in a translation string\n * Replaces {{variable}} with the value from options\n */\nfunction interpolate(str: string, options: TranslateOptions): string {\n return str.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => {\n const value = options[key];\n return value !== undefined ? String(value) : `{{${key}}}`;\n });\n}\n\n/**\n * Create translation function for a given locale\n */\nfunction createTranslateFunction(locale: Locale): TranslateFunction {\n const localeTranslations = translations[locale] || translations.en;\n\n return (key: string, optionsOrFallback?: TranslateOptions | string, fallback?: string): string => {\n const value = getNestedValue(localeTranslations as Record<string, unknown>, key);\n\n // Determine if second param is options object or fallback string\n const isOptions = optionsOrFallback && typeof optionsOrFallback === 'object';\n const options = isOptions ? optionsOrFallback : undefined;\n const fallbackStr = isOptions ? fallback : (optionsOrFallback as string | undefined);\n\n const result = value ?? fallbackStr ?? key;\n\n // Apply interpolation if options provided\n return options ? interpolate(result, options) : result;\n };\n}\n\nconst defaultT = createTranslateFunction('de');\n\nconst defaultValue: UIContextValue = {\n locale: 'de',\n currency: 'CHF',\n isDesktop: false,\n apiBaseUrl: '',\n t: defaultT,\n};\n\nconst UIContext = createContext<UIContextValue>(defaultValue);\n\nexport interface HotelCardUIProviderProps {\n /** Current locale */\n locale?: Locale;\n /** Currency code */\n currency?: string;\n /** Whether running on desktop */\n isDesktop?: boolean;\n /** Base URL for API calls (e.g., 'https://hotelcard.ch') */\n apiBaseUrl?: string;\n /** Optional custom translation function (overrides internal translations) */\n t?: TranslateFunction;\n children: ReactNode;\n}\n\n/**\n * HotelCardUIProvider - Configure shared UI components\n *\n * Wrap your app with this provider to configure locale, currency, and responsive mode\n * for all @hotelcard/ui components.\n *\n * @example\n * ```tsx\n * import { HotelCardUIProvider } from '@hotelcard/ui';\n *\n * <HotelCardUIProvider locale=\"de\" currency=\"CHF\">\n * <App />\n * </HotelCardUIProvider>\n * ```\n */\nexport const HotelCardUIProvider: React.FC<HotelCardUIProviderProps> = ({\n locale = 'de',\n currency = 'CHF',\n isDesktop = false,\n apiBaseUrl = '',\n t: customT,\n children,\n}) => {\n // Create translation function based on locale, or use custom one\n const t = useMemo(\n () => customT ?? createTranslateFunction(locale),\n [locale, customT]\n );\n\n const value: UIContextValue = useMemo(\n () => ({ locale, currency, isDesktop, apiBaseUrl, t }),\n [locale, currency, isDesktop, apiBaseUrl, t]\n );\n\n return (\n <UIContext.Provider value={value}>\n {children}\n </UIContext.Provider>\n );\n};\n\n/**\n * Hook to access UI context values\n * Returns locale, currency, and isDesktop\n */\nexport const useUIContext = (): UIContextValue => {\n return useContext(UIContext);\n};\n\nexport { UIContext };\n","// hooks/useDebounce.ts\nimport { useCallback, useRef } from 'react';\n\nexport function useDebounce<T extends (...args: any[]) => any>(\n callback: T,\n delay: number\n): (...args: Parameters<T>) => void {\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n\n return useCallback((...args: Parameters<T>) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n callback(...args);\n }, delay);\n }, [callback, delay]);\n}\n","/**\n * Hook for detecting responsive breakpoints\n *\n * Automatically detects screen size and updates when window resizes.\n * Provides boolean flags for easy conditional rendering.\n *\n * ⚠️ IMPORTANT: Only use this hook for LOGIC, NOT styling!\n * - ✅ Good: Show/hide modals, enable/disable carousel swipe, change JS behavior\n * - ❌ Bad: Padding, margins, font sizes, display properties\n * - For styling: Use CSS with design tokens (tokens automatically handle responsive)\n *\n * Breakpoints align with Figma tokens:\n * - Mobile: 0-767px (02-dimensions-semantic/Mobile)\n * - Tablet: 768-1023px (02-dimensions-semantic/Tablet)\n * - Desktop: 1024px+ (02-dimensions-semantic/Desktop)\n */\n\nimport { useState, useEffect } from 'react';\n\n/**\n * Responsive breakpoint constants\n * These match the design token breakpoints in tokens.json\n */\nexport const BREAKPOINTS = {\n mobile: 767, // 0-767px: Mobile devices\n tablet: 1023, // 768-1023px: Tablets and small laptops\n desktop: 1024, // 1024px+: Desktop and large screens\n} as const;\n\nexport interface ResponsiveState {\n /** True when screen width >= 1024px (desktop only, excludes tablet) */\n isDesktop: boolean;\n /** True when screen width < 768px */\n isMobile: boolean;\n /** True when screen width is between 768px and 1023px */\n isTablet: boolean;\n /** True when screen width >= 1024px (same as isDesktop) */\n isLargeDesktop: boolean;\n /** Current window width in pixels */\n width: number;\n}\n\nexport const useResponsive = (): ResponsiveState => {\n // Always start with 1024 (desktop) for SSR consistency.\n // This prevents hydration mismatches: server renders desktop,\n // first client render also renders desktop, then useEffect\n // corrects to the real width after mount.\n const [width, setWidth] = useState<number>(1024);\n\n useEffect(() => {\n // Immediately set real width on mount (before paint via sync update)\n setWidth(window.innerWidth);\n\n const handleResize = () => {\n setWidth(window.innerWidth);\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n // Calculate breakpoint flags based on current width\n return {\n isDesktop: width >= 1024, // Only true for desktop (>= 1024px)\n isMobile: width < 768, // Mobile devices (< 768px)\n isTablet: width >= 768 && width < 1024, // Tablet range (768-1023px)\n isLargeDesktop: width >= 1024, // Same as isDesktop\n width,\n };\n};\n","import { forwardRef } from 'react';\nimport { ButtonProps } from \"./Button.types\";\nimport styles from './Button.module.css';\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[] = [styles.button];\n\n // Link variant\n if (variant === 'link') {\n classes.push(styles.link);\n classes.push(styles[size]);\n return classes.filter(Boolean).join(' ');\n }\n\n // Icon-only variant\n if (iconOnly) {\n classes.push(styles.iconOnly);\n classes.push(styles[size]);\n classes.push(styles[variant]);\n return classes.filter(Boolean).join(' ');\n }\n\n // Standard button\n classes.push(styles.standard);\n classes.push(styles[size]);\n classes.push(styles[variant]);\n\n return classes.filter(Boolean).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={styles.iconWrapper}>\n {leftIcon}\n </span>\n )}\n <span className={styles.textWrapper}>{children}</span>\n {rightIcon && (\n <span className={styles.iconWrapper}>\n {rightIcon}\n </span>\n )}\n </>\n )}\n </button>\n );\n});\n\nButton.displayName = 'Button';\n\nexport { Button };\n","import React from 'react';\nimport { BadgeProps } from './Badge.types';\nimport styles from './Badge.module.css';\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 styles.badge,\n styles[`badge--${size}`],\n styles[`badge--${colorStyleKey}`],\n className\n ].filter(Boolean).join(' ');\n\n // Build icon classes\n const iconClasses = [\n styles.icon,\n styles[`icon--${size}`]\n ].join(' ');\n\n // Build text classes\n const textClasses = [\n styles.text,\n size === 'large' && icon && styles['text--largeWithIcon']\n ].filter(Boolean).join(' ');\n\n return (\n <div className={badgeClasses}>\n {/* Icon placeholder - not implemented yet */}\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 };","import { BlockProps } from './Block.types';\nimport styles from './Block.module.css';\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 // Icon Block variant\n const containerClasses = [\n styles.blockIcon,\n onClick && styles['blockIcon--clickable'],\n className\n ].filter(Boolean).join(' ');\n\n const iconContainerClass = style === 'primary'\n ? styles['iconContainer--primary']\n : styles['iconContainer--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={styles.textContainer}>\n <div className={styles.iconLabel}>{label}</div>\n {description && <div className={styles.iconDescription}>{description}</div>}\n </div>\n </div>\n );\n }\n\n // Image Block variant\n const containerClasses = [\n styles.blockImage,\n onClick && styles['blockImage--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={styles.imageContainer}>\n {visual}\n </div>\n <div className={styles.footer}>\n <span className={styles.imageLabel}>{label}</span>\n {showArrow && (\n <span className={styles.arrow}>→</span>\n )}\n </div>\n </div>\n );\n};\n\nBlock.displayName = 'Block';\n\nexport { Block };","import { useState } from 'react';\nimport { CheckboxProps } from './Checkbox.types';\nimport styles from './Checkbox.module.css';\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 styles.container,\n disabled && styles['container--disabled'],\n className\n ].filter(Boolean).join(' ');\n\n // Build checkbox wrapper classes\n const checkboxWrapperClasses = [\n styles.checkboxWrapper,\n styles[`checkboxWrapper--${size}`]\n ].filter(Boolean).join(' ');\n\n // Build checkbox box classes\n const checkboxBoxClasses = [\n styles.checkboxBox,\n styles[`checkboxBox--${size}`],\n actualChecked && styles['checkboxBox--checked'],\n disabled && styles['checkboxBox--disabled'],\n error && !actualChecked && styles['checkboxBox--error'],\n isFocused && styles['checkboxBox--focused']\n ].filter(Boolean).join(' ');\n\n // Build input classes\n const inputClasses = [\n styles.input,\n disabled && styles['input--disabled']\n ].filter(Boolean).join(' ');\n\n // Build checkmark classes\n const checkmarkClasses = [\n styles.checkmark,\n styles[`checkmark--${size}`],\n actualChecked && styles['checkmark--checked']\n ].filter(Boolean).join(' ');\n\n // Build label classes\n const labelClasses = [\n styles.label,\n disabled && styles['label--disabled'],\n error && !disabled && styles['label--error']\n ].filter(Boolean).join(' ');\n\n return (\n <label className={containerClasses}>\n <div className={checkboxWrapperClasses}>\n <div className={checkboxBoxClasses} />\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)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </div>\n {label && (\n <span className={labelClasses}>\n {label}\n </span>\n )}\n </label>\n );\n};\n\nCheckbox.displayName = 'Checkbox';\n\nexport { Checkbox };","import React from 'react';\nimport { ChipProps } from './Chip.types';\nimport styles from './Chip.module.css';\n\n/**\n * Chip Component\n *\n * A removable filter chip component matching Figma specs (689-7141)\n *\n * Features:\n * - Two sizes: small (for filter rows), medium (default)\n * - Three states: idle, active, disabled\n * - Optional count badge\n * - Optional removable (X icon)\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 styles.chip,\n styles[`chip--${size}`],\n styles[`chip--${effectiveState}`],\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // Build label classes\n const labelClasses = [styles.label, styles[`label--${size}`]].join(' ');\n\n // Build count badge classes\n const countBadgeClasses = [styles.countBadge, styles[`countBadge--${size}`]].join(' ');\n\n const handleClick = (e: React.MouseEvent) => {\n if (disabled) return;\n\n // If removable and there's an onRemove handler, use that\n // Otherwise use onClick for toggle behavior\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={styles.closeIcon} aria-hidden=\"true\">\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_1054_71341)\">\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=\"#4B5563\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_1054_71341\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n </span>\n )}\n </button>\n );\n};\n\nChip.displayName = 'Chip';\n\nexport { Chip };\n","import { DividerProps } from './Divider.types';\nimport styles from './Divider.module.css';\n\nconst Divider: React.FC<DividerProps> = ({\n label,\n orientation = 'horizontal',\n className = '',\n variant\n }) => {\n const isHorizontal = orientation === 'horizontal';\n\n if (!label) {\n // Clean variant - just the line\n const lineClass = isHorizontal\n ? styles['lineStandalone--horizontal']\n : styles['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 ? styles['container--horizontal']\n : styles['container--vertical'];\n\n const lineClass = isHorizontal\n ? styles['line--horizontal']\n : styles['line--vertical'];\n\n const containerClasses = [\n styles.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={styles.label}>{label}</span>\n <div className={lineClass} />\n </div>\n );\n};\n\nDivider.displayName = 'Divider';\n\nexport { Divider };\n","import React, { useState, useRef } from \"react\";\nimport styles from './Dropdown.module.css';\n\ninterface DateOption {\n value: string;\n label: string;\n}\n\ninterface DropdownProps {\n options?: DateOption[];\n disabled?: boolean;\n error?: boolean;\n defaultValue?: string;\n onChange?: (value: string) => void;\n className?: string;\n name?: string;\n id?: string;\n}\n\nconst Dropdown: React.FC<DropdownProps> = ({\n options = [\n { value: \"1\", label: \"Today\" },\n { value: \"2\", label: \"This weekend\" },\n { value: \"3\", label: \"Choose a date\" },\n ],\n disabled = false,\n error = false,\n defaultValue = options[0].value,\n onChange,\n className,\n name,\n id,\n}) => {\n const [selectedValue, setSelectedValue] = useState(defaultValue);\n const [isOpen, setIsOpen] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const selectedLabel = options.find(o => o.value === selectedValue)?.label || \"\";\n\n const handleSelect = (value: string) => {\n setSelectedValue(value);\n onChange?.(value);\n setIsOpen(false);\n };\n\n // Build container classes\n const containerClasses = [\n styles.container,\n disabled && styles['container--disabled'],\n className\n ].filter(Boolean).join(' ');\n\n // Build button classes\n const buttonClasses = [\n styles.button,\n error && styles['button--error'],\n isFocused && !error && styles['button--focus'],\n disabled && styles['button--disabled']\n ].filter(Boolean).join(' ');\n\n // Build dropdown list classes\n const dropdownListClasses = [\n styles.dropdownList,\n isOpen && styles['dropdownList--open']\n ].filter(Boolean).join(' ');\n\n // Build option classes\n const getOptionClasses = (isSelected: boolean) => [\n styles.option,\n isSelected && styles['option--selected']\n ].filter(Boolean).join(' ');\n\n return (\n <div\n ref={dropdownRef}\n className={containerClasses}\n >\n <div\n className={buttonClasses}\n tabIndex={disabled ? -1 : 0}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n onFocus={() => !disabled && setIsFocused(true)}\n onBlur={() => {\n setTimeout(() => setIsFocused(false), 100); // prevent premature close\n }}\n role=\"button\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-disabled={disabled}\n >\n <span>{selectedLabel}</span>\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 </div>\n\n <ul role=\"listbox\" className={dropdownListClasses}>\n {options.map((option) => (\n <li\n key={option.value}\n role=\"option\"\n aria-selected={selectedValue === option.value}\n onClick={() => handleSelect(option.value)}\n className={getOptionClasses(selectedValue === option.value)}\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={selectedValue}\n onChange={(e) => handleSelect(e.target.value)}\n disabled={disabled}\n className={styles.hiddenSelect}\n >\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 };","import React, { useState, useRef } from 'react';\nimport styles from '../Input.module.css';\n\ninterface DefaultInputProps {\n value: string;\n onChange: (value: string) => void;\n onFocus?: () => void;\n onBlur?: () => void;\n type?: 'text' | 'email' | 'password' | 'tel' | 'number' | 'search' | 'url' | 'date';\n placeholder?: string;\n error?: boolean;\n disabled?: boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n prefix?: string;\n inputClassName?: string;\n wrapperClassName?: string;\n name?: string;\n id?: string;\n required?: boolean;\n autoComplete?: string;\n autoFocus?: boolean;\n readOnly?: boolean;\n uniqueId: string;\n inputProps?: React.InputHTMLAttributes<HTMLInputElement>;\n}\n\nexport const DefaultInput: React.FC<DefaultInputProps> = ({\n value,\n onChange,\n onFocus,\n onBlur,\n type = 'text',\n placeholder = 'Placeholder',\n error = false,\n disabled = false,\n leftIcon,\n rightIcon,\n prefix,\n inputClassName,\n wrapperClassName,\n name,\n id,\n required = false,\n autoComplete,\n autoFocus = false,\n readOnly = false,\n uniqueId,\n inputProps,\n}) => {\n const [isFocused, setIsFocused] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n };\n\n const handleFocus = () => {\n setIsFocused(true);\n onFocus?.();\n };\n\n const handleBlur = () => {\n setIsFocused(false);\n onBlur?.();\n };\n\n // Build wrapper classes\n const wrapperClasses = [\n styles.inputWrapper,\n isFocused && styles['inputWrapper--focus'],\n error && styles['inputWrapper--error'],\n (disabled || readOnly) && styles['inputWrapper--disabled'],\n wrapperClassName\n ].filter(Boolean).join(' ');\n\n // Build input classes\n const inputClasses = [\n styles.input,\n (disabled || readOnly) && styles['input--disabled'],\n inputClassName\n ].filter(Boolean).join(' ');\n\n return (\n <div\n className={wrapperClasses}\n onClick={() => !disabled && inputRef.current?.focus()}\n >\n {leftIcon && (\n <div className={styles.icon}>\n {leftIcon}\n </div>\n )}\n\n {prefix && (\n <div className={styles.prefix}>\n {prefix}\n </div>\n )}\n\n <input\n ref={inputRef}\n type={type}\n id={id}\n name={name}\n value={value}\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};","import React, { useState, useRef } from 'react';\nimport styles from '../Input.module.css';\n\ninterface PhoneInputProps {\n value: string;\n onChange: (value: string) => void;\n phonePrefix: string;\n onPhonePrefixChange: (value: string) => void;\n onPhonePrefixBlur?: () => void;\n onFocus?: () => void;\n onBlur?: () => void;\n placeholder?: string;\n error?: boolean;\n disabled?: boolean;\n inputClassName?: string;\n name?: string;\n id?: string;\n required?: boolean;\n autoComplete?: string;\n autoFocus?: boolean;\n readOnly?: boolean;\n uniqueId: string;\n}\n\nexport const PhoneInput: React.FC<PhoneInputProps> = ({\n value,\n onChange,\n phonePrefix,\n onPhonePrefixChange,\n onPhonePrefixBlur,\n onFocus,\n onBlur,\n placeholder = 'Placeholder',\n error = false,\n disabled = false,\n inputClassName,\n name,\n id,\n required = false,\n autoComplete,\n autoFocus = false,\n readOnly = false,\n uniqueId\n}) => {\n const [isFocused, setIsFocused] = useState(false);\n const [isPrefixFocused, setIsPrefixFocused] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const prefixRef = useRef<HTMLInputElement>(null);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange(e.target.value);\n };\n\n const handleFocus = () => {\n setIsFocused(true);\n onFocus?.();\n };\n\n const handleBlur = () => {\n setIsFocused(false);\n onBlur?.();\n };\n\n const handlePrefixChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n onPhonePrefixChange(e.target.value);\n };\n\n const handlePrefixFocus = () => {\n setIsPrefixFocused(true);\n };\n\n const handlePrefixBlur = () => {\n setIsPrefixFocused(false);\n onPhonePrefixBlur?.();\n };\n\n // Build prefix wrapper classes\n const prefixWrapperClasses = [\n styles.phonePrefixWrapper,\n isPrefixFocused && styles['phonePrefixWrapper--focus'],\n error && styles['phonePrefixWrapper--error'],\n disabled && styles['phonePrefixWrapper--disabled']\n ].filter(Boolean).join(' ');\n\n // Build prefix input classes\n const prefixInputClasses = [\n styles.phonePrefixInput,\n disabled && styles['phonePrefixInput--disabled']\n ].filter(Boolean).join(' ');\n\n // Build main wrapper classes\n const wrapperClasses = [\n styles.inputWrapper,\n styles['inputWrapper--phone'],\n isFocused && styles['inputWrapper--focus'],\n error && styles['inputWrapper--error'],\n disabled && styles['inputWrapper--disabled']\n ].filter(Boolean).join(' ');\n\n // Build main input classes\n const inputClasses = [\n styles.input,\n disabled && styles['input--disabled'],\n inputClassName\n ].filter(Boolean).join(' ');\n\n return (\n <div className={styles.phoneContainer + ' checkout-input-phone'}>\n {/* Prefix field */}\n <div\n className={prefixWrapperClasses + ' checkout-phone-code'}\n onClick={() => !disabled && prefixRef.current?.focus()}\n >\n <input\n ref={prefixRef}\n type=\"text\"\n name=\"country_code\"\n autoComplete=\"tel-country-code\"\n value={phonePrefix}\n onChange={handlePrefixChange}\n onFocus={handlePrefixFocus}\n onBlur={handlePrefixBlur}\n disabled={disabled}\n className={prefixInputClasses}\n />\n </div>\n\n {/* Number field */}\n <div\n className={wrapperClasses}\n onClick={() => !disabled && inputRef.current?.focus()}\n >\n <input\n ref={inputRef}\n type=\"tel\"\n id={id}\n name={name}\n value={value}\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 />\n </div>\n </div>\n );\n};\n","import React, { useState, useRef, useEffect } from 'react';\nimport styles from '../Input.module.css';\n\ninterface DropdownOption {\n value: string;\n label: string;\n icon?: React.ReactNode;\n}\n\ninterface DropdownInputProps {\n value: string;\n onChange: (value: string) => void;\n options: DropdownOption[];\n onSelect?: (value: string) => void;\n dropdownOpen?: boolean;\n onDropdownToggle?: (open: boolean) => void;\n onFocus?: () => void;\n onBlur?: () => void;\n placeholder?: string;\n error?: boolean;\n disabled?: boolean;\n inputClassName?: string;\n name?: string;\n id?: string;\n required?: boolean;\n autoFocus?: boolean;\n uniqueId: string;\n}\n\nexport const DropdownInput: React.FC<DropdownInputProps> = ({\n value,\n onChange,\n options = [],\n onSelect,\n dropdownOpen: controlledDropdownOpen,\n onDropdownToggle,\n onFocus,\n onBlur,\n placeholder = 'Placeholder',\n error = false,\n disabled = false,\n inputClassName,\n name,\n id,\n required = false,\n autoFocus = false,\n uniqueId\n}) => {\n const [isFocused, setIsFocused] = useState(false);\n const [localDropdownOpen, setLocalDropdownOpen] = useState(false);\n const [selectedLabel, setSelectedLabel] = useState<string>('');\n const [selectedIcon, setSelectedIcon] = useState<React.ReactNode | null>(null);\n const [searchValue, setSearchValue] = useState<string>('');\n const inputRef = useRef<HTMLInputElement>(null);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const hasValue = value && value.length > 0;\n const isDropdownOpen = controlledDropdownOpen !== undefined ? controlledDropdownOpen : localDropdownOpen;\n\n const handleFocus = () => {\n setIsFocused(true);\n onFocus?.();\n };\n\n const handleBlur = () => {\n setIsFocused(false);\n onBlur?.();\n // Close dropdown on blur\n setTimeout(() => {\n if (controlledDropdownOpen === undefined) {\n setLocalDropdownOpen(false);\n }\n onDropdownToggle?.(false);\n }, 200); // Small delay to allow click on dropdown items\n };\n\n const handleDropdownClick = () => {\n if (!disabled) {\n const newOpen = !isDropdownOpen;\n if (controlledDropdownOpen === undefined) {\n setLocalDropdownOpen(newOpen);\n }\n onDropdownToggle?.(newOpen);\n if (newOpen) {\n inputRef.current?.focus();\n // Clear search when opening\n setSearchValue('');\n }\n }\n };\n \n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const newValue = e.target.value;\n setSearchValue(newValue);\n // Open dropdown when typing\n if (!isDropdownOpen && newValue) {\n if (controlledDropdownOpen === undefined) {\n setLocalDropdownOpen(true);\n }\n onDropdownToggle?.(true);\n }\n };\n\n const handleItemSelect = (option: DropdownOption) => {\n onChange(option.value);\n setSelectedLabel(option.label);\n setSelectedIcon(option.icon || null);\n setSearchValue(''); // Clear search after selection\n onSelect?.(option.value);\n \n // Close dropdown\n if (controlledDropdownOpen === undefined) {\n setLocalDropdownOpen(false);\n }\n onDropdownToggle?.(false);\n };\n\n // Initialize selected label and icon when value changes\n useEffect(() => {\n if (value && options.length > 0) {\n const selectedOption = options.find(opt => opt.value === value);\n if (selectedOption) {\n setSelectedLabel(selectedOption.label);\n setSelectedIcon(selectedOption.icon || null);\n }\n }\n }, [value, options]);\n\n // Handle click outside to close dropdown\n useEffect(() => {\n if (isDropdownOpen) {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n if (dropdownRef.current && !dropdownRef.current.contains(target)) {\n if (controlledDropdownOpen === undefined) {\n setLocalDropdownOpen(false);\n }\n onDropdownToggle?.(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }\n }, [isDropdownOpen, controlledDropdownOpen, onDropdownToggle]);\n\n // Build wrapper classes\n const wrapperClasses = [\n styles.inputWrapper,\n styles['inputWrapper--dropdown'],\n isFocused && styles['inputWrapper--focus'],\n error && styles['inputWrapper--error'],\n disabled && styles['inputWrapper--disabled']\n ].filter(Boolean).join(' ');\n\n // Build input classes\n const inputClasses = [\n styles.input,\n disabled && styles['input--disabled'],\n inputClassName\n ].filter(Boolean).join(' ');\n\n // Build dropdown icon classes\n const dropdownIconClasses = [\n styles.dropdownIcon,\n isDropdownOpen && styles['dropdownIcon--open']\n ].filter(Boolean).join(' ');\n\n // Build dropdown body classes\n const dropdownBodyClasses = [\n styles.dropdownBody,\n isDropdownOpen && styles['dropdownBody--open']\n ].filter(Boolean).join(' ');\n\n return (\n <div className={styles.dropdownContainer} ref={dropdownRef}>\n <div\n className={wrapperClasses}\n onClick={handleDropdownClick}\n >\n {/* Show selected icon if available */}\n {selectedIcon && (\n <div className={styles.icon}>\n {selectedIcon}\n </div>\n )}\n\n <input\n ref={inputRef}\n type=\"text\"\n id={id}\n name={name}\n value={isDropdownOpen ? searchValue : (selectedLabel || value || '')}\n onChange={handleInputChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n placeholder={placeholder}\n disabled={disabled}\n required={required}\n autoComplete=\"off\"\n readOnly={false}\n className={inputClasses}\n />\n\n <div className={dropdownIconClasses}>\n <svg\n width=\"16\"\n height=\"9\"\n viewBox=\"0 0 16 9\"\n fill=\"none\"\n className={styles.icon}\n >\n <path d=\"M1 1L8 8L15 1\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n </svg>\n </div>\n </div>\n\n {/* Dropdown menu */}\n <div className={dropdownBodyClasses}>\n {options\n .filter(option => {\n // Filter options based on search value\n if (!searchValue) return true;\n return option.label.toLowerCase().includes(searchValue.toLowerCase());\n })\n .map((option) => (\n <div\n key={option.value}\n className={styles.dropdownItem}\n onClick={() => handleItemSelect(option)}\n >\n {option.icon && (\n <div className={styles.icon}>\n {option.icon}\n </div>\n )}\n <span className={styles.dropdownItemText}>\n {option.label}\n </span>\n </div>\n ))}\n </div>\n </div>\n );\n};","import React, { useState } from 'react';\nimport { InputProps } from './Input.types';\nimport { DefaultInput } from './variants/DefaultInput';\nimport { PhoneInput } from './variants/PhoneInput';\nimport { DropdownInput } from './variants/DropdownInput';\nimport styles from './Input.module.css';\n\n// Generate a unique ID for CSS\nlet inputIdCounter = 0;\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 name,\n id,\n required = false,\n autoComplete,\n autoFocus = false,\n readOnly = false,\n variant = 'default',\n phonePrefix,\n onPhonePrefixChange,\n onPhonePrefixBlur,\n options = [],\n onSelect,\n dropdownOpen,\n onDropdownToggle,\n wrapperClassName,\n inputProps\n}) => {\n const [localValue, setLocalValue] = useState(defaultValue || '');\n const [localPhonePrefix, setLocalPhonePrefix] = useState(phonePrefix || '+000');\n const [uniqueId] = useState(() => `input-${++inputIdCounter}`);\n \n const actualValue = value !== undefined ? value : localValue;\n const actualPhonePrefix = phonePrefix !== undefined ? phonePrefix : localPhonePrefix;\n \n const handleChange = (newValue: string) => {\n if (value === undefined) {\n setLocalValue(newValue);\n }\n onChange?.(newValue);\n };\n \n const handlePrefixChange = (newValue: string) => {\n if (phonePrefix === undefined) {\n setLocalPhonePrefix(newValue);\n }\n onPhonePrefixChange?.(newValue);\n };\n\n // Build className for container\n const containerClasses = [styles.container, className].filter(Boolean).join(' ');\n\n // Build className for label\n const labelClasses = [\n styles.label,\n (disabled || readOnly) && styles['label--disabled']\n ].filter(Boolean).join(' ');\n\n // Build className for helper\n const helperClasses = [\n styles.helper,\n error && styles['helper--error'],\n (disabled || readOnly) && styles['helper--disabled']\n ].filter(Boolean).join(' ');\n\n\n return (\n <div className={containerClasses}>\n {label && (\n <label htmlFor={id} className={labelClasses}>\n {label}\n </label>\n )}\n\n {variant === 'phone' ? (\n <PhoneInput\n value={actualValue}\n onChange={handleChange}\n phonePrefix={actualPhonePrefix}\n onPhonePrefixChange={handlePrefixChange}\n onPhonePrefixBlur={onPhonePrefixBlur}\n onFocus={onFocus}\n onBlur={onBlur}\n placeholder={placeholder}\n error={error}\n disabled={disabled}\n inputClassName={inputClassName}\n name={name}\n id={id}\n required={required}\n autoComplete={autoComplete}\n autoFocus={autoFocus}\n readOnly={readOnly}\n uniqueId={uniqueId}\n />\n ) : variant === 'dropdown' ? (\n <DropdownInput\n value={actualValue}\n onChange={handleChange}\n options={options}\n onSelect={onSelect}\n dropdownOpen={dropdownOpen}\n onDropdownToggle={onDropdownToggle}\n onFocus={onFocus}\n onBlur={onBlur}\n placeholder={placeholder}\n error={error}\n disabled={disabled}\n inputClassName={inputClassName}\n name={name}\n id={id}\n required={required}\n autoFocus={autoFocus}\n uniqueId={uniqueId}\n />\n ) : (\n <DefaultInput\n value={actualValue}\n onChange={handleChange}\n onFocus={onFocus}\n onBlur={onBlur}\n type={type}\n placeholder={placeholder}\n error={error}\n disabled={disabled}\n leftIcon={leftIcon}\n rightIcon={rightIcon}\n prefix={prefix}\n inputClassName={inputClassName}\n wrapperClassName={wrapperClassName}\n name={name}\n id={id}\n required={required}\n autoComplete={autoComplete}\n autoFocus={autoFocus}\n readOnly={readOnly}\n uniqueId={uniqueId}\n inputProps={inputProps}\n />\n )}\n\n {helper && (\n <div className={helperClasses}>\n {helper}\n </div>\n )}\n </div>\n );\n};\n\nInput.displayName = 'Input';\n\nexport default Input;\n","import React, { forwardRef } from 'react';\nimport { PinProps } from './Pin.types';\nimport styles from './Pin.module.css';\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 styles.pin,\n styles[styleVariant],\n variant === 'hotel' && styles.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={styles.body}>\n {variant === 'price' ? (\n <>\n <span className={styles.currency}>{currency}</span>\n <span className={styles.price}>{formattedPrice}</span>\n {showFavorite && (\n <div className={styles.favoriteContainer}>\n <HeartIcon className={styles.favoriteIcon} />\n </div>\n )}\n </>\n ) : (\n <HomeIcon className={styles.hotelIcon} />\n )}\n </div>\n\n {/* Pointer arrow at bottom */}\n <div className={styles.pointer}>\n <div className={styles.pointerInner} />\n </div>\n </button>\n );\n }\n);\n\nPin.displayName = 'Pin';\n\nexport { Pin };\n","import React from 'react';\nimport { RadioButtonProps } from './RadioButton.types';\nimport styles from './RadioButton.module.css';\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 styles.container,\n disabled && styles['container--disabled'],\n className\n ].filter(Boolean).join(' ');\n\n // Build outer circle classes\n const outerCircleClasses = [\n styles.outerCircle,\n checked && styles['outerCircle--checked'],\n disabled && styles['outerCircle--disabled']\n ].filter(Boolean).join(' ');\n\n // Build inner dot classes\n const innerDotClasses = [\n styles.innerDot,\n checked && styles['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={styles.radioWrapper}>\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={styles.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 && (<label htmlFor={id} className={styles.label}>{label}</label>)}\n </div>\n );\n};\n\nRadioButton.displayName = 'RadioButton';\n\nexport { RadioButton };\n","import { RatingProps } from './Rating.types';\nimport styles from './Rating.module.css';\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 // Full star icon (filled)\n const 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_2938_4605)\">\n <g clipPath=\"url(#clip1_2938_4605)\">\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 <g clipPath=\"url(#clip2_2938_4605)\">\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 </g>\n <defs>\n <clipPath id=\"clip0_2938_4605\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n <clipPath id=\"clip1_2938_4605\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n <clipPath id=\"clip2_2938_4605\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n );\n\n // Half star icon (left half filled, right half empty)\n const 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\n // Empty star icon (outline only)\n const 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_2938_4609)\">\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_2938_4609\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n );\n\n const renderStars = () => {\n const starClasses = [\n styles.star,\n styles[`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 = [styles.starsContainer, className].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n <div className={styles.starContainer}>\n {renderStars()}\n </div>\n {showValue && (\n <span className={styles.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 = [styles.resultContainer, className].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n <span className={styles.resultChar}>N</span>\n <div>\n {renderStars()}\n </div>\n </div>\n );\n }\n\n // Block variant - full review block\n const containerClasses = [styles.blockContainer, className].filter(Boolean).join(' ');\n\n return (\n <div className={containerClasses}>\n <div className={styles.blockHeader}>\n <div className={styles.blockHeaderLeft}>\n {name && <span className={styles.blockName}>{name}</span>}\n <div>\n {renderStars()}\n </div>\n </div>\n {date && <span className={styles.blockDate}>{date}</span>}\n </div>\n {quote && <p className={styles.blockQuote}>{quote}</p>}\n </div>\n );\n};\n\nRating.displayName = 'Rating';\n\nexport { Rating };","import { CardProps } from './Card.types';\nimport { Badge } from '../Badge';\nimport { Rating } from '../Rating';\nimport { useUIContext } from '../../context';\nimport { useResponsive } from '../../hooks';\nimport styles from './Card.module.css';\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 hasRating,\n variant = 'desktop', // 'desktop' | 'mobile'\n withPadding = false,\n withHeight = false,\n isRatingComments = false,\n context\n }) => {\n const { isDesktop } = useResponsive();\n const { t } = useUIContext();\n\n // Build dynamic class names\n const containerClasses = [\n styles.card,\n onClick && styles.cardClickable,\n withPadding && styles.cardWithPadding,\n withHeight && styles.cardWithHeight,\n className\n ].filter(Boolean).join(' ');\n\n const starsRowClasses = [\n styles.starsRow,\n context === 'hotel-deals' && styles.starsRowFixed\n ].filter(Boolean).join(' ');\n\n const labelClasses = [\n styles.label,\n isDesktop ? styles.labelDesktop : styles.labelMobile,\n context === 'hotel-deals' && styles.labelHotelDeals,\n !isDesktop && context !== 'hotel-deals' && styles.labelMobileOverflow,\n !hasRating && styles.labelNoRating\n ].filter(Boolean).join(' ');\n\n const priceClasses = [\n styles.price,\n context === 'hotel-deals' && hasRating && styles.priceHotelDealsWithRating,\n context === 'hotel-deals' && !hasRating && styles.priceHotelDealsNoRating,\n context !== 'hotel-deals' && !hasRating && styles.priceNoRating,\n context !== 'hotel-deals' && hasRating && styles.priceRegularWithRating\n ].filter(Boolean).join(' ');\n\n // Default placeholder if no image\n const displayImage = image || '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 const 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_1590_1299)\">\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_1590_1299\">\n <rect width=\"8\" height=\"8\" fill=\"white\" transform=\"translate(0.800049 0.199951)\"/>\n </clipPath>\n </defs>\n </svg>\n );\n const repeat = (n: number, renderFn: (i: number) => React.ReactNode) => Array.from({ length: n }, (_, i) => renderFn(i));\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={styles.imageContainer}>\n <img\n src={displayImage}\n alt={imageAlt}\n className={styles.image}\n />\n <div className={styles.shadowOverlay} />\n {badge && (\n <div className={styles.badgeWrapper}>\n <Badge\n variant={badge.variant || 'primary'}\n size={isDesktop ? 'large' : 'small'}\n >\n {badge.text}\n </Badge>\n </div>\n )}\n </div>\n\n <div className={styles.textContainer}>\n {/* Always render stars row to maintain alignment */}\n <div className={starsRowClasses}>\n {stars !== undefined && stars > 0 ? (\n <>\n {/* Check for Swiss Lodge (rating = 6) */}\n {stars === 6 ? (\n <span className={styles.swissLodge}>\n {t('star_rating.swiss_lodge', {}, 'Swiss Lodge')}\n </span>\n ) : (\n <>\n {isDesktop ? (\n <>\n <div className={styles.starsContainer}>\n {repeat(Math.floor(stars), (i) => (\n <StarIcon key={i} />\n ))}\n {isSuperior && (\n <span className={styles.superiorBadge}>\n (s)\n </span>\n )}\n </div>\n <div>\n {isRatingComments && (\n <span className={styles.ratingInfo}>\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 36 38\" fill=\"#478EFA\" className={styles.ratingSvg}>\n <path d=\"M4 0C1.79086 0 0 1.79086 0 4V32V38L9 32H32C34.2091 32 36 30.2091 36 28V0H4Z\"></path>\n </svg>\n <span className={styles.ratingLabel}>Excellent</span>\n <span className={styles.ratingValue}>4.5</span>\n </span>\n )}\n </div>\n </>\n ) : (\n <>\n <div className={styles.starsContainer}>\n {repeat(Math.floor(stars), (i) => (\n <StarIcon key={i} />\n ))}\n </div>\n {isSuperior && (\n <span className={styles.superiorBadge}>\n (s)\n </span>\n )}\n {isRatingComments && (\n <span className={styles.ratingInfo}>\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 36 38\" fill=\"#478EFA\" className={styles.ratingSvg}>\n <path d=\"M4 0C1.79086 0 0 1.79086 0 4V32V38L9 32H32C34.2091 32 36 30.2091 36 28V0H4Z\"></path>\n </svg>\n <span className={styles.ratingLabel}>Excellent</span>\n <span className={styles.ratingValue}>4.5</span>\n </span>\n )}\n </>\n )}\n </>\n )}\n </>\n ) : (\n // Empty space to maintain alignment\n <div className={styles.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 from 'react';\nimport styles from './HotelCardSkeleton.module.css';\n\n/**\n * HotelCardSkeleton - Loading placeholder for hotel cards\n *\n * Displays a shimmer animation while hotel data is loading.\n * Matches the layout of HotelCard component.\n */\nconst HotelCardSkeleton: React.FC = () => {\n return (\n <div className={styles.card}>\n {/* Image skeleton */}\n <div className={`${styles.imageSection} ${styles.skeleton}`} />\n\n {/* Content skeleton */}\n <div className={styles.content}>\n <div className={`${styles.ratingRow} ${styles.skeleton}`} />\n <div className={`${styles.hotelName} ${styles.skeleton}`} />\n <div className={`${styles.location} ${styles.skeleton}`} />\n <div className={`${styles.uspBadge} ${styles.skeleton}`} />\n <div className={styles.benefitsAndPricing}>\n <div className={styles.benefitsSection}>\n <div className={`${styles.benefit} ${styles.skeleton}`} />\n </div>\n <div className={styles.pricingSection}>\n <div className={`${styles.priceLabel} ${styles.skeleton}`} />\n <div className={`${styles.originalPrice} ${styles.skeleton}`} />\n <div className={styles.priceContainer}>\n <div className={`${styles.badge} ${styles.skeleton}`} />\n <div className={`${styles.currentPrice} ${styles.skeleton}`} />\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport default HotelCardSkeleton;\n","// @hotelcard/ui - Shared UI Components\n\n// Context\nexport { HotelCardUIProvider, useUIContext } from './context';\nexport type { UIContextValue, HotelCardUIProviderProps, TranslateFunction, TranslateOptions } from './context';\nexport type { Locale } from './locales';\n\n// Hooks\nexport { useDebounce, useResponsive, BREAKPOINTS } from './hooks';\nexport type { ResponsiveState } from './hooks';\n\n// Components\nexport { Button } from './components/Button';\nexport type { ButtonProps } from './components/Button';\nexport { Badge } from './components/Badge';\nexport type { BadgeProps } from './components/Badge';\nexport { Block } from './components/Block';\nexport type { BlockProps } from './components/Block';\nexport { Checkbox } from './components/Checkbox';\nexport type { CheckboxProps } from './components/Checkbox';\nexport { Chip } from './components/Chip';\nexport type { ChipProps } from './components/Chip';\nexport { Divider } from './components/Divider';\nexport type { DividerProps } from './components/Divider';\nexport { Dropdown } from './components/Dropdown';\nexport type { DropdownProps } from './components/Dropdown';\nexport { Input } from './components/Input';\nexport type { InputProps } from './components/Input';\nexport { Pin } from './components/Pin';\nexport type { PinProps } from './components/Pin';\nexport { RadioButton } from './components/RadioButton';\nexport type { RadioButtonProps } from './components/RadioButton';\nexport { Rating } from './components/Rating';\nexport type { RatingProps } from './components/Rating';\nexport { Card } from './components/Card';\nexport type { CardProps } from './components/Card';\nexport { HotelCardSkeleton } from './components/HotelCardSkeleton';\n\nexport const VERSION = '0.1.0';\n"],"names":["translations","de","en","fr","it","getNestedValue","obj","path","keys","current","key","interpolate","str","options","_","value","createTranslateFunction","locale","localeTranslations","optionsOrFallback","fallback","isOptions","result","defaultT","defaultValue","UIContext","createContext","HotelCardUIProvider","currency","isDesktop","apiBaseUrl","customT","children","t","useMemo","jsx","useUIContext","useContext","useDebounce","callback","delay","timeoutRef","useRef","useCallback","args","BREAKPOINTS","useResponsive","width","setWidth","useState","useEffect","handleResize","Button","forwardRef","variant","size","leftIcon","rightIcon","className","disabled","iconOnly","style","props","ref","getButtonClasses","classes","styles","jsxs","Fragment","Badge","color","icon","colorStyleKey","badgeClasses","iconClasses","textClasses","Block","visual","label","description","onClick","showArrow","containerClasses","iconContainerClass","Checkbox","checked","defaultChecked","onChange","error","name","id","localChecked","setLocalChecked","isFocused","setIsFocused","actualChecked","handleChange","e","newChecked","checkboxWrapperClasses","checkboxBoxClasses","inputClasses","checkmarkClasses","labelClasses","Chip","count","state","removable","onRemove","effectiveState","chipClasses","countBadgeClasses","handleClick","handleKeyDown","Divider","orientation","isHorizontal","lineClass","containerClass","Dropdown","selectedValue","setSelectedValue","isOpen","setIsOpen","dropdownRef","selectedLabel","_a","o","handleSelect","buttonClasses","dropdownListClasses","getOptionClasses","isSelected","option","opt","DefaultInput","onFocus","onBlur","type","placeholder","prefix","inputClassName","wrapperClassName","required","autoComplete","autoFocus","readOnly","uniqueId","inputProps","inputRef","handleFocus","handleBlur","wrapperClasses","PhoneInput","phonePrefix","onPhonePrefixChange","onPhonePrefixBlur","isPrefixFocused","setIsPrefixFocused","prefixRef","handlePrefixChange","handlePrefixFocus","handlePrefixBlur","prefixWrapperClasses","prefixInputClasses","DropdownInput","onSelect","controlledDropdownOpen","onDropdownToggle","localDropdownOpen","setLocalDropdownOpen","setSelectedLabel","selectedIcon","setSelectedIcon","searchValue","setSearchValue","isDropdownOpen","handleDropdownClick","newOpen","handleInputChange","newValue","handleItemSelect","selectedOption","handleClickOutside","event","target","dropdownIconClasses","dropdownBodyClasses","inputIdCounter","Input","helper","dropdownOpen","localValue","setLocalValue","localPhonePrefix","setLocalPhonePrefix","actualValue","actualPhonePrefix","helperClasses","HeartIcon","HomeIcon","Pin","viewed","price","showFavorite","styleVariant","pinClasses","formattedPrice","RadioButton","outerCircleClasses","innerDotClasses","Rating","maxValue","showValue","date","quote","clampedValue","fullStars","hasHalfStar","emptyStars","StarIcon","HalfStarIcon","EmptyStarIcon","renderStars","starClasses","stars","i","Card","image","imageAlt","isSuperior","badge","hasRating","withPadding","withHeight","isRatingComments","context","starsRowClasses","priceClasses","displayImage","repeat","n","renderFn","HotelCardSkeleton","VERSION"],"mappings":"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"}