@travelswitchhq/flight-search-react 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/Flight.tsx","../src/flight-search-widget.styles.ts"],"sourcesContent":["export { FlightSearchWidget } from \"./Flight\";\nexport type {\n FlightSearchWidgetProps,\n FlightSearchSegment,\n FlightSearchFormState,\n AirportModel,\n FlightSearchSsoUser,\n} from \"./Flight\";\n","\"use client\";\n\nimport { useState, useRef, useEffect, useMemo, useCallback, type Ref } from \"react\";\nimport { Calendar } from \"primereact/calendar\";\nimport { Accordion, AccordionTab } from \"primereact/accordion\";\nimport { AutoComplete } from \"primereact/autocomplete\";\nimport { PrimeReactProvider } from \"primereact/api\";\nimport { JSEncrypt } from \"jsencrypt\";\nimport { flightSearchWidgetStyles } from \"./flight-search-widget.styles\";\n/** Airport from search API - matches response: ac, an, cc, cn, ct, etc. */\nexport interface AirportModel {\n id?: string;\n /** Airport code e.g. \"DUB\" */\n ac?: string;\n /** Airport name e.g. \"Dublin Airport\" */\n an?: string;\n /** Country code e.g. \"IE\" */\n cc?: string;\n /** Country name e.g. \"Ireland\" */\n cn?: string;\n /** City e.g. \"Dublin\" */\n ct?: string;\n pr?: number;\n tp?: number;\n [key: string]: unknown;\n}\n\nexport interface FlightSearchSsoUser {\n /** Mandatory: user email */\n email: string;\n /** Optional: first name */\n firstName?: string;\n /** Optional: last name */\n lastName?: string;\n /** Optional: country code / dialing code */\n cc?: string;\n /** Optional: phone number without country code */\n phone?: string;\n /** Optional: timestamp – if omitted, widget will inject current time */\n ts?: string;\n}\n\nexport type FlightSearchWidgetProps = {\n config?: {\n theme?: {\n primary?: string;\n secondary?: string;\n primaryLight?: string;\n };\n redirectionDomain?: string;\n fontName?: string;\n };\n ssoUser?: FlightSearchSsoUser;\n};\n/** Single segment in the flight search form (round-trip, one-way, or one leg of multi-city) */\nexport interface FlightSearchSegment {\n origin: string;\n destination: string;\n departureDate: Date | null;\n returnDate: Date | null;\n dateRange: (Date | null)[] | null;\n travelerClass: string;\n adultCount: number;\n childCount: number;\n infantCount: number;\n}\n\n/** Main form state: array of segments; works for round-trip, one-way, multi-city, custom-search */\nexport interface FlightSearchFormState {\n tripType: \"round-trip\" | \"one-way\" | \"multi-city\" | \"custom-search\";\n segments: FlightSearchSegment[];\n}\n\ninterface AdvancedOptions {\n isDirectFlights: boolean;\n isRefundable: boolean;\n isBaggage: boolean;\n preferredAirlineList: string[];\n isFlexiDate: boolean;\n isUmrah: boolean;\n}\n\ninterface ItineraryReq {\n departureCode: string;\n returnCode: string;\n departureDate: string;\n class: string;\n}\n\ntype DropdownType = \"origin\" | \"destination\";\n\ninterface PredictiveSearchState {\n fromAirport: AirportModel[];\n toAirport: AirportModel[];\n selectedFromIndex: number;\n selectedToIndex: number;\n}\n\ninterface AirlineOption {\n airline_code: string;\n airline_name: string;\n}\n\nconst normalizeDomainName = (domainName: string): string => {\n const trimmed = domainName.trim();\n if (!trimmed) return \"\";\n if (trimmed.startsWith(\"http://\") || trimmed.startsWith(\"https://\")) {\n try {\n return new URL(trimmed).hostname;\n } catch {\n return trimmed.replace(/^https?:\\/\\//, \"\").split(\"/\")[0] ?? \"\";\n }\n }\n return trimmed.split(\"/\")[0] ?? \"\";\n};\n\nconst buildEncryptedToken = (domainName: string): string | null => {\n const normalizedDomain = normalizeDomainName(domainName);\n if (!normalizedDomain) return null;\n const encryptor = new JSEncrypt();\n encryptor.setPublicKey(RSA_PUBLIC_KEY);\n const payload = `${normalizedDomain}~${new Date().getTime()}`;\n const encrypted = encryptor.encrypt(payload);\n return typeof encrypted === \"string\" ? encrypted : null;\n};\n\nconst STYLE_ELEMENT_ID = \"tfsw-flight-styles\";\nconst PRIMEICONS_LINK_ID = \"tfsw-primeicons\";\nconst RSA_PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----\nMIICITANBgkqhkiG9w0BAQEFAAOCAg4AMIICCQKCAgB0rRSHGZK/FtK15IRfQxtl\ndN5ToPtfXGzTNBe1vGhow5xqp6BLubMKKPwCj3zOJiAm1Ip1VNqqYxWnaL8ZErBF\nrErtE0r7kn50QgGgJCpdrWJ4unhaoe1su207d9oY6D6OBH90v1aXA6ZjN7zTJmiq\nFJZOOTQE6t/XwNAOphq/B6Lcr1iQSQmSqaMozy4OQ4NvIzNTQn5tcs9qJBMsKFeU\ncSp8VK76JBNEqSuEHNmbV2d/IQ5XAqVUiAs34kH2xWRSbBmy0WK3c3QKGzC1MRWM\n9JauLN56TKUFOmUSjfWY3caJru6HxsiMTGKnvflXHfgA2aLAPxu72pIHoCTy5Hxj\nAUoKM7qXUn/kQj4Ci0M/0LRF4boqd37wpbyVNeXNvqm+dLjxklf/+NHMfNL2Wvb4\nekHUVI8nMVPgswIcQ7q/Njf9DC+LA+/duf8m9JDjI3J6r9y1gQugdkLETGzF2Gj1\nToU0Pocrg6CFHImqq2z+cOeWnURrV0f0I1UWWGCb79OZxZ5oDjM9uCLRsoe8+Npg\nACZNf4AbnM7OUNj5TEYs6t/tUYouvTB7gH452I3EH6KWBl+ZTgCg0RFkOMazNOjn\n4J0yfbaPvpVgKzF2WRyn63mTO2tdLRl5s9uqMFhXmCs6IzEqBpxMKL1aS6ONZLDG\n5qPtpCPJnUFQEBTVlSO15QIDAQAB\n-----END PUBLIC KEY-----`;\n\n// Public key used exclusively for encrypting SSO user payloads.\n// Replace this placeholder with the actual SSO RSA public key.\nconst SSO_RSA_PUBLIC_KEY = `-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAv+PThexweK9V8axQRaB3\nJrhYm/y2JAhED2o7V4Kpi4PpwdkcsVuACwxPt8M51idar/lBNnm12yJAvMnSRAYP\nGv+iYCE5VV+XPzUZuu/ho3sARxO3bCSRx9Xk0JZkd0Q7Muvy3Z74N9lML+g4DAHH\n1SA+tQnvk2hLwna7vd6pHfmVDROEkTTqv0EF+0cVCUhwrXcEZ7NLrs3BPWLbxzus\njlYsutTU0oaCeeag+xX6vbb+LFjDBvxngdlPzApUU0z9T4r/Mqbdb73e2FMrPSHO\nrJo+bRQ1+GE0EoFxYTyYVyOrd9bpfUhcc/ziK8Bu2M8lQk9pFs+1DGb1wC1TWklf\nZCHX79BPP+tyLFugqmCLm+WprtNl+Cv93VQuwue6m9UATeiWHYrA9uZ0mWHvRPuD\nEaXCAvT3JUDqTnuV/mTu8cAr+HWMfB7wQ+XWyi6TVAfQovMawV89Gtk5q7Ep2L89\nMShfennamuIRODd7IuDLN24h8laBEKz0lPATsvyS3ITHG+DdwUjU+ptGYGzGI+ps\nYadkX8g5DSjQs8JZvCN22ktjGRLCudvS8e0IfgzRe6QQ90NmQ3dmtC4AsatHBeM5\nS7wetGyB9NHx52liu+AwZqiiLk8Yf/Y2/4394Z+kE/CYVFnCMEOxRhx/Fs3QRCm2\npiJcd0xNaTlQZ4IcB08NBMECAwEAAQ==\n-----END PUBLIC KEY-----`;\n\nconst buildEncryptedSsoUserToken = (user: FlightSearchSsoUser | undefined): string | null => {\n if (!user) return null;\n\n const email = (user.email ?? \"\").trim();\n if (!email) return null;\n\n const encryptor = new JSEncrypt();\n encryptor.setPublicKey(SSO_RSA_PUBLIC_KEY);\n\n const payloadUser: FlightSearchSsoUser = {\n ...user,\n email,\n ts: user.ts ?? new Date().toISOString(),\n };\n\n const payload = JSON.stringify(payloadUser);\n const encrypted = encryptor.encrypt(payload);\n return typeof encrypted === \"string\" ? encrypted : null;\n};\n\nconst ensureStylesInjected = () => {\n if (typeof document === \"undefined\") {\n return;\n }\n\n if (document.getElementById(STYLE_ELEMENT_ID)) {\n return;\n }\n\n const style = document.createElement(\"style\");\n style.id = STYLE_ELEMENT_ID;\n style.textContent = flightSearchWidgetStyles;\n document.head.appendChild(style);\n};\n\nconst ensurePrimeIconsLoaded = () => {\n if (typeof document === \"undefined\") {\n return;\n }\n\n if (document.getElementById(PRIMEICONS_LINK_ID)) {\n return;\n }\n\n const link = document.createElement(\"link\");\n link.id = PRIMEICONS_LINK_ID;\n link.rel = \"stylesheet\";\n link.href = \"https://unpkg.com/primeicons@7.0.0/primeicons.css\";\n document.head.appendChild(link);\n};\n\n/** Default/popular airports (sequence: AUH, CAI, DXB, RUH, LOS, LON, PAR, NYC) */\nconst DEFAULT_AIRPORTS: AirportModel[] = [\n { ac: \"AUH\", an: \"Abu Dhabi International Airport\", cc: \"AE\", cn: \"United Arab Emirates\", ct: \"Abu Dhabi\" },\n { ac: \"CAI\", an: \"Cairo International Airport\", cc: \"EG\", cn: \"Egypt\", ct: \"Cairo\" },\n { ac: \"DXB\", an: \"Dubai International Airport\", cc: \"AE\", cn: \"United Arab Emirates\", ct: \"Dubai\" },\n { ac: \"RUH\", an: \"King Khalid International Airport\", cc: \"SA\", cn: \"Saudi Arabia\", ct: \"Riyadh\" },\n { ac: \"LOS\", an: \"Murtala Muhammed International Airport\", cc: \"NG\", cn: \"Nigeria\", ct: \"Lagos\" },\n { ac: \"LON\", an: \"London All Airports\", cc: \"GB\", cn: \"United Kingdom\", ct: \"London\" },\n { ac: \"PAR\", an: \"All Airports\", cc: \"FR\", cn: \"France\", ct: \"Paris\" },\n { ac: \"NYC\", an: \"All airports\", cc: \"US\", cn: \"United States Of America\", ct: \"New York\" },\n];\n\n/** Display string for input/selected value e.g. \"Dublin Airport (DUB)\" */\nfunction formatAirportDisplay(airport: AirportModel): string {\n const code = airport.ac ?? \"\";\n const name = airport.an ?? airport.ct ?? \"\";\n return name ? `${name} (${code})` : code;\n}\n\n/** Airport code for badge and query e.g. \"DUB\" */\nfunction getAirportCode(airport: AirportModel): string {\n return airport.ac ?? \"\";\n}\n\n/** Format date for display (e.g. \"31 Jan 2026\") or \"Select date\" */\nfunction formatDisplayDate(date: Date | null | undefined): string {\n if (!date || !(date instanceof Date) || isNaN(date.getTime())) return \"Select date\";\n return date.toLocaleDateString(\"en-GB\", { day: \"2-digit\", month: \"short\", year: \"numeric\" });\n}\n\nexport function FlightSearchWidget({\n config,\n ssoUser,\n}: FlightSearchWidgetProps) {\n const theme = config?.theme;\n const primaryColor = theme?.primary ?? \"#2c0a82\";\n const secondaryColor = theme?.secondary ?? \"#2c0a82\";\n const primaryLightColor = theme?.primaryLight ?? \"#f3e2ff\";\n const fontName = config?.fontName;\n const redirectionDomain = config?.redirectionDomain;\n const airportSearchApiBaseUrl = \"https://adminapi-go.dev.futuretravelplatform.com/api\";\n const airlineSearchApiBaseUrl = \"https://adminapi.dev.futuretravelplatform.com/api\";\n const langCode = \"en\";\n const [airlineQuery, setAirlineQuery] = useState(\"\");\n const [airlineSuggestions, setAirlineSuggestions] = useState<AirlineOption[]>([]);\n const [selectedAirlines, setSelectedAirlines] = useState<AirlineOption[]>([]);\n const [validationErrors, setValidationErrors] = useState<Record<number, { origin?: boolean; destination?: boolean }>>({});\n\n const createDefaultSegment = (): FlightSearchSegment => ({\n origin: \"Origin\",\n destination: \"Destination\",\n departureDate: new Date(),\n returnDate: new Date(new Date().setDate(new Date().getDate() + 1)),\n dateRange: [new Date(), new Date(new Date().setDate(new Date().getDate() + 1))],\n travelerClass: \"Economy\",\n adultCount: 1,\n childCount: 0,\n infantCount: 0,\n });\n\n const [formState, setFormState] = useState<FlightSearchFormState>(() => ({\n tripType: \"round-trip\",\n segments: [{\n origin: \"Origin\",\n destination: \"Destination\",\n departureDate: new Date(),\n returnDate: new Date(new Date().setDate(new Date().getDate() + 1)),\n dateRange: [new Date(), new Date(new Date().setDate(new Date().getDate() + 1))],\n travelerClass: \"Economy\",\n adultCount: 1,\n childCount: 0,\n infantCount: 0,\n }],\n }));\n\n const { tripType, segments } = formState;\n const setTripType = (value: string) =>\n setFormState((prev) => ({ ...prev, tripType: value as FlightSearchFormState[\"tripType\"] }));\n const setSegments = (updater: (prev: FlightSearchSegment[]) => FlightSearchSegment[]) =>\n setFormState((prev) => ({ ...prev, segments: updater(prev.segments) }));\n\n const [advancedOptions, setAdvancedOptions] = useState<AdvancedOptions>({\n isDirectFlights: false,\n isRefundable: false,\n isBaggage: false,\n preferredAirlineList: [],\n isFlexiDate: false,\n isUmrah: false\n });\n const [isOriginDropdownOpen, setIsOriginDropdownOpen] = useState(false);\n const [isDestinationDropdownOpen, setIsDestinationDropdownOpen] = useState(false);\n const [isRoomsGuestsMenuOpen, setIsRoomsGuestsMenuOpen] = useState(false);\n const originDropdownRef = useRef<HTMLDivElement>(null);\n const destinationDropdownRef = useRef<HTMLDivElement>(null);\n const roomsGuestsMenuRef = useRef<HTMLDivElement>(null);\n const dateRangeCalendarRef = useRef<any>(null);\n const segmentCalendarRefs = useRef<Record<number, any>>({});\n\n // Get max segments based on trip type\n const getMaxSegments = (): number => {\n if (tripType === 'custom-search') return 3;\n if (tripType === 'multi-city') return 6;\n return 1;\n };\n const [segmentDropdowns, setSegmentDropdowns] = useState<{\n [key: number]: { origin: boolean; destination: boolean };\n }>({});\n const segmentRefs = useRef<{\n [key: number]: { origin: HTMLDivElement | null; destination: HTMLDivElement | null };\n }>({});\n\n const [predictiveSearchList, setPredictiveSearchList] = useState<Record<number, PredictiveSearchState>>({});\n const searchDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const airlineSearchDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const getPredictiveState = (segmentIndex: number): PredictiveSearchState => {\n return predictiveSearchList[segmentIndex] ?? {\n fromAirport: [],\n toAirport: [],\n selectedFromIndex: -1,\n selectedToIndex: -1,\n };\n };\n\n const getAirportListBySearch = useCallback(async (searchKeyword: string): Promise<AirportModel[]> => {\n if (!searchKeyword.trim()) return [];\n const url = `${airportSearchApiBaseUrl.replace(/\\/$/, \"\")}/Airport/GetList/${encodeURIComponent(langCode)}/${encodeURIComponent(searchKeyword.trim())}`;\n try {\n const res = await fetch(url);\n if (!res.ok) return [];\n const data = await res.json();\n if (Array.isArray(data)) return data;\n if (data && Array.isArray((data as { data?: unknown }).data)) return (data as { data: AirportModel[] }).data;\n if (data && Array.isArray((data as { result?: unknown }).result)) return (data as { result: AirportModel[] }).result;\n return [];\n } catch {\n return [];\n }\n }, [airportSearchApiBaseUrl, langCode]);\n\n const getAirlineListBySearch = useCallback(async (searchKeyword: string): Promise<AirlineOption[]> => {\n if (!searchKeyword.trim()) return [];\n const lang = (langCode ?? \"en\").toUpperCase();\n const url = `${airlineSearchApiBaseUrl.replace(/\\/$/, \"\")}/MasterSearch/GetAllAirline/${encodeURIComponent(lang)}/${encodeURIComponent(searchKeyword.trim())}`;\n try {\n const token = buildEncryptedToken(redirectionDomain ?? \"\");\n const res = await fetch(url, {\n headers: token ? { token } : undefined\n });\n if (!res.ok) return [];\n const data = await res.json();\n if (Array.isArray(data)) return data as AirlineOption[];\n if (data && Array.isArray((data as { data?: unknown }).data)) return (data as { data: AirlineOption[] }).data;\n if (data && Array.isArray((data as { result?: unknown }).result)) return (data as { result: AirlineOption[] }).result;\n return [];\n } catch {\n return [];\n }\n }, [airlineSearchApiBaseUrl, langCode, redirectionDomain]);\n\n const searchAirport = useCallback((segmentIndex: number, dropdownType: DropdownType, value: string) => {\n if (value.length < 3) {\n setPredictiveSearchList((prev) => ({\n ...prev,\n [segmentIndex]: {\n ...(prev[segmentIndex] ?? { fromAirport: [], toAirport: [], selectedFromIndex: -1, selectedToIndex: -1 }),\n [dropdownType === \"origin\" ? \"fromAirport\" : \"toAirport\"]: [],\n [dropdownType === \"origin\" ? \"selectedFromIndex\" : \"selectedToIndex\"]: -1,\n },\n }));\n return;\n }\n getAirportListBySearch(value).then((res) => {\n setPredictiveSearchList((prev) => ({\n ...prev,\n [segmentIndex]: {\n ...(prev[segmentIndex] ?? { fromAirport: [], toAirport: [], selectedFromIndex: -1, selectedToIndex: -1 }),\n [dropdownType === \"origin\" ? \"fromAirport\" : \"toAirport\"]: res,\n [dropdownType === \"origin\" ? \"selectedFromIndex\" : \"selectedToIndex\"]: res?.length === 0 ? -1 : 0,\n },\n }));\n });\n }, [getAirportListBySearch]);\n\n const closeAirportDropdown = useCallback((dropdownType: DropdownType, segmentIndex: number) => {\n if (dropdownType === \"origin\") {\n setIsOriginDropdownOpen(false);\n } else {\n setIsDestinationDropdownOpen(false);\n }\n setSegmentDropdowns((prev) => ({\n ...prev,\n [segmentIndex]: { ...(prev[segmentIndex] || { origin: false, destination: false }), [dropdownType]: false },\n }));\n }, []);\n\n const selectAirport = useCallback((airport: AirportModel, dropdownType: DropdownType, segmentIndex: number) => {\n const display = formatAirportDisplay(airport);\n setSegments((prev) => {\n const updated = [...prev];\n if (!updated[segmentIndex]) return prev;\n if (dropdownType === \"origin\") updated[segmentIndex] = { ...updated[segmentIndex], origin: display };\n else updated[segmentIndex] = { ...updated[segmentIndex], destination: display };\n return updated;\n });\n closeAirportDropdown(dropdownType, segmentIndex);\n }, [closeAirportDropdown]);\n\n const updateSelectedIndex = useCallback((segmentIndex: number, dropdownType: DropdownType, newIndex: number) => {\n setPredictiveSearchList((prev) => {\n const state = prev[segmentIndex] ?? { fromAirport: [], toAirport: [], selectedFromIndex: -1, selectedToIndex: -1 };\n const list = dropdownType === \"origin\" ? state.fromAirport : state.toAirport;\n const len = list.length;\n if (len === 0) return prev;\n const clamped = ((newIndex % len) + len) % len;\n return {\n ...prev,\n [segmentIndex]: {\n ...state,\n [dropdownType === \"origin\" ? \"selectedFromIndex\" : \"selectedToIndex\"]: clamped,\n },\n };\n });\n }, []);\n\n const handleKeyDown = useCallback((\n event: React.KeyboardEvent<HTMLInputElement>,\n dropdownType: DropdownType,\n segmentIndex: number\n ) => {\n const state = getPredictiveState(segmentIndex);\n const options = dropdownType === \"origin\" ? state.fromAirport : state.toAirport;\n const selectedIndex = dropdownType === \"origin\" ? state.selectedFromIndex : state.selectedToIndex;\n const isOpen = segmentIndex === 0\n ? (dropdownType === \"origin\" ? isOriginDropdownOpen : isDestinationDropdownOpen)\n : segmentDropdowns[segmentIndex]?.[dropdownType];\n\n switch (event.key) {\n case \"ArrowDown\":\n if (isOpen && options.length) {\n event.preventDefault();\n updateSelectedIndex(segmentIndex, dropdownType, selectedIndex + 1);\n }\n break;\n case \"ArrowUp\":\n if (isOpen && options.length) {\n event.preventDefault();\n updateSelectedIndex(segmentIndex, dropdownType, selectedIndex - 1);\n }\n break;\n case \"Enter\":\n if (isOpen && options.length && selectedIndex >= 0 && options[selectedIndex]) {\n event.preventDefault();\n selectAirport(options[selectedIndex], dropdownType, segmentIndex);\n }\n break;\n case \"Escape\":\n if (isOpen) {\n event.preventDefault();\n closeAirportDropdown(dropdownType, segmentIndex);\n }\n break;\n default:\n break;\n }\n }, [isOriginDropdownOpen, isDestinationDropdownOpen, segmentDropdowns, getPredictiveState, updateSelectedIndex, selectAirport, closeAirportDropdown]);\n\n const DEBOUNCE_MS = 300;\n const triggerSearchAirport = useCallback((segmentIndex: number, dropdownType: DropdownType, value: string) => {\n if (searchDebounceRef.current) clearTimeout(searchDebounceRef.current);\n if (value.length < 3) {\n searchAirport(segmentIndex, dropdownType, value);\n return;\n }\n searchDebounceRef.current = setTimeout(() => {\n searchDebounceRef.current = null;\n searchAirport(segmentIndex, dropdownType, value);\n }, DEBOUNCE_MS);\n }, [searchAirport]);\n\n const triggerSearchAirline = useCallback((value: string) => {\n if (airlineSearchDebounceRef.current) clearTimeout(airlineSearchDebounceRef.current);\n if (value.length < 2) {\n setAirlineSuggestions([]);\n return;\n }\n airlineSearchDebounceRef.current = setTimeout(() => {\n airlineSearchDebounceRef.current = null;\n getAirlineListBySearch(value).then(setAirlineSuggestions);\n }, DEBOUNCE_MS);\n }, [getAirlineListBySearch]);\n\n useEffect(() => () => {\n if (searchDebounceRef.current) clearTimeout(searchDebounceRef.current);\n if (airlineSearchDebounceRef.current) clearTimeout(airlineSearchDebounceRef.current);\n }, []);\n\n const themeStyle = useMemo(\n () => {\n const style: React.CSSProperties = {\n [\"--primary\" as string]: primaryColor,\n [\"--secondary\" as string]: secondaryColor,\n [\"--primary-light\" as string]: primaryLightColor\n };\n\n if (fontName) {\n (style as Record<string, string>)[\"--font-family\"] = fontName;\n }\n\n return style;\n },\n [primaryColor, secondaryColor, primaryLightColor]\n );\n\n useEffect(() => {\n ensureStylesInjected();\n ensurePrimeIconsLoaded();\n }, []);\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as HTMLElement;\n\n const isInsidePrimeDropdown =\n target.closest(\".p-dropdown-panel\") !== null ||\n target.closest(\".p-dropdown-items-wrapper\") !== null ||\n target.closest(\".p-dropdown-item\") !== null ||\n target.closest(\".p-component\")?.classList.contains(\"p-dropdown\") !== false ||\n target.closest('[data-pc-section=\"panel\"]') !== null ||\n target.closest('[data-pc-name=\"dropdown\"]') !== null;\n\n if (originDropdownRef.current && !originDropdownRef.current.contains(target)) {\n setIsOriginDropdownOpen(false);\n }\n if (destinationDropdownRef.current && !destinationDropdownRef.current.contains(target)) {\n setIsDestinationDropdownOpen(false);\n }\n\n if (\n !isInsidePrimeDropdown &&\n roomsGuestsMenuRef.current &&\n !roomsGuestsMenuRef.current.contains(target)\n ) {\n setIsRoomsGuestsMenuOpen(false);\n }\n\n const isInsideCustomDropdown = target.closest(\".sw-custom-dropdown\") !== null;\n const isInsideCalendar = target.closest(\".p-datepicker\") !== null || target.closest(\".p-calendar\") !== null;\n if (!isInsideCustomDropdown && !isInsideCalendar) {\n setSegmentDropdowns({});\n return;\n }\n\n Object.keys(segmentRefs.current).forEach((key) => {\n const index = Number.parseInt(key, 10);\n const refs = segmentRefs.current[index];\n if (refs) {\n if (refs.origin && !refs.origin.contains(target)) {\n setSegmentDropdowns((prev) => ({\n ...prev,\n [index]: { ...(prev[index] || { origin: false, destination: false }), origin: false }\n }));\n }\n if (refs.destination && !refs.destination.contains(target)) {\n setSegmentDropdowns((prev) => ({\n ...prev,\n [index]: {\n ...(prev[index] || { origin: false, destination: false }),\n destination: false\n }\n }));\n }\n }\n });\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, []);\n\n // Reset flight segments when trip type changes (multi-city/custom-search = at least 2 segments)\n useEffect(() => {\n if (tripType === 'multi-city' || tripType === 'custom-search') {\n setSegments((prev) => {\n const maxSegments = getMaxSegments();\n if (prev.length === 0) {\n const first = createDefaultSegment();\n const second: FlightSearchSegment = {\n origin: \"Origin\",\n destination: \"Destination\",\n departureDate: new Date(),\n returnDate: null,\n dateRange: null,\n travelerClass: first.travelerClass,\n adultCount: first.adultCount,\n childCount: first.childCount,\n infantCount: first.infantCount,\n };\n return [first, second];\n }\n if (prev.length === 1) {\n const first = prev[0];\n const second: FlightSearchSegment = {\n origin: \"Origin\",\n destination: \"Destination\",\n departureDate: new Date(),\n returnDate: null,\n dateRange: null,\n travelerClass: first.travelerClass,\n adultCount: first.adultCount,\n childCount: first.childCount,\n infantCount: first.infantCount,\n };\n return [first, second];\n }\n if (prev.length > maxSegments) return prev.slice(0, maxSegments);\n return prev;\n });\n } else {\n // round-trip / one-way: ensure single segment\n setSegments((prev) => {\n if (prev.length === 0) return [createDefaultSegment()];\n if (prev.length > 1) return [prev[0]];\n return prev;\n });\n }\n }, [tripType]);\n\n type SegmentField = keyof FlightSearchSegment;\n type SegmentValue = string | Date | null | (Date | null)[];\n\n const isValidLocationValue = (value: SegmentValue, placeholder: string): boolean => {\n if (typeof value !== \"string\") return false;\n const trimmed = value.trim();\n return trimmed.length > 0 && trimmed !== placeholder;\n };\n\n const handleSegmentFieldChange = (\n index: number,\n field: SegmentField,\n value: SegmentValue\n ): void => {\n setSegments((prev) => {\n const updated = [...prev];\n if (!updated[index]) return prev;\n updated[index] = { ...updated[index], [field]: value };\n\n if (\n field === \"departureDate\" &&\n (tripType === \"multi-city\" || tripType === \"custom-search\") &&\n value instanceof Date &&\n !isNaN(value.getTime())\n ) {\n for (let i = index + 1; i < updated.length; i += 1) {\n updated[i] = { ...updated[i], departureDate: value };\n }\n }\n return updated;\n });\n if (field === \"origin\" || field === \"destination\") {\n setSegmentDropdowns((prev) => ({\n ...prev,\n [index]: { ...prev[index], [field]: false }\n }));\n const placeholder = field === \"origin\" ? \"Origin\" : \"Destination\";\n if (isValidLocationValue(value, placeholder)) {\n setValidationErrors((prev) => ({\n ...prev,\n [index]: { ...(prev[index] ?? {}), [field]: false }\n }));\n }\n }\n };\n\n const handleTravellerChange = (field: \"travelerClass\" | \"adultCount\" | \"childCount\" | \"infantCount\", value: string | number): void => {\n setSegments((prev) => {\n const updated = prev.map((seg, i) =>\n i === 0 ? { ...seg, [field]: value } : seg\n );\n return updated;\n });\n };\n\n const toggleSegmentDropdown = (index: number, field: \"origin\" | \"destination\"): void => {\n setSegmentDropdowns((prev) => ({\n ...prev,\n [index]: {\n ...(prev[index] || { origin: false, destination: false }),\n [field]: !prev[index]?.[field]\n }\n }));\n };\n\n const addFlightSegment = (): void => {\n const maxSegments = getMaxSegments();\n if (segments.length < maxSegments) {\n const template = segments[0] ?? createDefaultSegment();\n setSegments((prev) => [\n ...prev,\n {\n origin: \"Origin\",\n destination: \"Destination\",\n departureDate: new Date(),\n returnDate: null,\n dateRange: null,\n travelerClass: template.travelerClass,\n adultCount: template.adultCount,\n childCount: template.childCount,\n infantCount: template.infantCount,\n }\n ]);\n }\n };\n\n const removeFlightSegment = (index: number): void => {\n if (segments.length > 1) {\n setSegments((prev) => prev.filter((_, i) => i !== index));\n }\n };\n\n // Helper function to extract airport code from string like \"Dubai (DXB)\"\n const extractAirportCode = (location: string): string => {\n const match = location.match(/\\(([A-Z]{3})\\)/);\n return match ? match[1] : location;\n };\n\n // Helper: format date for URL as DD-MMM-YYYY (e.g. 31-Jan-2026)\n const MONTH_NAMES = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n const formatDate = (date: Date | null): string => {\n if (!date) return '';\n const day = String(date.getDate()).padStart(2, '0');\n const month = MONTH_NAMES[date.getMonth()];\n const year = date.getFullYear();\n return `${day}-${month}-${year}`;\n };\n\n /** Trip type number for URL triptype param: 1=one-way, 2=round-trip, 3=multi-city, 4=custom-search */\n const getTripTypeNumber = (): number => {\n switch (tripType) {\n case 'one-way': return 1;\n case 'round-trip': return 2;\n case 'multi-city': return 3;\n case 'custom-search': return 4;\n default: return 2;\n }\n };\n\n\n // Map class name to class code (adjust based on your requirements)\n const getClassCode = (className: string): string => {\n const classMap: Record<string, string> = {\n 'Economy': 'Y',\n 'Business': 'C',\n 'First Class': 'F',\n 'Premium Economy': 'W'\n };\n return classMap[className] || 'Y';\n };\n\n // Build itinerary requests (new Angular: round-trip = 2 legs: outbound + return)\n const buildItineraryRequests = (): ItineraryReq[] => {\n const itineraryReqs: ItineraryReq[] = [];\n const firstSegment = segments[0];\n if (!firstSegment) return itineraryReqs;\n\n if (tripType === 'one-way') {\n itineraryReqs.push({\n departureCode: extractAirportCode(firstSegment.origin),\n returnCode: extractAirportCode(firstSegment.destination),\n departureDate: formatDate(firstSegment.departureDate),\n class: getClassCode(firstSegment.travelerClass)\n });\n } else if (tripType === 'round-trip') {\n // Leg 1: outbound dep1/ret1/dtt1/cl1\n itineraryReqs.push({\n departureCode: extractAirportCode(firstSegment.origin),\n returnCode: extractAirportCode(firstSegment.destination),\n departureDate: formatDate(firstSegment.departureDate),\n class: getClassCode(firstSegment.travelerClass)\n });\n // Leg 2: return dep2=ret1, ret2=dep1, dtt2=returnDate, cl2\n const returnDate = firstSegment.dateRange?.[1] ?? firstSegment.returnDate ?? firstSegment.departureDate;\n itineraryReqs.push({\n departureCode: extractAirportCode(firstSegment.destination),\n returnCode: extractAirportCode(firstSegment.origin),\n departureDate: formatDate(returnDate),\n class: getClassCode(firstSegment.travelerClass)\n });\n } else if (tripType === 'multi-city' || tripType === 'custom-search') {\n segments.forEach((segment) => {\n itineraryReqs.push({\n departureCode: extractAirportCode(segment.origin),\n returnCode: extractAirportCode(segment.destination),\n departureDate: formatDate(segment.departureDate),\n class: getClassCode(segment.travelerClass)\n });\n });\n }\n\n return itineraryReqs;\n };\n\n // Check if baggage option is selected\n const isBaggageOption = (): boolean => {\n return advancedOptions.isBaggage;\n };\n\n /** Trip type number for URL triptype param: 1=one-way, 2=round-trip, 3=multi-city, 4=custom-search */\n const getTripKey = (): string => {\n switch (tripType) {\n case 'one-way': return \"OW\";\n case 'round-trip': return \"IRT\";\n case 'multi-city': return \"NMC\";\n case 'custom-search': return \"MC\";\n default: return \"OW\";\n }\n };\n\n // Check if flexi date option is selected\n const isFlexiDateOption = (): boolean => {\n return advancedOptions.isFlexiDate;\n };\n\n // Check if umrah fare option is selected\n const isUmrahFareOption = (): boolean => {\n return advancedOptions.isUmrah;\n };\n\n // Create query string function similar to Angular implementation\n const createQueryString = (): Record<string, any> => {\n const queryStringObj: Record<string, any> = {};\n const itineraryReqs = buildItineraryRequests();\n let trip_index = 1;\n\n itineraryReqs.forEach((itineraryReqObj: ItineraryReq) => {\n queryStringObj[`dep${trip_index}`] = itineraryReqObj.departureCode;\n queryStringObj[`ret${trip_index}`] = itineraryReqObj.returnCode;\n queryStringObj[`dtt${trip_index}`] = itineraryReqObj.departureDate;\n queryStringObj[`cl${trip_index}`] = itineraryReqObj.class;\n trip_index++;\n });\n\n queryStringObj[`triptype`] = getTripTypeNumber();\n const firstSeg = segments[0];\n queryStringObj[`adult`] = firstSeg?.adultCount ?? 1;\n queryStringObj[`child`] = firstSeg?.childCount ?? 0;\n queryStringObj[`infant`] = firstSeg?.infantCount ?? 0;\n queryStringObj[`direct`] = advancedOptions.isDirectFlights;\n queryStringObj[`baggage`] = isBaggageOption();\n queryStringObj[`key`] = getTripKey();\n queryStringObj[`airlines`] = advancedOptions.preferredAirlineList.join(',') || '';\n queryStringObj[`ref`] = advancedOptions.isRefundable;\n queryStringObj[`lc`] = (langCode ?? 'en').toUpperCase();\n queryStringObj[`curr`] = 'AED';\n queryStringObj[`mgcc`] = 'AE';\n queryStringObj['ipc'] = isFlexiDateOption();\n queryStringObj[`umrah`] = isUmrahFareOption();\n\n return queryStringObj;\n };\n\n const handleSearch = (): void => {\n const queryStringObj = createQueryString();\n console.log(\"Query String Object:\", queryStringObj);\n console.log(\"Searching with:\", formState, \"domain:\", redirectionDomain);\n \n // Build query string for URL\n const queryParams = new URLSearchParams();\n Object.keys(queryStringObj).forEach((key) => {\n const value = queryStringObj[key];\n if (key === 'airlines' || key === 'mgcc') {\n queryParams.append(key, value !== null && value !== undefined ? String(value) : '');\n } else if (value !== null && value !== undefined && value !== '') {\n queryParams.append(key, String(value));\n }\n });\n\n const ssoToken = buildEncryptedSsoUserToken(ssoUser);\n if (ssoToken) {\n queryParams.append(\"to\", ssoToken);\n }\n \n const queryString = queryParams.toString();\n console.log(\"Query String:\", queryString);\n \n // If redirection domain is provided, open results in a new tab\n if (redirectionDomain) {\n const url = `${redirectionDomain}/flight/listing?${queryString}`;\n window.open(url, \"_blank\");\n }\n };\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>): void => {\n e.preventDefault();\n const isMultiCityOrCustom = tripType === \"multi-city\" || tripType === \"custom-search\";\n const segmentsToValidate = isMultiCityOrCustom ? segments : segments.slice(0, 1);\n const nextErrors: Record<number, { origin?: boolean; destination?: boolean }> = {};\n segmentsToValidate.forEach((segment, index) => {\n const originInvalid = !isValidLocationValue(segment.origin, \"Origin\");\n const destinationInvalid = !isValidLocationValue(segment.destination, \"Destination\");\n if (originInvalid || destinationInvalid) {\n nextErrors[index] = {\n origin: originInvalid,\n destination: destinationInvalid\n };\n }\n });\n if (Object.keys(nextErrors).length > 0) {\n setValidationErrors(nextErrors);\n return;\n }\n handleSearch();\n };\n \n const renderAirportDropdown = (\n segmentIndex: number,\n dropdownType: DropdownType,\n dropdownRef: Ref<HTMLDivElement>,\n isOpen: boolean,\n onOpen: () => void\n ) => {\n const isOrigin = dropdownType === \"origin\";\n const value = segments[segmentIndex]?.[dropdownType];\n const placeholder = isOrigin ? \"Origin\" : \"Destination\";\n const label = isOrigin ? \"From\" : \"To\";\n const list = isOrigin ? getPredictiveState(segmentIndex).fromAirport : getPredictiveState(segmentIndex).toAirport;\n const selectedIndex = isOrigin ? getPredictiveState(segmentIndex).selectedFromIndex : getPredictiveState(segmentIndex).selectedToIndex;\n\n return (\n <div className={`sw-form-field sw-pos-rel ${validationErrors[segmentIndex]?.[dropdownType] ? \"sw-is-invalid\" : \"\"}`}>\n <label htmlFor={`${dropdownType}-${segmentIndex}`}>{label}</label>\n <div className={`sw-custom-dropdown ${((validationErrors[segmentIndex]?.[dropdownType]) ? \"sw-has-error\" : \"\")}`} ref={dropdownRef}>\n <input\n type=\"text\"\n id={`${dropdownType}-${segmentIndex}`}\n className={`sw-custom-dropdown-trigger ${(value === placeholder || !value) ? 'sw-placeholder' : ''}`}\n value={value === placeholder ? '' : (value ?? '')}\n placeholder={placeholder}\n onFocus={onOpen}\n onChange={(e) => {\n const val = e.target.value;\n handleSegmentFieldChange(segmentIndex, dropdownType, val);\n triggerSearchAirport(segmentIndex, dropdownType, val);\n }}\n onKeyDown={(e) => handleKeyDown(e, dropdownType, segmentIndex)}\n />\n {isOpen && (\n <div className=\"sw-dropdown\">\n <ul className=\"sw-dropdown-list\">\n {(list.length > 0\n ? list.map((airport, i) => (\n <li key={airport.id ?? airport.ac ?? i} className={`sw-dropdown-list-item ${selectedIndex === i ? \"highlight\" : \"\"}`} onClick={() => selectAirport(airport, dropdownType, segmentIndex)}>\n <div className=\"sw-dropdown-list-card\"><h6 className=\"sw-dropdown-item-badge sw-en-font\">{getAirportCode(airport)}</h6><div><h5 className=\"sw-fw500 sw-text-ellipsis\">{formatAirportDisplay(airport)}</h5><h6 className=\"sw-text-label sw-text-ellipsis\">{airport.ct}{airport.cn ? `, ${airport.cn}` : \"\"}</h6></div></div>\n </li>\n ))\n : DEFAULT_AIRPORTS.map((airport, i) => (\n <li key={airport.ac ?? i} className=\"sw-dropdown-list-item \" onClick={() => selectAirport(airport, dropdownType, segmentIndex)}>\n <div className=\"sw-dropdown-list-card\"><h6 className=\"sw-dropdown-item-badge sw-en-font\">{getAirportCode(airport)}</h6><div><h5 className=\"sw-fw500 sw-text-ellipsis\">{formatAirportDisplay(airport)}</h5><h6 className=\"sw-text-label sw-text-ellipsis\">{airport.ct}{airport.cn ? `, ${airport.cn}` : \"\"}</h6></div></div>\n </li>\n ))\n )}\n </ul>\n </div>\n )}\n </div>\n </div>\n );\n };\n\n const getMinDateForSegment = (index: number): Date => {\n const today = new Date();\n if (index <= 0) return today;\n const prev = segments[index - 1]?.departureDate;\n if (prev instanceof Date && !isNaN(prev.getTime())) return prev;\n return today;\n };\n\n const renderFlightSegment = (index: number, segment: FlightSearchSegment, isMultiCityOrCustom: boolean) => {\n const canRemove = segments.length > 2 && index > 0 && isMultiCityOrCustom;\n\n const originRef = (el: HTMLDivElement | null) => {\n if (!segmentRefs.current[index]) segmentRefs.current[index] = { origin: null, destination: null };\n segmentRefs.current[index].origin = el;\n };\n const destinationRef = (el: HTMLDivElement | null) => {\n if (!segmentRefs.current[index]) segmentRefs.current[index] = { origin: null, destination: null };\n segmentRefs.current[index].destination = el;\n };\n\n const isOriginOpen = segmentDropdowns[index]?.origin ?? false;\n const isDestOpen = segmentDropdowns[index]?.destination ?? false;\n\n return (\n <div key={index} className=\"sw-srh-wrap sw-srh-box\">\n {renderAirportDropdown(index, \"origin\", originDropdownRef || originRef, isOriginOpen, () => toggleSegmentDropdown(index, \"origin\"))}\n {renderAirportDropdown(index, \"destination\", destinationDropdownRef || destinationRef, isDestOpen, () => toggleSegmentDropdown(index, \"destination\"))}\n {isMultiCityOrCustom && (\n <div className=\"sw-srh-wrap sw-pos-rel\">\n <div className=\"sw-form-field sw-com-cal\">\n <label htmlFor={`departure-${index}`}>Departure</label>\n <Calendar\n numberOfMonths={2}\n id={`departure-${index}`}\n appendTo=\"self\"\n value={segment.departureDate ?? null}\n onChange={(e) => {\n const raw = e.value as Date | string | null;\n const nextDate = raw instanceof Date ? raw : (typeof raw === \"string\" ? new Date(raw) : null);\n handleSegmentFieldChange(\n index,\n \"departureDate\",\n nextDate && !isNaN(nextDate.getTime()) ? nextDate : null\n );\n }}\n dateFormat=\"dd M yy\"\n placeholder=\"29 Jan 2026\"\n className=\"p-inputtext-sm\"\n minDate={getMinDateForSegment(index)}\n />\n </div>\n </div>\n )}\n {canRemove && (\n <div className=\"sw-srh-wrap\">\n <a\n type=\"button\"\n className=\"sw-remove-segment\"\n onClick={() => removeFlightSegment(index)}>\n <svg viewBox=\"0 0 200 200\" width=\"35\" height=\"35\" xmlns=\"http://www.w3.org/2000/svg\" role=\"presentation\"><path d=\"M124.697 135.303L100 110.606l-24.697 24.697l-10.606-10.606L89.393 100L64.697 75.303l10.606-10.606L100 89.394l24.697-24.697l10.606 10.606L110.607 100l24.696 24.697z\"></path></svg>\n </a>\n </div>\n )}\n </div>\n )\n }\n\n return (\n <PrimeReactProvider value={{ hideOverlaysOnDocumentScrolling: false }}>\n <div className=\"tfsw-root sw-container\" style={themeStyle}>\n <div className=\"sw-card-box\">\n <div className=\"sw-srh-main-head\">\n <div className=\"sw-srh-head\">\n <div className=\"sw-srh-round-text\" >\n {([\n { value: \"round-trip\", label: \"Round-trip\" },\n { value: \"one-way\", label: \"One-way\" },\n { value: \"custom-search\", label: \"Custom Search\" },\n { value: \"multi-city\", label: \"Multi-city\" },\n ] as const).map((option) => (\n <label key={option.value} className=\"sw-tab-checkbox\">\n <input\n type=\"radio\"\n name=\"trip\"\n value={option.value}\n checked={tripType === option.value}\n onChange={(e) => setTripType(e.target.value)}\n />\n <h5 className=\"sw-tab-content\">{option.label}</h5>\n </label>\n ))}\n </div>\n </div>\n </div>\n <form className={`sw-srh-grid ${tripType === 'multi-city' || tripType === 'custom-search' ? 'sw-srh-mc' : ''}`} onSubmit={handleSubmit}>\n {tripType === 'multi-city' || tripType === 'custom-search' ? (\n segments.map((segment, index) => renderFlightSegment(index, segment, true))\n ) : (\n <div className=\"sw-srh-wrap sw-srh-box\">\n {renderAirportDropdown(0, \"origin\", originDropdownRef, isOriginDropdownOpen, () => setIsOriginDropdownOpen(true))}\n {renderAirportDropdown(0, \"destination\", destinationDropdownRef, isDestinationDropdownOpen, () => setIsDestinationDropdownOpen(true))}\n </div>\n )}\n {(tripType === 'round-trip' || tripType === 'one-way') && (\n <div className=\"sw-srh-wrap sw-pos-rel \">\n {tripType === 'round-trip' ? (\n <>\n <div style={{ cursor: 'pointer' }} onClick={() => dateRangeCalendarRef.current?.show?.()} className=\"sw-form-field sw-com-cal\">\n <div><label>Departure</label><p>{segments[0]?.dateRange?.[0]?.toLocaleDateString('en-GB', { day: '2-digit', month: 'short', year: 'numeric' })}</p></div>\n <Calendar\n numberOfMonths={2}\n ref={dateRangeCalendarRef}\n id=\"dateRange\"\n appendTo=\"self\"\n selectionMode=\"range\"\n value={segments[0]?.dateRange ?? null}\n minDate={new Date()}\n onChange={(e) => {\n const range = e.value as (Date | null)[] | null;\n setSegments(prev => {\n const u = [...prev];\n if (!u[0]) return prev;\n u[0] = {\n ...u[0],\n dateRange: range,\n departureDate: range?.[0] ?? new Date(),\n returnDate: range?.[1] ?? new Date()\n };\n return u;\n });\n if (range?.[0] && range?.[1]) setTimeout(() => { dateRangeCalendarRef.current?.hide?.(); }, 150);\n }}\n dateFormat=\"dd M yy\"\n placeholder=\"Select date range\"\n className=\"p-inputtext-sm tfsw-calendar-input\"\n />\n </div>\n <div style={{ cursor: 'pointer' }} className=\"sw-form-field sw-com-cal\" onClick={() => dateRangeCalendarRef.current?.show?.()}>\n <div><label>Return</label><p>{(segments[0]?.dateRange?.[1] ?? segments[0]?.dateRange?.[0])?.toLocaleDateString('en-GB', { day: '2-digit', month: 'short', year: 'numeric' })}</p></div>\n </div>\n </>\n ) : (\n <>\n <div\n className=\"sw-form-field sw-pos-rel sw-com-cal\"\n style={{ cursor: 'pointer' }}\n onClick={() => segmentCalendarRefs.current[0]?.show?.()}\n >\n <label>Departure</label>\n <p>{formatDisplayDate(segments[0]?.departureDate)}</p>\n <Calendar\n numberOfMonths={2}\n ref={(el) => { segmentCalendarRefs.current[0] = el; }}\n value={segments[0]?.departureDate ?? null}\n onChange={(e) => {\n const raw = e.value as Date | string | null;\n const nextDate = raw instanceof Date ? raw : (typeof raw === \"string\" ? new Date(raw) : null);\n handleSegmentFieldChange(\n 0,\n \"departureDate\",\n nextDate && !isNaN(nextDate.getTime()) ? nextDate : null\n );\n }}\n appendTo=\"self\"\n minDate={new Date()}\n dateFormat=\"dd M yy\"\n className=\"p-inputtext-sm tfsw-calendar-input\"\n />\n </div>\n <div className=\"sw-form-field sw-pos-rel sw-com-cal sw-add-return-label\" style={{ cursor: 'pointer' }} onClick={() => { setTripType('round-trip'); setTimeout(() => document.getElementById('dateRange')?.querySelector('input')?.focus?.(), 100); }}>\n <label>Add return</label>\n </div>\n </>\n )}\n </div>\n )}\n {(tripType === 'multi-city' || tripType === 'custom-search') && (\n <div className=\"sw-srh-mc-foot\">\n {segments.length < getMaxSegments() && (\n <button type=\"button\" className=\"sw-srh-add-btn\" onClick={addFlightSegment}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"none\" d=\"M0 0h16v16H0z\"></path><path d=\"M15 7H9V1H7v6H1v2h6v6h2V9h6z\"></path>\n </svg>\n Add Another Flight\n </button>\n )}\n </div>\n )}\n <div className=\"sw-form-field sw-traveller sw-pos-rel\">\n <label htmlFor=\"rooms\">Travellers and Class</label>\n <div className=\"sw-custom-dropdown\" ref={roomsGuestsMenuRef}>\n <div\n className=\"sw-custom-dropdown-trigger\"\n onClick={() => setIsRoomsGuestsMenuOpen(!isRoomsGuestsMenuOpen)}\n >\n <span>\n {(segments[0]?.adultCount ?? 0) + (segments[0]?.childCount ?? 0) + (segments[0]?.infantCount ?? 0)} Traveller{((segments[0]?.adultCount ?? 0) + (segments[0]?.childCount ?? 0) + (segments[0]?.infantCount ?? 0)) !== 1 ? 's' : ''}, {segments[0]?.travelerClass ?? 'Economy'}\n </span>\n </div>\n {isRoomsGuestsMenuOpen && (\n <div className=\"sw-rooms-guests-menu\">\n <h3 className=\"sw-rooms-guests-title\">Number of Travellers\n </h3>\n <div className=\"sw-srh-pax\">\n <div className=\"sw-srh-common-adult\"><h3>Adults</h3><p>Age (12+)</p></div>\n <div className=\"sw-srh-button-wrapper\">\n {[1, 2, 3, 4, 5, 6, 7, 8, 9].map((count) => {\n const childCount = segments[0]?.childCount ?? 0;\n const infantCount = segments[0]?.infantCount ?? 0;\n const isDisabled = (count + childCount) > 9;\n \n return (\n <button \n key={count}\n type=\"button\"\n className={`sw-en-font ${(segments[0]?.adultCount ?? 0) === count ? 'sw-active-button' : ''} ${isDisabled ? 'disabled' : ''}`}\n disabled={isDisabled}\n onClick={() => {\n const newChildCount = Math.min(childCount, 9 - count);\n setSegments(prev => {\n const updated = [...prev];\n if (!updated[0]) return prev;\n updated[0] = {\n ...updated[0],\n adultCount: count,\n childCount: newChildCount,\n infantCount: Math.min(infantCount, count)\n };\n return updated;\n });\n }}\n >\n {count}\n </button>\n );\n })}\n </div>\n </div>\n <div className=\"sw-srh-pax\">\n <div className=\"sw-srh-common-adult\"><h3>Child</h3><p>Age (2-11)</p></div>\n <div className=\"sw-srh-button-wrapper\">\n {[0, 1, 2, 3, 4, 5, 6, 7, 8].map((count) => {\n const adultCount = segments[0]?.adultCount ?? 0;\n const isDisabled = (adultCount + count) > 9;\n \n return (\n <button \n key={count}\n type=\"button\"\n className={`sw-en-font ${(segments[0]?.childCount ?? 0) === count ? 'sw-active-button' : ''} ${isDisabled ? 'disabled' : ''}`}\n disabled={isDisabled}\n onClick={() => handleTravellerChange(\"childCount\", count)}\n >\n {count}\n </button>\n );\n })}\n </div>\n </div>\n <div className=\"sw-srh-pax\">\n <div className=\"sw-srh-common-adult\"><h3>Infant</h3><p>Under 2 years</p></div>\n <div className=\"sw-srh-button-wrapper\">\n {[0, 1, 2, 3, 4, 5, 6, 7, 8, 9].map((count) => {\n const adultCount = segments[0]?.adultCount ?? 0;\n const isDisabled = count > adultCount;\n \n return (\n <button \n key={count}\n type=\"button\"\n className={`sw-en-font ${(segments[0]?.infantCount ?? 0) === count ? 'sw-active-button' : ''} ${isDisabled ? 'disabled' : ''}`}\n disabled={isDisabled}\n onClick={() => handleTravellerChange(\"infantCount\", count)}\n >\n {count}\n </button>\n );\n })}\n </div>\n </div>\n <h3 className=\"sw-rooms-guests-title\">Travel Class\n </h3>\n <div className=\"sw-srh-class\">\n {['Economy', 'Business', 'First Class', 'Premium Economy'].map((classOption) => (\n <label key={classOption} className=\"sw-tab-checkbox\">\n <input \n type=\"radio\" \n name=\"travel-class\" \n checked={(segments[0]?.travelerClass ?? 'Economy') === classOption}\n onChange={() => handleTravellerChange(\"travelerClass\", classOption)}\n />\n <span className=\"sw-tab-content\">\n {classOption}\n </span>\n </label>\n ))}\n </div>\n <div className=\"sw-rooms-guests-footer\">\n <div></div>\n <div className=\"sw-rooms-guests-cta\">\n <button\n type=\"button\"\n className=\"sw-reset-button\"\n onClick={() => {\n setSegments(prev => {\n const updated = [...prev];\n if (!updated[0]) return prev;\n updated[0] = { ...updated[0], adultCount: 1, childCount: 0, infantCount: 0, travelerClass: 'Economy' };\n return updated;\n });\n }}\n >\n Reset\n </button>\n <button\n type=\"button\"\n className=\"sw-apply-button\"\n onClick={() => setIsRoomsGuestsMenuOpen(false)}\n >\n Apply\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n <button type=\"submit\" className=\"sw-search-button\">\n <span className=\"pi pi-search\" aria-hidden=\"true\" />\n Search\n </button>\n </form>\n <div className=\"sw-advanced-search-options\">\n <Accordion>\n <AccordionTab header=\"Advanced Search options\">\n <div className=\"sw-fsrh-adv-cont\">\n <AutoComplete\n value={selectedAirlines}\n suggestions={airlineSuggestions}\n completeMethod={(e) => {\n const query = e.query ?? \"\";\n setAirlineQuery(query);\n triggerSearchAirline(query);\n }}\n onChange={(e) => {\n const next = (e.value ?? []) as AirlineOption[];\n setSelectedAirlines(next);\n setAdvancedOptions(prev => ({\n ...prev,\n preferredAirlineList: next.map((item) => item.airline_code)\n }));\n }}\n field=\"airline_name\"\n multiple\n forceSelection\n placeholder=\"Preferred airline\"\n />\n <div className=\"sw-fsrh-chk-main\">\n <label className=\"sw-material-checkbox\">\n <input \n type=\"checkbox\" \n checked={advancedOptions.isRefundable}\n onChange={(e) => setAdvancedOptions(prev => ({ ...prev, isRefundable: e.target.checked }))}\n />\n <span className=\"sw-checkmark\"></span> \n Refundable\n </label>\n <label className=\"sw-material-checkbox\">\n <input \n type=\"checkbox\" \n checked={advancedOptions.isBaggage}\n onChange={(e) => setAdvancedOptions(prev => ({ ...prev, isBaggage: e.target.checked }))}\n />\n <span className=\"sw-checkmark\"></span> \n Baggage only \n </label>\n <label className=\"sw-material-checkbox\">\n <input \n type=\"checkbox\" \n checked={advancedOptions.isDirectFlights}\n onChange={(e) => setAdvancedOptions(prev => ({ ...prev, isDirectFlights: e.target.checked }))}\n />\n <span className=\"sw-checkmark\"></span> \n Direct Flights \n </label>\n </div>\n </div>\n </AccordionTab>\n </Accordion>\n </div>\n </div>\n </div>\n </PrimeReactProvider>\n )\n}\n\n","export const flightSearchWidgetStyles = `\r\n:root {\r\n --font-family: Montserrat, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\r\n --ar-font-family: Arial, sans-serif;\r\n --label-color: #66797F;\r\n --body-text: #0B1215;\r\n --btn-radius: 8px;\r\n --radius: 12px;\r\n --primary-btn: #2C0A82;\r\n --primary-button-text: #ffffff;\r\n --button-primary-border: #2C0A82;\r\n --form-border: #d8dcde;\r\n --white: #ffffff;\r\n --gray: #999;\r\n --widget-bg: #f5f5f8;\r\n --widget-font-size: 1.4rem;\r\n --widget-z-index-base: 1000;\r\n --widget-transition: all 0.2s ease;\r\n --widget-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n --widget-shadow-hover: 0 4px 12px rgba(0, 0, 0, 0.15);\r\n --grid-gap-sm: 2px;\r\n --grid-gap-md: 10px;\r\n --grid-gap-lg: 20px;\r\n --flex-gap-sm: 5px;\r\n --flex-gap-md: 15px;\r\n --flex-gap-lg: 20px;\r\n}\r\n.sw-container {\r\n contain: layout;\r\n position: relative;\r\n display: block;\r\n width: 100%;\r\n min-width: 1240px;\r\n margin: 0;\r\n padding: 0;\r\n box-sizing: border-box;\r\n color: var(--body-text);\r\n font-family: var(--font-family);\r\n font-size: var(--widget-font-size);\r\n font-weight: 400;\r\n line-height: 1.5;\r\n -webkit-font-smoothing: antialiased;\r\n -moz-osx-font-smoothing: grayscale;\r\n -webkit-tap-highlight-color: transparent;\r\n background: var(--widget-bg);\r\n *,\r\n *::before,\r\n *::after {\r\n box-sizing: border-box;\r\n }\r\n}\r\n.sw-container button,\r\n.sw-container input {\r\n font-family: var(--font-family);\r\n}\r\n.sw-container h1,\r\n.sw-container h2,\r\n.sw-container h3,\r\n.sw-container h4,\r\n.sw-container h5,\r\n.sw-container h6,\r\n.sw-container p {\r\n display: block;\r\n margin: 0;\r\n color: inherit;\r\n font-family: var(--font-family);\r\n font-weight: normal;\r\n line-height: 1.4;\r\n}\r\n.sw-container h1 {\r\n font-size: 22px;\r\n}\r\n.sw-container h2 {\r\n font-size: 20px;\r\n}\r\n.sw-container h3 {\r\n font-size: 18px;\r\n}\r\n.sw-container h4 {\r\n font-size: 16px;\r\n}\r\n.sw-container h5 {\r\n font-size: 14px;\r\n}\r\n.sw-container h6,\r\n.sw-container small {\r\n font-size: 12px;\r\n}\r\n.sw-container .sw-fw500 {\r\n font-weight: 500 !important;\r\n}\r\n.sw-container .sw-flex {\r\n display: flex;\r\n}\r\n.sw-container .sw-align-center {\r\n display: flex;\r\n align-items: center;\r\n}\r\n.sw-container .sw-gap-5 {\r\n gap: 5px;\r\n}\r\n.sw-container .sw-gap-15 {\r\n gap: 15px;\r\n}\r\n.sw-container .sw-justify-between {\r\n justify-content: space-between;\r\n}\r\n.sw-container .enFont{\r\n font-family: var(--ar-font-family);\r\n}\r\n.sw-container .sw-text-ellipsis {\r\n display: -webkit-box;\r\n overflow: hidden;\r\n -webkit-box-orient: vertical;\r\n text-overflow: ellipsis;\r\n}\r\n.sw-container .sw-text-label {\r\n color: var(--label-color);\r\n}\r\n.sw-booking-form {\r\n position: relative;\r\n display: grid;\r\n grid-template-columns: 1fr repeat(4, minmax(0, 1fr)) minmax(80px, 0.8fr);\r\n gap: var(--grid-gap-sm);\r\n min-height: 55px;\r\n min-width: 0; \r\n border-radius: var(--radius);\r\n overflow: visible; \r\n}\r\n.sw-card-box {\r\n position: relative;\r\n display: block;\r\n padding: 20px;\r\n background-color: var(--white);\r\n border-radius: var(--radius);\r\n}\r\nbody[dir=\"ltr\"] .sw-card-box .br-right,\r\nbody[dir=\"rtl\"] .sw-card-box .br-left{\r\n border-top-right-radius: var(--radius);\r\n border-bottom-right-radius: var(--radius);\r\n}\r\nbody[dir=\"rtl\"] .sw-card-box .br-right,\r\nbody[dir=\"ltr\"] .sw-card-box .br-left{\r\n border-top-left-radius: var(--radius);\r\n border-bottom-left-radius: var(--radius);\r\n}\r\n.sw-form-field {\r\n display: flex;\r\n flex-direction: column;\r\n flex: 1 1 auto; \r\n gap: 3px;\r\n padding: 10px 15px;\r\n background-color: #f8f8f8;\r\n min-width: 0; \r\n overflow: visible; \r\n}\r\n.sw-form-field .p-calendar {\r\n position: unset;\r\n}\r\n.sw-form-field label {\r\n display: block;\r\n width: 100%;\r\n margin: 0;\r\n padding: 0;\r\n overflow: hidden;\r\n white-space: nowrap;\r\n color: var(--label-color);\r\n font-size: 12px;\r\n font-weight: 500;\r\n -webkit-box-orient: vertical;\r\n text-overflow: ellipsis;\r\n}\r\n.p-button-label {\r\n flex: unset;\r\n}\r\n.sw-form-field input,\r\n.sw-form-field .p-inputtext {\r\n display: block;\r\n width: 100%;\r\n margin: 0;\r\n padding: 0;\r\n border: 0;\r\n border-radius: 0;\r\n outline: none;\r\n background: transparent;\r\n box-shadow: none;\r\n color: var(--body-text);\r\n font-size: 14px;\r\n font-weight: 500;\r\n}\r\n.sw-form-field input::placeholder,\r\n.sw-form-field .p-inputtext::placeholder {\r\n color: var(--label-color) !important;\r\n}\r\n.sw-form-swap {\r\n position: absolute;\r\n top: 50%;\r\n left: 50%;\r\n z-index: 2;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 3px;\r\n border: 1px solid var(--form-border);\r\n border-radius: 50%;\r\n background-color: #fff;\r\n cursor: pointer;\r\n transform: translate(-50%, -50%);\r\n}\r\n.sw-srh-wrap.sw-srh-box.sw-pos-rel .sw-form-field.sw-pos-rel:last-child {\r\npadding-inline-start: 25px;\r\n}\r\n.sw-custom-dropdown {\r\n display: block;\r\n width: 100%;\r\n}\r\n.sw-custom-dropdown-trigger {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n flex: 1 1 auto; \r\n width: 100%;\r\n min-width: 0; \r\n margin: 0;\r\n padding: 0;\r\n border: 0;\r\n outline: none;\r\n background: transparent;\r\n cursor: pointer;\r\n color: var(--body-text);\r\n font-size: 14px;\r\n font-weight: 500;\r\n}\r\n.sw-custom-dropdown-trigger .sw-placeholder {\r\n color: var(--label-color);\r\n}\r\n.sw-dropdown-arrow {\r\n margin-left: 8px;\r\n color: var(--label-color);\r\n font-size: 10px;\r\n transition: transform 0.2s ease;\r\n}\r\n.sw-dropdown{\r\n position: absolute;\r\n top: calc(100% + 5px);\r\n left: 0;\r\n right: 0;\r\n z-index: calc(var(--widget-z-index-base) + 5);\r\n display: block; \r\n visibility: visible; \r\n opacity: 1; \r\n}\r\n.sw-dropdown,\r\n.p-autocomplete-panel {\r\n width: 380px;\r\n max-height: 310px;\r\n margin: 0;\r\n padding: 0;\r\n overflow: auto;\r\n overflow-x: hidden;\r\n background: var(--white);\r\n border: 1px solid var(--form-border);\r\n border-radius: var(--radius);\r\n box-shadow: var(--widget-shadow);\r\n}\r\n.sw-dropdown::-webkit-scrollbar {\r\n display: none;\r\n}\r\n.sw-dropdown-list-card,\r\n.sw-dropdown-list-box,\r\n.p-autocomplete-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 15px;\r\n margin: 0 20px;\r\n padding: 10px 0;\r\n cursor: pointer;\r\n font-family: var(--font-family);\r\n}\r\n.p-autocomplete-item{\r\n font-size: 14px;\r\n font-weight: 400;\r\n}\r\n.p-autocomplete-item:hover{\r\n background-color: var(--primary-light);\r\n}\r\n.sw-dropdown-list-box {\r\n display: flex;\r\n justify-content: space-between;\r\n}\r\n.sw-dropdown-list-card {\r\n display: grid;\r\n grid-template-columns: 45px auto;\r\n}\r\n.sw-dropdown-item-badge {\r\n display: grid;\r\n place-items: center;\r\n width: fit-content;\r\n height: unset;\r\n margin: 0;\r\n padding: 4px 8px;\r\n background-color: #f4f5f5;\r\n border-radius: 4px;\r\n font-weight: 500;\r\n}\r\n.sw-dropdown-list {\r\n display: block;\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n}\r\n.sw-dropdown-list-item {\r\n display: block;\r\n margin: 0;\r\n padding: 0;\r\n cursor: pointer;\r\n color: var(--body-text);\r\n font-size: 14px;\r\n transition: background-color 0.2s ease;\r\n}\r\n.sw-current {\r\n font-weight: 500;\r\n}\r\n.sw-en-font {\r\n font-family: Arial, sans-serif; \r\n}\r\n.sw-bg-color-loc {\r\n color: var(--primary);\r\n}\r\n.sw-scale-rotate {\r\n transition: transform 0.2s ease;\r\n}\r\n.sw-custom-dropdown-item:hover {\r\n background-color: var(--secondary-light);\r\n}\r\n.sw-custom-dropdown-item:first-child {\r\n border-top-left-radius: var(--btn-radius);\r\n border-top-right-radius: var(--btn-radius);\r\n}\r\n.sw-custom-dropdown-item:last-child {\r\n border-bottom-left-radius: var(--btn-radius);\r\n border-bottom-right-radius: var(--btn-radius);\r\n}\r\n.sw-rooms-guests-menu {\r\n position: absolute;\r\n top: 100%;\r\n right: 0;\r\n z-index: var(--widget-z-index-base);\r\n display: block;\r\n width: 75%;\r\n margin-top: 4px;\r\n padding: 20px;\r\n background: var(--white);\r\n border: 1px solid var(--form-border);\r\n border-radius: var(--radius);\r\n box-shadow: var(--widget-shadow);\r\n}\r\n.sw-pos-rel {\r\n position: relative;\r\n}\r\n.sw-rooms-guests-title {\r\n margin: 0 0 15px 0 !important;\r\n font-size: 16px !important;\r\n font-weight: 500 !important;\r\n}\r\n.sw-room-section {\r\n display: grid;\r\n grid-template-columns: 1.2fr 3fr 4fr 50px;\r\n align-items: center;\r\n padding: 10px 0;\r\n}\r\n.sw-pb0 {\r\n padding-bottom: 0;\r\n}\r\n.sw-room-section:last-of-type {\r\n margin-bottom: 15px;\r\n}\r\n.sw-room-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 5px;\r\n color: var(--primary);\r\n font-size: 14px;\r\n font-weight: 500;\r\n}\r\n.sw-room-controls-child {\r\n display: grid;\r\n grid-template-columns: repeat(4, minmax(0, 1fr));\r\n gap: var(--grid-gap-lg);\r\n min-width: 0; \r\n}\r\n.sw-room-controls-child .p-dropdown {\r\n padding: 10px;\r\n border: 1px solid var(--form-border);\r\n border-radius: var(--radius);\r\n}\r\n.sw-room-controls-child .p-dropdown-item {\r\n padding: 10px;\r\n font-size: 14px;\r\n}\r\n.sw-room-controls-child .p-dropdown-panel {\r\n background: var(--white);\r\n border: 1px solid var(--form-border);\r\n border-radius: var(--btn-radius);\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\r\n}\r\n.sw-room-controls-group {\r\n display: grid;\r\n grid-template-columns: repeat(2, minmax(0, 1fr));\r\n justify-content: center;\r\n gap: var(--grid-gap-md);\r\n min-width: 0; \r\n}\r\n.sw-room-control-item {\r\n display: flex;\r\n flex-direction: column;\r\n flex: 1 1 auto; \r\n justify-content: space-between;\r\n gap: var(--flex-gap-sm);\r\n min-width: 0; \r\n}\r\n.sw-room-control-label {\r\n color: var(--body-text);\r\n font-size: 14px;\r\n font-weight: 400;\r\n}\r\n.sw-room-control-buttons {\r\n display: grid;\r\n grid-template-columns: 36px 40px 36px;\r\n align-items: center;\r\n overflow: hidden;\r\n}\r\n.sw-count-button {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 36px;\r\n height: 36px;\r\n margin: 0;\r\n padding: 0;\r\n border: none;\r\n border-radius: 50%;\r\n background: var(--primary);\r\n cursor: pointer;\r\n color: var(--white);\r\n font-size: 20px;\r\n font-weight: 500;\r\n transition: var(--widget-transition);\r\n}\r\n.sw-count-button:focus-visible {\r\n outline: 2px solid var(--primary);\r\n outline-offset: 2px;\r\n}\r\n.sw-count-button:hover:not(:disabled) {\r\n background: var(--primary-btn);\r\n opacity: 0.9;\r\n transform: scale(1.05);\r\n}\r\n.sw-count-button.sw-disabled {\r\n opacity: 0.6;\r\n cursor: not-allowed;\r\n}\r\n.sw-count-button:disabled {\r\n cursor: not-allowed;\r\n}\r\n.sw-count-value {\r\n min-width: 30px;\r\n text-align: center;\r\n color: var(--body-text);\r\n font-size: 16px;\r\n font-weight: 500;\r\n}\r\n.sw-add-room-button {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n width: auto;\r\n height: 40px;\r\n margin: 0 !important;\r\n padding: 1rem;\r\n border: 1px solid var(--primary);\r\n border-radius: var(--radius);\r\n background-color: transparent;\r\n cursor: pointer;\r\n color: var(--primary);\r\n font-size: 14px;\r\n font-weight: 500;\r\n}\r\n.sw-rooms-guests-cta {\r\n display: flex;\r\n gap: 10px;\r\n}\r\n.sw-rooms-guests-footer {\r\n display: flex;\r\n justify-content: space-between;\r\n gap: 10px;\r\n margin-top: 15px;\r\n padding-top: 15px;\r\n border-top: 1px solid var(--form-border);\r\n}\r\n.sw-reset-button {\r\n padding: 10px 20px;\r\n border: 1px solid var(--primary);\r\n border-radius: var(--btn-radius);\r\n background: transparent;\r\n cursor: pointer;\r\n color: var(--primary);\r\n font-size: 14px;\r\n font-weight: 500;\r\n transition: all 0.2s ease;\r\n}\r\n.sw-reset-button:hover {\r\n background: var(--primary-light);\r\n}\r\n.sw-apply-button {\r\n padding: 10px 20px;\r\n border: 1px solid var(--button-primary-border);\r\n border-radius: var(--btn-radius);\r\n background: var(--primary-btn);\r\n cursor: pointer;\r\n color: var(--primary-button-text);\r\n font-size: 14px;\r\n font-weight: 500;\r\n transition: all 0.2s ease;\r\n}\r\n.sw-apply-button:hover {\r\n opacity: 0.9;\r\n background: var(--primary);\r\n}\r\n.sw-search-button,\r\n.sw-search-button.p-button {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 10px;\r\n width: auto;\r\n height: 100%;\r\n min-height: 56px;\r\n margin: 0;\r\n padding: 0 15px;\r\n border: 1px solid var(--button-primary-border);\r\n background-color: var(--primary-btn);\r\n cursor: pointer;\r\n color: var(--primary-button-text);\r\n font-size: 16px;\r\n font-weight: 400;\r\n transition: var(--widget-transition);\r\n}\r\n.sw-search-button:focus-visible,\r\n.sw-search-button.p-button:focus-visible {\r\n outline: 2px solid var(--primary);\r\n outline-offset: 2px;\r\n}\r\n.sw-search-button:hover:not(:disabled),\r\n.sw-search-button.p-button:hover:not(:disabled) {\r\n background-color: var(--primary);\r\n opacity: 0.9;\r\n box-shadow: var(--widget-shadow-hover);\r\n}\r\n.sw-search-button .p-button-icon-left {\r\n margin: 0;\r\n}\r\n.sw-search-button svg,\r\n.sw-search-button .p-button-icon {\r\n flex-shrink: 0;\r\n}\r\n.p-calendar .p-datepicker { \r\n top: 100% !important;\r\n display: block;\r\n min-width: 100%;\r\n margin-top: 5px !important;\r\n padding: 15px;\r\n background-color: var(--white);\r\n border: 1px solid var(--form-border);\r\n border-radius: var(--radius);\r\n box-shadow: var(--widget-shadow);\r\n}\r\n.sw-srh-wrap {\r\n display: flex;\r\n gap: 2px;\r\n}\r\n.sw-com-cal p{\r\n color: var(--body-text);\r\n font-size: 14px;\r\n font-weight: 500;\r\n}\r\n.sw-com-cal .p-inputtext{\r\n visibility: hidden;\r\n height: 0;\r\n width: 0;\r\n ;\r\n}\r\n.p-datepicker-header {\r\n padding-bottom: 15px;\r\n}\r\n.p-datepicker-prev[style=\"visibility: hidden;\"]::after,\r\n.p-datepicker-next[style=\"visibility: hidden;\"]::after {\r\n visibility: hidden !important;\r\n}\r\n.p-datepicker-prev,\r\n.p-datepicker-next {\r\n cursor: pointer;\r\n\r\n}\r\n.p-datepicker-prev::after,\r\n.p-datepicker-next::after {\r\n content: \"\";\r\n display: block;\r\n width: 14px;\r\n height: 14px;\r\n visibility: visible;\r\n background-image: url(\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024'><path fill='%231b1a1f' d='m222.927 580.115 301.354 328.512c24.354 28.708 20.825 71.724-7.883 96.078s-71.724 20.825-96.078-7.883L19.576 559.963a67.9 67.9 0 0 1-13.784-20.022 68 68 0 0 1-5.977-29.488l.001-.063a68.34 68.34 0 0 1 7.265-29.134 68 68 0 0 1 1.384-2.6 67.6 67.6 0 0 1 10.102-13.687L429.966 21.113c25.592-27.611 68.721-29.247 96.331-3.656s29.247 68.721 3.656 96.331L224.088 443.784h730.46c37.647 0 68.166 30.519 68.166 68.166s-30.519 68.166-68.166 68.166z'/></svg>\");\r\n}\r\n.p-datepicker-header button {\r\n margin: 0;\r\n padding: 0 5px;\r\n border: 0;\r\n border-color: var(--white);\r\n outline: none;\r\n background: transparent;\r\n color: var(--body-text);\r\n font-size: 16px;\r\n font-weight: 500;\r\n line-height: 20px;\r\n}\r\n.p-datepicker-header button .p-icon {\r\n display: none;\r\n}\r\n.p-datepicker .p-datepicker-next {\r\n transform: rotate(180deg);\r\n}\r\n.p-datepicker .p-datepicker-header button {\r\n border: 0;\r\n border-color: var(--white);\r\n outline: none;\r\n box-shadow: none !important;\r\n background: transparent;\r\n color: var(--body-text);\r\n font-size: 16px;\r\n font-weight: 500;\r\n line-height: 20px;\r\n}\r\n.p-datepicker .p-datepicker-calendar-container th {\r\n padding: 10px 0;\r\n color: var(--body-text);\r\n font-size: 14px;\r\n font-weight: 400;\r\n line-height: 1.4;\r\n}\r\n.p-datepicker .p-datepicker-calendar-container td {\r\n padding: 0;\r\n}\r\n.p-datepicker .p-datepicker-calendar-container td span {\r\n padding: 10px 0;\r\n border-radius: 0;\r\n font-size: 14px;\r\n width: 45px;\r\n height: 45px;\r\n}\r\n.p-datepicker-group-container .p-datepicker-group:not(:last-child) {\r\n border-inline-end: 1px solid var(--form-border);\r\n padding-inline-end: 10px;\r\n margin-inline-end: 10px;\r\n}\r\n.p-datepicker-other-month span{\r\n opacity: 0;\r\n}\r\n.p-datepicker .p-highlight {\r\n position: relative;\r\n background: var(--primary) !important;\r\n color: var(--white) !important;\r\n}\r\n.sw-product-tabs {\r\n position: relative;\r\n z-index: 1;\r\n}\r\n.sw-product-tabs .p-tabview-nav {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 10px;\r\n margin: 0;\r\n padding: 0;\r\n list-style: none;\r\n}\r\n.sw-product-tabs .sw-product-list {\r\n position: relative;\r\n gap: 10px;\r\n padding: 0 10px 10px;\r\n border: 0 !important;\r\n border-radius: 0;\r\n cursor: pointer;\r\n}\r\n.p-tabview-selected .sw-product-list:before {\r\n content: \"\";\r\n position: absolute;\r\n bottom: 0;\r\n left: 0;\r\n inset-inline-start: 0;\r\n width: 100%;\r\n border: 2px solid var(--primary) !important;\r\n border-radius: 40px;\r\n}\r\n.p-tabview-ink-bar {\r\n display: none;\r\n}\r\n.sw-advanced-search-options .p-accordion-header-link {\r\n display: flex;\r\n flex-direction: row-reverse;\r\n gap: 10px;\r\n width: fit-content;\r\n margin-top: 15px;\r\n color: var(--body-text);\r\n font-size: 14px;\r\n}\r\n.sw-advanced-search-options .p-toggleable-content {\r\n margin-top: 20px;\r\n}\r\n.sw-advanced-search-options .p-accordion-content .sw-hsrh-advan-cont:not(:last-child) {\r\n margin-bottom: 16px;\r\n}\r\n.sw-advanced-search-options .p-accordion-header-link svg {\r\n transform: rotate(90deg);\r\n}\r\n.sw-advanced-search-options .p-accordion-header-link[aria-expanded=\"true\"] svg {\r\n transform: scale(-1);\r\n}\r\n.sw-material-checkbox {\r\n position: relative;\r\n display: inline-flex;\r\n gap: 10px;\r\n cursor: pointer;\r\n user-select: none;\r\n color: var(--body-text);\r\n font-size: 14px;\r\n}\r\n.sw-material-checkbox input {\r\n display: none;\r\n}\r\n.sw-material-checkbox input:checked + .sw-checkmark {\r\n background-color: var(--primary);\r\n border-color: var(--primary);\r\n}\r\n.sw-material-checkbox input:checked + .sw-checkmark::after {\r\n content: \"\";\r\n position: absolute;\r\n top: 2px;\r\n left: 6px;\r\n display: block;\r\n width: 6px;\r\n height: 11px;\r\n border: solid #fff;\r\n border-width: 0 2px 2px 0;\r\n transform: rotate(45deg);\r\n}\r\n.sw-material-checkbox .sw-checkmark {\r\n position: relative;\r\n display: inline-block;\r\n width: 20px;\r\n min-width: 20px;\r\n height: 20px;\r\n background-color: #fff;\r\n border: 1px solid var(--form-border);\r\n border-radius: 4px;\r\n transition: background-color 0.3s, border-color 0.3s;\r\n}\r\n.sw-material-checkbox .sw-checkmark::after {\r\n content: \"\";\r\n position: absolute;\r\n display: none;\r\n}\r\n.sw-tab-checkbox {\r\n display: flex;\r\n cursor: pointer;\r\n -webkit-user-select: none;\r\n user-select: none;\r\n}\r\n.sw-tab-checkbox input {\r\n display: none;\r\n}\r\n.sw-tab-checkbox input:checked + .sw-tab-content,\r\n.sw-tab-checkbox input[type=radio]:checked + .sw-tab-content {\r\n border: 1px solid var(--primary);\r\n background-color: var(--primary-light);\r\n color: var(--primary);\r\n}\r\n.sw-tab-content {\r\n height: 40px;\r\n padding: 6px 15px;\r\n border: 1px solid var(--form-border);\r\n border-radius: var(--radius);\r\n align-content: center;\r\n}\r\n@media print {\r\n .sw-container {\r\n display: none;\r\n }\r\n}\r\n.sw-dropdown,\r\n.sw-rooms-guests-menu,\r\n.p-calendar .p-datepicker {\r\n will-change: transform, opacity;\r\n transform: translateZ(0);\r\n}\r\n.sw-dropdown {\r\n -webkit-overflow-scrolling: touch;\r\n scroll-behavior: smooth;\r\n}\r\n.sw-container img {\r\n max-width: 100%;\r\n height: auto;\r\n}\r\n.sw-container svg {\r\n max-width: 100%;\r\n height: auto;\r\n}\r\n.sw-container {\r\n isolation: isolate;\r\n}\r\n.sw-srh-grid {\r\n display: grid;\r\n grid-template-columns: minmax(200px, 2fr) minmax(100px, 1fr) minmax(80px, 0.6fr) minmax(60px, 0.4fr);\r\n gap: var(--grid-gap-sm, 2px);\r\n margin-top: 15px;\r\n border-radius: var(--radius);\r\n min-width: 0; \r\n overflow: visible; \r\n}\r\n.sw-srh-wrap .sw-form-field {\r\n flex: 1 1 50%; \r\n min-width: 0; \r\n justify-content: center;\r\n}\r\n.sw-add-return-label label {\r\n color: var(--primary) !important;\r\n}\r\n.sw-srh-main-head {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n margin-bottom: 15px;\r\n}\r\n.sw-srh-head {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n}\r\n.sw-srh-round-text {\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n height: 40px;\r\n}\r\n.sw-remove-segment{\r\n fill: var(--primary);\r\n cursor: pointer;\r\n display: grid;\r\n place-content: center;\r\n position: absolute;\r\n z-index: 2;\r\n border-radius: 50%;\r\n inset-inline-end: 12px;\r\n border: 1px solid var(--primary);\r\n width: 22px;\r\n height: 22px;\r\n top: 19px;\r\n svg{\r\n width: 22px;\r\n height: 22px;\r\n }\r\n}\r\n.sw-srh-mc .sw-srh-wrap.sw-srh-box{\r\n position: relative;\r\n}\r\n.sw-srh-mc {\r\n grid-template-columns: 6.3fr 2.5fr 1.15fr !important;\r\n min-width: 0; \r\n}\r\n.sw-srh-mc .sw-com-cal .p-inputtext{\r\n visibility: visible !important;\r\n height: auto !important;\r\n width: auto !important;\r\n}\r\n.sw-srh-mc .sw-srh-wrap.sw-pos-rel:nth-child(3){\r\n flex-basis: 30%;\r\n}\r\n.sw-srh-mc .sw-srh-mc-foot {\r\n display: flex;\r\n align-items: flex-end;\r\n width: fit-content;\r\n grid-column-start: 2;\r\n}\r\n.sw-srh-mc .sw-srh-mc-foot button {\r\n display: flex;\r\n align-items: center;\r\n gap: 7px;\r\n margin-inline-start: 5px;\r\n padding: 8px 10px;\r\n border: 1px solid var(--primary);\r\n border-radius: 30px;\r\n background-color: transparent;\r\n color: var(--primary);\r\n font-size: 14px;\r\n}\r\n.sw-srh-mc .sw-srh-mc-foot button svg {\r\n fill: var(--primary);\r\n}\r\n.sw-srh-mc .sw-srh-add-btn {\r\n display: flex;\r\n align-items: center;\r\n gap: 7px;\r\n margin-inline-start: 5px;\r\n padding: 0.8rem 1rem;\r\n border-radius: 30px;\r\n color: var(--primary);\r\n font-size: 1.4rem;\r\n}\r\n.sw-srh-mc .sw-traveller {\r\n grid-row-start: 1;\r\n grid-column-start: 2;\r\n}\r\n.sw-srh-mc button {\r\n grid-row-start: 1;\r\n grid-column-start: 3;\r\n}\r\n.sw-srh-box {\r\n grid-column-start: 1;\r\n}\r\n.p-autocomplete-multiple-container {\r\n width: 100%;\r\n min-width: 270px;\r\n padding: 10px;\r\n padding-inline-end: 2rem;\r\n border: 1px solid var(--form-border);\r\n border-radius: var(--radius);\r\n gap: 0.5rem;\r\n font-size: 14px;\r\n}\r\n.p-autocomplete-multiple-container .p-autocomplete-token {\r\n padding: 5px 8px;\r\n border-radius: 5px;\r\n background: var(--primary-light);\r\n gap: 5px;\r\n color: var(--primary);\r\n}\r\n.p-autocomplete-token .p-autocomplete-token-label{\r\n font-size: 12px;\r\n font-weight: 400;\r\n}\r\n.sw-fsrh-adv-cont {\r\n display: flex;\r\n align-items: center;\r\n gap: 20px;\r\n}\r\n.sw-fsrh-chk-main {\r\n display: flex;\r\n gap: 20px;\r\n font-size: 1.4rem;\r\n font-weight: 400;\r\n}\r\n.sw-srh-pax {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n}\r\n.sw-srh-pax:not(:last-child) {\r\n margin-bottom: 15px;\r\n}\r\n.sw-srh-common-adult {\r\n width: 92px;\r\n}\r\n.sw-srh-pax h3 {\r\n font-size: 14px;\r\n}\r\n.sw-srh-pax p {\r\n color: var(--label-color);\r\n font-size: 12px;\r\n}\r\n.sw-srh-button-wrapper button {\r\n width: 32px;\r\n height: 30px;\r\n margin: 0;\r\n padding: 0;\r\n border: 0;\r\n border-radius: 8px;\r\n background-color: transparent;\r\n font-size: 14px;\r\n font-weight: 400;\r\n}\r\n.sw-srh-button-wrapper button.sw-active-button {\r\n background-color: var(--secondary);\r\n color: var(--white);\r\n}\r\n.sw-traveller .sw-rooms-guests-menu {\r\n width: 460px;\r\n}\r\n.sw-srh-class {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: var(--flex-gap-md, 10px);\r\n align-items: stretch; \r\n}\r\n.sw-srh-class .sw-tab-content {\r\n min-width: fit-content; \r\n display: block;\r\n}\r\n.sw-srh-class label {\r\n width: fit-content !important;\r\n}\r\n.sw-srh-class .sw-tab-checkbox input:checked + .sw-tab-content,\r\n.sw-srh-class .sw-tab-checkbox input[type=radio]:checked + .sw-tab-content {\r\n background-color: var(--primary);\r\n color: var(--white);\r\n}\r\n.sw-srh-h-grid {\r\n position: relative;\r\n display: grid;\r\n grid-template-columns: 2.2fr 1.8fr 3fr 1.8fr 1.15fr;\r\n gap: var(--grid-gap-sm, 2px);\r\n min-height: 55px;\r\n min-width: 0; \r\n overflow: visible; \r\n border-radius: var(--radius);\r\n}\r\n.sw-srh-loc {\r\n display: block !important;\r\n padding: 15px 0 12px;\r\n border-bottom: 1px solid var(--form-border);\r\n}\r\n.sw-srh-count-wrapper,\r\n.sw-srh-loc {\r\n display: flex;\r\n align-items: center;\r\n gap: 15px;\r\n margin: 0 20px;\r\n cursor: pointer;\r\n}\r\n.sw-hotel-search-form-icon {\r\n display: grid;\r\n place-content: center;\r\n width: 40px;\r\n height: 40px;\r\n background: #f4f5f5;\r\n border-radius: var(--radius);\r\n}\r\n.sw-hotel-search-form-icon.sw-fill {\r\n background: var(--primary-light);\r\n}\r\n.sw-hsrh-advan-cont {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n}\r\n.sw-checkbox-wrap {\r\n cursor: pointer;\r\n}\r\n.sw-checkbox-wrap input {\r\n display: none;\r\n}\r\n.sw-checkbox-wrap input:checked + .sw-star-checkbox {\r\n padding: 8px 12px;\r\n border: 1px solid var(--primary-light);\r\n border-radius: 20px;\r\n background: var(--primary-light);\r\n gap: 5px;\r\n color: var(--primary);\r\n font-size: 14px;\r\n line-height: 1;\r\n}\r\n.sw-checkbox-wrap .sw-star-checkbox {\r\n display: flex;\r\n align-items: center;\r\n gap: 5px;\r\n padding: 8px 12px;\r\n border: 1px solid var(--form-border);\r\n border-radius: 20px;\r\n font-size: 14px;\r\n line-height: 1;\r\n}\r\n.sw-star-checkbox-wrap input:checked + .sw-star-checkbox {\r\n padding: 7px 12px;\r\n border: 1px solid #fcf2e8;\r\n border-radius: 20px;\r\n background: #fcf2e8;\r\n color: #ffae43;\r\n}\r\n.sw-star-checkbox-wrap input:checked + .sw-star-checkbox svg path {\r\n fill: #ffae43;\r\n}\r\n.sw-hsrh-chk-main {\r\n display: flex;\r\n gap: var(--flex-gap-md, 10px);\r\n font-size: 1.4rem;\r\n font-weight: 400;\r\n flex-wrap: wrap; \r\n}\r\n.sw-srh-class {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: var(--flex-gap-md, 10px);\r\n align-items: stretch; \r\n}\r\n.sw-srh-class .sw-tab-content {\r\n flex: 0 1 auto; \r\n min-width: fit-content; \r\n}\r\n`;\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,mBAA4E;AAC5E,sBAAyB;AACzB,uBAAwC;AACxC,0BAA6B;AAC7B,iBAAmC;AACnC,uBAA0B;;;ACPnB,IAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":[]}
@@ -0,0 +1,65 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ /** Airport from search API - matches response: ac, an, cc, cn, ct, etc. */
4
+ interface AirportModel {
5
+ id?: string;
6
+ /** Airport code e.g. "DUB" */
7
+ ac?: string;
8
+ /** Airport name e.g. "Dublin Airport" */
9
+ an?: string;
10
+ /** Country code e.g. "IE" */
11
+ cc?: string;
12
+ /** Country name e.g. "Ireland" */
13
+ cn?: string;
14
+ /** City e.g. "Dublin" */
15
+ ct?: string;
16
+ pr?: number;
17
+ tp?: number;
18
+ [key: string]: unknown;
19
+ }
20
+ interface FlightSearchSsoUser {
21
+ /** Mandatory: user email */
22
+ email: string;
23
+ /** Optional: first name */
24
+ firstName?: string;
25
+ /** Optional: last name */
26
+ lastName?: string;
27
+ /** Optional: country code / dialing code */
28
+ cc?: string;
29
+ /** Optional: phone number without country code */
30
+ phone?: string;
31
+ /** Optional: timestamp – if omitted, widget will inject current time */
32
+ ts?: string;
33
+ }
34
+ type FlightSearchWidgetProps = {
35
+ config?: {
36
+ theme?: {
37
+ primary?: string;
38
+ secondary?: string;
39
+ primaryLight?: string;
40
+ };
41
+ redirectionDomain?: string;
42
+ fontName?: string;
43
+ };
44
+ ssoUser?: FlightSearchSsoUser;
45
+ };
46
+ /** Single segment in the flight search form (round-trip, one-way, or one leg of multi-city) */
47
+ interface FlightSearchSegment {
48
+ origin: string;
49
+ destination: string;
50
+ departureDate: Date | null;
51
+ returnDate: Date | null;
52
+ dateRange: (Date | null)[] | null;
53
+ travelerClass: string;
54
+ adultCount: number;
55
+ childCount: number;
56
+ infantCount: number;
57
+ }
58
+ /** Main form state: array of segments; works for round-trip, one-way, multi-city, custom-search */
59
+ interface FlightSearchFormState {
60
+ tripType: "round-trip" | "one-way" | "multi-city" | "custom-search";
61
+ segments: FlightSearchSegment[];
62
+ }
63
+ declare function FlightSearchWidget({ config, ssoUser, }: FlightSearchWidgetProps): react_jsx_runtime.JSX.Element;
64
+
65
+ export { type AirportModel, type FlightSearchFormState, type FlightSearchSegment, type FlightSearchSsoUser, FlightSearchWidget, type FlightSearchWidgetProps };
@@ -0,0 +1,65 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ /** Airport from search API - matches response: ac, an, cc, cn, ct, etc. */
4
+ interface AirportModel {
5
+ id?: string;
6
+ /** Airport code e.g. "DUB" */
7
+ ac?: string;
8
+ /** Airport name e.g. "Dublin Airport" */
9
+ an?: string;
10
+ /** Country code e.g. "IE" */
11
+ cc?: string;
12
+ /** Country name e.g. "Ireland" */
13
+ cn?: string;
14
+ /** City e.g. "Dublin" */
15
+ ct?: string;
16
+ pr?: number;
17
+ tp?: number;
18
+ [key: string]: unknown;
19
+ }
20
+ interface FlightSearchSsoUser {
21
+ /** Mandatory: user email */
22
+ email: string;
23
+ /** Optional: first name */
24
+ firstName?: string;
25
+ /** Optional: last name */
26
+ lastName?: string;
27
+ /** Optional: country code / dialing code */
28
+ cc?: string;
29
+ /** Optional: phone number without country code */
30
+ phone?: string;
31
+ /** Optional: timestamp – if omitted, widget will inject current time */
32
+ ts?: string;
33
+ }
34
+ type FlightSearchWidgetProps = {
35
+ config?: {
36
+ theme?: {
37
+ primary?: string;
38
+ secondary?: string;
39
+ primaryLight?: string;
40
+ };
41
+ redirectionDomain?: string;
42
+ fontName?: string;
43
+ };
44
+ ssoUser?: FlightSearchSsoUser;
45
+ };
46
+ /** Single segment in the flight search form (round-trip, one-way, or one leg of multi-city) */
47
+ interface FlightSearchSegment {
48
+ origin: string;
49
+ destination: string;
50
+ departureDate: Date | null;
51
+ returnDate: Date | null;
52
+ dateRange: (Date | null)[] | null;
53
+ travelerClass: string;
54
+ adultCount: number;
55
+ childCount: number;
56
+ infantCount: number;
57
+ }
58
+ /** Main form state: array of segments; works for round-trip, one-way, multi-city, custom-search */
59
+ interface FlightSearchFormState {
60
+ tripType: "round-trip" | "one-way" | "multi-city" | "custom-search";
61
+ segments: FlightSearchSegment[];
62
+ }
63
+ declare function FlightSearchWidget({ config, ssoUser, }: FlightSearchWidgetProps): react_jsx_runtime.JSX.Element;
64
+
65
+ export { type AirportModel, type FlightSearchFormState, type FlightSearchSegment, type FlightSearchSsoUser, FlightSearchWidget, type FlightSearchWidgetProps };