@tfehotels/tfe-gatsby-library 1.0.78 → 1.0.79
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.browser.cjs","sources":["../src/browser/utils/animation.ts","../src/browser/utils/viewport.ts","../src/browser/utils/forms.ts","../src/browser/utils/image.ts","../src/browser/utils/location.ts","../src/browser/api/icon/index.tsx","../src/browser/toast/index.tsx","../src/browser/utils/notifications.tsx","../src/browser/utils/url.ts","../src/browser/markdown/index.tsx","../src/browser/api/checkbox/index.tsx","../src/browser/api/country-prefix/index.tsx","../node_modules/@babel/runtime/helpers/esm/extends.js","../src/browser/api/google-places/index.tsx","../src/browser/api/link/index.tsx","../src/browser/api/image/index.tsx","../src/browser/api/input/index.tsx","../src/browser/api/linklist/index.tsx","../src/browser/api/select/index.tsx","../src/browser/api/svg/index.tsx","../src/browser/api/text/index.tsx","../src/browser/api/textarea/index.tsx","../src/browser/api/title/index.tsx","../src/browser/api/button/index.tsx","../src/browser/carousel/buttons/index.tsx","../src/browser/carousel/dots/index.tsx","../src/browser/carousel/index.tsx","../src/browser/gatsby_link/index.tsx","../src/browser/modal/index.tsx","../src/browser/spinner/index.tsx","../src/browser/api/form/index.tsx","../src/browser/api/country/index.tsx","../src/browser/use_intersection_observer/index.ts","../src/browser/utils/booking_engine.ts","../src/browser/utils/search.ts","../src/browser/utils/eclub.ts","../src/browser/utils/number.ts","../src/browser/utils/hotel.ts","../src/browser/utils/requests.ts","../src/browser/utils/string.ts","../src/browser/use_viewport/index.tsx"],"sourcesContent":["import { Stage } from \"react-transition-hook\";\n\nexport const animateJSX = (\n transition: {\n stage: Stage;\n shouldMount: boolean;\n },\n animation: string = \"presence\"\n): string =>\n `jsx__${animation} jsx__${animation}__${\n [\"from\", \"leave\"].includes(transition.stage) ? \"loading\" : \"loaded\"\n }`;\n","import ClassNames from \"classnames\";\n\nexport const isMobile = (width: number) => width < 769;\nexport const isTablet = (width: number) => width >= 769 && width < 1024;\nexport const isDesktop = (width: number) => width >= 1024;\n\nexport const getViewPort = () => {\n if (typeof window === \"undefined\") {\n throw new Error(\"getViewPort() requires browser window!\");\n }\n if (isMobile(window.innerWidth)) {\n return \"m\";\n }\n if (isTablet(window.innerWidth)) {\n return \"t\";\n }\n return \"d\";\n};\n\nexport const scrollToElement = async (elementId: string) => {\n document.getElementById(elementId)?.scrollIntoView({ behavior: \"smooth\" });\n};\n\nexport const scrollToChild = (parent: HTMLElement, child: HTMLElement) => {\n const initialDisplayValue = parent.style.display;\n // HACK: can't use getBoundingClientRect when display is 'none'\n if (initialDisplayValue !== \"block\") {\n parent.style.display = \"block\";\n }\n\n // can't use scrollIntoView because of scroll event bubbling\n const parentPosition = parent.getBoundingClientRect();\n const childPosition = child.getBoundingClientRect();\n\n const topOffset = childPosition.top - parentPosition.top;\n const bottomOffset = parentPosition.bottom - childPosition.bottom;\n\n const isChildVisible = topOffset >= 0 && bottomOffset >= 0;\n\n if (!isChildVisible) {\n if (Math.abs(topOffset) < Math.abs(bottomOffset)) {\n // element above the container\n parent.scrollTop += topOffset;\n } else {\n // element below the container\n parent.scrollTop -= bottomOffset;\n }\n }\n\n parent.style.display = initialDisplayValue;\n};\n\nexport const isIOS = () => /iPad|iPhone|iPod/.test(navigator.userAgent);\n\n// Returns the device ID depending on the viewport width (d: Desktop, t: Tablet, m: Mobile)\nexport const deviceId = (width: number) =>\n width > 1023 ? \"d\" : width > 768 ? \"t\" : \"m\";\n\nconst HideOnDevice = (devices: Array<string>, device: string): boolean =>\n device ? !!devices.length && !devices.includes(device) : !devices.length;\n\nexport const classNames = (\n classes: { [k: string]: boolean },\n displayOn: Array<string> | null = null\n): any => {\n if (displayOn) {\n classes.hidden = HideOnDevice(displayOn, \"\");\n classes.hidden_mobile = HideOnDevice(displayOn, \"m\");\n classes.hidden_tablet = HideOnDevice(displayOn, \"t\");\n classes.hidden_desktop = HideOnDevice(displayOn, \"d\");\n }\n return ClassNames(classes);\n};\n","export interface RequestParamsType {\n [param: string]: string | number | null;\n}\nexport interface HeadersType {\n [param: string]: string;\n}\n\nexport interface APIResponseType {\n success?: boolean;\n errors?: { [input: string]: string[] };\n error?: string;\n msg?: string;\n status: number;\n [k: string]: any;\n}\nexport const json_request = async (\n url: string,\n params: RequestParamsType,\n method: \"get\" | \"post\" = \"post\",\n headers: HeadersType = {}\n): Promise<APIResponseType> => {\n if (url.includes(process.env.API_HOST as string)) {\n headers[\"project-id\"] = process.env.PROJECT as string;\n }\n let config: any = {\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n method: method.toUpperCase(),\n };\n if (method === \"post\") {\n config.body = JSON.stringify(params);\n } else {\n url = `${url}?${new URLSearchParams(\n Object.entries(params).map(([k, v]) => [k, v === null ? \"\" : `${v}`])\n )}`;\n }\n try {\n let response = await fetch(url, config);\n return { ...(await response.json()), status: response.status };\n } catch (error) {\n console.error(error);\n return { success: false, error: \"Request failed\", status: 400 };\n }\n};\n\nconst INPUT_EVENT_VALUES: any = {\n select: (e: any) => e.value,\n input: (e: any) => e.target.value,\n textarea: (e: any) => e.target.value,\n \"google-places\": (e: any) => e.target.value,\n};\n\nexport const getInputEventValue = (inputType: string, event: any) =>\n INPUT_EVENT_VALUES.hasOwnProperty(inputType)\n ? INPUT_EVENT_VALUES[inputType](event)\n : event;\n\nconst INPUT_HUMAN_VALUES: any = {};\n\nexport const getInputHumanValue = (inputType: string, value: any) =>\n INPUT_HUMAN_VALUES.hasOwnProperty(inputType)\n ? INPUT_HUMAN_VALUES[inputType](value)\n : value;\n\nexport const INPUT_FIELDS = new Set([\n \"input\",\n \"select\",\n \"textarea\",\n \"checkbox\",\n \"button\",\n \"recaptcha2\",\n \"google-places\",\n \"country-prefix\",\n \"country\",\n \"hidden\",\n]);\n","import { ImageMediaType, ImageType } from \"../api/types\";\nimport { isMobile } from \"./viewport\";\n\nexport const preloadImages = async (images: string[]) => {\n images.forEach((url: string) => {\n if (url) {\n const img = new Image();\n img.src = url;\n }\n });\n};\n\nexport const optimizedThumb = (img: ImageType): string =>\n img.optimized ? `${img.url}${img.name}-20w.webp` : img.url;\n\n// Extract the Thumb image from the provided Image (if any)\nexport const getThumb = (img: {\n image?: ImageType;\n mobile_image?: ImageType;\n}): string => {\n if (img.image || img.mobile_image) {\n return typeof window !== \"undefined\" && isMobile(window.innerWidth)\n ? img.mobile_image\n ? optimizedThumb(img.mobile_image) // @ts-ignore\n : optimizedThumb(img.image)\n : img.image\n ? optimizedThumb(img.image) // @ts-ignore\n : optimizedThumb(img.mobile_image);\n }\n return \"\";\n};\n\n// Creates a valid image element\nexport const toImageElement = (obj: any, keyMap: any = {}): ImageMediaType => {\n return Object.entries(obj).reduce(\n (acc: any, [key, value]: any) => {\n acc[keyMap[key] || key] = value;\n return acc;\n },\n {\n type: \"image\",\n title: \"\",\n loading: \"eager\",\n image: undefined,\n mobile_image: undefined,\n mobile_file: undefined,\n }\n );\n};\n\n// Slick breaks when his number or slides is equal or less than the param \"slidesToShow\"\n// Therefore we duplicate the slides in case of not having enough of them:\nexport const minimumSlides = (slidesToShow: number, slides: any[]) =>\n slides.length >= slidesToShow\n ? slides\n : [].concat(\n ...new Array(Math.ceil(slidesToShow / slides.length)).fill(slides)\n );\n\n// Gets an image URL out of a ImageMediaType\nexport const imageUrl = (\n img: ImageType,\n format = \"webp\",\n sizes = [1408, 1216, 1024, 769]\n): string =>\n img.optimized\n ? `${img.url}${img.name}-${\n sizes.find((w) => w <= img.width) || img.width\n }w.${format}`\n : img.url;\n","export const countryPrefixes = [\n [\"AF\", \"93\", \"Afghanistan\"],\n [\"AL\", \"355\", \"Albania\"],\n [\"DZ\", \"213\", \"Algeria\"],\n [\"AD\", \"376\", \"Andorra\"],\n [\"AO\", \"244\", \"Angola\"],\n [\"AG\", \"1268\", \"Antigua and Barbuda\"],\n [\"AR\", \"54\", \"Argentina\"],\n [\"AM\", \"374\", \"Armenia\"],\n [\"AW\", \"297\", \"Aruba\"],\n [\"AU\", \"61\", \"Australia\"],\n [\"AT\", \"43\", \"Austria\"],\n [\"AZ\", \"994\", \"Azerbaijan\"],\n [\"BS\", \"1242\", \"Bahamas\"],\n [\"BH\", \"973\", \"Bahrain\"],\n [\"BD\", \"880\", \"Bangladesh\"],\n [\"BB\", \"1246\", \"Barbados\"],\n [\"BY\", \"375\", \"Belarus\"],\n [\"BE\", \"32\", \"Belgium\"],\n [\"BZ\", \"501\", \"Belize\"],\n [\"BJ\", \"229\", \"Benin\"],\n [\"BT\", \"975\", \"Bhutan\"],\n [\"BO\", \"591\", \"Bolivia\"],\n [\"BA\", \"387\", \"Bosnia and Herzegovina\"],\n [\"BW\", \"267\", \"Botswana\"],\n [\"BR\", \"55\", \"Brazil\"],\n [\"IO\", \"246\", \"British Indian Ocean Territory\"],\n [\"BN\", \"673\", \"Brunei\"],\n [\"BG\", \"359\", \"Bulgaria\"],\n [\"BF\", \"226\", \"Burkina Faso\"],\n [\"BI\", \"257\", \"Burundi\"],\n [\"KH\", \"855\", \"Cambodia\"],\n [\"CM\", \"237\", \"Cameroon\"],\n [\"CA\", \"1\", \"Canada\"],\n [\"CV\", \"238\", \"Cape Verde\"],\n [\"BQ\", \"599\", \"Caribbean Netherlands\"],\n [\"CF\", \"236\", \"Central African Republic\"],\n [\"TD\", \"235\", \"Chad\"],\n [\"CL\", \"56\", \"Chile\"],\n [\"CN\", \"86\", \"China\"],\n [\"CO\", \"57\", \"Colombia\"],\n [\"KM\", \"269\", \"Comoros\"],\n [\"CD\", \"243\", \"Congo\"],\n [\"CG\", \"242\", \"Congo\"],\n [\"CR\", \"506\", \"Costa Rica\"],\n [\"CI\", \"225\", \"Côte d'Ivoire\"],\n [\"HR\", \"385\", \"Croatia\"],\n [\"CU\", \"53\", \"Cuba\"],\n [\"CW\", \"599\", \"Curaçao\"],\n [\"CY\", \"357\", \"Cyprus\"],\n [\"CZ\", \"420\", \"Czech Republic\"],\n [\"DK\", \"45\", \"Denmark\"],\n [\"DJ\", \"253\", \"Djibouti\"],\n [\"DM\", \"1767\", \"Dominica\"],\n [\"DO\", \"1\", \"Dominican Republic\"],\n [\"EC\", \"593\", \"Ecuador\"],\n [\"EG\", \"20\", \"Egypt\"],\n [\"SV\", \"503\", \"El Salvador\"],\n [\"GQ\", \"240\", \"Equatorial Guinea\"],\n [\"ER\", \"291\", \"Eritrea\"],\n [\"EE\", \"372\", \"Estonia\"],\n [\"ET\", \"251\", \"Ethiopia\"],\n [\"FJ\", \"679\", \"Fiji\"],\n [\"FI\", \"358\", \"Finland\"],\n [\"FR\", \"33\", \"France\"],\n [\"GF\", \"594\", \"French Guiana\"],\n [\"PF\", \"689\", \"French Polynesia\"],\n [\"GA\", \"241\", \"Gabon\"],\n [\"GM\", \"220\", \"Gambia\"],\n [\"GE\", \"995\", \"Georgia\"],\n [\"DE\", \"49\", \"Germany\"],\n [\"GH\", \"233\", \"Ghana\"],\n [\"GR\", \"30\", \"Greece\"],\n [\"GD\", \"1473\", \"Grenada\"],\n [\"GP\", \"590\", \"Guadeloupe\"],\n [\"GU\", \"1671\", \"Guam\"],\n [\"GT\", \"502\", \"Guatemala\"],\n [\"GN\", \"224\", \"Guinea\"],\n [\"GW\", \"245\", \"Guinea-Bissau\"],\n [\"GY\", \"592\", \"Guyana\"],\n [\"HT\", \"509\", \"Haiti\"],\n [\"HN\", \"504\", \"Honduras\"],\n [\"HK\", \"852\", \"Hong Kong\"],\n [\"HU\", \"36\", \"Hungary\"],\n [\"IS\", \"354\", \"Iceland\"],\n [\"IN\", \"91\", \"India\"],\n [\"ID\", \"62\", \"Indonesia\"],\n [\"IR\", \"98\", \"Iran\"],\n [\"IQ\", \"964\", \"Iraq\"],\n [\"IE\", \"353\", \"Ireland\"],\n [\"IL\", \"972\", \"Israel\"],\n [\"IT\", \"39\", \"Italy\"],\n [\"JM\", \"1876\", \"Jamaica\"],\n [\"JP\", \"81\", \"Japan\"],\n [\"JO\", \"962\", \"Jordan\"],\n [\"KZ\", \"7\", \"Kazakhstan\"],\n [\"KE\", \"254\", \"Kenya\"],\n [\"KI\", \"686\", \"Kiribati\"],\n [\"XK\", \"383\", \"Kosovo\"],\n [\"KW\", \"965\", \"Kuwait\"],\n [\"KG\", \"996\", \"Kyrgyzstan\"],\n [\"LA\", \"856\", \"Laos\"],\n [\"LV\", \"371\", \"Latvia\"],\n [\"LB\", \"961\", \"Lebanon\"],\n [\"LS\", \"266\", \"Lesotho\"],\n [\"LR\", \"231\", \"Liberia\"],\n [\"LY\", \"218\", \"Libya\"],\n [\"LI\", \"423\", \"Liechtenstein\"],\n [\"LT\", \"370\", \"Lithuania\"],\n [\"LU\", \"352\", \"Luxembourg\"],\n [\"MO\", \"853\", \"Macau\"],\n [\"MK\", \"389\", \"Macedonia\"],\n [\"MG\", \"261\", \"Madagascar\"],\n [\"MW\", \"265\", \"Malawi\"],\n [\"MY\", \"60\", \"Malaysia\"],\n [\"MV\", \"960\", \"Maldives\"],\n [\"ML\", \"223\", \"Mali\"],\n [\"MT\", \"356\", \"Malta\"],\n [\"MH\", \"692\", \"Marshall Islands\"],\n [\"MQ\", \"596\", \"Martinique\"],\n [\"MR\", \"222\", \"Mauritania\"],\n [\"MU\", \"230\", \"Mauritius\"],\n [\"MX\", \"52\", \"Mexico\"],\n [\"FM\", \"691\", \"Micronesia\"],\n [\"MD\", \"373\", \"Moldova\"],\n [\"MC\", \"377\", \"Monaco\"],\n [\"MN\", \"976\", \"Mongolia\"],\n [\"ME\", \"382\", \"Montenegro\"],\n [\"MA\", \"212\", \"Morocco\"],\n [\"MZ\", \"258\", \"Mozambique\"],\n [\"MM\", \"95\", \"Myanmar\"],\n [\"NA\", \"264\", \"Namibia\"],\n [\"NR\", \"674\", \"Nauru\"],\n [\"NP\", \"977\", \"Nepal\"],\n [\"NL\", \"31\", \"Netherlands\"],\n [\"NC\", \"687\", \"New Caledonia\"],\n [\"NZ\", \"64\", \"New Zealand\"],\n [\"NI\", \"505\", \"Nicaragua\"],\n [\"NE\", \"227\", \"Niger\"],\n [\"NG\", \"234\", \"Nigeria\"],\n [\"KP\", \"850\", \"North Korea\"],\n [\"NO\", \"47\", \"Norway\"],\n [\"OM\", \"968\", \"Oman\"],\n [\"PK\", \"92\", \"Pakistan\"],\n [\"PW\", \"680\", \"Palau\"],\n [\"PS\", \"970\", \"Palestine\"],\n [\"PA\", \"507\", \"Panama\"],\n [\"PG\", \"675\", \"Papua New Guinea\"],\n [\"PY\", \"595\", \"Paraguay\"],\n [\"PE\", \"51\", \"Peru\"],\n [\"PH\", \"63\", \"Philippines\"],\n [\"PL\", \"48\", \"Poland\"],\n [\"PT\", \"351\", \"Portugal\"],\n [\"PR\", \"1\", \"Puerto Rico\"],\n [\"QA\", \"974\", \"Qatar\"],\n [\"RE\", \"262\", \"Réunion\"],\n [\"RO\", \"40\", \"Romania\"],\n [\"RU\", \"7\", \"Russia\"],\n [\"RW\", \"250\", \"Rwanda\"],\n [\"KN\", \"1869\", \"Saint Kitts and Nevis\"],\n [\"LC\", \"1758\", \"Saint Lucia\"],\n [\"VC\", \"1784\", \"Saint Vincent and the Grenadines\"],\n [\"WS\", \"685\", \"Samoa\"],\n [\"SM\", \"378\", \"San Marino\"],\n [\"ST\", \"239\", \"São Tomé and Príncipe\"],\n [\"SA\", \"966\", \"Saudi Arabia\"],\n [\"SN\", \"221\", \"Senegal\"],\n [\"RS\", \"381\", \"Serbia\"],\n [\"SC\", \"248\", \"Seychelles\"],\n [\"SL\", \"232\", \"Sierra Leone\"],\n [\"SG\", \"65\", \"Singapore\"],\n [\"SK\", \"421\", \"Slovakia\"],\n [\"SI\", \"386\", \"Slovenia\"],\n [\"SB\", \"677\", \"Solomon Islands\"],\n [\"SO\", \"252\", \"Somalia\"],\n [\"ZA\", \"27\", \"South Africa\"],\n [\"KR\", \"82\", \"South Korea\"],\n [\"SS\", \"211\", \"South Sudan\"],\n [\"ES\", \"34\", \"Spain\"],\n [\"LK\", \"94\", \"Sri Lanka\"],\n [\"SD\", \"249\", \"Sudan\"],\n [\"SR\", \"597\", \"Suriname\"],\n [\"SZ\", \"268\", \"Swaziland\"],\n [\"SE\", \"46\", \"Sweden\"],\n [\"CH\", \"41\", \"Switzerland\"],\n [\"SY\", \"963\", \"Syria\"],\n [\"TW\", \"886\", \"Taiwan\"],\n [\"TJ\", \"992\", \"Tajikistan\"],\n [\"TZ\", \"255\", \"Tanzania\"],\n [\"TH\", \"66\", \"Thailand\"],\n [\"TL\", \"670\", \"Timor-Leste\"],\n [\"TG\", \"228\", \"Togo\"],\n [\"TO\", \"676\", \"Tonga\"],\n [\"TT\", \"1868\", \"Trinidad and Tobago\"],\n [\"TN\", \"216\", \"Tunisia\"],\n [\"TR\", \"90\", \"Turkey\"],\n [\"TM\", \"993\", \"Turkmenistan\"],\n [\"TV\", \"688\", \"Tuvalu\"],\n [\"UG\", \"256\", \"Uganda\"],\n [\"UA\", \"380\", \"Ukraine\"],\n [\"AE\", \"971\", \"United Arab Emirates\"],\n [\"GB\", \"44\", \"United Kingdom\"],\n [\"US\", \"1\", \"United States\"],\n [\"UY\", \"598\", \"Uruguay\"],\n [\"UZ\", \"998\", \"Uzbekistan\"],\n [\"VU\", \"678\", \"Vanuatu\"],\n [\"VA\", \"39\", \"Vatican City\"],\n [\"VE\", \"58\", \"Venezuela\"],\n [\"VN\", \"84\", \"Vietnam\"],\n [\"YE\", \"967\", \"Yemen\"],\n [\"ZM\", \"260\", \"Zambia\"],\n [\"ZW\", \"263\", \"Zimbabwe\"],\n];\n","import React from \"react\"\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"\nimport { IconPropsType, FontAwesomeGroupsType } from \"./types\"\n// import { StaticImage } from \"gatsby-plugin-image\"\n\n \nconst FontAwesomeGroups: FontAwesomeGroupsType = {\n FAB: \"fab\",\n FAS: \"fas\",\n}\n\n\nconst Icon = ({ icon, className, onClick, color, width, height }: IconPropsType) => {\n return FontAwesomeGroups.hasOwnProperty(icon.group) ? (\n <FontAwesomeIcon\n className={className}\n color={color}\n onClick={onClick}\n icon={[FontAwesomeGroups[icon.group], icon.icon]}\n />\n ) : (\n <img className={className} width={width} height={height} alt={icon.icon} onClick={onClick} src={`/icons/${icon.group}/${icon.icon}.svg`} />\n ) \n}\n\nexport default Icon\n","import React, { FC, ReactNode } from \"react\"\nimport { toast, ToastPosition } from \"react-hot-toast\"\nimport { keyframes } from \"goober\"\nimport Icon from \"../api/icon\"\n\n\nconst enterAnimation = (factor: number) => `\n0% {transform: translate3d(0,${factor * -200}%,0) scale(.6); opacity:.5;}\n100% {transform: translate3d(0,0,0) scale(1); opacity:1;}\n`\n\nconst exitAnimation = (factor: number) => `\n0% {transform: translate3d(0,0,-1px) scale(1); opacity:1;}\n100% {transform: translate3d(0,${factor * -150}%,-1px) scale(.6); opacity:0;}\n`\n\nconst fadeInAnimation = `0%{opacity:0;} 100%{opacity:1;}`\nconst fadeOutAnimation = `0%{opacity:1;} 100%{opacity:0;}`\n\nconst prefersReducedMotion = (() => {\n // Cache result\n let shouldReduceMotion: boolean | undefined = undefined\n\n return () => {\n if (shouldReduceMotion === undefined && typeof window !== \"undefined\") {\n const mediaQuery = matchMedia(\"(prefers-reduced-motion: reduce)\")\n shouldReduceMotion = !mediaQuery || mediaQuery.matches\n }\n return shouldReduceMotion\n }\n})()\n\nconst getAnimationStyle = (\n position: ToastPosition,\n visible: boolean\n): React.CSSProperties => {\n const top = position.includes(\"top\")\n const factor = top ? 1 : -1\n\n const [enter, exit] = prefersReducedMotion()\n ? [fadeInAnimation, fadeOutAnimation]\n : [enterAnimation(factor), exitAnimation(factor)]\n\n return {\n animation: visible\n ? `${keyframes(enter)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`\n : `${keyframes(exit)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`,\n }\n}\n\nexport interface ToastProps {\n id: string\n visible: boolean\n message: string | ReactNode\n height?: number\n position?: ToastPosition\n variant: \"error\" | \"info\" | \"success\"\n}\n\nexport const Toast: FC<ToastProps> = ({\n id,\n visible,\n message,\n height,\n position,\n variant,\n}) => {\n const animationStyle: React.CSSProperties = height\n ? getAnimationStyle(position || \"top-center\", visible)\n : { opacity: 0 }\n\n return (\n <div\n className={`toast ${visible ? \"animate-enter\" : \"animate-leave\"} ${variant}`}\n style={{\n ...animationStyle,\n }}\n >\n <button className={\"close\"} onClick={() => toast.dismiss(id)}><Icon icon={{icon:\"close\", group:\"GLO\"}} /></button>\n {message}\n </div>\n )\n}\n\nexport default Toast\n","import toast from \"react-hot-toast\"\nimport React, { ReactNode } from \"react\"\nimport Toast from \"../toast\"\n\nexport const toastMsg = (\n msg: string | ReactNode,\n variant: \"error\" | \"info\" | \"success\" = \"error\",\n duration: number = 10000\n) => {\n toast.custom(\n (t:any) => (\n <Toast\n id={t.id}\n visible={t.visible}\n message={msg}\n variant={variant}\n height={t.height}\n position={t.position}\n />\n ),\n {\n duration: duration,\n }\n )\n}\n","import { parseISO, format } from \"date-fns\";\nimport slugify from \"slugify\";\n\nexport interface QueryParamsType {\n [key: string]: string;\n}\n\nexport const siteUrl = (path: string = \"\") =>\n `${process.env.PROTOCOL}://${process.env.HOST}${path}`;\n\nconst serializeDate = (date: string) => {\n try {\n return date ? parseISO(date) : undefined;\n } catch (e) {\n return undefined;\n }\n};\nconst serializeNumber = (n: string) => {\n try {\n return n ? parseInt(n) : undefined;\n } catch (e) {\n return undefined;\n }\n};\nconst serializeList = (str: string): string[] => (str ? [str] : []);\n\nconst serializeParam: any = {\n check_in: serializeDate,\n check_out: serializeDate,\n child_count: serializeNumber,\n adult_count: serializeNumber,\n rate_codes: serializeList,\n promo_codes: serializeList,\n};\n\n/**\n * Extracts query params from an URL\n *\n * @param queryString String with query params\n * @param rename Object for renaming params, e.g: {\"oldParam\": \"newParam\"}\n * @returns Object with the parsed params\n */\nexport function parseQueryParams(\n queryString: string,\n rename: { [k: string]: string } = {}\n): QueryParamsType {\n if (!queryString) return {};\n // Transform rate_code and promo_code into their corresponding plurals\n rename = { rate_code: \"rate_codes\", promo_code: \"promo_codes\", ...rename };\n return queryString\n .slice(1)\n .split(\"&\")\n .reduce((acc: QueryParamsType, param: string) => {\n let [key, value] = param.split(\"=\");\n key = decodeURIComponent(key);\n value = decodeURIComponent(value || \"\");\n if (rename[key]) {\n key = rename[key];\n }\n acc[key] = serializeParam.hasOwnProperty(key)\n ? serializeParam[key](value)\n : value;\n return acc;\n }, {});\n}\n\nexport const joinPaths = (path1: string, path2: string): string =>\n `${path1.replace(new RegExp(`/$`), \"\")}/${path2.replace(\n new RegExp(`^/`),\n \"\"\n )}`;\n\nexport const dealLink = (dealSlug: string): string => {\n if (!process.env.DEALS_ROOT_SLUG)\n throw new Error(\"The env variable DEALS_ROOT_SLUG is not defined!\");\n return joinPaths(process.env.DEALS_ROOT_SLUG as string, dealSlug);\n};\n\nexport const apiLink = (\n apiPath: string = \"\",\n queryParams: QueryParamsType | null = null\n): string =>\n `${joinPaths(\n `${process.env.API_PROTOCOL}://${process.env.API_HOST}`,\n apiPath\n )}${queryParams ? `?${new URLSearchParams(queryParams).toString()}` : \"\"}`;\n\n/**\n *\n * Transforms Search params into a query string\n *\n * hotel_codes: Filters the displayed hotels (when defined).\n */\nexport const sp_to_qs = (\n check_in: Date,\n check_out: Date,\n adult_count: number,\n child_count: number,\n rate_codes: string[],\n promo_codes: string[],\n hotel_codes: string | undefined = undefined,\n rooms: number = 1\n) =>\n `?check_in=${format(check_in, \"yyyy-MM-dd\")}&check_out=${format(\n check_out,\n \"yyyy-MM-dd\"\n )}&adult_count=${adult_count}&child_count=${child_count}&promo_code=${\n promo_codes?.length ? promo_codes[0] : \"\"\n }&rate_code=${rate_codes?.length ? rate_codes[0] : \"\"}${\n hotel_codes ? `&hotel_codes=${hotel_codes}` : \"\"\n }&rooms=${rooms}`;\n\nexport const decodeQuotePlus = (text: string) =>\n decodeURIComponent(text.replace(/\\+/g, \"%20\"));\n","import React from \"react\"\nimport { marked } from \"marked\"\nimport parse from \"html-react-parser\"\nimport { MarkdownPropsType } from \"./types\"\n\nexport default function Markdown({\n children,\n className,\n tagAttrs,\n onClick,\n}: MarkdownPropsType) {\n const renderer = new marked.Renderer()\n renderer.link = (href, title, text) => {\n let attrs = {\n href: href,\n title: title ?? \"\",\n target: \"_blank\",\n }\n if (tagAttrs?.a) {\n attrs = { ...attrs, ...tagAttrs?.a }\n }\n return `<a ${Object.entries(attrs)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(\" \")}>${text}</a>`\n }\n marked.setOptions({ renderer })\n\n const createMarkup = () => parse(children ? (marked(children) as string) : \"\")\n\n return (\n <>\n {className || onClick ? (\n <div className={className} onClick={onClick}>\n {createMarkup()}\n </div>\n ) : (\n <>{createMarkup()}</>\n )}\n </>\n )\n}\n","import React from \"react\"\nimport { CheckboxPropsType } from \"./types\"\nimport Markdown from \"../../markdown\"\n\nexport default function Checkbox({\n className,\n label,\n description,\n ...props\n}: CheckboxPropsType) {\n return (\n <label\n className={`checkbox${props.value ? \" checked\" : \"\"}${className ? ` ${className}` : \"\"}`}\n onClick={props.onClick}\n onChange={props.onChange}\n >\n {!!label && <span>{label}</span>}\n <svg\n id={props.id}\n width={props.width ? props.width : 30}\n height={props.height ? props.height : 30}\n viewBox=\"0 0 440 440\"\n >\n <path\n className=\"box\"\n d=\"M 72 136 C 72 100.654 100.654 72 136 72 L 304 72 C 339.346 72 368 100.654 368 136 L 368 304 C 368 339.346 339.346 368 304 368 L 136 368 C 100.654 368 72 339.346 72 304 Z\"\n fill={props.color ? props.color : \"#58595b\"}\n />\n <path\n className=\"tick\"\n d=\"M 160 180 L 210 250 L 340 130\"\n transform=\"translate(40 65) rotate(-10 70.904 438.687)\"\n fill=\"transparent\"\n strokeWidth={30}\n stroke=\"white\"\n strokeLinecap=\"square\"\n strokeLinejoin=\"miter\"\n />\n </svg>\n {!!description && (\n <div>\n <Markdown>{description}</Markdown>\n </div>\n )}\n </label>\n )\n}\n","import React, {\n startTransition,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\"\nimport { PhonePropsType } from \"./types\"\nimport { countryPrefixes } from \"../../utils/location\"\nimport { scrollToChild } from \"../../utils/viewport\"\nimport Markdown from \"../../markdown\"\nimport Icon from \"../icon\"\n\nexport default function CountryPrefix({\n className,\n label,\n description,\n input_name,\n onClick,\n onChange,\n value,\n ...props\n}: PhonePropsType) {\n const [showOptions, setShowOptions] = useState<boolean>(false)\n const [focused, setFocused] = useState<number>(0)\n const [input, setInput] = useState(\"\")\n const inputRef = useRef<HTMLInputElement>(null)\n const listRef = useRef<HTMLUListElement>(null)\n\n const handleSelection = useCallback(\n (focused: number) => {\n onChange?.(countryPrefixes[focused][1] as any)\n startTransition(() => {\n setShowOptions(false)\n setFocused(focused)\n setInput(countryPrefixes[focused][2])\n })\n },\n [onChange, countryPrefixes],\n )\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n const { key } = e\n if (key === \"ArrowDown\" || key === \"ArrowUp\") {\n // Logic to navigate through the list items\n startTransition(() => {\n const newFocus =\n key === \"ArrowDown\"\n ? Math.min(focused + 1, countryPrefixes.length - 1)\n : Math.max(focused - 1, 0)\n setFocused(newFocus)\n setInput(countryPrefixes[newFocus][2])\n })\n } else if (key === \"Escape\") {\n startTransition(() => setShowOptions(false))\n } else if (key === \"Enter\") {\n e.preventDefault()\n e.stopPropagation()\n handleSelection(focused)\n }\n }\n\n const scrollToFocusedCountry = useCallback(() => {\n if (!listRef.current) return\n const element = listRef.current.querySelector(\n `#${props.name ?? \"country-prefix\"}__${countryPrefixes[focused][0]}`,\n )\n if (!element) return\n scrollToChild(listRef.current, element as HTMLElement)\n }, [focused, countryPrefixes])\n\n // Focus selected option based on input\n function handleOnChange(value: string) {\n startTransition(() => {\n setInput(value)\n })\n let foundIndex = countryPrefixes.findIndex(row =>\n row[2].toLowerCase().startsWith(input.toLowerCase()),\n )\n if (foundIndex >= 0) {\n startTransition(() => setFocused(foundIndex))\n }\n }\n\n // Handle clicks outside the\n useEffect(() => {\n const handleClickOutside = (e: any) => {\n if (\n inputRef.current &&\n !inputRef.current.contains(e.target) &&\n listRef.current &&\n !listRef.current.contains(e.target)\n ) {\n startTransition(() => setShowOptions(false))\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }, [inputRef, listRef])\n \n useEffect(() => {\n scrollToFocusedCountry()\n }, [focused])\n\n useEffect(() => {\n document.body.classList[showOptions ? \"add\" : \"remove\"](\"no-scroll\")\n if (!inputRef.current) return\n if (showOptions) {\n // Autofocus on open dropdown\n inputRef.current.focus()\n }\n }, [showOptions])\n\n return (\n <label className={`country-prefix ${className ? ` ${className}` : \"\"}`}>\n {!!label && <span>{label}</span>}\n <div\n className=\"selected-prefix\"\n onClick={() => startTransition(() => setShowOptions(true))}\n >\n +{value ?? countryPrefixes[0][1]}\n <Icon\n className={showOptions ? \"opened\" : \"\"}\n icon={{ icon: \"chevron-right\", group: \"FAS\" }}\n />\n </div>\n <div className={`countries-prefixes${showOptions ? \" show\" : \"\"}`}>\n <input\n ref={inputRef}\n name={input_name}\n value={input}\n onChange={e => handleOnChange(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n <ul\n ref={listRef}\n role=\"listbox\"\n tabIndex={-1}\n aria-activedescendant={`${props.name ?? \"country-prefix\"}__${\n countryPrefixes[focused][0]\n }`}\n >\n {countryPrefixes.map(([countryCode, prefix, name], k) => {\n return (\n <li\n className={k === focused ? \"selected\" : \"\"}\n role=\"option\"\n onClick={() => handleSelection(k)}\n aria-selected={k === focused}\n aria-label={`${name} +${prefix}`}\n id={`${props.name ?? \"country-prefix\"}__${countryCode}`}\n key={`${props.name ?? \"country-prefix\"}__${countryCode}`}\n >\n {name} +{prefix}\n </li>\n )\n })}\n </ul>\n </div>\n {!!description && (\n <div>\n <Markdown>{description}</Markdown>\n </div>\n )}\n </label>\n )\n}\n","export default function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}","import React, { useEffect, useState } from \"react\"\nimport { usePlacesWidget } from \"react-google-autocomplete\"\nimport { GooglePlacesPropsType, PlaceType } from \"./types\"\nimport { countryPrefixes } from \"../../utils/location\"\n\nconst getCountryCode = (place: google.maps.places.PlaceResult) => {\n if (place.address_components) {\n for (const component of place.address_components) {\n if (component.types[0] == \"country\") {\n return component.short_name\n }\n }\n }\n return null\n}\n\nconst GooglePlaces = ({\n label,\n name,\n input_name,\n value, \n defaultCountryCode,\n onChange,\n onClick,\n onFocus,\n onBlur,\n data,\n ...props\n}: GooglePlacesPropsType) => {\n const [place, setPlace] = useState<PlaceType | undefined>()\n\n if (!process.env.GOOGLEMAPS_KEY) {\n throw new Error(\"The environment variable GOOGLEMAPS_KEY is not defined!\")\n }\n\n const { ref }: any = usePlacesWidget({\n apiKey: process.env.GOOGLEMAPS_KEY,\n onPlaceSelected: place =>\n setPlace({\n target: {\n value: place.formatted_address,\n data: { countryCode: getCountryCode(place) },\n },\n }),\n ...data,\n })\n\n useEffect(() => {\n if (onChange && place) {\n onChange(place as any)\n }\n }, [place])\n\n // Init country when countryCode is provided\n useEffect(() => {\n if (!defaultCountryCode || value || place) return\n const found = countryPrefixes.find(\n x => x[0] === defaultCountryCode.toLowerCase()\n )\n if (found) {\n setPlace({\n target: {\n value: found[2],\n data: { countryCode: defaultCountryCode },\n },\n })\n }\n }, [defaultCountryCode])\n\n return (\n <label className={`google-places label-${name}`}>\n {!!label && <span>{label}</span>}\n\n <input\n ref={ref}\n name={input_name}\n autoComplete=\"off\"\n onChange={onChange}\n onClick={onClick}\n onFocus={onFocus}\n onBlur={onBlur}\n value={value}\n placeholder={props.placeholder ?? undefined}\n {...props}\n />\n </label>\n )\n}\n\nexport default GooglePlaces\n","import React, { useState } from \"react\"\nimport { Link as PageLink } from \"gatsby\"\nimport { LinkPropsType, ExternalLinkPropsType } from \"./types\"\nimport Icon from \"../icon\"\nimport {classNames} from \"../../utils/viewport\"\n\nconst ExternalLink = ({ animate = true, ...props }: ExternalLinkPropsType) => {\n const [scale, setScale] = useState(1)\n\n const setState = (n: number) => {\n if (animate) {\n setScale(n)\n }\n }\n\n return (\n <a\n className={props.className}\n onMouseDown={() => setState(0.95)}\n onMouseUp={() => setState(1)}\n onTouchStart={() => setState(0.95)}\n onTouchEnd={() => setState(1)}\n title={props.title}\n href={props.to}\n target={ props.target? props.target : props.to? \"_blank\" : undefined}\n onClick={props.onClick}\n >\n {props.children}\n </a>\n )\n}\n\nconst Link = (props: LinkPropsType) => {\n const LinkTag = props.page_slug ? PageLink : ExternalLink\n let slug = (props.page_slug ? `${props.page_slug}${props.query_params?`?${props.query_params}`:\"\"}` : props.external_link?? \"\") as string\n if (props.anchor) {\n slug = `${slug}#${props.anchor}`\n }\n return (\n <LinkTag\n className={`${props.className??\"\"}${props.display_on?` ${classNames({}, props.display_on)}` : \"\"}`}\n to={slug}\n title={props.title}\n target={props.target}\n onClick={props.onClick}\n animate={props.animate}\n >\n {!!props.icon && <Icon icon={props.icon} />}\n {props.children ? props.children : props.text}\n </LinkTag>\n )\n}\n\nexport default Link\n","import React from \"react\"\nimport {\n GatsbyImage,\n getImage,\n withArtDirection,\n IGatsbyImageData,\n} from \"gatsby-plugin-image\"\nimport { ImageType } from \"../types\"\nimport { ImagePropsType } from \"./types\"\nimport classNames from \"classnames\"\nimport Link from \"../link\"\n\nconst buildImage = (img: ImageType): IGatsbyImageData | undefined => {\n if (!img) {\n return undefined\n }\n\n let fallback = {\n src: img.url,\n sizes: \"100vw\",\n srcSet: \"\",\n }\n let sources = []\n let placeholder = { fallback: img.url }\n const sizes = [img.width, 360, 769, 1024, 1216, 1408].sort((a, b) => a - b)\n\n if (img.optimized) {\n fallback.src = img.url + img.name + \"-\" + img.width + \"w.jpg\"\n placeholder.fallback = img.url + img.name + \"-20w.jpg\"\n sources.push({ sizes: \"100vw\", srcSet: \"\", type: \"image/avif\" })\n sources.push({ sizes: \"100vw\", srcSet: \"\", type: \"image/webp\" })\n for (let index in sizes) {\n if (sizes[index] > img.width) {\n break\n }\n let image_url =\n (index === \"0\" ? \"\" : \",\") + img.url + img.name + \"-\" + sizes[index]\n fallback.srcSet += image_url + \"w.jpg \" + sizes[index] + \"w\"\n sources[0].srcSet += image_url + \"w.avif \" + sizes[index] + \"w\"\n sources[1].srcSet += image_url + \"w.webp \" + sizes[index] + \"w\"\n }\n }\n\n return getImage({\n childImageSharp: {\n gatsbyImageData: {\n backgroundColor: \"transparent\",\n height: img.height / img.width,\n width: 1,\n layout: \"fullWidth\",\n placeholder: placeholder,\n images: {\n fallback: fallback,\n sources: sources,\n },\n },\n },\n })\n}\n\nconst Image = ({ imageData, ...props }: ImagePropsType) => {\n const initImage = () => {\n const image_data = buildImage(props.image as ImageType)\n const mobile_image_data = buildImage(props.mobile_image as ImageType)\n return image_data && mobile_image_data // If mobile image exists, it must be added using Art Direction.\n ? withArtDirection(image_data, [\n {\n media: \"(max-width: 768px)\",\n image: mobile_image_data,\n },\n ])\n : image_data\n }\n let image = imageData ?? initImage()\n if (!image) {\n return <span>Missing image!</span>\n }\n const imageProps = {\n className:classNames({\n [\"mobile-img\"]: !!props.image && !!props.mobile_image,\n [props.className as string]: !!props.className,\n }),\n image:image,\n onLoad:props.onLoad,\n alt:props.image?.alt ? props.image.alt : \"\",\n style:props.style\n }\n return props.page_slug || props.external_link?\n ( <Link page_slug={props.page_slug} external_link={props.external_link} title={props.link_text} >\n <GatsbyImage {...imageProps} />\n </Link>\n ) : <GatsbyImage {...imageProps} />\n\n}\n\nexport default Image\n","import React from \"react\"\nimport { InputPropsType } from \"./types\"\nimport Markdown from \"../../markdown\"\nimport Icon from \"../icon\"\n\n\nconst Input = ({\n label,\n type,\n input_type,\n description,\n name,\n input_name,\n icon,\n iconOnClick,\n read_only,\n className,\n ...props\n}: InputPropsType) => {\n return (\n <label\n className={`input label-${name}${\n input_type === \"hidden\" ? \" hidden\" : \"\"\n }${className?` label-${className}`:\"\"}`}\n >\n {!!label && <span>{label}</span>}\n {!!icon && <Icon icon={icon} onClick={iconOnClick} />}\n <input\n type={input_type}\n name={input_name}\n readOnly={read_only}\n className={className}\n {...props}\n />\n {!!description && (\n <div className=\"desc\">\n <div>\n <Markdown>{description}</Markdown>\n </div>\n </div>\n )}\n </label>\n )\n}\n\nexport default Input\n","import React from \"react\"\nimport { LinkType } from \"../types\"\nimport { LinkListPropsType } from \"./types\"\nimport Link from \"../link\"\n\nconst LinkList = ({ pk, ...props }: LinkListPropsType) => {\n return (\n <ul className={props.className}>\n {props.links.map((link: LinkType, k: number) => (\n <li key={`LinkList${pk}-${k}`}>\n <Link {...link}>{props.children}</Link>\n </li>\n ))}\n </ul>\n )\n}\nexport default LinkList\n","import React from \"react\"\nimport ReactSelect from \"react-select\"\nimport {\n GroupedOptionsType,\n OptionType,\n OptionsType,\n SelectPropsType,\n} from \"./types\"\n\n/**\n * Transforms the options into the allowed format, which could be either\n *\n * - Normal options:\n * [\n * {label: \"option 1\", value: \"1\"},\n * {label: \"option 2\", value: \"2\"},\n * ...\n * ]\n *\n * - Grouped options:\n * [\n * {label: \"Group 1\", options: [{label: \"option 1\", value: \"1\"}, {label: \"option 2\", value: \"2\"}, ..]},\n * {label: \"Group 2\", options: [{label: \"option 3\", value: \"3\"}, {label: \"option 4\", value: \"4\"}, ..]},\n * ...\n * ]\n */\nconst formatOptions = (\n options: OptionsType\n): (OptionType | GroupedOptionsType)[] => {\n if (Array.isArray(options)) {\n return options\n }\n return typeof options[Object.keys(options)[0]] === \"string\"\n ? Object.entries(options).reduce((acc, [value, label]) => {\n // @ts-ignore\n acc.push({ label: label, value: value })\n return acc\n }, [] as OptionType[])\n : Object.entries(options).reduce((acc, [label, values]) => {\n acc.push({\n label: label,\n options: Object.entries(values).reduce(\n (opts, [k, v]) => [...opts, { label: v, value: k }],\n [] as OptionType[]\n ),\n })\n return acc\n }, [] as GroupedOptionsType[])\n}\n\nconst getValue = (\n options: (OptionType | GroupedOptionsType)[],\n value: string\n): any => {\n for (let option of options) {\n if (option.hasOwnProperty(\"options\")) {\n for (let opt of (option as GroupedOptionsType).options) {\n if (value === opt.value) {\n return opt\n }\n }\n return option\n } else if (value === (option as OptionType).value) {\n return option\n }\n }\n return null\n}\n\nconst Select: React.FC<SelectPropsType> = ({\n value,\n styles,\n options,\n label,\n scrollDisabledOnClose,\n ...props\n}) => {\n const opts = formatOptions(options) as any\n\n return (\n <label\n className={\"label-\" + (props.className ? props.className : props.name)}\n >\n {!!label && <span>{label}</span>}\n <ReactSelect\n options={opts}\n value={typeof value === \"string\" ? getValue(opts, value) : value}\n styles={styles}\n onMenuOpen={() => document.body.classList.add(\"no-scroll\")}\n onMenuClose={() => !scrollDisabledOnClose && document.body.classList.remove(\"no-scroll\")}\n classNamePrefix=\"select\"\n {...props}\n />\n </label>\n \n )\n}\n\nexport default Select\n","import React from \"react\"\nimport { FilePropsType } from \"./types\"\n\nconst SVG = (props: FilePropsType) => {\n return <img className={props.className} src={props.file.url} />\n}\n\nexport default SVG\n","import React from \"react\"\nimport { TextPropsType } from \"./types\"\nimport Markdown from \"../../markdown\"\nimport Icon from \"../icon\"\n\n\nconst Text = ({text, icon, ...props}: TextPropsType) => {\n return (\n <div className={props.className}>\n {!!icon && <Icon icon={icon} />} <Markdown tagAttrs={props.tagAttrs}>{text}</Markdown>\n </div>\n )\n}\n\nexport default Text\n","import React from \"react\"\n\nconst Textarea = ({ label, ...props }: any) => {\n return (\n <label className={`textarea label-${props.name}`}>\n {!!label && <span>{label}</span>}\n <textarea {...props} />\n </label>\n )\n}\n\nexport default Textarea\n","import React, { useMemo } from \"react\"\nimport { TitlePropsType } from \"./types\"\nimport Markdown from \"../../markdown\"\n\nconst Title = (props: TitlePropsType) => {\n const data = useMemo(() => {\n return props.title && props.title[0] === \"#\"\n ? props.title\n : `### ${props.title}`\n }, [props.title])\n\n return (\n <Markdown className={props.className} onClick={props.onClick}>\n {data}\n </Markdown>\n )\n}\n\nexport default Title\n","import React from \"react\"\nimport { ButtonPropsType } from \"./types\"\n\nconst Button: React.FC<ButtonPropsType> = ({ ...props }) => {\n return (\n <button\n className={props.className}\n type={props.input_type ?? \"button\"}\n onClick={props.onClick}\n >\n {props.value}\n </button>\n )\n}\n\nexport default Button;","import React, { useCallback, useEffect, useState } from \"react\"\nimport { EmblaCarouselType } from \"embla-carousel\"\nimport { PropType, UseButtonsType } from \"./types\"\n\nexport const useButtons = (\n emblaApi: EmblaCarouselType | undefined,\n showButtons: boolean | undefined\n): UseButtonsType => {\n const [prevBtnDisabled, setPrevBtnDisabled] = useState(true)\n const [nextBtnDisabled, setNextBtnDisabled] = useState(true)\n\n const onPrevButtonClick = useCallback(() => {\n if (!emblaApi) return\n emblaApi.scrollPrev()\n }, [emblaApi])\n\n const onNextButtonClick = useCallback(() => {\n if (!emblaApi) return\n emblaApi.scrollNext()\n }, [emblaApi])\n\n const onSelect = useCallback((emblaApi: EmblaCarouselType) => {\n setPrevBtnDisabled(!emblaApi.canScrollPrev())\n setNextBtnDisabled(!emblaApi.canScrollNext())\n }, [])\n\n useEffect(() => {\n if (!emblaApi || !showButtons) return\n\n onSelect(emblaApi)\n emblaApi.on(\"reInit\", onSelect)\n emblaApi.on(\"select\", onSelect)\n }, [emblaApi, onSelect])\n\n return {\n prevBtnDisabled,\n nextBtnDisabled,\n onPrevButtonClick,\n onNextButtonClick,\n }\n}\n\nexport const PrevButton: React.FC<PropType> = props => {\n const { children, icon, ...restProps } = props\n\n return (\n <button\n className=\"embla__button embla__button--prev\"\n type=\"button\"\n {...restProps}\n >\n {icon? icon: <svg className=\"embla__button__svg\" viewBox=\"0 0 532 532\">\n <path\n fill=\"currentColor\"\n d=\"M355.66 11.354c13.793-13.805 36.208-13.805 50.001 0 13.785 13.804 13.785 36.238 0 50.034L201.22 266l204.442 204.61c13.785 13.805 13.785 36.239 0 50.044-13.793 13.796-36.208 13.796-50.002 0a5994246.277 5994246.277 0 0 0-229.332-229.454 35.065 35.065 0 0 1-10.326-25.126c0-9.2 3.393-18.26 10.326-25.2C172.192 194.973 332.731 34.31 355.66 11.354Z\"\n />\n </svg>}\n {children}\n </button>\n )\n}\n\nexport const NextButton: React.FC<PropType> = props => {\n const { children, icon, ...restProps } = props\n\n return (\n <button\n className=\"embla__button embla__button--next\"\n type=\"button\"\n {...restProps}\n >\n {icon? icon:\n <svg className=\"embla__button__svg\" viewBox=\"0 0 532 532\">\n <path\n fill=\"currentColor\"\n d=\"M176.34 520.646c-13.793 13.805-36.208 13.805-50.001 0-13.785-13.804-13.785-36.238 0-50.034L330.78 266 126.34 61.391c-13.785-13.805-13.785-36.239 0-50.044 13.793-13.796 36.208-13.796 50.002 0 22.928 22.947 206.395 206.507 229.332 229.454a35.065 35.065 0 0 1 10.326 25.126c0 9.2-3.393 18.26-10.326 25.2-45.865 45.901-206.404 206.564-229.332 229.52Z\"\n />\n </svg>}\n {children}\n </button>\n )\n}\n","import React, { useCallback, useEffect, useState } from \"react\"\nimport { EmblaCarouselType } from \"embla-carousel\"\nimport { PropType, UseDotsType } from \"./types\"\n\nexport const useDots = (\n emblaApi: EmblaCarouselType | undefined,\n showDots: boolean | undefined\n): UseDotsType => {\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [scrollSnaps, setScrollSnaps] = useState<number[]>([])\n\n const onDotButtonClick = useCallback(\n (index: number) => {\n if (!emblaApi) return\n emblaApi.scrollTo(index)\n },\n [emblaApi]\n )\n\n const onInit = useCallback((emblaApi: EmblaCarouselType) => {\n setScrollSnaps(emblaApi.scrollSnapList())\n }, [])\n\n const onSelect = useCallback((emblaApi: EmblaCarouselType) => {\n setSelectedIndex(emblaApi.selectedScrollSnap())\n }, [])\n\n useEffect(() => {\n if (!emblaApi || !showDots) return\n\n onInit(emblaApi)\n onSelect(emblaApi)\n emblaApi.on(\"reInit\", onInit)\n emblaApi.on(\"reInit\", onSelect)\n emblaApi.on(\"select\", onSelect)\n }, [emblaApi, onInit, onSelect])\n\n return {\n selectedIndex,\n scrollSnaps,\n onDotButtonClick,\n }\n}\n\nexport const DotButton: React.FC<PropType> = props => {\n const { children, ...restProps } = props\n\n return (\n <button type=\"button\" {...restProps}>\n {children}\n </button>\n )\n}\n","import React, { startTransition, useCallback, useEffect, useState } from \"react\"\nimport { EmblaCarouselType } from \"embla-carousel\"\nimport type { CarouselPropsType, ScreenSizesType, ViewPortKeyType} from \"./types\"\nimport { useButtons } from \"./buttons\"\nimport { useDots,DotButton } from \"./dots\"\nimport { NextButton, PrevButton } from \"./buttons\"\n\n\nexport const ScreenSizes: ScreenSizesType = {\n mobile: \"(max-width: 768px)\",\n tablet: \"(min-width: 769px) and (max-width: 1023px)\",\n desktop: \"(min-width: 1024px) and (max-width: 1215px)\",\n wide:\"(min-width: 1216px) and (max-width: 1407)\",\n fullhd:\"(min-width: 1408px)\",\n}\n\nconst Carousel: React.FC<CarouselPropsType> = ({\n id,\n emblaRef,\n emblaApi,\n slidesPerView,\n slidesPerViewport,\n slides,\n gap,\n height,\n showButtons,\n showDots,\n showProgress,\n showScroll,\n prevIcon,\n nextIcon,\n}) => {\n const [scrollProgress, setScrollProgress] = useState(0)\n const { selectedIndex, scrollSnaps, onDotButtonClick } = useDots(\n emblaApi,\n showDots\n )\n const [options, setOptions] = useState({} as any)\n\n // Calculate Carousel progress\n const onScroll = useCallback((emblaApi: EmblaCarouselType) => {\n const progress = Math.max(0, Math.min(1, emblaApi.scrollProgress()))\n setScrollProgress(progress * 100)\n }, [])\n\n const {\n prevBtnDisabled,\n nextBtnDisabled,\n onPrevButtonClick,\n onNextButtonClick,\n } = useButtons(emblaApi, showButtons)\n\n useEffect(() => {\n if (!emblaApi || (!showProgress && !showScroll)) return\n\n onScroll(emblaApi)\n emblaApi.on(\"reInit\", onScroll)\n emblaApi.on(\"scroll\", onScroll)\n }, [emblaApi, onScroll])\n\n // Fixes mobile issue of disabled navigation.\n useEffect(() => {\n if (emblaApi) {\n startTransition(() => {\n setOptions(emblaApi.internalEngine().options ?? ({} as any))\n emblaApi.reInit()\n })\n }\n }, [emblaApi])\n\n useEffect(() => {\n if (options?.axis === \"y\" && !height) {\n throw Error('Vertical carousel needs \"slideHeight\" prop')\n }\n }, [options])\n\n\n return (\n <div id={id} className={`embla${options.axis === 'y' ? ' vertical':''}`}>\n <div className=\"embla__viewport\" ref={emblaRef}>\n <div className=\"embla__container\">\n {slides.map((slide, k) => (\n <div className=\"embla__slide\" key={`${id}-slide-${k}`}>\n {slide}\n </div>\n ))}\n </div>\n </div>\n {!!showButtons && (\n <>\n <PrevButton onClick={onPrevButtonClick} disabled={prevBtnDisabled} icon={prevIcon} />\n <NextButton onClick={onNextButtonClick} disabled={nextBtnDisabled} icon={nextIcon} />\n </>\n )}\n {!!showDots && (\n <div className=\"embla__dots\">\n {scrollSnaps.map((_: any, index: number) => (\n <DotButton\n key={index}\n onClick={() => onDotButtonClick(index)}\n className={\"embla__dot\".concat(\n index === selectedIndex ? \" embla__dot--selected\" : \"\"\n )}\n />\n ))}\n </div>\n )}\n {!!showProgress && (\n <div className=\"embla__progress\">\n <div\n className=\"embla__progress__bar\"\n style={{ transform: `translate3d(${scrollProgress}%,0px,0px)` }}\n />\n </div>\n )}\n {!!showScroll && (\n <div className=\"embla__scroll\">\n <div className=\"embla__scroll__bar\" />\n </div>\n )}\n <style>\n {!!Object.keys(options).length &&\n `\n #${id} > .embla__viewport > .embla__container{\n margin-${options.axis === 'y'?'top':'left'}: calc(${gap?? 0}px * -1);\n ${height?`height: calc(${gap? gap : 0}px + ${height}px);`:\"\"}\n }\n #${id} > .embla__scroll > .embla__scroll__bar{\n width: ${slides.length <= slidesPerView?\"100%\":\"50%\"};\n transform: translate3d(${scrollProgress}%,0px,0px);\n }\n #${id} > .embla__viewport > .embla__container > .embla__slide{\n flex: 0 0 ${(100 / slidesPerView).toFixed(2)}%;\n padding-${options.axis === 'y'?'top':'left'}: ${gap? gap : 0}px;\n }\n ${\n slidesPerViewport\n ? Object.entries(slidesPerViewport).map(([device, opts]) => {\n let viewPortGap: number |null = opts.gap? opts.gap: gap?? null\n let viewPortSlides = opts.slides\n \n return `@media ${ScreenSizes[device as ViewPortKeyType]} {\n #${id} > .embla__viewport > .embla__container{\n ${\n viewPortGap !== null\n ? `margin-${options.axis === 'y'?'top':'left'}: calc(${viewPortGap}px * -1);`\n : \"\"\n }\n ${viewPortGap !== null && opts?.height?`height: calc(${viewPortGap}px + ${opts.height}px);`:\"\"}\n } \n #${id} > .embla__scroll > .embla__scroll__bar{\n width: ${slides.length <= viewPortSlides?\"100%\":\"50%\"};\n }\n #${id} > .embla__viewport > .embla__container > .embla__slide {\n flex: 0 0 ${(100 / viewPortSlides).toFixed(2)}%;\n ${viewPortGap !== null ? `padding-${options.axis === 'y'?'top':'left'}: ${viewPortGap}px;` : \"\"}\n }\n }`\n }).join(\"\\n\")\n : \"\"\n }\n `}\n </style>\n </div>\n )\n}\n\nexport default Carousel\n","import React from \"react\"\nimport { Link } from \"gatsby\"\nimport { GatsbyLinkProps } from \"./types\"\n\nconst GatsbyLink: React.FC<GatsbyLinkProps> = ({ children, to, activeClassName, partiallyActive, internal=true, ...props }) => ( \n // Assumes that any link is internal by default (Gatsby navigation)\n // but when internal=false use external links: <a>.\n internal ? \n <Link\n to={to}\n activeClassName={activeClassName}\n partiallyActive={partiallyActive}\n {...props}\n >\n {children}\n </Link>\n :\n <a href={to} {...props}>\n {children}\n </a>)\n \n\n\nexport default GatsbyLink\n","import React, { useEffect } from \"react\"\nimport { ModalPropsType } from \"./types\"\nimport Icon from \"../api/icon\"\n\nconst Modal = ({\n modalId,\n show,\n className,\n setShowModal,\n children,\n closeWidth,\n closeHeight ,\n closeIcon = { icon: \"times\", group: \"FAS\" },\n}: ModalPropsType) => {\n useEffect(() => {\n document.body.classList[show ? \"add\" : \"remove\"](\"no-scroll\")\n }, [show])\n return (\n <div\n className={`modal-layout${show ? \" opened\" : \"\"}`}\n onClick={e => {\n // Close Modal when clicking outside:\n if (e.target === e.currentTarget) {\n setShowModal(modalId, false)\n }\n }}\n >\n <div className={`modal${className ? ` ${className}` : \"\"}`}>\n <div className=\"modal-body\">{children}</div>\n <button className=\"close\" onClick={() => setShowModal(modalId, false)}>\n <Icon icon={closeIcon} width={closeWidth} height={closeHeight} />\n </button>\n </div>\n </div>\n )\n}\n\nexport default Modal\n","import React from \"react\"\nimport { SpinnerPropsType } from \"./types\"\n\nexport default function Spinner({ color, size, className }: SpinnerPropsType) {\n return (\n <div\n className={`spinner-box${className ? ` ${className}` : \"\"}`}\n >\n <div\n className=\"spinner\"\n style={{\n border: `5px solid ${color ? color : \"white\"}`,\n width: size ? size : 45,\n height: size ? size : 45,\n }}\n ></div>\n </div>\n )\n}\n","import React, { startTransition, useCallback, useEffect, useState } from \"react\"\nimport { ErrorsType, FormPropsType } from \"./types\"\nimport { toastMsg } from \"../../utils/notifications\"\nimport {\n INPUT_FIELDS,\n getInputEventValue,\n getInputHumanValue,\n json_request,\n} from \"../../utils/forms\"\nimport type { \n FormFieldsType,\n FormItemType,\n} from \"../../utils/types\"\nimport classNames from \"classnames\"\nimport Markdown from \"../../markdown\"\nimport Spinner from \"../../spinner\"\nimport Link from \"../link\"\nimport Title from \"../title\"\nimport Text from \"../text\"\nimport Input from \"../input\"\nimport Textarea from \"../textarea\"\nimport Checkbox from \"../checkbox\"\nimport Country from \"../country\"\nimport CountryPrefix from \"../country-prefix\"\nimport Select from \"../select\"\nimport Button from \"../button\"\nimport GooglePlaces from \"../google-places\"\nimport Image from \"../image\"\n\n\n\nexport const FormElements: any = {\n link: Link,\n title: Title,\n text: Text,\n input: Input,\n textarea: Textarea,\n checkbox: Checkbox,\n \"country\": Country,\n \"country-prefix\": CountryPrefix,\n select: Select,\n button: Button,\n \"google-places\": GooglePlaces,\n image: Image,\n hidden: Input\n}\n\nexport const FormElement = (props: any) => {\n if (FormElements.hasOwnProperty(props.type)) {\n const FormElementWrapper = FormElements[props.type]\n return <FormElementWrapper {...props} />\n }\n console.error(`Element \"${props.type}\" not supported by <Form />!`)\n return <></>\n}\n\n\nexport default function Form({\n className,\n form,\n setForm,\n errors,\n setErrors,\n beforeSubmit,\n formatParams,\n validate,\n validateResponse,\n onSuccess,\n onFocus,\n onBlur,\n onClick,\n onChange,\n onError,\n afterSubmit,\n loading,\n}: FormPropsType) {\n const [recaptchaReady, setRecaptchaReady] = useState(false);\n\n const showErrors = (errors: ErrorsType, showInputName: boolean = true) => (\n <div>\n <ul className={\"error\"}>\n {Object.entries(errors).map(([input, error], k: number) => (\n <li key={`error-form${k}`}>\n <span>\n {showInputName ? <strong>{input}:</strong> : \"\"} {error}\n </span>\n </li>\n ))}\n </ul>\n </div>\n )\n\n useEffect(() => {\n // Function to check if grecaptcha is loaded\n const checkRecaptcha = () => {\n if ((window as any).grecaptcha?.execute) {\n setRecaptchaReady(true);\n return\n } \n setTimeout(checkRecaptcha, 500); // Retry in 0.5s if not loaded\n };\n\n checkRecaptcha(); \n }, []);\n\n\n const executeRecaptcha = useCallback(async () => {\n if(!process.env.RECAPTCHA_V3_SITE_KEY){\n console.error(\"RECAPTCHA_V3_SITE_KEY is not defined!\")\n return null\n }\n if (!(window as any).grecaptcha?.execute) {\n console.warn(\"reCAPTCHA not yet loaded.\");\n return null;\n }\n return await (window as any).grecaptcha.execute(process.env.RECAPTCHA_V3_SITE_KEY, {action: form.settings.recaptcha_action?? 'submit'});\n }, [recaptchaReady]);\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n let errors: any = {}\n let params = Object.values(form.fields).reduce((acc, field:any) => {\n if (INPUT_FIELDS.has(field.type)) {\n if (field.required && !field.value) {\n const fieldName = field.label ? field.label : field.placeholder\n errors[field.input_name] =`${fieldName.charAt(0).toUpperCase()}${fieldName.slice(1).toLowerCase()} is required`\n return acc\n }\n // Skip non-checked radio buttons\n if (field.input_type === \"radio\" && !field.checked) {\n return acc\n }\n // Skip submit buttons\n if (field.input_type === \"submit\") {\n return acc\n }\n // @ts-ignore\n acc[field.input_name] = getInputHumanValue(field.type, field.value)\n }\n return acc\n }, {} as any)\n\n // Get reCAPTCHA v3 token\n if (form.settings.recaptcha_v3) {\n params.recaptcha_token = await executeRecaptcha()\n if (!params.recaptcha_token) {\n errors.recaptcha = \"reCAPTCHA failed!\"\n }\n }\n\n // Check recaptcha v2 if it's within the fields\n if (form.fields.recaptcha && !params.recaptcha) {\n errors.recaptcha = \"Recaptcha is mandatory\"\n }\n\n if (validate) {\n errors = { ...errors, ...validate(form.fields, params) }\n }\n if (Object.keys(errors).length) {\n startTransition(() => {\n setErrors(errors)\n toastMsg(showErrors(errors, false))\n })\n return\n }\n\n if (beforeSubmit) {\n beforeSubmit(form)\n }\n\n if (formatParams) {\n params = formatParams(params)\n }\n\n // If is not an AJAX request, the page will be redirected into the form submit URL\n if (!form.settings.form_ajax_request) {\n // @ts-ignore\n return e.target.submit()\n }\n const response = await json_request(\n form.settings.form_submit,\n params,\n form.settings.form_method,\n form.settings.form_recipient\n ? {\n \"recipient-id\": `${form.settings.form_recipient}`,\n }\n : {}\n )\n startTransition(() => {\n // ON SUCCESS:\n if (\n response.status === 200 &&\n (!validateResponse || validateResponse(response))\n ) {\n if (onSuccess) {\n // Execute onSuccess action when defined:\n onSuccess(response, form.settings.form_success_msg)\n } else {\n // Otherwise just show success message:\n toastMsg(\n form.settings.form_success_msg ? (\n <Markdown>{form.settings.form_success_msg}</Markdown>\n ) : (\n \"Success! Your form has been successfully sent. Thank you for reaching out, we will get back to you as soon as possible.\"\n ),\n \"success\"\n )\n }\n\n if (form.settings.form_redirection) {\n setTimeout(() => {\n window.location.href = form.settings.form_redirection as string\n }, 3000)\n }\n\n // Reset all form values:\n setForm({\n ...form,\n fields: Object.entries(form.fields).reduce((acc, [name, field]) => {\n acc[name] = ![\"button\", \"hidden\"].includes(field.type) && INPUT_FIELDS.has(field.type) // @ts-ignore\n ? { ...field, value: \"\" }\n : field\n return acc\n }, {} as FormFieldsType),\n })\n // ON ERROR:\n } else if (onError) {\n onError(response)\n // ELSE ON ERROR:\n } else if (response.errors) {\n let newErrors: ErrorsType = Object.entries(response.errors).reduce(\n (acc, [inputName, errorList]) => {\n acc[inputName] = errorList.join(\", \")\n return acc\n },\n {} as ErrorsType\n )\n toastMsg(showErrors(newErrors))\n setErrors(newErrors)\n // ELSE ON ERROR:\n } else if (response.error) {\n toastMsg(\n showErrors(\n {\n failed: response.error ? (\n <Markdown>{response.error}</Markdown>\n ) : (\n \"Oops. Something went wrong. Please try again later, or contact us at members@tfehotels.com\"\n ),\n },\n false\n )\n )\n }\n })\n\n if (afterSubmit) {\n afterSubmit(response)\n }\n }\n\n\n const buildFormElement = (item: FormItemType) => {\n if (typeof item === \"string\") {\n const field: any = form.fields[item]\n return (\n <div\n className={`${field.type} ${field.type}-${field.name}${field.data?.class?` ${field.type}-${field.data.class}`:\"\"}`}\n key={`ff-${form.settings.pk}-${item}`}\n >\n {INPUT_FIELDS.has(field.type) ? (\n <FormElement\n className={classNames({\n [field.data.class]: Boolean(field.data.class),\n error: Boolean(errors[item]),\n })}\n onFocus={(e: React.FocusEvent) => {\n if (onFocus) onFocus(e)\n }}\n onBlur={(e: React.FocusEvent) => {\n if (onBlur) onBlur(e)\n }}\n onClick={(e: React.MouseEvent) => {\n // Only for checkboxes/Radios\n if ([\"checkbox\", \"radio\"].includes(field.input_type)) {\n let newForm = { ...form }\n if (field.input_type === \"checkbox\") {\n newForm.fields = {\n ...form.fields,\n [item]: { ...field, value: !field.value },\n }\n } else {\n // Radio buttons (sets the \"checked\" flag on all radio buttons with same name)\n newForm.fields = Object.entries(form.fields).reduce(\n (acc, [fieldName, attrs]) => {\n acc[fieldName] = attrs //@ts-ignore\n if (attrs.input_name === field.input_name) {\n //@ts-ignore\n acc[fieldName].checked = //@ts-ignore\n field.value === acc[fieldName].value\n }\n return acc\n },\n {} as FormFieldsType\n )\n }\n startTransition(() => {\n setForm(newForm)\n if (errors[item]) {\n setErrors({}) // reset errors\n }\n })\n }\n if (onClick) onClick(e)\n }}\n checked={\n field.input_type === \"radio\" ? !!field.checked : undefined\n }\n onChange={(e: any) => {\n if (![\"checkbox\", \"radio\"].includes(field.input_type)) {\n startTransition(() => {\n setForm({\n ...form,\n fields: {\n ...form.fields,\n [item]: {\n ...field,\n value: getInputEventValue(field.type, e),\n data: e.target?.data\n ? { ...field.data, ...e.target.data }\n : field.data,\n },\n },\n })\n\n if (errors[item]) {\n setErrors({}) // reset errors\n }\n })\n }\n if (onChange) onChange(e)\n }}\n {...{\n ...field,\n value: field.value ? field.value : \"\",\n }}\n />\n ) : (\n // Display Titles, Texts, Links, etc..\n <FormElement {...field} />\n )}\n </div>\n )\n }\n // Otherwise is a section\n return (\n <div\n className={`form-section ${item.name}`}\n key={`ff-${form.settings.pk}-${item.name}`}\n >\n {item.children.map(buildFormElement)}\n </div>\n )\n }\n return (\n <form\n className={className}\n action={form.settings.form_submit}\n method={form.settings.form_method}\n onSubmit={e => handleSubmit(e)}\n noValidate\n >\n {loading ? <Spinner color=\"#00b5ee\" /> : form.items.map(buildFormElement)}\n </form>\n )\n}\n","import React, {\n startTransition,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\"\nimport { CountryPropsType } from \"./types\"\nimport { countryPrefixes } from \"../../utils/location\"\nimport { scrollToChild } from \"../../utils/viewport\"\nimport Markdown from \"../../markdown\"\nimport Icon from \"../icon\"\n\nexport default function Country({\n className,\n label,\n description,\n input_name,\n onClick,\n onChange,\n value,\n placeholder,\n ...props\n}: CountryPropsType) {\n const countriesMap = useMemo(\n () =>\n countryPrefixes.reduce((acc, row) => {\n acc[row[0]] = row[2]\n return acc\n }, {} as any),\n [],\n )\n const [showOptions, setShowOptions] = useState<boolean>(false)\n const [focused, setFocused] = useState<number>(0)\n const [input, setInput] = useState(\"\")\n const inputRef = useRef<HTMLInputElement>(null)\n const listRef = useRef<HTMLUListElement>(null)\n\n const handleSelection = useCallback(\n (focused: number) => {\n onChange?.(countryPrefixes[focused][0] as any)\n startTransition(() => {\n setShowOptions(false)\n setFocused(focused)\n setInput(countryPrefixes[focused][2])\n })\n },\n [onChange, countryPrefixes],\n )\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n const { key, target } = e\n if (key === \"ArrowDown\" || key === \"ArrowUp\") {\n // Logic to navigate through the list items\n startTransition(() => {\n const newFocus =\n key === \"ArrowDown\"\n ? Math.min(focused + 1, countryPrefixes.length - 1)\n : Math.max(focused - 1, 0)\n setFocused(newFocus)\n setInput(countryPrefixes[newFocus][2])\n })\n } else if (key === \"Escape\") {\n startTransition(() => setShowOptions(false))\n } else if (key === \"Enter\") {\n e.preventDefault()\n e.stopPropagation() \n handleSelection(focused)\n } else if(key.length === 1 || key === 'Backspace'){ \n e.preventDefault();\n e.stopPropagation() \n startTransition(() => handleOnChange((key === 'Backspace')? input.slice(0, -1):`${input}${key}`))\n }\n }\n\n const scrollToFocusedCountry = useCallback(() => {\n if (!listRef.current) return\n const element = listRef.current.querySelector(\n `#${props.name ?? \"country\"}__${countryPrefixes[focused][0]}`,\n )\n if (!element) return\n scrollToChild(listRef.current, element as HTMLElement)\n }, [focused, countryPrefixes])\n\n // Focus selected option based on input\n function handleOnChange(value: string) {\n startTransition(() => {\n setInput(value)\n })\n let foundIndex = countryPrefixes.findIndex(row =>\n row[2].toLowerCase().startsWith(input.toLowerCase()),\n )\n if (foundIndex >= 0) {\n startTransition(() => setFocused(foundIndex))\n }\n }\n\n // Handle clicks outside the\n useEffect(() => {\n const handleClickOutside = (e: any) => {\n if (\n inputRef.current &&\n !inputRef.current.contains(e.target) &&\n listRef.current &&\n !listRef.current.contains(e.target)\n ) {\n startTransition(() => setShowOptions(false))\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }, [inputRef, listRef])\n\n useEffect(() => {\n scrollToFocusedCountry()\n }, [focused])\n\n useEffect(() => {\n document.body.classList[showOptions ? \"add\" : \"remove\"](\"no-scroll\")\n if (!inputRef.current) return\n if (showOptions) {\n // Autofocus on open dropdown\n inputRef.current.focus()\n }\n }, [showOptions])\n\n return (\n <label className={`country ${className ? ` ${className}` : \"\"}${!value && placeholder?\" placeholder\":\"\"}`}>\n {!!label && <span>{label}</span>}\n <div\n className=\"selected-country\"\n onClick={() => startTransition(() => setShowOptions(true))}\n >\n {value ? countriesMap[value] : placeholder ?? \"\"}\n <Icon\n className={showOptions ? \"opened\" : \"\"}\n icon={{ icon: \"chevron-right\", group: \"FAS\" }}\n />\n </div>\n <div className={`countries${showOptions ? \" show\" : \"\"}`}>\n <input\n ref={inputRef}\n name={input_name}\n value={input}\n onKeyDown={handleKeyDown}\n onChange={()=>null}\n />\n <ul\n ref={listRef}\n role=\"listbox\"\n tabIndex={-1}\n aria-activedescendant={`${props.name ?? \"country\"}__${\n countryPrefixes[focused][0]\n }`}\n >\n {countryPrefixes.map(([countryCode, _, name], k) => {\n return (\n <li\n className={k === focused ? \"selected\" : \"\"}\n role=\"option\"\n onClick={() => handleSelection(k)}\n aria-selected={k === focused}\n aria-label={name}\n id={`${props.name ?? \"country\"}__${countryCode}`}\n key={`${props.name ?? \"country\"}__${countryCode}`}\n >\n {name}\n </li>\n )\n })}\n </ul>\n </div>\n {!!description && (\n <div>\n <Markdown>{description}</Markdown>\n </div>\n )}\n </label>\n )\n}\n","import { useEffect, useState, MutableRefObject, useRef } from \"react\";\nimport { IntersectionObserverOptionsType } from \"./types\";\n\nconst useIntersectionObserver = (\n ref: MutableRefObject<Element | null>,\n options: IntersectionObserverOptionsType = {}\n): [boolean, () => void] => {\n const { threshold = 0.5, autoDisconnect = true, onIntersect } = options;\n const [isVisible, setIsVisible] = useState(false);\n const observerRef = useRef<IntersectionObserver | null>(null); // Store the observer instance\n\n useEffect(() => {\n observerRef.current = new IntersectionObserver(\n (entries, observer) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n setIsVisible(true); // Element is visible\n onIntersect?.(); // Call onIntersect if defined\n if (autoDisconnect) {\n observer.disconnect(); // Optionally stop observing\n }\n }\n });\n },\n { threshold }\n );\n\n const element = ref.current;\n if (element) {\n observerRef.current.observe(element); // Start observing the element\n }\n\n return () => {\n if (element && observerRef.current) {\n observerRef.current.disconnect();\n }\n // Set observerRef to null once disconnected\n observerRef.current = null;\n };\n }, [ref, threshold, autoDisconnect, onIntersect]);\n\n // Disconnect function that can be called externally\n const disconnect = () => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n }\n };\n\n return [isVisible, disconnect];\n};\n\nexport default useIntersectionObserver;\n","import { format } from \"date-fns\";\nimport { isMobile } from \"./viewport\";\nimport {\n BookingURLsType,\n HotelOptionsByCityType,\n HotelPagesType,\n SearchParamsType,\n} from \"./types\";\n\nfunction RenderTemplate(str: string, obj: any) {\n let parts = str.split(/\\$\\{(?!\\d)[\\wæøåÆØÅ]*\\}/);\n let args = str.match(/[^{}]+(?=})/g) || [];\n let parameters = args.map(\n (argument) =>\n obj[argument] || (obj[argument] === undefined ? \"\" : obj[argument])\n );\n return String.raw({ raw: parts }, ...parameters);\n}\n\nexport const BookingUrl = (\n hotel_code: string,\n urls: BookingURLsType[\"booking_urls\"],\n searchParams: SearchParamsType,\n hasAvailability: boolean,\n rate_code: string | null = null,\n room_code: string | null = null\n) => {\n let params = RenderTemplate(urls.variables, {\n hotel_code: hotel_code,\n check_in: format(\n searchParams.check_in,\n urls.date_format.replace(/m/g, \"M\")\n ),\n check_out: format(\n searchParams.check_out,\n urls.date_format.replace(/m/g, \"M\")\n ),\n adult_count: searchParams.adult_count,\n child_count: searchParams.child_count,\n total_rooms: searchParams.rooms ?? 1,\n rate_code:\n hasAvailability && !searchParams.promo_codes.length && rate_code\n ? rate_code\n : \"\", // rate_code must be removed when there is no availability\n promo_code: searchParams.promo_codes.length\n ? searchParams.promo_codes[0]\n : \"\",\n });\n if (room_code) {\n params += \"&room=\" + room_code;\n }\n\n let url =\n typeof window !== \"undefined\" && isMobile(window.innerWidth)\n ? (hasAvailability ? urls.mobile_url : urls.mobile_url_no_availability) +\n \"&\" +\n params\n : (hasAvailability ? urls.url : urls.url_no_availability) + \"&\" + params;\n\n // console.log(searchParams)\n // console.log(url)\n window.open(url, \"_blank\");\n // window.location.href = url\n};\n\nconst ParseAvailability = (data: any) => {\n if (!data.success) {\n return {};\n }\n data.data.forEach((hotel: any) => {\n hotel.room_rates = {};\n hotel.rates.forEach((room: any) =>\n room.forEach((room_rate: any) => {\n if (!hotel.room_rates.hasOwnProperty(room_rate.room_type_code)) {\n hotel.room_rates[room_rate.room_type_code] = [];\n }\n hotel.room_rates[room_rate.room_type_code].push(room_rate);\n })\n );\n });\n return data.data;\n};\n\n/**\n *\n * Returns Select options sorting by the cities with more hotels, otherwise alphabetically.\n *\n * For instance:\n *\n * [\n * {\n * label: 'Sydney',\n * options: [\n * { label: 'Vibe Hotel Sydney', value: \"58443\" },\n * { label: 'Vibe Hotel Sydney Darling Harbour', value: \"8565\" }\n * ]\n * },\n * {\n * label: 'Mebourne',\n * options: [\n * { label: 'Vibe Hotel Melbourne', value: \"9969\" },\n * ]\n * },\n * ]\n */\nexport const hotelOptionsByCity = (\n hotelPages: HotelPagesType\n): HotelOptionsByCityType[] => {\n let hotelsByCity: { [k: string]: { label: string; value: string }[] } = {\n Sydney: [],\n Melbourne: [],\n Brisbane: [],\n Perth: [],\n Hobart: [],\n Canberra: [],\n Adelaide: [],\n \"Gold Coast\": [],\n Darwin: [],\n Auckland: [],\n Wellington: [],\n Singapore: [],\n };\n const propertyOrder = Object.entries(hotelPages).reduce(\n (acc, [id, hotel]) => {\n if (hotelsByCity[hotel.city]) {\n hotelsByCity[hotel.city].push({ label: hotel.name, value: id });\n } else {\n hotelsByCity[hotel.city] = [{ label: hotel.name, value: id }];\n }\n acc[id] = hotel.sort;\n return acc;\n },\n {} as { [k: string]: number }\n );\n return Object.entries(hotelsByCity).map(([city, options]) => {\n return {\n label: city,\n options: options.sort(\n (a, b) => propertyOrder[a.value] - propertyOrder[b.value]\n ),\n };\n });\n};\n\nexport const SearchAvailability = async (\n check_in: Date,\n check_out: Date,\n adult_count: number,\n child_count: number,\n promo_codes: string[],\n rate_codes: string[],\n hotel_codes: string[]\n) => {\n if (!hotel_codes) {\n throw new Error(\n '\"hotel_codes\" must be defined within the page attributes!'\n );\n }\n return fetch(\n `${process.env.SABRE_PROTOCOL}://${process.env.SABRE_HOST}/availability`,\n {\n headers: { \"Content-Type\": \"application/json\" },\n method: \"POST\",\n body: JSON.stringify({\n check_in: format(check_in, \"yyyy-MM-dd\"),\n check_out: format(check_out, \"yyyy-MM-dd\"),\n hotel_codes: hotel_codes,\n adult_count: adult_count,\n child_count: child_count,\n area_codes: [],\n promo_codes: promo_codes,\n rate_codes: rate_codes,\n price_range: { min: 0, max: 0 },\n is_mobile: typeof window !== \"undefined\" && isMobile(window.innerWidth),\n language: \"en\",\n }),\n }\n )\n .then((response) => response.json())\n .then(\n (data) => ParseAvailability(data),\n (error) => {\n console.log(error);\n }\n );\n};\n\nexport const pricePerNight = (total: string, nights: number): string =>\n (parseFloat(total) / nights).toFixed(2);\n","import { addDays } from \"date-fns\";\nimport { CachedSearchParamsType } from \"./types\";\n\nexport const cachedSearchParams = (): CachedSearchParamsType | null => {\n if (typeof window === \"undefined\") return null;\n let cached: any = localStorage.getItem(\"search-params\");\n if (cached) {\n cached = JSON.parse(cached);\n cached.rate_codes = []; // Bypass Rate\n cached.promo_codes = []; // Bypass Promo codes\n cached.check_in = cached.check_in ? new Date(cached.check_in) : new Date();\n cached.check_out = cached.check_out\n ? new Date(cached.check_out)\n : addDays(new Date(), 1);\n\n // Invalidate cache if dates are in the past\n if (cached.check_in < new Date()) {\n return null;\n }\n }\n return cached;\n};\n\nexport const cacheSearchParams = (searchParams: CachedSearchParamsType) =>\n localStorage.setItem(\"search-params\", JSON.stringify(searchParams));\n","import { UserType } from \"../api/types\";\n\nexport const saveUserSession = (data: any) => {\n sessionStorage.setItem(\n \"user\",\n JSON.stringify({\n loyaltyprofileId: data.loyaltyprofileId,\n profile_id: data.profile_id,\n title: data.title,\n first_name: data.first_name,\n last_name: data.last_name,\n email: data.email,\n zip: data.zip,\n country_code: data.country_code,\n MobilePhoneCountryCode: data.MobilePhoneCountryCode,\n mobile: data.mobile,\n date_of_birth: data.date_of_birth,\n language: data.language,\n } as UserType)\n );\n};\n\nexport const loadUserSession = (): UserType | null => {\n const user = sessionStorage.getItem(\"user\");\n return user ? JSON.parse(user) : null;\n};\n\nexport const deleteUserSession = () => {\n sessionStorage.removeItem(\"user\");\n};\n","export function human_number(n: number, decimals: number = 2) {\n return n.toLocaleString(\"en-US\", {\n useGrouping: false,\n maximumFractionDigits: decimals,\n })\n}\n","import type { RateType, RoomType } from \"./types\";\n\nexport const joinAddress = (addressParams: (string | null)[]) =>\n addressParams\n .reduce((acc: string[], param: string | null) => {\n if (param) {\n acc.push(param);\n }\n return acc;\n }, [])\n .join(\", \");\n\nexport interface PageTagsType {\n [k: string]: string;\n}\n\nexport const tagExists = (\n pageTags: PageTagsType,\n ...tags: string[]\n): boolean => {\n for (const tag of Object.keys(pageTags)) {\n if (tags.includes(tag)) {\n return true;\n }\n }\n return false;\n};\n\nexport const roomFeatures = [\n \"balcony\",\n \"sofa_bed\",\n \"kitchen\",\n \"kitchenette\",\n \"laundry_machine\",\n];\n\n/**\n * Sorts Rooms by predefined `sort` order, or by price if `sortByPrice` is `true`.\n */\nexport const sortRooms = (\n rooms: RoomType[],\n roomRates: { [booking_engine_code: string]: RateType[] },\n sortByPrice: boolean = false\n) => {\n if (sortByPrice) {\n return rooms.sort((a, b) => {\n const aAvailable = Number(Boolean(roomRates[a.booking_engine_code]));\n const bAvailable = Number(Boolean(roomRates[b.booking_engine_code]));\n\n // Prioritize availability (available rooms come first)\n if (aAvailable !== bAvailable) {\n return bAvailable - aAvailable; // `true` (1) comes before `false` (0)\n }\n\n if (aAvailable && bAvailable) {\n // If both are available, extract and convert price\n const aPrice = aAvailable\n ? parseFloat(roomRates[a.booking_engine_code][0].total)\n : Infinity;\n const bPrice = bAvailable\n ? parseFloat(roomRates[b.booking_engine_code][0].total)\n : Infinity;\n\n if (aPrice !== bPrice) {\n return aPrice - bPrice; // Lower price comes first\n }\n }\n // If price is the same, sort by predefined `sort` order\n return a.sort - b.sort;\n });\n }\n // Otherwise, sort by predefined \"room.sort\" order\n return rooms.sort((a, b) => a.sort - b.sort);\n};\n","export const ssoURL = (path: string) =>\n `${process.env.SABRE_SSO_PROTOCOL}://${process.env.SABRE_SSO_HOST}${path}`\n","/**\n * Replace underscores and dashes with spaces\n *\n * @param string\n * @returns string\n */\nexport const toPhrase = (string: string) =>\n string.charAt(0).toUpperCase() +\n string.slice(1).replace(/[_-]/g, \" \").toLowerCase();\n","import { useState, useEffect, startTransition } from \"react\"\nimport { ViewportType } from \"./types\"\nimport { isDesktop, isMobile, isTablet } from \"../utils/viewport\"\n\nfunction UseViewport() {\n const [viewport, setViewport] = useState<ViewportType>('d')\n\n useEffect(() => {\n const resize = () => {\n const width = window.innerWidth\n if(viewport === 'm' ){\n if(isMobile(width)) return\n }else if(viewport === 't'){\n if(isTablet(width)) return\n }else if(viewport === 'd'){\n if(isDesktop(width)) return\n }\n startTransition(() => setViewport(isMobile(width)? \"m\" : isTablet(width)? \"t\" : \"d\"))\n }\n\n resize()\n window.addEventListener(\"resize\", resize)\n return () => {\n window.removeEventListener(\"resize\", resize)\n }\n }, [viewport])\n\n return viewport\n}\n\nexport default UseViewport\n"],"names":["animateJSX","isMobile","width","isTablet","isDesktop","scrollToChild","parent","child","initialDisplayValue","style","display","parentPosition","getBoundingClientRect","childPosition","topOffset","top","bottomOffset","bottom","Math","abs","scrollTop","HideOnDevice","devices","device","length","includes","classNames","classes","displayOn","hidden","hidden_mobile","hidden_tablet","hidden_desktop","ClassNames","json_request","async","url","params","method","headers","process","env","API_HOST","PROJECT","config","toUpperCase","body","JSON","stringify","URLSearchParams","Object","entries","map","k","v","response","fetch","json","status","error","console","success","INPUT_EVENT_VALUES","select","e","value","input","target","textarea","getInputEventValue","inputType","event","hasOwnProperty","INPUT_HUMAN_VALUES","getInputHumanValue","INPUT_FIELDS","Set","optimizedThumb","img","optimized","name","countryPrefixes","FontAwesomeGroups","FAB","FAS","Icon","icon","className","onClick","color","height","group","React","createElement","FontAwesomeIcon","alt","src","enterAnimation","factor","exitAnimation","prefersReducedMotion","shouldReduceMotion","undefined","window","mediaQuery","matchMedia","matches","Toast","id","visible","message","position","variant","animationStyle","getAnimationStyle","enter","exit","animation","keyframes","opacity","toast","dismiss","toastMsg","msg","duration","custom","t","serializeDate","date","parseISO","serializeNumber","n","parseInt","serializeList","str","serializeParam","check_in","check_out","child_count","adult_count","rate_codes","promo_codes","joinPaths","path1","path2","replace","RegExp","Markdown","children","tagAttrs","renderer","marked","Renderer","link","href","title","text","attrs","a","join","setOptions","createMarkup","parse","Fragment","Checkbox","label","description","props","onChange","viewBox","d","fill","transform","strokeWidth","stroke","strokeLinecap","strokeLinejoin","CountryPrefix","input_name","showOptions","setShowOptions","useState","focused","setFocused","setInput","inputRef","useRef","listRef","handleSelection","useCallback","startTransition","scrollToFocusedCountry","current","element","querySelector","useEffect","handleClickOutside","contains","document","addEventListener","removeEventListener","classList","focus","ref","foundIndex","findIndex","row","toLowerCase","startsWith","handleOnChange","onKeyDown","key","newFocus","min","max","preventDefault","stopPropagation","role","tabIndex","countryCode","prefix","_extends","assign","bind","i","arguments","source","prototype","call","apply","this","getCountryCode","place","address_components","component","types","short_name","GooglePlaces$1","GooglePlaces","defaultCountryCode","onFocus","onBlur","data","setPlace","GOOGLEMAPS_KEY","Error","usePlacesWidget","apiKey","onPlaceSelected","formatted_address","found","find","x","autoComplete","placeholder","ExternalLink","animate","scale","setScale","setState","onMouseDown","onMouseUp","onTouchStart","onTouchEnd","to","Link$1","LinkTag","page_slug","PageLink","slug","query_params","external_link","anchor","display_on","buildImage","fallback","sizes","srcSet","sources","sort","b","push","type","index","image_url","getImage","childImageSharp","gatsbyImageData","backgroundColor","layout","images","Image$2","Image","imageData","image","initImage","image_data","mobile_image_data","mobile_image","withArtDirection","media","imageProps","onLoad","Link","link_text","GatsbyImage","Input$1","Input","input_type","iconOnClick","read_only","readOnly","LinkList$1","LinkList","pk","links","getValue","options","option","opt","Select$1","Select","styles","scrollDisabledOnClose","opts","Array","isArray","keys","reduce","acc","values","formatOptions","ReactSelect","onMenuOpen","add","onMenuClose","remove","classNamePrefix","SVG$1","file","Text$1","Text","Textarea$1","Textarea","Title$1","useMemo","Button$1","Button","PrevButton","restProps","NextButton","DotButton","ScreenSizes","mobile","tablet","desktop","wide","fullhd","Carousel$1","Carousel","emblaRef","emblaApi","slidesPerView","slidesPerViewport","slides","gap","showButtons","showDots","showProgress","showScroll","prevIcon","nextIcon","scrollProgress","setScrollProgress","selectedIndex","scrollSnaps","onDotButtonClick","useDots","setSelectedIndex","setScrollSnaps","scrollTo","onInit","scrollSnapList","onSelect","selectedScrollSnap","on","onScroll","progress","prevBtnDisabled","nextBtnDisabled","onPrevButtonClick","onNextButtonClick","useButtons","setPrevBtnDisabled","setNextBtnDisabled","scrollPrev","scrollNext","canScrollPrev","canScrollNext","internalEngine","reInit","axis","slide","disabled","_","concat","toFixed","viewPortGap","viewPortSlides","GatsbyLink$1","GatsbyLink","activeClassName","partiallyActive","internal","Modal$1","Modal","modalId","show","setShowModal","closeWidth","closeHeight","closeIcon","currentTarget","Spinner","size","border","FormElements","Title","checkbox","country","countriesMap","slice","button","FormElement","FormElementWrapper","useIntersectionObserver$1","useIntersectionObserver","threshold","autoDisconnect","onIntersect","isVisible","setIsVisible","observerRef","IntersectionObserver","observer","forEach","entry","isIntersecting","disconnect","observe","BookingUrl","hotel_code","urls","searchParams","hasAvailability","rate_code","room_code","obj","parts","split","parameters","match","argument","String","raw","RenderTemplate","variables","format","date_format","total_rooms","rooms","promo_code","innerWidth","mobile_url","mobile_url_no_availability","url_no_availability","open","form","setForm","errors","setErrors","beforeSubmit","formatParams","validate","validateResponse","onSuccess","onError","afterSubmit","loading","recaptchaReady","setRecaptchaReady","showErrors","showInputName","checkRecaptcha","grecaptcha","execute","setTimeout","executeRecaptcha","RECAPTCHA_V3_SITE_KEY","action","settings","recaptcha_action","warn","buildFormElement","item","field","fields","class","has","Boolean","newForm","fieldName","checked","form_submit","form_method","onSubmit","required","charAt","recaptcha_v3","recaptcha_token","recaptcha","form_ajax_request","submit","form_recipient","newErrors","inputName","errorList","failed","form_success_msg","form_redirection","location","handleSubmit","noValidate","items","hotel_codes","SABRE_PROTOCOL","SABRE_HOST","area_codes","price_range","is_mobile","language","then","hotel","room_rates","rates","room","room_rate","room_type_code","ParseAvailability","log","transition","stage","apiLink","apiPath","queryParams","API_PROTOCOL","toString","localStorage","setItem","cachedSearchParams","cached","getItem","Date","addDays","dealSlug","DEALS_ROOT_SLUG","decodeURIComponent","deleteUserSession","sessionStorage","removeItem","getViewPort","hotelPages","hotelsByCity","Sydney","Melbourne","Brisbane","Perth","Hobart","Canberra","Adelaide","Darwin","Auckland","Wellington","Singapore","propertyOrder","city","decimals","toLocaleString","useGrouping","maximumFractionDigits","isIOS","test","navigator","userAgent","addressParams","param","loadUserSession","user","minimumSlides","slidesToShow","ceil","queryString","rename","pricePerNight","total","nights","parseFloat","loyaltyprofileId","profile_id","first_name","last_name","email","zip","country_code","MobilePhoneCountryCode","date_of_birth","getElementById","elementId","scrollIntoView","behavior","siteUrl","path","PROTOCOL","HOST","sortRooms","roomRates","sortByPrice","aAvailable","Number","booking_engine_code","bAvailable","aPrice","Infinity","bPrice","sp_to_qs","SABRE_SSO_PROTOCOL","SABRE_SSO_HOST","tagExists","pageTags","tags","tag","toImageElement","keyMap","mobile_file","string","viewport","setViewport","resize"],"mappings":"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","x_google_ignoreList":[12]}
|
|
1
|
+
{"version":3,"file":"index.browser.cjs","sources":["../src/browser/utils/animation.ts","../src/browser/utils/viewport.ts","../src/browser/utils/forms.ts","../src/browser/utils/image.ts","../src/browser/utils/location.ts","../src/browser/api/icon/index.tsx","../src/browser/toast/index.tsx","../src/browser/utils/notifications.tsx","../src/browser/utils/url.ts","../src/browser/markdown/index.tsx","../src/browser/api/checkbox/index.tsx","../src/browser/api/country-prefix/index.tsx","../node_modules/@babel/runtime/helpers/esm/extends.js","../src/browser/api/google-places/index.tsx","../src/browser/api/link/index.tsx","../src/browser/api/image/index.tsx","../src/browser/api/input/index.tsx","../src/browser/api/linklist/index.tsx","../src/browser/api/select/index.tsx","../src/browser/api/svg/index.tsx","../src/browser/api/text/index.tsx","../src/browser/api/textarea/index.tsx","../src/browser/api/title/index.tsx","../src/browser/api/button/index.tsx","../src/browser/carousel/buttons/index.tsx","../src/browser/carousel/dots/index.tsx","../src/browser/carousel/index.tsx","../src/browser/gatsby_link/index.tsx","../src/browser/modal/index.tsx","../src/browser/spinner/index.tsx","../src/browser/api/form/index.tsx","../src/browser/api/country/index.tsx","../src/browser/use_intersection_observer/index.ts","../src/browser/utils/booking_engine.ts","../src/browser/utils/search.ts","../src/browser/utils/eclub.ts","../src/browser/utils/number.ts","../src/browser/utils/hotel.ts","../src/browser/utils/requests.ts","../src/browser/utils/string.ts","../src/browser/use_viewport/index.tsx"],"sourcesContent":["import { Stage } from \"react-transition-hook\";\n\nexport const animateJSX = (\n transition: {\n stage: Stage;\n shouldMount: boolean;\n },\n animation: string = \"presence\"\n): string =>\n `jsx__${animation} jsx__${animation}__${\n [\"from\", \"leave\"].includes(transition.stage) ? \"loading\" : \"loaded\"\n }`;\n","import ClassNames from \"classnames\";\n\nexport const isMobile = (width: number) => width < 769;\nexport const isTablet = (width: number) => width >= 769 && width < 1024;\nexport const isDesktop = (width: number) => width >= 1024;\n\nexport const getViewPort = () => {\n if (typeof window === \"undefined\") {\n throw new Error(\"getViewPort() requires browser window!\");\n }\n if (isMobile(window.innerWidth)) {\n return \"m\";\n }\n if (isTablet(window.innerWidth)) {\n return \"t\";\n }\n return \"d\";\n};\n\nexport const scrollToElement = async (elementId: string) => {\n document.getElementById(elementId)?.scrollIntoView({ behavior: \"smooth\" });\n};\n\nexport const scrollToChild = (parent: HTMLElement, child: HTMLElement) => {\n const initialDisplayValue = parent.style.display;\n // HACK: can't use getBoundingClientRect when display is 'none'\n if (initialDisplayValue !== \"block\") {\n parent.style.display = \"block\";\n }\n\n // can't use scrollIntoView because of scroll event bubbling\n const parentPosition = parent.getBoundingClientRect();\n const childPosition = child.getBoundingClientRect();\n\n const topOffset = childPosition.top - parentPosition.top;\n const bottomOffset = parentPosition.bottom - childPosition.bottom;\n\n const isChildVisible = topOffset >= 0 && bottomOffset >= 0;\n\n if (!isChildVisible) {\n if (Math.abs(topOffset) < Math.abs(bottomOffset)) {\n // element above the container\n parent.scrollTop += topOffset;\n } else {\n // element below the container\n parent.scrollTop -= bottomOffset;\n }\n }\n\n parent.style.display = initialDisplayValue;\n};\n\nexport const isIOS = () => /iPad|iPhone|iPod/.test(navigator.userAgent);\n\n// Returns the device ID depending on the viewport width (d: Desktop, t: Tablet, m: Mobile)\nexport const deviceId = (width: number) =>\n width > 1023 ? \"d\" : width > 768 ? \"t\" : \"m\";\n\nconst HideOnDevice = (devices: Array<string>, device: string): boolean =>\n device ? !!devices.length && !devices.includes(device) : !devices.length;\n\nexport const classNames = (\n classes: { [k: string]: boolean },\n displayOn: Array<string> | null = null\n): any => {\n if (displayOn) {\n classes.hidden = HideOnDevice(displayOn, \"\");\n classes.hidden_mobile = HideOnDevice(displayOn, \"m\");\n classes.hidden_tablet = HideOnDevice(displayOn, \"t\");\n classes.hidden_desktop = HideOnDevice(displayOn, \"d\");\n }\n return ClassNames(classes);\n};\n","export interface RequestParamsType {\n [param: string]: string | number | null;\n}\nexport interface HeadersType {\n [param: string]: string;\n}\n\nexport interface APIResponseType {\n success?: boolean;\n errors?: { [input: string]: string[] };\n error?: string;\n msg?: string;\n status: number;\n [k: string]: any;\n}\nexport const json_request = async (\n url: string,\n params: RequestParamsType,\n method: \"get\" | \"post\" = \"post\",\n headers: HeadersType = {}\n): Promise<APIResponseType> => {\n if (url.includes(process.env.API_HOST as string)) {\n headers[\"project-id\"] = process.env.PROJECT as string;\n }\n let config: any = {\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n method: method.toUpperCase(),\n };\n if (method === \"post\") {\n config.body = JSON.stringify(params);\n } else {\n url = `${url}?${new URLSearchParams(\n Object.entries(params).map(([k, v]) => [k, v === null ? \"\" : `${v}`])\n )}`;\n }\n try {\n let response = await fetch(url, config);\n return { ...(await response.json()), status: response.status };\n } catch (error) {\n console.error(error);\n return { success: false, error: \"Request failed\", status: 400 };\n }\n};\n\nconst INPUT_EVENT_VALUES: any = {\n select: (e: any) => e.value,\n input: (e: any) => e.target.value,\n textarea: (e: any) => e.target.value,\n \"google-places\": (e: any) => e.target.value,\n};\n\nexport const getInputEventValue = (inputType: string, event: any) =>\n INPUT_EVENT_VALUES.hasOwnProperty(inputType)\n ? INPUT_EVENT_VALUES[inputType](event)\n : event;\n\nconst INPUT_HUMAN_VALUES: any = {};\n\nexport const getInputHumanValue = (inputType: string, value: any) =>\n INPUT_HUMAN_VALUES.hasOwnProperty(inputType)\n ? INPUT_HUMAN_VALUES[inputType](value)\n : value;\n\nexport const INPUT_FIELDS = new Set([\n \"input\",\n \"select\",\n \"textarea\",\n \"checkbox\",\n \"button\",\n \"recaptcha2\",\n \"google-places\",\n \"country-prefix\",\n \"country\",\n \"hidden\",\n]);\n","import { ImageMediaType, ImageType } from \"../api/types\";\nimport { isMobile } from \"./viewport\";\n\nexport const preloadImages = async (images: string[]) => {\n images.forEach((url: string) => {\n if (url) {\n const img = new Image();\n img.src = url;\n }\n });\n};\n\nexport const optimizedThumb = (img: ImageType): string =>\n img.optimized ? `${img.url}${img.name}-20w.webp` : img.url;\n\n// Extract the Thumb image from the provided Image (if any)\nexport const getThumb = (img: {\n image?: ImageType;\n mobile_image?: ImageType;\n}): string => {\n if (img.image || img.mobile_image) {\n return typeof window !== \"undefined\" && isMobile(window.innerWidth)\n ? img.mobile_image\n ? optimizedThumb(img.mobile_image) // @ts-ignore\n : optimizedThumb(img.image)\n : img.image\n ? optimizedThumb(img.image) // @ts-ignore\n : optimizedThumb(img.mobile_image);\n }\n return \"\";\n};\n\n// Creates a valid image element\nexport const toImageElement = (obj: any, keyMap: any = {}): ImageMediaType => {\n return Object.entries(obj).reduce(\n (acc: any, [key, value]: any) => {\n acc[keyMap[key] || key] = value;\n return acc;\n },\n {\n type: \"image\",\n title: \"\",\n loading: \"eager\",\n image: undefined,\n mobile_image: undefined,\n mobile_file: undefined,\n }\n );\n};\n\n// Slick breaks when his number or slides is equal or less than the param \"slidesToShow\"\n// Therefore we duplicate the slides in case of not having enough of them:\nexport const minimumSlides = (slidesToShow: number, slides: any[]) =>\n slides.length >= slidesToShow\n ? slides\n : [].concat(\n ...new Array(Math.ceil(slidesToShow / slides.length)).fill(slides)\n );\n\n// Gets an image URL out of a ImageMediaType\nexport const imageUrl = (\n img: ImageType,\n format = \"webp\",\n sizes = [1408, 1216, 1024, 769]\n): string =>\n img.optimized\n ? `${img.url}${img.name}-${\n sizes.find((w) => w <= img.width) || img.width\n }w.${format}`\n : img.url;\n","export const countryPrefixes = [\n [\"AF\", \"93\", \"Afghanistan\"],\n [\"AL\", \"355\", \"Albania\"],\n [\"DZ\", \"213\", \"Algeria\"],\n [\"AD\", \"376\", \"Andorra\"],\n [\"AO\", \"244\", \"Angola\"],\n [\"AG\", \"1268\", \"Antigua and Barbuda\"],\n [\"AR\", \"54\", \"Argentina\"],\n [\"AM\", \"374\", \"Armenia\"],\n [\"AW\", \"297\", \"Aruba\"],\n [\"AU\", \"61\", \"Australia\"],\n [\"AT\", \"43\", \"Austria\"],\n [\"AZ\", \"994\", \"Azerbaijan\"],\n [\"BS\", \"1242\", \"Bahamas\"],\n [\"BH\", \"973\", \"Bahrain\"],\n [\"BD\", \"880\", \"Bangladesh\"],\n [\"BB\", \"1246\", \"Barbados\"],\n [\"BY\", \"375\", \"Belarus\"],\n [\"BE\", \"32\", \"Belgium\"],\n [\"BZ\", \"501\", \"Belize\"],\n [\"BJ\", \"229\", \"Benin\"],\n [\"BT\", \"975\", \"Bhutan\"],\n [\"BO\", \"591\", \"Bolivia\"],\n [\"BA\", \"387\", \"Bosnia and Herzegovina\"],\n [\"BW\", \"267\", \"Botswana\"],\n [\"BR\", \"55\", \"Brazil\"],\n [\"IO\", \"246\", \"British Indian Ocean Territory\"],\n [\"BN\", \"673\", \"Brunei\"],\n [\"BG\", \"359\", \"Bulgaria\"],\n [\"BF\", \"226\", \"Burkina Faso\"],\n [\"BI\", \"257\", \"Burundi\"],\n [\"KH\", \"855\", \"Cambodia\"],\n [\"CM\", \"237\", \"Cameroon\"],\n [\"CA\", \"1\", \"Canada\"],\n [\"CV\", \"238\", \"Cape Verde\"],\n [\"BQ\", \"599\", \"Caribbean Netherlands\"],\n [\"CF\", \"236\", \"Central African Republic\"],\n [\"TD\", \"235\", \"Chad\"],\n [\"CL\", \"56\", \"Chile\"],\n [\"CN\", \"86\", \"China\"],\n [\"CO\", \"57\", \"Colombia\"],\n [\"KM\", \"269\", \"Comoros\"],\n [\"CD\", \"243\", \"Congo\"],\n [\"CG\", \"242\", \"Congo\"],\n [\"CR\", \"506\", \"Costa Rica\"],\n [\"CI\", \"225\", \"Côte d'Ivoire\"],\n [\"HR\", \"385\", \"Croatia\"],\n [\"CU\", \"53\", \"Cuba\"],\n [\"CW\", \"599\", \"Curaçao\"],\n [\"CY\", \"357\", \"Cyprus\"],\n [\"CZ\", \"420\", \"Czech Republic\"],\n [\"DK\", \"45\", \"Denmark\"],\n [\"DJ\", \"253\", \"Djibouti\"],\n [\"DM\", \"1767\", \"Dominica\"],\n [\"DO\", \"1\", \"Dominican Republic\"],\n [\"EC\", \"593\", \"Ecuador\"],\n [\"EG\", \"20\", \"Egypt\"],\n [\"SV\", \"503\", \"El Salvador\"],\n [\"GQ\", \"240\", \"Equatorial Guinea\"],\n [\"ER\", \"291\", \"Eritrea\"],\n [\"EE\", \"372\", \"Estonia\"],\n [\"ET\", \"251\", \"Ethiopia\"],\n [\"FJ\", \"679\", \"Fiji\"],\n [\"FI\", \"358\", \"Finland\"],\n [\"FR\", \"33\", \"France\"],\n [\"GF\", \"594\", \"French Guiana\"],\n [\"PF\", \"689\", \"French Polynesia\"],\n [\"GA\", \"241\", \"Gabon\"],\n [\"GM\", \"220\", \"Gambia\"],\n [\"GE\", \"995\", \"Georgia\"],\n [\"DE\", \"49\", \"Germany\"],\n [\"GH\", \"233\", \"Ghana\"],\n [\"GR\", \"30\", \"Greece\"],\n [\"GD\", \"1473\", \"Grenada\"],\n [\"GP\", \"590\", \"Guadeloupe\"],\n [\"GU\", \"1671\", \"Guam\"],\n [\"GT\", \"502\", \"Guatemala\"],\n [\"GN\", \"224\", \"Guinea\"],\n [\"GW\", \"245\", \"Guinea-Bissau\"],\n [\"GY\", \"592\", \"Guyana\"],\n [\"HT\", \"509\", \"Haiti\"],\n [\"HN\", \"504\", \"Honduras\"],\n [\"HK\", \"852\", \"Hong Kong\"],\n [\"HU\", \"36\", \"Hungary\"],\n [\"IS\", \"354\", \"Iceland\"],\n [\"IN\", \"91\", \"India\"],\n [\"ID\", \"62\", \"Indonesia\"],\n [\"IR\", \"98\", \"Iran\"],\n [\"IQ\", \"964\", \"Iraq\"],\n [\"IE\", \"353\", \"Ireland\"],\n [\"IL\", \"972\", \"Israel\"],\n [\"IT\", \"39\", \"Italy\"],\n [\"JM\", \"1876\", \"Jamaica\"],\n [\"JP\", \"81\", \"Japan\"],\n [\"JO\", \"962\", \"Jordan\"],\n [\"KZ\", \"7\", \"Kazakhstan\"],\n [\"KE\", \"254\", \"Kenya\"],\n [\"KI\", \"686\", \"Kiribati\"],\n [\"XK\", \"383\", \"Kosovo\"],\n [\"KW\", \"965\", \"Kuwait\"],\n [\"KG\", \"996\", \"Kyrgyzstan\"],\n [\"LA\", \"856\", \"Laos\"],\n [\"LV\", \"371\", \"Latvia\"],\n [\"LB\", \"961\", \"Lebanon\"],\n [\"LS\", \"266\", \"Lesotho\"],\n [\"LR\", \"231\", \"Liberia\"],\n [\"LY\", \"218\", \"Libya\"],\n [\"LI\", \"423\", \"Liechtenstein\"],\n [\"LT\", \"370\", \"Lithuania\"],\n [\"LU\", \"352\", \"Luxembourg\"],\n [\"MO\", \"853\", \"Macau\"],\n [\"MK\", \"389\", \"Macedonia\"],\n [\"MG\", \"261\", \"Madagascar\"],\n [\"MW\", \"265\", \"Malawi\"],\n [\"MY\", \"60\", \"Malaysia\"],\n [\"MV\", \"960\", \"Maldives\"],\n [\"ML\", \"223\", \"Mali\"],\n [\"MT\", \"356\", \"Malta\"],\n [\"MH\", \"692\", \"Marshall Islands\"],\n [\"MQ\", \"596\", \"Martinique\"],\n [\"MR\", \"222\", \"Mauritania\"],\n [\"MU\", \"230\", \"Mauritius\"],\n [\"MX\", \"52\", \"Mexico\"],\n [\"FM\", \"691\", \"Micronesia\"],\n [\"MD\", \"373\", \"Moldova\"],\n [\"MC\", \"377\", \"Monaco\"],\n [\"MN\", \"976\", \"Mongolia\"],\n [\"ME\", \"382\", \"Montenegro\"],\n [\"MA\", \"212\", \"Morocco\"],\n [\"MZ\", \"258\", \"Mozambique\"],\n [\"MM\", \"95\", \"Myanmar\"],\n [\"NA\", \"264\", \"Namibia\"],\n [\"NR\", \"674\", \"Nauru\"],\n [\"NP\", \"977\", \"Nepal\"],\n [\"NL\", \"31\", \"Netherlands\"],\n [\"NC\", \"687\", \"New Caledonia\"],\n [\"NZ\", \"64\", \"New Zealand\"],\n [\"NI\", \"505\", \"Nicaragua\"],\n [\"NE\", \"227\", \"Niger\"],\n [\"NG\", \"234\", \"Nigeria\"],\n [\"KP\", \"850\", \"North Korea\"],\n [\"NO\", \"47\", \"Norway\"],\n [\"OM\", \"968\", \"Oman\"],\n [\"PK\", \"92\", \"Pakistan\"],\n [\"PW\", \"680\", \"Palau\"],\n [\"PS\", \"970\", \"Palestine\"],\n [\"PA\", \"507\", \"Panama\"],\n [\"PG\", \"675\", \"Papua New Guinea\"],\n [\"PY\", \"595\", \"Paraguay\"],\n [\"PE\", \"51\", \"Peru\"],\n [\"PH\", \"63\", \"Philippines\"],\n [\"PL\", \"48\", \"Poland\"],\n [\"PT\", \"351\", \"Portugal\"],\n [\"PR\", \"1\", \"Puerto Rico\"],\n [\"QA\", \"974\", \"Qatar\"],\n [\"RE\", \"262\", \"Réunion\"],\n [\"RO\", \"40\", \"Romania\"],\n [\"RU\", \"7\", \"Russia\"],\n [\"RW\", \"250\", \"Rwanda\"],\n [\"KN\", \"1869\", \"Saint Kitts and Nevis\"],\n [\"LC\", \"1758\", \"Saint Lucia\"],\n [\"VC\", \"1784\", \"Saint Vincent and the Grenadines\"],\n [\"WS\", \"685\", \"Samoa\"],\n [\"SM\", \"378\", \"San Marino\"],\n [\"ST\", \"239\", \"São Tomé and Príncipe\"],\n [\"SA\", \"966\", \"Saudi Arabia\"],\n [\"SN\", \"221\", \"Senegal\"],\n [\"RS\", \"381\", \"Serbia\"],\n [\"SC\", \"248\", \"Seychelles\"],\n [\"SL\", \"232\", \"Sierra Leone\"],\n [\"SG\", \"65\", \"Singapore\"],\n [\"SK\", \"421\", \"Slovakia\"],\n [\"SI\", \"386\", \"Slovenia\"],\n [\"SB\", \"677\", \"Solomon Islands\"],\n [\"SO\", \"252\", \"Somalia\"],\n [\"ZA\", \"27\", \"South Africa\"],\n [\"KR\", \"82\", \"South Korea\"],\n [\"SS\", \"211\", \"South Sudan\"],\n [\"ES\", \"34\", \"Spain\"],\n [\"LK\", \"94\", \"Sri Lanka\"],\n [\"SD\", \"249\", \"Sudan\"],\n [\"SR\", \"597\", \"Suriname\"],\n [\"SZ\", \"268\", \"Swaziland\"],\n [\"SE\", \"46\", \"Sweden\"],\n [\"CH\", \"41\", \"Switzerland\"],\n [\"SY\", \"963\", \"Syria\"],\n [\"TW\", \"886\", \"Taiwan\"],\n [\"TJ\", \"992\", \"Tajikistan\"],\n [\"TZ\", \"255\", \"Tanzania\"],\n [\"TH\", \"66\", \"Thailand\"],\n [\"TL\", \"670\", \"Timor-Leste\"],\n [\"TG\", \"228\", \"Togo\"],\n [\"TO\", \"676\", \"Tonga\"],\n [\"TT\", \"1868\", \"Trinidad and Tobago\"],\n [\"TN\", \"216\", \"Tunisia\"],\n [\"TR\", \"90\", \"Turkey\"],\n [\"TM\", \"993\", \"Turkmenistan\"],\n [\"TV\", \"688\", \"Tuvalu\"],\n [\"UG\", \"256\", \"Uganda\"],\n [\"UA\", \"380\", \"Ukraine\"],\n [\"AE\", \"971\", \"United Arab Emirates\"],\n [\"GB\", \"44\", \"United Kingdom\"],\n [\"US\", \"1\", \"United States\"],\n [\"UY\", \"598\", \"Uruguay\"],\n [\"UZ\", \"998\", \"Uzbekistan\"],\n [\"VU\", \"678\", \"Vanuatu\"],\n [\"VA\", \"39\", \"Vatican City\"],\n [\"VE\", \"58\", \"Venezuela\"],\n [\"VN\", \"84\", \"Vietnam\"],\n [\"YE\", \"967\", \"Yemen\"],\n [\"ZM\", \"260\", \"Zambia\"],\n [\"ZW\", \"263\", \"Zimbabwe\"],\n];\n","import React from \"react\"\nimport { FontAwesomeIcon } from \"@fortawesome/react-fontawesome\"\nimport { IconPropsType, FontAwesomeGroupsType } from \"./types\"\n// import { StaticImage } from \"gatsby-plugin-image\"\n\n \nconst FontAwesomeGroups: FontAwesomeGroupsType = {\n FAB: \"fab\",\n FAS: \"fas\",\n}\n\n\nconst Icon = ({ icon, className, onClick, color, width, height }: IconPropsType) => {\n return FontAwesomeGroups.hasOwnProperty(icon.group) ? (\n <FontAwesomeIcon\n className={className}\n color={color}\n onClick={onClick}\n icon={[FontAwesomeGroups[icon.group], icon.icon]}\n />\n ) : (\n <img className={className} width={width} height={height} alt={icon.icon} onClick={onClick} src={`/icons/${icon.group}/${icon.icon}.svg`} />\n ) \n}\n\nexport default Icon\n","import React, { FC, ReactNode } from \"react\"\nimport { toast, ToastPosition } from \"react-hot-toast\"\nimport { keyframes } from \"goober\"\nimport Icon from \"../api/icon\"\n\n\nconst enterAnimation = (factor: number) => `\n0% {transform: translate3d(0,${factor * -200}%,0) scale(.6); opacity:.5;}\n100% {transform: translate3d(0,0,0) scale(1); opacity:1;}\n`\n\nconst exitAnimation = (factor: number) => `\n0% {transform: translate3d(0,0,-1px) scale(1); opacity:1;}\n100% {transform: translate3d(0,${factor * -150}%,-1px) scale(.6); opacity:0;}\n`\n\nconst fadeInAnimation = `0%{opacity:0;} 100%{opacity:1;}`\nconst fadeOutAnimation = `0%{opacity:1;} 100%{opacity:0;}`\n\nconst prefersReducedMotion = (() => {\n // Cache result\n let shouldReduceMotion: boolean | undefined = undefined\n\n return () => {\n if (shouldReduceMotion === undefined && typeof window !== \"undefined\") {\n const mediaQuery = matchMedia(\"(prefers-reduced-motion: reduce)\")\n shouldReduceMotion = !mediaQuery || mediaQuery.matches\n }\n return shouldReduceMotion\n }\n})()\n\nconst getAnimationStyle = (\n position: ToastPosition,\n visible: boolean\n): React.CSSProperties => {\n const top = position.includes(\"top\")\n const factor = top ? 1 : -1\n\n const [enter, exit] = prefersReducedMotion()\n ? [fadeInAnimation, fadeOutAnimation]\n : [enterAnimation(factor), exitAnimation(factor)]\n\n return {\n animation: visible\n ? `${keyframes(enter)} 0.35s cubic-bezier(.21,1.02,.73,1) forwards`\n : `${keyframes(exit)} 0.4s forwards cubic-bezier(.06,.71,.55,1)`,\n }\n}\n\nexport interface ToastProps {\n id: string\n visible: boolean\n message: string | ReactNode\n height?: number\n position?: ToastPosition\n variant: \"error\" | \"info\" | \"success\"\n}\n\nexport const Toast: FC<ToastProps> = ({\n id,\n visible,\n message,\n height,\n position,\n variant,\n}) => {\n const animationStyle: React.CSSProperties = height\n ? getAnimationStyle(position || \"top-center\", visible)\n : { opacity: 0 }\n\n return (\n <div\n className={`toast ${visible ? \"animate-enter\" : \"animate-leave\"} ${variant}`}\n style={{\n ...animationStyle,\n }}\n >\n <button className={\"close\"} onClick={() => toast.dismiss(id)}><Icon icon={{icon:\"close\", group:\"GLO\"}} /></button>\n {message}\n </div>\n )\n}\n\nexport default Toast\n","import toast from \"react-hot-toast\"\nimport React, { ReactNode } from \"react\"\nimport Toast from \"../toast\"\n\nexport const toastMsg = (\n msg: string | ReactNode,\n variant: \"error\" | \"info\" | \"success\" = \"error\",\n duration: number = 10000\n) => {\n toast.custom(\n (t:any) => (\n <Toast\n id={t.id}\n visible={t.visible}\n message={msg}\n variant={variant}\n height={t.height}\n position={t.position}\n />\n ),\n {\n duration: duration,\n }\n )\n}\n","import { parseISO, format } from \"date-fns\";\nimport slugify from \"slugify\";\n\nexport interface QueryParamsType {\n [key: string]: string;\n}\n\nexport const siteUrl = (path: string = \"\") =>\n `${process.env.PROTOCOL}://${process.env.HOST}${path}`;\n\nconst serializeDate = (date: string) => {\n try {\n return date ? parseISO(date) : undefined;\n } catch (e) {\n return undefined;\n }\n};\nconst serializeNumber = (n: string) => {\n try {\n return n ? parseInt(n) : undefined;\n } catch (e) {\n return undefined;\n }\n};\nconst serializeList = (str: string): string[] => (str ? [str] : []);\n\nconst serializeParam: any = {\n check_in: serializeDate,\n check_out: serializeDate,\n child_count: serializeNumber,\n adult_count: serializeNumber,\n rate_codes: serializeList,\n promo_codes: serializeList,\n};\n\n/**\n * Extracts query params from an URL\n *\n * @param queryString String with query params\n * @param rename Object for renaming params, e.g: {\"oldParam\": \"newParam\"}\n * @returns Object with the parsed params\n */\nexport function parseQueryParams(\n queryString: string,\n rename: { [k: string]: string } = {}\n): QueryParamsType {\n if (!queryString) return {};\n // Transform rate_code and promo_code into their corresponding plurals\n rename = { rate_code: \"rate_codes\", promo_code: \"promo_codes\", ...rename };\n return queryString\n .slice(1)\n .split(\"&\")\n .reduce((acc: QueryParamsType, param: string) => {\n let [key, value] = param.split(\"=\");\n key = decodeURIComponent(key);\n value = decodeURIComponent(value || \"\");\n if (rename[key]) {\n key = rename[key];\n }\n acc[key] = serializeParam.hasOwnProperty(key)\n ? serializeParam[key](value)\n : value;\n return acc;\n }, {});\n}\n\nexport const joinPaths = (path1: string, path2: string): string =>\n `${path1.replace(new RegExp(`/$`), \"\")}/${path2.replace(\n new RegExp(`^/`),\n \"\"\n )}`;\n\nexport const dealLink = (dealSlug: string): string => {\n if (!process.env.DEALS_ROOT_SLUG)\n throw new Error(\"The env variable DEALS_ROOT_SLUG is not defined!\");\n return joinPaths(process.env.DEALS_ROOT_SLUG as string, dealSlug);\n};\n\nexport const apiLink = (\n apiPath: string = \"\",\n queryParams: QueryParamsType | null = null\n): string =>\n `${joinPaths(\n `${process.env.API_PROTOCOL}://${process.env.API_HOST}`,\n apiPath\n )}${queryParams ? `?${new URLSearchParams(queryParams).toString()}` : \"\"}`;\n\n/**\n *\n * Transforms Search params into a query string\n *\n * hotel_codes: Filters the displayed hotels (when defined).\n */\nexport const sp_to_qs = (\n check_in: Date,\n check_out: Date,\n adult_count: number,\n child_count: number,\n rate_codes: string[],\n promo_codes: string[],\n hotel_codes: string | undefined = undefined,\n rooms: number = 1\n) =>\n `?check_in=${format(check_in, \"yyyy-MM-dd\")}&check_out=${format(\n check_out,\n \"yyyy-MM-dd\"\n )}&adult_count=${adult_count}&child_count=${child_count}&promo_code=${\n promo_codes?.length ? promo_codes[0] : \"\"\n }&rate_code=${rate_codes?.length ? rate_codes[0] : \"\"}${\n hotel_codes ? `&hotel_codes=${hotel_codes}` : \"\"\n }&rooms=${rooms}`;\n\nexport const decodeQuotePlus = (text: string) =>\n decodeURIComponent(text.replace(/\\+/g, \"%20\"));\n","import React from \"react\"\nimport { marked } from \"marked\"\nimport parse from \"html-react-parser\"\nimport { MarkdownPropsType } from \"./types\"\n\nexport default function Markdown({\n children,\n className,\n tagAttrs,\n onClick,\n}: MarkdownPropsType) {\n const renderer = new marked.Renderer()\n renderer.link = (href, title, text) => {\n let attrs = {\n href: href,\n title: title ?? \"\",\n target: \"_blank\",\n }\n if (tagAttrs?.a) {\n attrs = { ...attrs, ...tagAttrs?.a }\n }\n return `<a ${Object.entries(attrs)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(\" \")}>${text}</a>`\n }\n marked.setOptions({ renderer })\n\n const createMarkup = () => parse(children ? (marked(children) as string) : \"\")\n\n return (\n <>\n {className || onClick ? (\n <div className={className} onClick={onClick}>\n {createMarkup()}\n </div>\n ) : (\n <>{createMarkup()}</>\n )}\n </>\n )\n}\n","import React from \"react\"\nimport { CheckboxPropsType } from \"./types\"\nimport Markdown from \"../../markdown\"\n\nexport default function Checkbox({\n className,\n label,\n description,\n ...props\n}: CheckboxPropsType) {\n return (\n <label\n className={`checkbox${props.value ? \" checked\" : \"\"}${className ? ` ${className}` : \"\"}`}\n onClick={props.onClick}\n onChange={props.onChange}\n >\n {!!label && <span>{label}</span>}\n <svg\n id={props.id}\n width={props.width ? props.width : 30}\n height={props.height ? props.height : 30}\n viewBox=\"0 0 440 440\"\n >\n <path\n className=\"box\"\n d=\"M 72 136 C 72 100.654 100.654 72 136 72 L 304 72 C 339.346 72 368 100.654 368 136 L 368 304 C 368 339.346 339.346 368 304 368 L 136 368 C 100.654 368 72 339.346 72 304 Z\"\n fill={props.color ? props.color : \"#58595b\"}\n />\n <path\n className=\"tick\"\n d=\"M 160 180 L 210 250 L 340 130\"\n transform=\"translate(40 65) rotate(-10 70.904 438.687)\"\n fill=\"transparent\"\n strokeWidth={30}\n stroke=\"white\"\n strokeLinecap=\"square\"\n strokeLinejoin=\"miter\"\n />\n </svg>\n {!!description && (\n <div>\n <Markdown>{description}</Markdown>\n </div>\n )}\n </label>\n )\n}\n","import React, {\n startTransition,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\"\nimport { PhonePropsType } from \"./types\"\nimport { countryPrefixes } from \"../../utils/location\"\nimport { scrollToChild } from \"../../utils/viewport\"\nimport Markdown from \"../../markdown\"\nimport Icon from \"../icon\"\n\nexport default function CountryPrefix({\n className,\n label,\n description,\n input_name,\n onClick,\n onChange,\n value,\n ...props\n}: PhonePropsType) {\n const [showOptions, setShowOptions] = useState<boolean>(false)\n const [focused, setFocused] = useState<number>(0)\n const [input, setInput] = useState(\"\")\n const inputRef = useRef<HTMLInputElement>(null)\n const listRef = useRef<HTMLUListElement>(null)\n\n const handleSelection = useCallback(\n (focused: number) => {\n onChange?.(countryPrefixes[focused][1] as any)\n startTransition(() => {\n setShowOptions(false)\n setFocused(focused)\n setInput(countryPrefixes[focused][2])\n })\n },\n [onChange, countryPrefixes],\n )\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n const { key } = e\n if (key === \"ArrowDown\" || key === \"ArrowUp\") {\n // Logic to navigate through the list items\n startTransition(() => {\n const newFocus =\n key === \"ArrowDown\"\n ? Math.min(focused + 1, countryPrefixes.length - 1)\n : Math.max(focused - 1, 0)\n setFocused(newFocus)\n setInput(countryPrefixes[newFocus][2])\n })\n } else if (key === \"Escape\") {\n startTransition(() => setShowOptions(false))\n } else if (key === \"Enter\") {\n e.preventDefault()\n e.stopPropagation()\n handleSelection(focused)\n }\n }\n\n const scrollToFocusedCountry = useCallback(() => {\n if (!listRef.current) return\n const element = listRef.current.querySelector(\n `#${props.name ?? \"country-prefix\"}__${countryPrefixes[focused][0]}`,\n )\n if (!element) return\n scrollToChild(listRef.current, element as HTMLElement)\n }, [focused, countryPrefixes])\n\n // Focus selected option based on input\n function handleOnChange(value: string) {\n startTransition(() => {\n setInput(value)\n })\n let foundIndex = countryPrefixes.findIndex(row =>\n row[2].toLowerCase().startsWith(input.toLowerCase()),\n )\n if (foundIndex >= 0) {\n startTransition(() => setFocused(foundIndex))\n }\n }\n\n // Handle clicks outside the\n useEffect(() => {\n const handleClickOutside = (e: any) => {\n if (\n inputRef.current &&\n !inputRef.current.contains(e.target) &&\n listRef.current &&\n !listRef.current.contains(e.target)\n ) {\n startTransition(() => setShowOptions(false))\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }, [inputRef, listRef])\n \n useEffect(() => {\n scrollToFocusedCountry()\n }, [focused])\n\n useEffect(() => {\n document.body.classList[showOptions ? \"add\" : \"remove\"](\"no-scroll\")\n if (!inputRef.current) return\n if (showOptions) {\n // Autofocus on open dropdown\n inputRef.current.focus()\n }\n }, [showOptions])\n\n return (\n <label className={`country-prefix ${className ? ` ${className}` : \"\"}`}>\n {!!label && <span>{label}</span>}\n <div\n className=\"selected-prefix\"\n onClick={() => startTransition(() => setShowOptions(true))}\n >\n +{value ?? countryPrefixes[0][1]}\n <Icon\n className={showOptions ? \"opened\" : \"\"}\n icon={{ icon: \"chevron-right\", group: \"FAS\" }}\n />\n </div>\n <div className={`countries-prefixes${showOptions ? \" show\" : \"\"}`}>\n <input\n ref={inputRef}\n name={input_name}\n value={input}\n onChange={e => handleOnChange(e.target.value)}\n onKeyDown={handleKeyDown}\n />\n <ul\n ref={listRef}\n role=\"listbox\"\n tabIndex={-1}\n aria-activedescendant={`${props.name ?? \"country-prefix\"}__${\n countryPrefixes[focused][0]\n }`}\n >\n {countryPrefixes.map(([countryCode, prefix, name], k) => {\n return (\n <li\n className={k === focused ? \"selected\" : \"\"}\n role=\"option\"\n onClick={() => handleSelection(k)}\n aria-selected={k === focused}\n aria-label={`${name} +${prefix}`}\n id={`${props.name ?? \"country-prefix\"}__${countryCode}`}\n key={`${props.name ?? \"country-prefix\"}__${countryCode}`}\n >\n {name} +{prefix}\n </li>\n )\n })}\n </ul>\n </div>\n {!!description && (\n <div>\n <Markdown>{description}</Markdown>\n </div>\n )}\n </label>\n )\n}\n","export default function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}","import React, { useEffect, useState } from \"react\"\nimport { usePlacesWidget } from \"react-google-autocomplete\"\nimport { GooglePlacesPropsType, PlaceType } from \"./types\"\nimport { countryPrefixes } from \"../../utils/location\"\n\nconst getCountryCode = (place: google.maps.places.PlaceResult) => {\n if (place.address_components) {\n for (const component of place.address_components) {\n if (component.types[0] == \"country\") {\n return component.short_name\n }\n }\n }\n return null\n}\n\nconst GooglePlaces = ({\n label,\n name,\n input_name,\n value, \n defaultCountryCode,\n onChange,\n onClick,\n onFocus,\n onBlur,\n data,\n ...props\n}: GooglePlacesPropsType) => {\n const [place, setPlace] = useState<PlaceType | undefined>()\n\n if (!process.env.GOOGLEMAPS_KEY) {\n throw new Error(\"The environment variable GOOGLEMAPS_KEY is not defined!\")\n }\n\n const { ref }: any = usePlacesWidget({\n apiKey: process.env.GOOGLEMAPS_KEY,\n onPlaceSelected: place =>\n setPlace({\n target: {\n value: place.formatted_address,\n data: { countryCode: getCountryCode(place) },\n },\n }),\n ...data,\n })\n\n useEffect(() => {\n if (onChange && place) {\n onChange(place as any)\n }\n }, [place])\n\n // Init country when countryCode is provided\n useEffect(() => {\n if (!defaultCountryCode || value || place) return\n const found = countryPrefixes.find(\n x => x[0] === defaultCountryCode.toLowerCase()\n )\n if (found) {\n setPlace({\n target: {\n value: found[2],\n data: { countryCode: defaultCountryCode },\n },\n })\n }\n }, [defaultCountryCode])\n\n return (\n <label className={`google-places label-${name}`}>\n {!!label && <span>{label}</span>}\n\n <input\n ref={ref}\n name={input_name}\n autoComplete=\"off\"\n onChange={onChange}\n onClick={onClick}\n onFocus={onFocus}\n onBlur={onBlur}\n value={value}\n placeholder={props.placeholder ?? undefined}\n {...props}\n />\n </label>\n )\n}\n\nexport default GooglePlaces\n","import React, { useState } from \"react\"\nimport { Link as PageLink } from \"gatsby\"\nimport { LinkPropsType, ExternalLinkPropsType } from \"./types\"\nimport Icon from \"../icon\"\nimport {classNames} from \"../../utils/viewport\"\n\nconst ExternalLink = ({ animate = true, ...props }: ExternalLinkPropsType) => {\n const [scale, setScale] = useState(1)\n\n const setState = (n: number) => {\n if (animate) {\n setScale(n)\n }\n }\n\n return (\n <a\n className={props.className}\n onMouseDown={() => setState(0.95)}\n onMouseUp={() => setState(1)}\n onTouchStart={() => setState(0.95)}\n onTouchEnd={() => setState(1)}\n title={props.title}\n href={props.to}\n target={ props.target? props.target : props.to? \"_blank\" : undefined}\n onClick={props.onClick}\n >\n {props.children}\n </a>\n )\n}\n\nconst Link = (props: LinkPropsType) => {\n const LinkTag = props.page_slug ? PageLink : ExternalLink\n let slug = (props.page_slug ? `${props.page_slug}${props.query_params?`?${props.query_params}`:\"\"}` : props.external_link?? \"\") as string\n if (props.anchor) {\n slug = `${slug}#${props.anchor}`\n }\n return (\n <LinkTag\n className={`${props.className??\"\"}${props.display_on?` ${classNames({}, props.display_on)}` : \"\"}`}\n to={slug}\n title={props.title}\n target={props.target}\n onClick={props.onClick}\n animate={props.animate}\n >\n {!!props.icon && <Icon icon={props.icon} />}\n {props.children ? props.children : props.text}\n </LinkTag>\n )\n}\n\nexport default Link\n","import React from \"react\"\nimport {\n GatsbyImage,\n getImage,\n withArtDirection,\n IGatsbyImageData,\n} from \"gatsby-plugin-image\"\nimport { ImageType } from \"../types\"\nimport { ImagePropsType } from \"./types\"\nimport classNames from \"classnames\"\nimport Link from \"../link\"\n\nconst buildImage = (img: ImageType): IGatsbyImageData | undefined => {\n if (!img) {\n return undefined\n }\n\n let fallback = {\n src: img.url,\n sizes: \"100vw\",\n srcSet: \"\",\n }\n let sources = []\n let placeholder = { fallback: img.url }\n const sizes = [img.width, 360, 769, 1024, 1216, 1408].sort((a, b) => a - b)\n\n if (img.optimized) {\n fallback.src = img.url + img.name + \"-\" + img.width + \"w.jpg\"\n placeholder.fallback = img.url + img.name + \"-20w.jpg\"\n sources.push({ sizes: \"100vw\", srcSet: \"\", type: \"image/avif\" })\n sources.push({ sizes: \"100vw\", srcSet: \"\", type: \"image/webp\" })\n for (let index in sizes) {\n if (sizes[index] > img.width) {\n break\n }\n let image_url =\n (index === \"0\" ? \"\" : \",\") + img.url + img.name + \"-\" + sizes[index]\n fallback.srcSet += image_url + \"w.jpg \" + sizes[index] + \"w\"\n sources[0].srcSet += image_url + \"w.avif \" + sizes[index] + \"w\"\n sources[1].srcSet += image_url + \"w.webp \" + sizes[index] + \"w\"\n }\n }\n\n return getImage({\n childImageSharp: {\n gatsbyImageData: {\n backgroundColor: \"transparent\",\n height: img.height / img.width,\n width: 1,\n layout: \"fullWidth\",\n placeholder: placeholder,\n images: {\n fallback: fallback,\n sources: sources,\n },\n },\n },\n })\n}\n\nconst Image = ({ imageData, ...props }: ImagePropsType) => {\n const initImage = () => {\n const image_data = buildImage(props.image as ImageType)\n const mobile_image_data = buildImage(props.mobile_image as ImageType)\n return image_data && mobile_image_data // If mobile image exists, it must be added using Art Direction.\n ? withArtDirection(image_data, [\n {\n media: \"(max-width: 768px)\",\n image: mobile_image_data,\n },\n ])\n : image_data\n }\n let image = imageData ?? initImage()\n if (!image) {\n return <span>Missing image!</span>\n }\n const imageProps = {\n className:classNames({\n [\"mobile-img\"]: !!props.image && !!props.mobile_image,\n [props.className as string]: !!props.className,\n }),\n image:image,\n onLoad:props.onLoad,\n alt:props.image?.alt ? props.image.alt : \"\",\n style:props.style\n }\n return props.page_slug || props.external_link?\n ( <Link page_slug={props.page_slug} external_link={props.external_link} title={props.link_text} >\n <GatsbyImage {...imageProps} />\n </Link>\n ) : <GatsbyImage {...imageProps} />\n\n}\n\nexport default Image\n","import React from \"react\"\nimport { InputPropsType } from \"./types\"\nimport Markdown from \"../../markdown\"\nimport Icon from \"../icon\"\n\n\nconst Input = ({\n label,\n type,\n input_type,\n description,\n name,\n input_name,\n icon,\n iconOnClick,\n read_only,\n className,\n ...props\n}: InputPropsType) => {\n return (\n <label\n className={`input label-${name}${\n input_type === \"hidden\" ? \" hidden\" : \"\"\n }${className?` label-${className}`:\"\"}`}\n >\n {!!label && <span>{label}</span>}\n {!!icon && <Icon icon={icon} onClick={iconOnClick} />}\n <input\n type={input_type}\n name={input_name}\n readOnly={read_only}\n className={className}\n {...props}\n />\n {!!description && (\n <div className=\"desc\">\n <div>\n <Markdown>{description}</Markdown>\n </div>\n </div>\n )}\n </label>\n )\n}\n\nexport default Input\n","import React from \"react\"\nimport { LinkType } from \"../types\"\nimport { LinkListPropsType } from \"./types\"\nimport Link from \"../link\"\n\nconst LinkList = ({ pk, ...props }: LinkListPropsType) => {\n return (\n <ul className={props.className}>\n {props.links.map((link: LinkType, k: number) => (\n <li key={`LinkList${pk}-${k}`}>\n <Link {...link}>{props.children}</Link>\n </li>\n ))}\n </ul>\n )\n}\nexport default LinkList\n","import React from \"react\"\nimport ReactSelect from \"react-select\"\nimport {\n GroupedOptionsType,\n OptionType,\n OptionsType,\n SelectPropsType,\n} from \"./types\"\n\n/**\n * Transforms the options into the allowed format, which could be either\n *\n * - Normal options:\n * [\n * {label: \"option 1\", value: \"1\"},\n * {label: \"option 2\", value: \"2\"},\n * ...\n * ]\n *\n * - Grouped options:\n * [\n * {label: \"Group 1\", options: [{label: \"option 1\", value: \"1\"}, {label: \"option 2\", value: \"2\"}, ..]},\n * {label: \"Group 2\", options: [{label: \"option 3\", value: \"3\"}, {label: \"option 4\", value: \"4\"}, ..]},\n * ...\n * ]\n */\nconst formatOptions = (\n options: OptionsType\n): (OptionType | GroupedOptionsType)[] => {\n if (Array.isArray(options)) {\n return options\n }\n return typeof options[Object.keys(options)[0]] === \"string\"\n ? Object.entries(options).reduce((acc, [value, label]) => {\n // @ts-ignore\n acc.push({ label: label, value: value })\n return acc\n }, [] as OptionType[])\n : Object.entries(options).reduce((acc, [label, values]) => {\n acc.push({\n label: label,\n options: Object.entries(values).reduce(\n (opts, [k, v]) => [...opts, { label: v, value: k }],\n [] as OptionType[]\n ),\n })\n return acc\n }, [] as GroupedOptionsType[])\n}\n\nconst getValue = (\n options: (OptionType | GroupedOptionsType)[],\n value: string\n): any => {\n for (let option of options) {\n if (option.hasOwnProperty(\"options\")) {\n for (let opt of (option as GroupedOptionsType).options) {\n if (value === opt.value) {\n return opt\n }\n }\n return option\n } else if (value === (option as OptionType).value) {\n return option\n }\n }\n return null\n}\n\nconst Select: React.FC<SelectPropsType> = ({\n value,\n styles,\n options,\n label,\n scrollDisabledOnClose,\n ...props\n}) => {\n const opts = formatOptions(options) as any\n\n return (\n <label\n className={\"label-\" + (props.className ? props.className : props.name)}\n >\n {!!label && <span>{label}</span>}\n <ReactSelect\n options={opts}\n value={typeof value === \"string\" ? getValue(opts, value) : value}\n styles={styles}\n onMenuOpen={() => document.body.classList.add(\"no-scroll\")}\n onMenuClose={() => !scrollDisabledOnClose && document.body.classList.remove(\"no-scroll\")}\n classNamePrefix=\"select\"\n {...props}\n />\n </label>\n \n )\n}\n\nexport default Select\n","import React from \"react\"\nimport { FilePropsType } from \"./types\"\n\nconst SVG = (props: FilePropsType) => {\n return <img className={props.className} src={props.file.url} />\n}\n\nexport default SVG\n","import React from \"react\"\nimport { TextPropsType } from \"./types\"\nimport Markdown from \"../../markdown\"\nimport Icon from \"../icon\"\n\n\nconst Text = ({text, icon, ...props}: TextPropsType) => {\n return (\n <div className={props.className}>\n {!!icon && <Icon icon={icon} />} <Markdown tagAttrs={props.tagAttrs}>{text}</Markdown>\n </div>\n )\n}\n\nexport default Text\n","import React from \"react\"\n\nconst Textarea = ({ label, ...props }: any) => {\n return (\n <label className={`textarea label-${props.name}`}>\n {!!label && <span>{label}</span>}\n <textarea {...props} />\n </label>\n )\n}\n\nexport default Textarea\n","import React, { useMemo } from \"react\"\nimport { TitlePropsType } from \"./types\"\nimport Markdown from \"../../markdown\"\n\nconst Title = (props: TitlePropsType) => {\n const data = useMemo(() => {\n return props.title && props.title[0] === \"#\"\n ? props.title\n : `### ${props.title}`\n }, [props.title])\n\n return (\n <Markdown className={props.className} onClick={props.onClick}>\n {data}\n </Markdown>\n )\n}\n\nexport default Title\n","import React from \"react\"\nimport { ButtonPropsType } from \"./types\"\n\nconst Button: React.FC<ButtonPropsType> = ({ ...props }) => {\n return (\n <button\n className={props.className}\n type={props.input_type ?? \"button\"}\n onClick={props.onClick}\n >\n {props.value}\n </button>\n )\n}\n\nexport default Button;","import React, { useCallback, useEffect, useState } from \"react\"\nimport { EmblaCarouselType } from \"embla-carousel\"\nimport { PropType, UseButtonsType } from \"./types\"\n\nexport const useButtons = (\n emblaApi: EmblaCarouselType | undefined,\n showButtons: boolean | undefined\n): UseButtonsType => {\n const [prevBtnDisabled, setPrevBtnDisabled] = useState(true)\n const [nextBtnDisabled, setNextBtnDisabled] = useState(true)\n\n const onPrevButtonClick = useCallback(() => {\n if (!emblaApi) return\n emblaApi.scrollPrev()\n }, [emblaApi])\n\n const onNextButtonClick = useCallback(() => {\n if (!emblaApi) return\n emblaApi.scrollNext()\n }, [emblaApi])\n\n const onSelect = useCallback((emblaApi: EmblaCarouselType) => {\n setPrevBtnDisabled(!emblaApi.canScrollPrev())\n setNextBtnDisabled(!emblaApi.canScrollNext())\n }, [])\n\n useEffect(() => {\n if (!emblaApi || !showButtons) return\n\n onSelect(emblaApi)\n emblaApi.on(\"reInit\", onSelect)\n emblaApi.on(\"select\", onSelect)\n }, [emblaApi, onSelect])\n\n return {\n prevBtnDisabled,\n nextBtnDisabled,\n onPrevButtonClick,\n onNextButtonClick,\n }\n}\n\nexport const PrevButton: React.FC<PropType> = props => {\n const { children, icon, ...restProps } = props\n\n return (\n <button\n className=\"embla__button embla__button--prev\"\n type=\"button\"\n {...restProps}\n >\n {icon? icon: <svg className=\"embla__button__svg\" viewBox=\"0 0 532 532\">\n <path\n fill=\"currentColor\"\n d=\"M355.66 11.354c13.793-13.805 36.208-13.805 50.001 0 13.785 13.804 13.785 36.238 0 50.034L201.22 266l204.442 204.61c13.785 13.805 13.785 36.239 0 50.044-13.793 13.796-36.208 13.796-50.002 0a5994246.277 5994246.277 0 0 0-229.332-229.454 35.065 35.065 0 0 1-10.326-25.126c0-9.2 3.393-18.26 10.326-25.2C172.192 194.973 332.731 34.31 355.66 11.354Z\"\n />\n </svg>}\n {children}\n </button>\n )\n}\n\nexport const NextButton: React.FC<PropType> = props => {\n const { children, icon, ...restProps } = props\n\n return (\n <button\n className=\"embla__button embla__button--next\"\n type=\"button\"\n {...restProps}\n >\n {icon? icon:\n <svg className=\"embla__button__svg\" viewBox=\"0 0 532 532\">\n <path\n fill=\"currentColor\"\n d=\"M176.34 520.646c-13.793 13.805-36.208 13.805-50.001 0-13.785-13.804-13.785-36.238 0-50.034L330.78 266 126.34 61.391c-13.785-13.805-13.785-36.239 0-50.044 13.793-13.796 36.208-13.796 50.002 0 22.928 22.947 206.395 206.507 229.332 229.454a35.065 35.065 0 0 1 10.326 25.126c0 9.2-3.393 18.26-10.326 25.2-45.865 45.901-206.404 206.564-229.332 229.52Z\"\n />\n </svg>}\n {children}\n </button>\n )\n}\n","import React, { useCallback, useEffect, useState } from \"react\"\nimport { EmblaCarouselType } from \"embla-carousel\"\nimport { PropType, UseDotsType } from \"./types\"\n\nexport const useDots = (\n emblaApi: EmblaCarouselType | undefined,\n showDots: boolean | undefined\n): UseDotsType => {\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [scrollSnaps, setScrollSnaps] = useState<number[]>([])\n\n const onDotButtonClick = useCallback(\n (index: number) => {\n if (!emblaApi) return\n emblaApi.scrollTo(index)\n },\n [emblaApi]\n )\n\n const onInit = useCallback((emblaApi: EmblaCarouselType) => {\n setScrollSnaps(emblaApi.scrollSnapList())\n }, [])\n\n const onSelect = useCallback((emblaApi: EmblaCarouselType) => {\n setSelectedIndex(emblaApi.selectedScrollSnap())\n }, [])\n\n useEffect(() => {\n if (!emblaApi || !showDots) return\n\n onInit(emblaApi)\n onSelect(emblaApi)\n emblaApi.on(\"reInit\", onInit)\n emblaApi.on(\"reInit\", onSelect)\n emblaApi.on(\"select\", onSelect)\n }, [emblaApi, onInit, onSelect])\n\n return {\n selectedIndex,\n scrollSnaps,\n onDotButtonClick,\n }\n}\n\nexport const DotButton: React.FC<PropType> = props => {\n const { children, ...restProps } = props\n\n return (\n <button type=\"button\" {...restProps}>\n {children}\n </button>\n )\n}\n","import React, { startTransition, useCallback, useEffect, useState } from \"react\"\nimport { EmblaCarouselType } from \"embla-carousel\"\nimport type { CarouselPropsType, ScreenSizesType, ViewPortKeyType} from \"./types\"\nimport { useButtons } from \"./buttons\"\nimport { useDots,DotButton } from \"./dots\"\nimport { NextButton, PrevButton } from \"./buttons\"\n\n\nexport const ScreenSizes: ScreenSizesType = {\n mobile: \"(max-width: 768px)\",\n tablet: \"(min-width: 769px) and (max-width: 1023px)\",\n desktop: \"(min-width: 1024px) and (max-width: 1215px)\",\n wide:\"(min-width: 1216px) and (max-width: 1407)\",\n fullhd:\"(min-width: 1408px)\",\n}\n\nconst Carousel: React.FC<CarouselPropsType> = ({\n id,\n emblaRef,\n emblaApi,\n slidesPerView,\n slidesPerViewport,\n slides,\n gap,\n height,\n showButtons,\n showDots,\n showProgress,\n showScroll,\n prevIcon,\n nextIcon,\n}) => {\n const [scrollProgress, setScrollProgress] = useState(0)\n const { selectedIndex, scrollSnaps, onDotButtonClick } = useDots(\n emblaApi,\n showDots\n )\n const [options, setOptions] = useState({} as any)\n\n // Calculate Carousel progress\n const onScroll = useCallback((emblaApi: EmblaCarouselType) => {\n const progress = Math.max(0, Math.min(1, emblaApi.scrollProgress()))\n setScrollProgress(progress * 100)\n }, [])\n\n const {\n prevBtnDisabled,\n nextBtnDisabled,\n onPrevButtonClick,\n onNextButtonClick,\n } = useButtons(emblaApi, showButtons)\n\n useEffect(() => {\n if (!emblaApi || (!showProgress && !showScroll)) return\n\n onScroll(emblaApi)\n emblaApi.on(\"reInit\", onScroll)\n emblaApi.on(\"scroll\", onScroll)\n }, [emblaApi, onScroll])\n\n // Fixes mobile issue of disabled navigation.\n useEffect(() => {\n if (emblaApi) {\n startTransition(() => {\n setOptions(emblaApi.internalEngine().options ?? ({} as any))\n emblaApi.reInit()\n })\n }\n }, [emblaApi])\n\n useEffect(() => {\n if (options?.axis === \"y\" && !height) {\n throw Error('Vertical carousel needs \"slideHeight\" prop')\n }\n }, [options])\n\n\n return (\n <div id={id} className={`embla${options.axis === 'y' ? ' vertical':''}`}>\n <div className=\"embla__viewport\" ref={emblaRef}>\n <div className=\"embla__container\">\n {slides.map((slide, k) => (\n <div className=\"embla__slide\" key={`${id}-slide-${k}`}>\n {slide}\n </div>\n ))}\n </div>\n </div>\n {!!showButtons && (\n <>\n <PrevButton onClick={onPrevButtonClick} disabled={prevBtnDisabled} icon={prevIcon} />\n <NextButton onClick={onNextButtonClick} disabled={nextBtnDisabled} icon={nextIcon} />\n </>\n )}\n {!!showDots && (\n <div className=\"embla__dots\">\n {scrollSnaps.map((_: any, index: number) => (\n <DotButton\n key={index}\n onClick={() => onDotButtonClick(index)}\n className={\"embla__dot\".concat(\n index === selectedIndex ? \" embla__dot--selected\" : \"\"\n )}\n />\n ))}\n </div>\n )}\n {!!showProgress && (\n <div className=\"embla__progress\">\n <div\n className=\"embla__progress__bar\"\n style={{ transform: `translate3d(${scrollProgress}%,0px,0px)` }}\n />\n </div>\n )}\n {!!showScroll && (\n <div className=\"embla__scroll\">\n <div className=\"embla__scroll__bar\" />\n </div>\n )}\n <style>\n {!!Object.keys(options).length &&\n `\n #${id} > .embla__viewport > .embla__container{\n margin-${options.axis === 'y'?'top':'left'}: calc(${gap?? 0}px * -1);\n ${height?`height: calc(${gap? gap : 0}px + ${height}px);`:\"\"}\n }\n #${id} > .embla__scroll > .embla__scroll__bar{\n width: ${slides.length <= slidesPerView?\"100%\":\"50%\"};\n transform: translate3d(${scrollProgress}%,0px,0px);\n }\n #${id} > .embla__viewport > .embla__container > .embla__slide{\n flex: 0 0 ${(100 / slidesPerView).toFixed(2)}%;\n padding-${options.axis === 'y'?'top':'left'}: ${gap? gap : 0}px;\n }\n ${\n slidesPerViewport\n ? Object.entries(slidesPerViewport).map(([device, opts]) => {\n let viewPortGap: number |null = opts.gap? opts.gap: gap?? null\n let viewPortSlides = opts.slides\n \n return `@media ${ScreenSizes[device as ViewPortKeyType]} {\n #${id} > .embla__viewport > .embla__container{\n ${\n viewPortGap !== null\n ? `margin-${options.axis === 'y'?'top':'left'}: calc(${viewPortGap}px * -1);`\n : \"\"\n }\n ${viewPortGap !== null && opts?.height?`height: calc(${viewPortGap}px + ${opts.height}px);`:\"\"}\n } \n #${id} > .embla__scroll > .embla__scroll__bar{\n width: ${slides.length <= viewPortSlides?\"100%\":\"50%\"};\n }\n #${id} > .embla__viewport > .embla__container > .embla__slide {\n flex: 0 0 ${(100 / viewPortSlides).toFixed(2)}%;\n ${viewPortGap !== null ? `padding-${options.axis === 'y'?'top':'left'}: ${viewPortGap}px;` : \"\"}\n }\n }`\n }).join(\"\\n\")\n : \"\"\n }\n `}\n </style>\n </div>\n )\n}\n\nexport default Carousel\n","import React from \"react\"\nimport { Link } from \"gatsby\"\nimport { GatsbyLinkProps } from \"./types\"\n\nconst GatsbyLink: React.FC<GatsbyLinkProps> = ({ children, to, activeClassName, partiallyActive, internal=true, ...props }) => ( \n // Assumes that any link is internal by default (Gatsby navigation)\n // but when internal=false use external links: <a>.\n internal ? \n <Link\n to={to}\n activeClassName={activeClassName}\n partiallyActive={partiallyActive}\n {...props}\n >\n {children}\n </Link>\n :\n <a href={to} {...props}>\n {children}\n </a>)\n \n\n\nexport default GatsbyLink\n","import React, { useEffect } from \"react\"\nimport { ModalPropsType } from \"./types\"\nimport Icon from \"../api/icon\"\n\nconst Modal = ({\n modalId,\n show,\n className,\n setShowModal,\n children,\n closeWidth,\n closeHeight,\n closeIcon = { icon: \"times\", group: \"FAS\" },\n}: ModalPropsType) => {\n useEffect(() => {\n document.body.classList[show ? \"add\" : \"remove\"](\"no-scroll\")\n }, [show])\n return (\n <div\n className={`modal-layout${show ? \" opened\" : \"\"}`}\n onClick={e => {\n // Close Modal when clicking outside:\n if (e.target === e.currentTarget) {\n setShowModal(modalId, false)\n }\n }}\n >\n <div className={`modal${className ? ` ${className}` : \"\"}`}>\n <div className=\"modal-body\">{children}</div>\n <button className=\"close\" onClick={() => setShowModal(modalId, false)}>\n <Icon icon={closeIcon} width={closeWidth} height={closeHeight} />\n </button>\n </div>\n </div>\n )\n}\n\nexport default Modal\n","import React from \"react\"\nimport { SpinnerPropsType } from \"./types\"\n\nexport default function Spinner({ color, size, className }: SpinnerPropsType) {\n return (\n <div\n className={`spinner-box${className ? ` ${className}` : \"\"}`}\n >\n <div\n className=\"spinner\"\n style={{\n border: `5px solid ${color ? color : \"white\"}`,\n width: size ? size : 45,\n height: size ? size : 45,\n }}\n ></div>\n </div>\n )\n}\n","import React, { startTransition, useCallback, useEffect, useState } from \"react\"\nimport { ErrorsType, FormPropsType } from \"./types\"\nimport { toastMsg } from \"../../utils/notifications\"\nimport {\n INPUT_FIELDS,\n getInputEventValue,\n getInputHumanValue,\n json_request,\n} from \"../../utils/forms\"\nimport type { \n FormFieldsType,\n FormItemType,\n} from \"../../utils/types\"\nimport classNames from \"classnames\"\nimport Markdown from \"../../markdown\"\nimport Spinner from \"../../spinner\"\nimport Link from \"../link\"\nimport Title from \"../title\"\nimport Text from \"../text\"\nimport Input from \"../input\"\nimport Textarea from \"../textarea\"\nimport Checkbox from \"../checkbox\"\nimport Country from \"../country\"\nimport CountryPrefix from \"../country-prefix\"\nimport Select from \"../select\"\nimport Button from \"../button\"\nimport GooglePlaces from \"../google-places\"\nimport Image from \"../image\"\n\n\n\nexport const FormElements: any = {\n link: Link,\n title: Title,\n text: Text,\n input: Input,\n textarea: Textarea,\n checkbox: Checkbox,\n \"country\": Country,\n \"country-prefix\": CountryPrefix,\n select: Select,\n button: Button,\n \"google-places\": GooglePlaces,\n image: Image,\n hidden: Input\n}\n\nexport const FormElement = (props: any) => {\n if (FormElements.hasOwnProperty(props.type)) {\n const FormElementWrapper = FormElements[props.type]\n return <FormElementWrapper {...props} />\n }\n console.error(`Element \"${props.type}\" not supported by <Form />!`)\n return <></>\n}\n\n\nexport default function Form({\n className,\n form,\n setForm,\n errors,\n setErrors,\n beforeSubmit,\n formatParams,\n validate,\n validateResponse,\n onSuccess,\n onFocus,\n onBlur,\n onClick,\n onChange,\n onError,\n afterSubmit,\n loading,\n}: FormPropsType) {\n const [recaptchaReady, setRecaptchaReady] = useState(false);\n\n const showErrors = (errors: ErrorsType, showInputName: boolean = true) => (\n <div>\n <ul className={\"error\"}>\n {Object.entries(errors).map(([input, error], k: number) => (\n <li key={`error-form${k}`}>\n <span>\n {showInputName ? <strong>{input}:</strong> : \"\"} {error}\n </span>\n </li>\n ))}\n </ul>\n </div>\n )\n\n useEffect(() => {\n // Function to check if grecaptcha is loaded\n const checkRecaptcha = () => {\n if ((window as any).grecaptcha?.execute) {\n setRecaptchaReady(true);\n return\n } \n setTimeout(checkRecaptcha, 500); // Retry in 0.5s if not loaded\n };\n\n checkRecaptcha(); \n }, []);\n\n\n const executeRecaptcha = useCallback(async () => {\n if(!process.env.RECAPTCHA_V3_SITE_KEY){\n console.error(\"RECAPTCHA_V3_SITE_KEY is not defined!\")\n return null\n }\n if (!(window as any).grecaptcha?.execute) {\n console.warn(\"reCAPTCHA not yet loaded.\");\n return null;\n }\n return await (window as any).grecaptcha.execute(process.env.RECAPTCHA_V3_SITE_KEY, {action: form.settings.recaptcha_action?? 'submit'});\n }, [recaptchaReady]);\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault()\n let errors: any = {}\n let params = Object.values(form.fields).reduce((acc, field:any) => {\n if (INPUT_FIELDS.has(field.type)) {\n if (field.required && !field.value) {\n const fieldName = field.label ? field.label : field.placeholder\n errors[field.input_name] =`${fieldName.charAt(0).toUpperCase()}${fieldName.slice(1).toLowerCase()} is required`\n return acc\n }\n // Skip non-checked radio buttons\n if (field.input_type === \"radio\" && !field.checked) {\n return acc\n }\n // Skip submit buttons\n if (field.input_type === \"submit\") {\n return acc\n }\n // @ts-ignore\n acc[field.input_name] = getInputHumanValue(field.type, field.value)\n }\n return acc\n }, {} as any)\n\n // Get reCAPTCHA v3 token\n if (form.settings.recaptcha_v3) {\n params.recaptcha_token = await executeRecaptcha()\n if (!params.recaptcha_token) {\n errors.recaptcha = \"reCAPTCHA failed!\"\n }\n }\n\n // Check recaptcha v2 if it's within the fields\n if (form.fields.recaptcha && !params.recaptcha) {\n errors.recaptcha = \"Recaptcha is mandatory\"\n }\n\n if (validate) {\n errors = { ...errors, ...validate(form.fields, params) }\n }\n if (Object.keys(errors).length) {\n startTransition(() => {\n setErrors(errors)\n toastMsg(showErrors(errors, false))\n })\n return\n }\n\n if (beforeSubmit) {\n beforeSubmit(form)\n }\n\n if (formatParams) {\n params = formatParams(params)\n }\n\n // If is not an AJAX request, the page will be redirected into the form submit URL\n if (!form.settings.form_ajax_request) {\n // @ts-ignore\n return e.target.submit()\n }\n const response = await json_request(\n form.settings.form_submit,\n params,\n form.settings.form_method,\n form.settings.form_recipient\n ? {\n \"recipient-id\": `${form.settings.form_recipient}`,\n }\n : {}\n )\n startTransition(() => {\n // ON SUCCESS:\n if (\n response.status === 200 &&\n (!validateResponse || validateResponse(response))\n ) {\n if (onSuccess) {\n // Execute onSuccess action when defined:\n onSuccess(response, form.settings.form_success_msg)\n } else {\n // Otherwise just show success message:\n toastMsg(\n form.settings.form_success_msg ? (\n <Markdown>{form.settings.form_success_msg}</Markdown>\n ) : (\n \"Success! Your form has been successfully sent. Thank you for reaching out, we will get back to you as soon as possible.\"\n ),\n \"success\"\n )\n }\n\n if (form.settings.form_redirection) {\n setTimeout(() => {\n window.location.href = form.settings.form_redirection as string\n }, 3000)\n }\n\n // Reset all form values:\n setForm({\n ...form,\n fields: Object.entries(form.fields).reduce((acc, [name, field]) => {\n acc[name] = ![\"button\", \"hidden\"].includes(field.type) && INPUT_FIELDS.has(field.type) // @ts-ignore\n ? { ...field, value: \"\" }\n : field\n return acc\n }, {} as FormFieldsType),\n })\n // ON ERROR:\n } else if (onError) {\n onError(response)\n // ELSE ON ERROR:\n } else if (response.errors) {\n let newErrors: ErrorsType = Object.entries(response.errors).reduce(\n (acc, [inputName, errorList]) => {\n acc[inputName] = errorList.join(\", \")\n return acc\n },\n {} as ErrorsType\n )\n toastMsg(showErrors(newErrors))\n setErrors(newErrors)\n // ELSE ON ERROR:\n } else if (response.error) {\n toastMsg(\n showErrors(\n {\n failed: response.error ? (\n <Markdown>{response.error}</Markdown>\n ) : (\n \"Oops. Something went wrong. Please try again later, or contact us at members@tfehotels.com\"\n ),\n },\n false\n )\n )\n }\n })\n\n if (afterSubmit) {\n afterSubmit(response)\n }\n }\n\n\n const buildFormElement = (item: FormItemType) => {\n if (typeof item === \"string\") {\n const field: any = form.fields[item]\n return (\n <div\n className={`${field.type} ${field.type}-${field.name}${field.data?.class?` ${field.type}-${field.data.class}`:\"\"}`}\n key={`ff-${form.settings.pk}-${item}`}\n >\n {INPUT_FIELDS.has(field.type) ? (\n <FormElement\n className={classNames({\n [field.data.class]: Boolean(field.data.class),\n error: Boolean(errors[item]),\n })}\n onFocus={(e: React.FocusEvent) => {\n if (onFocus) onFocus(e)\n }}\n onBlur={(e: React.FocusEvent) => {\n if (onBlur) onBlur(e)\n }}\n onClick={(e: React.MouseEvent) => {\n // Only for checkboxes/Radios\n if ([\"checkbox\", \"radio\"].includes(field.input_type)) {\n let newForm = { ...form }\n if (field.input_type === \"checkbox\") {\n newForm.fields = {\n ...form.fields,\n [item]: { ...field, value: !field.value },\n }\n } else {\n // Radio buttons (sets the \"checked\" flag on all radio buttons with same name)\n newForm.fields = Object.entries(form.fields).reduce(\n (acc, [fieldName, attrs]) => {\n acc[fieldName] = attrs //@ts-ignore\n if (attrs.input_name === field.input_name) {\n //@ts-ignore\n acc[fieldName].checked = //@ts-ignore\n field.value === acc[fieldName].value\n }\n return acc\n },\n {} as FormFieldsType\n )\n }\n startTransition(() => {\n setForm(newForm)\n if (errors[item]) {\n setErrors({}) // reset errors\n }\n })\n }\n if (onClick) onClick(e)\n }}\n checked={\n field.input_type === \"radio\" ? !!field.checked : undefined\n }\n onChange={(e: any) => {\n if (![\"checkbox\", \"radio\"].includes(field.input_type)) {\n startTransition(() => {\n setForm({\n ...form,\n fields: {\n ...form.fields,\n [item]: {\n ...field,\n value: getInputEventValue(field.type, e),\n data: e.target?.data\n ? { ...field.data, ...e.target.data }\n : field.data,\n },\n },\n })\n\n if (errors[item]) {\n setErrors({}) // reset errors\n }\n })\n }\n if (onChange) onChange(e)\n }}\n {...{\n ...field,\n value: field.value ? field.value : \"\",\n }}\n />\n ) : (\n // Display Titles, Texts, Links, etc..\n <FormElement {...field} />\n )}\n </div>\n )\n }\n // Otherwise is a section\n return (\n <div\n className={`form-section ${item.name}`}\n key={`ff-${form.settings.pk}-${item.name}`}\n >\n {item.children.map(buildFormElement)}\n </div>\n )\n }\n return (\n <form\n className={className}\n action={form.settings.form_submit}\n method={form.settings.form_method}\n onSubmit={e => handleSubmit(e)}\n noValidate\n >\n {loading ? <Spinner color=\"#00b5ee\" /> : form.items.map(buildFormElement)}\n </form>\n )\n}\n","import React, {\n startTransition,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\"\nimport { CountryPropsType } from \"./types\"\nimport { countryPrefixes } from \"../../utils/location\"\nimport { scrollToChild } from \"../../utils/viewport\"\nimport Markdown from \"../../markdown\"\nimport Icon from \"../icon\"\n\nexport default function Country({\n className,\n label,\n description,\n input_name,\n onClick,\n onChange,\n value,\n placeholder,\n ...props\n}: CountryPropsType) {\n const countriesMap = useMemo(\n () =>\n countryPrefixes.reduce((acc, row) => {\n acc[row[0]] = row[2]\n return acc\n }, {} as any),\n [],\n )\n const [showOptions, setShowOptions] = useState<boolean>(false)\n const [focused, setFocused] = useState<number>(0)\n const [input, setInput] = useState(\"\")\n const inputRef = useRef<HTMLInputElement>(null)\n const listRef = useRef<HTMLUListElement>(null)\n\n const handleSelection = useCallback(\n (focused: number) => {\n onChange?.(countryPrefixes[focused][0] as any)\n startTransition(() => {\n setShowOptions(false)\n setFocused(focused)\n setInput(countryPrefixes[focused][2])\n })\n },\n [onChange, countryPrefixes],\n )\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n const { key, target } = e\n if (key === \"ArrowDown\" || key === \"ArrowUp\") {\n // Logic to navigate through the list items\n startTransition(() => {\n const newFocus =\n key === \"ArrowDown\"\n ? Math.min(focused + 1, countryPrefixes.length - 1)\n : Math.max(focused - 1, 0)\n setFocused(newFocus)\n setInput(countryPrefixes[newFocus][2])\n })\n } else if (key === \"Escape\") {\n startTransition(() => setShowOptions(false))\n } else if (key === \"Enter\") {\n e.preventDefault()\n e.stopPropagation() \n handleSelection(focused)\n } else if(key.length === 1 || key === 'Backspace'){ \n e.preventDefault();\n e.stopPropagation() \n startTransition(() => handleOnChange((key === 'Backspace')? input.slice(0, -1):`${input}${key}`))\n }\n }\n\n const scrollToFocusedCountry = useCallback(() => {\n if (!listRef.current) return\n const element = listRef.current.querySelector(\n `#${props.name ?? \"country\"}__${countryPrefixes[focused][0]}`,\n )\n if (!element) return\n scrollToChild(listRef.current, element as HTMLElement)\n }, [focused, countryPrefixes])\n\n // Focus selected option based on input\n function handleOnChange(value: string) {\n startTransition(() => {\n setInput(value)\n })\n let foundIndex = countryPrefixes.findIndex(row =>\n row[2].toLowerCase().startsWith(input.toLowerCase()),\n )\n if (foundIndex >= 0) {\n startTransition(() => setFocused(foundIndex))\n }\n }\n\n // Handle clicks outside the\n useEffect(() => {\n const handleClickOutside = (e: any) => {\n if (\n inputRef.current &&\n !inputRef.current.contains(e.target) &&\n listRef.current &&\n !listRef.current.contains(e.target)\n ) {\n startTransition(() => setShowOptions(false))\n }\n }\n document.addEventListener(\"mousedown\", handleClickOutside)\n return () => document.removeEventListener(\"mousedown\", handleClickOutside)\n }, [inputRef, listRef])\n\n useEffect(() => {\n scrollToFocusedCountry()\n }, [focused])\n\n useEffect(() => {\n document.body.classList[showOptions ? \"add\" : \"remove\"](\"no-scroll\")\n if (!inputRef.current) return\n if (showOptions) {\n // Autofocus on open dropdown\n inputRef.current.focus()\n }\n }, [showOptions])\n\n return (\n <label className={`country ${className ? ` ${className}` : \"\"}${!value && placeholder?\" placeholder\":\"\"}`}>\n {!!label && <span>{label}</span>}\n <div\n className=\"selected-country\"\n onClick={() => startTransition(() => setShowOptions(true))}\n >\n {value ? countriesMap[value] : placeholder ?? \"\"}\n <Icon\n className={showOptions ? \"opened\" : \"\"}\n icon={{ icon: \"chevron-right\", group: \"FAS\" }}\n />\n </div>\n <div className={`countries${showOptions ? \" show\" : \"\"}`}>\n <input\n ref={inputRef}\n name={input_name}\n value={input}\n onKeyDown={handleKeyDown}\n onChange={()=>null}\n />\n <ul\n ref={listRef}\n role=\"listbox\"\n tabIndex={-1}\n aria-activedescendant={`${props.name ?? \"country\"}__${\n countryPrefixes[focused][0]\n }`}\n >\n {countryPrefixes.map(([countryCode, _, name], k) => {\n return (\n <li\n className={k === focused ? \"selected\" : \"\"}\n role=\"option\"\n onClick={() => handleSelection(k)}\n aria-selected={k === focused}\n aria-label={name}\n id={`${props.name ?? \"country\"}__${countryCode}`}\n key={`${props.name ?? \"country\"}__${countryCode}`}\n >\n {name}\n </li>\n )\n })}\n </ul>\n </div>\n {!!description && (\n <div>\n <Markdown>{description}</Markdown>\n </div>\n )}\n </label>\n )\n}\n","import { useEffect, useState, MutableRefObject, useRef } from \"react\";\nimport { IntersectionObserverOptionsType } from \"./types\";\n\nconst useIntersectionObserver = (\n ref: MutableRefObject<Element | null>,\n options: IntersectionObserverOptionsType = {}\n): [boolean, () => void] => {\n const { threshold = 0.5, autoDisconnect = true, onIntersect } = options;\n const [isVisible, setIsVisible] = useState(false);\n const observerRef = useRef<IntersectionObserver | null>(null); // Store the observer instance\n\n useEffect(() => {\n observerRef.current = new IntersectionObserver(\n (entries, observer) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n setIsVisible(true); // Element is visible\n onIntersect?.(); // Call onIntersect if defined\n if (autoDisconnect) {\n observer.disconnect(); // Optionally stop observing\n }\n }\n });\n },\n { threshold }\n );\n\n const element = ref.current;\n if (element) {\n observerRef.current.observe(element); // Start observing the element\n }\n\n return () => {\n if (element && observerRef.current) {\n observerRef.current.disconnect();\n }\n // Set observerRef to null once disconnected\n observerRef.current = null;\n };\n }, [ref, threshold, autoDisconnect, onIntersect]);\n\n // Disconnect function that can be called externally\n const disconnect = () => {\n if (observerRef.current) {\n observerRef.current.disconnect();\n }\n };\n\n return [isVisible, disconnect];\n};\n\nexport default useIntersectionObserver;\n","import { format } from \"date-fns\";\nimport { isMobile } from \"./viewport\";\nimport {\n BookingURLsType,\n HotelOptionsByCityType,\n HotelPagesType,\n SearchParamsType,\n} from \"./types\";\n\nfunction RenderTemplate(str: string, obj: any) {\n let parts = str.split(/\\$\\{(?!\\d)[\\wæøåÆØÅ]*\\}/);\n let args = str.match(/[^{}]+(?=})/g) || [];\n let parameters = args.map(\n (argument) =>\n obj[argument] || (obj[argument] === undefined ? \"\" : obj[argument])\n );\n return String.raw({ raw: parts }, ...parameters);\n}\n\nexport const BookingUrl = (\n hotel_code: string,\n urls: BookingURLsType[\"booking_urls\"],\n searchParams: SearchParamsType,\n hasAvailability: boolean,\n rate_code: string | null = null,\n room_code: string | null = null\n) => {\n let params = RenderTemplate(urls.variables, {\n hotel_code: hotel_code,\n check_in: format(\n searchParams.check_in,\n urls.date_format.replace(/m/g, \"M\")\n ),\n check_out: format(\n searchParams.check_out,\n urls.date_format.replace(/m/g, \"M\")\n ),\n adult_count: searchParams.adult_count,\n child_count: searchParams.child_count,\n total_rooms: searchParams.rooms ?? 1,\n rate_code:\n hasAvailability && !searchParams.promo_codes.length && rate_code\n ? rate_code\n : \"\", // rate_code must be removed when there is no availability\n promo_code: searchParams.promo_codes.length\n ? searchParams.promo_codes[0]\n : \"\",\n });\n if (room_code) {\n params += \"&room=\" + room_code;\n }\n\n let url =\n typeof window !== \"undefined\" && isMobile(window.innerWidth)\n ? (hasAvailability ? urls.mobile_url : urls.mobile_url_no_availability) +\n \"&\" +\n params\n : (hasAvailability ? urls.url : urls.url_no_availability) + \"&\" + params;\n\n // console.log(searchParams)\n // console.log(url)\n window.open(url, \"_blank\");\n // window.location.href = url\n};\n\nconst ParseAvailability = (data: any) => {\n if (!data.success) {\n return {};\n }\n data.data.forEach((hotel: any) => {\n hotel.room_rates = {};\n hotel.rates.forEach((room: any) =>\n room.forEach((room_rate: any) => {\n if (!hotel.room_rates.hasOwnProperty(room_rate.room_type_code)) {\n hotel.room_rates[room_rate.room_type_code] = [];\n }\n hotel.room_rates[room_rate.room_type_code].push(room_rate);\n })\n );\n });\n return data.data;\n};\n\n/**\n *\n * Returns Select options sorting by the cities with more hotels, otherwise alphabetically.\n *\n * For instance:\n *\n * [\n * {\n * label: 'Sydney',\n * options: [\n * { label: 'Vibe Hotel Sydney', value: \"58443\" },\n * { label: 'Vibe Hotel Sydney Darling Harbour', value: \"8565\" }\n * ]\n * },\n * {\n * label: 'Mebourne',\n * options: [\n * { label: 'Vibe Hotel Melbourne', value: \"9969\" },\n * ]\n * },\n * ]\n */\nexport const hotelOptionsByCity = (\n hotelPages: HotelPagesType\n): HotelOptionsByCityType[] => {\n let hotelsByCity: { [k: string]: { label: string; value: string }[] } = {\n Sydney: [],\n Melbourne: [],\n Brisbane: [],\n Perth: [],\n Hobart: [],\n Canberra: [],\n Adelaide: [],\n \"Gold Coast\": [],\n Darwin: [],\n Auckland: [],\n Wellington: [],\n Singapore: [],\n };\n const propertyOrder = Object.entries(hotelPages).reduce(\n (acc, [id, hotel]) => {\n if (hotelsByCity[hotel.city]) {\n hotelsByCity[hotel.city].push({ label: hotel.name, value: id });\n } else {\n hotelsByCity[hotel.city] = [{ label: hotel.name, value: id }];\n }\n acc[id] = hotel.sort;\n return acc;\n },\n {} as { [k: string]: number }\n );\n return Object.entries(hotelsByCity).map(([city, options]) => {\n return {\n label: city,\n options: options.sort(\n (a, b) => propertyOrder[a.value] - propertyOrder[b.value]\n ),\n };\n });\n};\n\nexport const SearchAvailability = async (\n check_in: Date,\n check_out: Date,\n adult_count: number,\n child_count: number,\n promo_codes: string[],\n rate_codes: string[],\n hotel_codes: string[]\n) => {\n if (!hotel_codes) {\n throw new Error(\n '\"hotel_codes\" must be defined within the page attributes!'\n );\n }\n return fetch(\n `${process.env.SABRE_PROTOCOL}://${process.env.SABRE_HOST}/availability`,\n {\n headers: { \"Content-Type\": \"application/json\" },\n method: \"POST\",\n body: JSON.stringify({\n check_in: format(check_in, \"yyyy-MM-dd\"),\n check_out: format(check_out, \"yyyy-MM-dd\"),\n hotel_codes: hotel_codes,\n adult_count: adult_count,\n child_count: child_count,\n area_codes: [],\n promo_codes: promo_codes,\n rate_codes: rate_codes,\n price_range: { min: 0, max: 0 },\n is_mobile: typeof window !== \"undefined\" && isMobile(window.innerWidth),\n language: \"en\",\n }),\n }\n )\n .then((response) => response.json())\n .then(\n (data) => ParseAvailability(data),\n (error) => {\n console.log(error);\n }\n );\n};\n\nexport const pricePerNight = (total: string, nights: number): string =>\n (parseFloat(total) / nights).toFixed(2);\n","import { addDays } from \"date-fns\";\nimport { CachedSearchParamsType } from \"./types\";\n\nexport const cachedSearchParams = (): CachedSearchParamsType | null => {\n if (typeof window === \"undefined\") return null;\n let cached: any = localStorage.getItem(\"search-params\");\n if (cached) {\n cached = JSON.parse(cached);\n cached.rate_codes = []; // Bypass Rate\n cached.promo_codes = []; // Bypass Promo codes\n cached.check_in = cached.check_in ? new Date(cached.check_in) : new Date();\n cached.check_out = cached.check_out\n ? new Date(cached.check_out)\n : addDays(new Date(), 1);\n\n // Invalidate cache if dates are in the past\n if (cached.check_in < new Date()) {\n return null;\n }\n }\n return cached;\n};\n\nexport const cacheSearchParams = (searchParams: CachedSearchParamsType) =>\n localStorage.setItem(\"search-params\", JSON.stringify(searchParams));\n","import { UserType } from \"../api/types\";\n\nexport const saveUserSession = (data: any) => {\n sessionStorage.setItem(\n \"user\",\n JSON.stringify({\n loyaltyprofileId: data.loyaltyprofileId,\n profile_id: data.profile_id,\n title: data.title,\n first_name: data.first_name,\n last_name: data.last_name,\n email: data.email,\n zip: data.zip,\n country_code: data.country_code,\n MobilePhoneCountryCode: data.MobilePhoneCountryCode,\n mobile: data.mobile,\n date_of_birth: data.date_of_birth,\n language: data.language,\n } as UserType)\n );\n};\n\nexport const loadUserSession = (): UserType | null => {\n const user = sessionStorage.getItem(\"user\");\n return user ? JSON.parse(user) : null;\n};\n\nexport const deleteUserSession = () => {\n sessionStorage.removeItem(\"user\");\n};\n","export function human_number(n: number, decimals: number = 2) {\n return n.toLocaleString(\"en-US\", {\n useGrouping: false,\n maximumFractionDigits: decimals,\n })\n}\n","import type { RateType, RoomType } from \"./types\";\n\nexport const joinAddress = (addressParams: (string | null)[]) =>\n addressParams\n .reduce((acc: string[], param: string | null) => {\n if (param) {\n acc.push(param);\n }\n return acc;\n }, [])\n .join(\", \");\n\nexport interface PageTagsType {\n [k: string]: string;\n}\n\nexport const tagExists = (\n pageTags: PageTagsType,\n ...tags: string[]\n): boolean => {\n for (const tag of Object.keys(pageTags)) {\n if (tags.includes(tag)) {\n return true;\n }\n }\n return false;\n};\n\nexport const roomFeatures = [\n \"balcony\",\n \"sofa_bed\",\n \"kitchen\",\n \"kitchenette\",\n \"laundry_machine\",\n];\n\n/**\n * Sorts Rooms by predefined `sort` order, or by price if `sortByPrice` is `true`.\n */\nexport const sortRooms = (\n rooms: RoomType[],\n roomRates: { [booking_engine_code: string]: RateType[] },\n sortByPrice: boolean = false\n) => {\n if (sortByPrice) {\n return rooms.sort((a, b) => {\n const aAvailable = Number(Boolean(roomRates[a.booking_engine_code]));\n const bAvailable = Number(Boolean(roomRates[b.booking_engine_code]));\n\n // Prioritize availability (available rooms come first)\n if (aAvailable !== bAvailable) {\n return bAvailable - aAvailable; // `true` (1) comes before `false` (0)\n }\n\n if (aAvailable && bAvailable) {\n // If both are available, extract and convert price\n const aPrice = aAvailable\n ? parseFloat(roomRates[a.booking_engine_code][0].total)\n : Infinity;\n const bPrice = bAvailable\n ? parseFloat(roomRates[b.booking_engine_code][0].total)\n : Infinity;\n\n if (aPrice !== bPrice) {\n return aPrice - bPrice; // Lower price comes first\n }\n }\n // If price is the same, sort by predefined `sort` order\n return a.sort - b.sort;\n });\n }\n // Otherwise, sort by predefined \"room.sort\" order\n return rooms.sort((a, b) => a.sort - b.sort);\n};\n","export const ssoURL = (path: string) =>\n `${process.env.SABRE_SSO_PROTOCOL}://${process.env.SABRE_SSO_HOST}${path}`\n","/**\n * Replace underscores and dashes with spaces\n *\n * @param string\n * @returns string\n */\nexport const toPhrase = (string: string) =>\n string.charAt(0).toUpperCase() +\n string.slice(1).replace(/[_-]/g, \" \").toLowerCase();\n","import { useState, useEffect, startTransition } from \"react\"\nimport { ViewportType } from \"./types\"\nimport { isDesktop, isMobile, isTablet } from \"../utils/viewport\"\n\nfunction UseViewport() {\n const [viewport, setViewport] = useState<ViewportType>('d')\n\n useEffect(() => {\n const resize = () => {\n const width = window.innerWidth\n if(viewport === 'm' ){\n if(isMobile(width)) return\n }else if(viewport === 't'){\n if(isTablet(width)) return\n }else if(viewport === 'd'){\n if(isDesktop(width)) return\n }\n startTransition(() => setViewport(isMobile(width)? \"m\" : isTablet(width)? \"t\" : \"d\"))\n }\n\n resize()\n window.addEventListener(\"resize\", resize)\n return () => {\n window.removeEventListener(\"resize\", resize)\n }\n }, [viewport])\n\n return viewport\n}\n\nexport default UseViewport\n"],"names":["animateJSX","isMobile","width","isTablet","isDesktop","scrollToChild","parent","child","initialDisplayValue","style","display","parentPosition","getBoundingClientRect","childPosition","topOffset","top","bottomOffset","bottom","Math","abs","scrollTop","HideOnDevice","devices","device","length","includes","classNames","classes","displayOn","hidden","hidden_mobile","hidden_tablet","hidden_desktop","ClassNames","json_request","async","url","params","method","headers","process","env","API_HOST","PROJECT","config","toUpperCase","body","JSON","stringify","URLSearchParams","Object","entries","map","k","v","response","fetch","json","status","error","console","success","INPUT_EVENT_VALUES","select","e","value","input","target","textarea","getInputEventValue","inputType","event","hasOwnProperty","INPUT_HUMAN_VALUES","getInputHumanValue","INPUT_FIELDS","Set","optimizedThumb","img","optimized","name","countryPrefixes","FontAwesomeGroups","FAB","FAS","Icon","icon","className","onClick","color","height","group","React","createElement","FontAwesomeIcon","alt","src","enterAnimation","factor","exitAnimation","prefersReducedMotion","shouldReduceMotion","undefined","window","mediaQuery","matchMedia","matches","Toast","id","visible","message","position","variant","animationStyle","getAnimationStyle","enter","exit","animation","keyframes","opacity","toast","dismiss","toastMsg","msg","duration","custom","t","serializeDate","date","parseISO","serializeNumber","n","parseInt","serializeList","str","serializeParam","check_in","check_out","child_count","adult_count","rate_codes","promo_codes","joinPaths","path1","path2","replace","RegExp","Markdown","children","tagAttrs","renderer","marked","Renderer","link","href","title","text","attrs","a","join","setOptions","createMarkup","parse","Fragment","Checkbox","label","description","props","onChange","viewBox","d","fill","transform","strokeWidth","stroke","strokeLinecap","strokeLinejoin","CountryPrefix","input_name","showOptions","setShowOptions","useState","focused","setFocused","setInput","inputRef","useRef","listRef","handleSelection","useCallback","startTransition","scrollToFocusedCountry","current","element","querySelector","useEffect","handleClickOutside","contains","document","addEventListener","removeEventListener","classList","focus","ref","foundIndex","findIndex","row","toLowerCase","startsWith","handleOnChange","onKeyDown","key","newFocus","min","max","preventDefault","stopPropagation","role","tabIndex","countryCode","prefix","_extends","assign","bind","i","arguments","source","prototype","call","apply","this","getCountryCode","place","address_components","component","types","short_name","GooglePlaces$1","GooglePlaces","defaultCountryCode","onFocus","onBlur","data","setPlace","GOOGLEMAPS_KEY","Error","usePlacesWidget","apiKey","onPlaceSelected","formatted_address","found","find","x","autoComplete","placeholder","ExternalLink","animate","scale","setScale","setState","onMouseDown","onMouseUp","onTouchStart","onTouchEnd","to","Link$1","LinkTag","page_slug","PageLink","slug","query_params","external_link","anchor","display_on","buildImage","fallback","sizes","srcSet","sources","sort","b","push","type","index","image_url","getImage","childImageSharp","gatsbyImageData","backgroundColor","layout","images","Image$2","Image","imageData","image","initImage","image_data","mobile_image_data","mobile_image","withArtDirection","media","imageProps","onLoad","Link","link_text","GatsbyImage","Input$1","Input","input_type","iconOnClick","read_only","readOnly","LinkList$1","LinkList","pk","links","getValue","options","option","opt","Select$1","Select","styles","scrollDisabledOnClose","opts","Array","isArray","keys","reduce","acc","values","formatOptions","ReactSelect","onMenuOpen","add","onMenuClose","remove","classNamePrefix","SVG$1","file","Text$1","Text","Textarea$1","Textarea","Title$1","useMemo","Button$1","Button","PrevButton","restProps","NextButton","DotButton","ScreenSizes","mobile","tablet","desktop","wide","fullhd","Carousel$1","Carousel","emblaRef","emblaApi","slidesPerView","slidesPerViewport","slides","gap","showButtons","showDots","showProgress","showScroll","prevIcon","nextIcon","scrollProgress","setScrollProgress","selectedIndex","scrollSnaps","onDotButtonClick","useDots","setSelectedIndex","setScrollSnaps","scrollTo","onInit","scrollSnapList","onSelect","selectedScrollSnap","on","onScroll","progress","prevBtnDisabled","nextBtnDisabled","onPrevButtonClick","onNextButtonClick","useButtons","setPrevBtnDisabled","setNextBtnDisabled","scrollPrev","scrollNext","canScrollPrev","canScrollNext","internalEngine","reInit","axis","slide","disabled","_","concat","toFixed","viewPortGap","viewPortSlides","GatsbyLink$1","GatsbyLink","activeClassName","partiallyActive","internal","Modal$1","Modal","modalId","show","setShowModal","closeWidth","closeHeight","closeIcon","currentTarget","Spinner","size","border","FormElements","Title","checkbox","country","countriesMap","slice","button","FormElement","FormElementWrapper","useIntersectionObserver$1","useIntersectionObserver","threshold","autoDisconnect","onIntersect","isVisible","setIsVisible","observerRef","IntersectionObserver","observer","forEach","entry","isIntersecting","disconnect","observe","BookingUrl","hotel_code","urls","searchParams","hasAvailability","rate_code","room_code","obj","parts","split","parameters","match","argument","String","raw","RenderTemplate","variables","format","date_format","total_rooms","rooms","promo_code","innerWidth","mobile_url","mobile_url_no_availability","url_no_availability","open","form","setForm","errors","setErrors","beforeSubmit","formatParams","validate","validateResponse","onSuccess","onError","afterSubmit","loading","recaptchaReady","setRecaptchaReady","showErrors","showInputName","checkRecaptcha","grecaptcha","execute","setTimeout","executeRecaptcha","RECAPTCHA_V3_SITE_KEY","action","settings","recaptcha_action","warn","buildFormElement","item","field","fields","class","has","Boolean","newForm","fieldName","checked","form_submit","form_method","onSubmit","required","charAt","recaptcha_v3","recaptcha_token","recaptcha","form_ajax_request","submit","form_recipient","newErrors","inputName","errorList","failed","form_success_msg","form_redirection","location","handleSubmit","noValidate","items","hotel_codes","SABRE_PROTOCOL","SABRE_HOST","area_codes","price_range","is_mobile","language","then","hotel","room_rates","rates","room","room_rate","room_type_code","ParseAvailability","log","transition","stage","apiLink","apiPath","queryParams","API_PROTOCOL","toString","localStorage","setItem","cachedSearchParams","cached","getItem","Date","addDays","dealSlug","DEALS_ROOT_SLUG","decodeURIComponent","deleteUserSession","sessionStorage","removeItem","getViewPort","hotelPages","hotelsByCity","Sydney","Melbourne","Brisbane","Perth","Hobart","Canberra","Adelaide","Darwin","Auckland","Wellington","Singapore","propertyOrder","city","decimals","toLocaleString","useGrouping","maximumFractionDigits","isIOS","test","navigator","userAgent","addressParams","param","loadUserSession","user","minimumSlides","slidesToShow","ceil","queryString","rename","pricePerNight","total","nights","parseFloat","loyaltyprofileId","profile_id","first_name","last_name","email","zip","country_code","MobilePhoneCountryCode","date_of_birth","getElementById","elementId","scrollIntoView","behavior","siteUrl","path","PROTOCOL","HOST","sortRooms","roomRates","sortByPrice","aAvailable","Number","booking_engine_code","bAvailable","aPrice","Infinity","bPrice","sp_to_qs","SABRE_SSO_PROTOCOL","SABRE_SSO_HOST","tagExists","pageTags","tags","tag","toImageElement","keyMap","mobile_file","string","viewport","setViewport","resize"],"mappings":"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","x_google_ignoreList":[12]}
|