{\n this.returnSearchedValue = this.returnSearchedValue.bind(this);\n }}\n >\n \n \n
\n );\n };\n\n handleClickOutside = event => {\n const domNode = ReactDOM.findDOMNode(this);\n if ((!domNode || !domNode.contains(event.target)) && this.state.active) {\n this.setState({ active: false });\n }\n };\n\n handleChange = event => this.setState({ value: event.target.value });\n\n handleFocus = () => {\n this.setState({ active: true });\n };\n\n returnSearchedValue = () =>\n this.state.value !== '' ? this.state.value : false;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/common/components/person_price.js","import React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { T } from '../../../../common/locale/translate';\n\nexport default class HotelStandard extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n active: false,\n pristine: true,\n values: [0, 1, 2, 3, 4, 5],\n hotel_standard: 0\n };\n }\n\n componentDidMount = () => {\n document.addEventListener(\n 'click',\n this.handleClickOutside.bind(this),\n true\n );\n };\n\n componentWillReceiveProps = nextProps => {\n if (typeof nextProps.rating_min != 'undefined' && this.state.pristine) {\n this.setState({ hotel_standard: nextProps.rating_min, pristine: false });\n }\n };\n\n componentWillUnmount = () => {\n document.removeEventListener(\n 'click',\n this.handleClickOutside.bind(this),\n true\n );\n };\n\n render = () => (\n \n
\n
${T(\n 'do_you_know'\n )} ${curiosity.content}`\n }}\n />\n
\n
\n
\n {this.state.open ? T('read_less') : T('read_more')}\n \n
\n
\n
\n
\n ));\n return curiosities.length ? (\n
\n {curiosities}\n \n ) : (\n false\n );\n };\n\n closePanel = () => this.setState({ active: false });\n\n toggleHeight = () => this.setState({ open: !this.state.open });\n\n updateHints = () => {\n fetchCuriosity({ regions: this.state.regions }).then(\n response => {\n if (response.status == 204) {\n this.setState({ loader: false, curiosity: 'Kurde blaszka' });\n } else {\n this.setState({\n curiosities: response.data,\n curiosity: response.data[0],\n current_index: 0\n });\n }\n },\n () => {\n // TODO handle error\n this.setState({ error: true, current_state: 'pristine' });\n }\n );\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/offers/components/offers_list/components/hints.js","import React from 'react';\nimport OfferWithHotelElement from './components/list-element';\nimport {\n fetchFilterData,\n createRegionsObject,\n localstorageAvailable,\n isFilterExpired\n} from '../../../../../../services/services';\n\nconst filterDataCacheTime = 900000;\n\nconst OfferWithHotelList = props => {\n const regions = setInitialData();\n return (\n
\n {props.data.map((element, index) => {\n let preloadclass =\n (index % 10) + 1 == props.preloadPoint ? 'preload-offers' : '';\n return (\n \n );\n })}\n
\n );\n};\n\nconst setInitialData = () => {\n if (localstorageAvailable()) {\n if (isFilterExpired('regions', filterDataCacheTime)) {\n return updateFilterSource();\n } else {\n const filter_data = JSON.parse(localStorage.getItem('regions_filter'));\n return filter_data.regions;\n }\n } else {\n return updateFilterSource();\n }\n};\n\nconst updateFilterSource = () => {\n fetchFilterData('regions_filter').then(\n response => {\n const filter_data = createRegionsObject(response.data);\n if (localstorageAvailable()) {\n localStorage.setItem('regions_filter', JSON.stringify(filter_data));\n localStorage.setItem(\n 'regions_filter_last_update',\n new Date().getTime()\n );\n }\n return filter_data.regions;\n },\n error => {\n console.log('Error when fetching regions filter', error);\n }\n );\n};\n\nexport default OfferWithHotelList;\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/offers/components/offers_list/components/with-hotel/index.js","import React from 'react';\nimport {\n link2ShowHotel,\n getHotelDetails\n} from '../../../../../../../services/services';\nimport Loader from '../../../../../../../common/components/loader';\nimport { T } from '../../../../../../../../../common/locale/translate';\n\nimport OfferLocationHeader from '../../../../../../../common/components/offer-location-header';\nimport Facilities from './facilities';\nimport Details from './details';\nimport Price from '../../../../../../../common/components/price';\nimport Categories from './categories';\nimport Operator from './operator';\nimport OfferVariants from '../../../../../../../common/components/offer-variants';\n\nexport default class OfferWithHotelElement extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n variantsActive: false,\n variantsActiveText: T('hide_prices'),\n variantsInActiveText: T('show_dates_with_prices'),\n offerLink: 'javascript:void(0)',\n params: props.params,\n pristine: true,\n loaderText: T('prices_and_dates_loading'),\n main_image: props.data.subject.thumbnail_url,\n image_loader: false,\n is_price_estimated: true\n };\n }\n\n componentDidMount() {\n if (!this.state.main_image) {\n this.setState({ image_loader: true }, this.fetchImage());\n }\n }\n\n render() {\n const data = this.props.data;\n const params = this.offerLinkParams();\n return (\n
\n \n \n \n );\n }\n\n offerVariantsParams() {\n const data = this.props.data;\n return {\n ...this.state.params,\n hotel_id: data.subject.id,\n parser: data.subject.parser,\n operator_code: data.operator.code,\n offer_type: data.offer_type\n };\n }\n\n offerLinkParams() {\n const data = this.props.data;\n return {\n ...this.state.params,\n id: data.subject.id,\n operator_code: data.operator.code,\n parser: data.subject.parser\n };\n }\n\n fetchImage = () => {\n const data = this.props.data;\n let params = {\n offer_type: data.offer_type,\n parser: data.subject.parser,\n id: data.subject.id,\n operator_code: data.operator.code\n };\n getHotelDetails(params).then(\n response => {\n if (response.status == 204) {\n this.setState({\n main_image: '/img/placeholder/250x240.png',\n image_loader: false\n });\n } else {\n this.setState({\n main_image: response.data.subject.thumbnail_url,\n image_loader: false\n });\n }\n },\n () => {\n // TODO handle error\n this.setState({\n main_image: '/img/placeholder/250x240.png',\n image_loader: false\n });\n }\n );\n };\n\n toggleOfferVariants = () => {\n this.setState({ variantsActive: !this.state.variantsActive });\n if (this.state.pristine) {\n this.setState({ pristine: false });\n this.refs['offer_variants'].appendOfferVariants(\n this.offerVariantsParams()\n );\n }\n };\n\n descriptionLinkTitle(offer_name) {\n return `${T('go_to_description')}: ${offer_name}`;\n }\n\n termsLinkTitle(offer_name) {\n return `${T('terms_and_prices')}: ${offer_name}`;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/offers/components/offers_list/components/with-hotel/components/list-element.js","import React from 'react';\n\nconst Facilities = props => (\n
\n
\n {props.facilities\n .map((facility, index) => (\n - \n {' '}\n {facility.name}{' '}\n
\n ))\n .splice(0, 6)}\n
\n
\n);\n\nexport default Facilities;\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/offers/components/offers_list/components/with-hotel/components/facilities.js","import React from 'react';\nimport moment from 'moment';\n\nimport { T } from '../../../../../../../../../common/locale/translate';\nimport DepartureFromGermany from '../../../../../../../common/components/departure_from_germany';\n\nconst Details = data => {\n let offer = data.offer;\n return (\n
\n );\n};\n\nexport default Details;\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/offers/components/offers_list/components/with-hotel/components/details.js","import React from 'react';\nimport { T } from '../../../../../../../../../common/locale/translate';\n\nconst Categories = props => (\n
\n {props.data.is_allinclusive && (\n \n {' '}\n {T('all_inclusive')}{' '}\n \n )}\n {props.data.is_lastminute && (\n {T('last_minute')} \n )}\n {props.data.is_firstminute && (\n {T('first_minute')} \n )}\n
\n);\n\nexport default Categories;\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/offers/components/offers_list/components/with-hotel/components/categories.js","import React from 'react';\n\nconst operators_logo = operator => {\n return operator.logo_url && operator.logo_url !== 'false' ? (\n

\n ) : (\n
{operator.name}\n );\n};\n\nconst Operator = props => {\n return (\n
\n {operators_logo(props.operator)}\n {props.operator.name}\n \n );\n};\n\nexport default Operator;\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/offers/components/offers_list/components/with-hotel/components/operator.js","import React from 'react';\n\nimport { T } from '../../../../../../../../common/locale/translate';\nimport Table from '../../../../../../common/components/responsive-table';\nimport Offer from '../../../../../../common/components/offer-list-element';\nimport { prepareOfferUniqueKey } from '../../../../../../services/services';\n\nexport default class Flight extends React.Component {\n constructor() {\n super();\n this.state = {\n C1: { headers: 'flightOneWay', className: 'flight-one-way' },\n C2: { headers: 'flightTwoWays', className: 'flight-two-ways' },\n flightTwoWays: [\n { name: 'route', title: T('departure_place') },\n { name: 'provider', title: T('operator_short') },\n { name: 'duration', title: T('admin_special_offers_duration') },\n { name: 'departure_details', title: T('departure_date') },\n { name: 'arrival_details', title: T('arrival_date') },\n { name: 'price', title: T('price_quality') }\n ],\n flightOneWay: [\n { name: 'route', title: T('departure_place') },\n { name: 'provider', title: T('operator') },\n { name: 'departure_details', title: T('departure_date') },\n { name: 'price', title: T('price_quality') }\n ],\n availabilityCheckNumber: 5\n };\n }\n\n render() {\n const option = this.state[this.props.offer_type];\n return (\n
\n
\n \n {this.props.data.map((flight, i) => {\n flight.uuid = flight.id;\n const tableRowKey = `${prepareOfferUniqueKey(flight)}-${i}`;\n return (\n \n );\n })}\n
\n \n
\n );\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/offers/components/offers_list/components/flight/index.js","import React from 'react';\nimport moment from 'moment';\nimport styled from 'styled-components';\nimport getMuiTheme from 'material-ui/styles/getMuiTheme';\nimport { breakpoint } from '../../../../../../../../admin/javascript/contract/duck/grid';\n\nimport {\n groupReserve,\n isDesktopDevice,\n groupReservationDefaultDateFilters\n} from '../../../../../../services/services';\nimport { T } from '../../../../../../../../common/locale/translate';\nimport { Validate } from '../../../../../../../../common/validation/validate';\nimport DatePicker from '../../../../../../common/components/datepicker';\nimport {\n SectionHeader,\n ContinueButton,\n SectionSubheader,\n ButtonWrapper\n} from '../../../../../reservation/default/styled-components';\nimport TextInput from '../../../../../reservation/default/input';\n\nclass GroupReservationForm extends React.Component {\n constructor(props) {\n super(props);\n\n this.state = {\n step: 1,\n showErrors: false,\n dataProtection: false,\n isSending: false,\n\n destination: '',\n search_from: groupReservationDefaultDateFilters().from,\n search_to: groupReservationDefaultDateFilters().to,\n max_price: '',\n participants_number: '',\n trip_type: {\n bus: false,\n flight: false,\n self_arrival: false\n },\n departure_from: '',\n comment: '',\n\n client_first_name: '',\n client_last_name: '',\n client_phone: '',\n client_email: '',\n client_club: '',\n\n destination_class: '',\n client_email_class: ''\n };\n }\n\n getChildContext() {\n return { muiTheme: getMuiTheme() };\n }\n\n render() {\n return (\n
\n {this.renderStep()}\n \n );\n }\n\n renderStep = () => {\n const {\n step,\n showErrors,\n dataProtection,\n\n destination,\n search_from,\n search_to,\n max_price,\n participants_number,\n trip_type,\n departure_from,\n comment,\n\n client_first_name,\n client_last_name,\n client_phone,\n client_email,\n client_club,\n\n destination_class,\n client_email_class\n } = this.state;\n\n console.log('1', destination_class);\n console.log('2', client_email_class);\n\n switch (step) {\n case 2:\n return (\n
\n \n {T('group_reservation_thank_you')}\n {T('group_reservation_contact_msg_1')}\n {T('group_reservation_contact_msg_2')}\n \n );\n default:\n return (\n
\n \n {T('group_reservation_info')}\n \n\n \n \n \n this.setState({ [name]: value })\n }\n validationMessage={T('invalid_destination')}\n />\n \n \n this.setState({ search_from: value })}\n withPortal={!isDesktopDevice()}\n />\n \n \n this.setState({ search_to: value })}\n withPortal={!isDesktopDevice()}\n />\n \n \n \n this.setState({ [name]: value })\n }\n />\n \n \n \n this.setState({ [name]: value })\n }\n />\n \n \n\n \n \n \n {T('group_reservation_offer_type')}\n \n {Object.keys(trip_type).map(type => (\n \n \n \n \n ))}\n \n \n \n this.setState({ [name]: value })\n }\n />\n \n \n \n this.setState({ [name]: value })\n }\n />\n \n \n\n \n {T('person_data')}\n \n\n \n \n \n this.setState({ [name]: value })\n }\n />\n \n \n \n this.setState({ [name]: value })\n }\n />\n \n \n \n this.setState({ [name]: value })\n }\n validationMessage={T('invalid_email')}\n />\n \n \n \n this.setState({ [name]: value })\n }\n />\n \n \n \n this.setState({ [name]: value })\n }\n />\n \n \n\n \n \n {T('data_protection_consent_header')}\n *\n \n \n \n \n this.setState({ dataProtection: !dataProtection })\n }\n checked={dataProtection}\n />\n \n {T('data_protection_content')}\n \n {showErrors &&\n !dataProtection && (\n {T('data_protection_error')}\n )}\n \n\n \n {T('data_protection')}\n \n \n {T('data_protection_info')}\n \n\n \n this.handleReserve()}>\n {T('request_free_offer')}\n \n \n
\n );\n }\n };\n\n handleTripTypeChange = event => {\n const type = event.target.value;\n this.setState(prevState => ({\n ...prevState,\n trip_type: {\n ...prevState.trip_type,\n [type]: !prevState.trip_type[type]\n }\n }));\n };\n\n handleReserve = () => {\n if (this.state.step === 1 && !this.validateForm()) {\n return this.setState({ showErrors: true }, () => this.scrollToForm());\n }\n\n if (!this.state.isSending) {\n this.setState({ isSending: true });\n const params = this.getBookParams();\n groupReserve(params, this.props.csrfToken)\n .then(response => {\n if (!response.data) {\n alert(T('reservation_error'));\n return;\n }\n\n this.setState({ step: 2 }, () => this.scrollToForm());\n })\n .finally(() => {\n this.setState({ isSending: false });\n });\n }\n };\n\n getBookParams = () => {\n return {\n ...this.state,\n search_from: moment.unix(this.state.search_from).format('YYYY-MM-DD'),\n search_to: moment.unix(this.state.search_to).format('YYYY-MM-DD')\n };\n };\n\n validateForm = () => {\n let valid = true;\n if (!this.state.dataProtection) {\n valid = false;\n }\n if (!this.validateField('destination')) {\n valid = false;\n }\n if (!this.validateField('client_email')) {\n valid = false;\n }\n return valid;\n };\n\n validateField = fieldName => {\n let fieldValue = this.state[fieldName];\n\n if (!Validate.notBlank(fieldValue)) {\n this.setState({\n [fieldName + '_class']: 'invalid'\n });\n return false;\n } else {\n this.setState({ [fieldName + '_class']: '' });\n return true;\n }\n };\n\n scrollToForm = () => {\n const element = document.getElementById('group_reservation_form_wrapper');\n element.scrollIntoView();\n window.scrollBy(0, -100);\n };\n}\n\nGroupReservationForm.childContextTypes = {\n muiTheme: React.PropTypes.object.isRequired\n};\n\nconst GroupReservationWrapper = styled.div`\n display: flex;\n flex-direction: column;\n\n ${breakpoint.m`\n flex-direction: row;\n `};\n`;\n\nconst InputWrapper = styled.div`\n width: ${({ fullWidth, left, right }) =>\n fullWidth || left || right ? 'calc(100% - 20px)' : 'calc(50% - 20px)'};\n display: inline-block;\n margin: 0 10px 10px 10px;\n\n ${breakpoint.m`\n width: ${({ fullWidth, left, right }) =>\n fullWidth\n ? 'calc(100% - 20px)'\n : left || right\n ? 'calc(50% - 30px)'\n : 'calc(50% - 20px)'};\n margin: 0 10px;\n margin-right: ${({ left }) => (left ? '20px' : '10px')};\n margin-left: ${({ right }) => (right ? '20px' : '10px')};\n height: 65px;\n `};\n`;\n\nconst ColumnWrapper = styled.div`\n display: inline-block;\n width: calc(100% - 20px);\n margin: 0 10px;\n vertical-align: top;\n\n ${breakpoint.m`\n width: ${({ fullWidth }) =>\n fullWidth ? 'calc(100% - 20px)' : 'calc(50% - 20px)'};\n `};\n`;\n\nconst StyledSectionHeader = styled(SectionHeader)`\n margin: 0;\n background-color: #fff;\n`;\n\nconst StyledDatePicker = styled(DatePicker)`\n &.datepicker-wrapper {\n width: 100%;\n margin-bottom: 15px;\n .react-datepicker {\n font-size: 1rem;\n }\n .react-datepicker__input-container {\n width: 100%;\n height: 100%;\n input {\n cursor: pointer;\n width: 100%;\n background: transparent;\n border: none;\n border-radius: 0;\n font-weight: 500;\n font-size: 15px;\n vertical-align: bottom;\n display: inline-block;\n position: absolute;\n bottom: 0.2rem;\n left: 0;\n }\n }\n span.animated-text-label-name {\n display: block;\n top: 0;\n font-size: 15px;\n }\n img.input-icon {\n right: 1px;\n left: auto;\n }\n }\n`;\n\nconst TripTypeWrapper = styled.div`\n display: inline-block;\n margin-right: 1rem;\n`;\n\nconst TripTypeHeader = styled.label`\n display: block;\n width: 100%;\n margin-bottom: 5px;\n span {\n font-size: 15px;\n }\n`;\n\nconst StyledContinueButton = styled(ContinueButton)`\n margin: 0 auto;\n line-height: normal;\n`;\n\nconst DataProtectionLabel = styled.label`\n && {\n font-size: 13px;\n line-height: normal;\n }\n`;\n\nconst StyledSectionSubheader = styled(SectionSubheader)`\n margin: 0 0 1rem 0;\n width: 100%;\n`;\n\nconst ErrorText = styled.div`\n font-size: 0.6rem;\n padding-top: 0.4rem;\n color: #e6004c;\n`;\n\nconst CenterWrapper = styled.div`\n width: 100%;\n padding: 100px 0;\n text-align: center;\n`;\n\nconst ThankYouIcon = styled.img`\n width: 60px;\n height: 60px;\n`;\n\nconst ThankYouHeader = styled.div`\n text-transform: uppercase;\n font-weight: 600;\n padding: 20px;\n`;\n\nconst ThankYouText = styled.div`\n padding-bottom: 4px;\n`;\n\nexport default styled(GroupReservationForm)`\n display: inline-block;\n width: 100%;\n margin: 0 auto;\n background-color: #fff;\n\n ${breakpoint.m`\n width: calc(100% - 20px - 1.5rem);\n margin-left: 1.5rem;\n padding: 20px 10px;\n `};\n`;\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/offers/components/offers_list/components/group-reservation/index.js","import styled from 'styled-components';\nimport { breakpoint } from '../../../../../admin/javascript/contract/duck/grid';\n\nexport const SectionHeader = styled.div`\n display: flex;\n justify-content: space-between;\n box-sizing: border-box;\n width: calc(100% - 20px);\n margin: 0 auto;\n padding: 10px;\n color: #333;\n font-size: 11px;\n background-color: #eee;\n\n > strong {\n font-weight: 600;\n font-size: 14px;\n }\n\n > span {\n margin-top: 3px;\n }\n\n ${breakpoint.m`\n width: calc(100% - 40px);\n margin: 0 20px;\n padding: 10px 20px;\n\n > strong {\n font-size: 16px;\n }\n `};\n`;\n\nexport const SectionSubheader = styled.div`\n box-sizing: border-box;\n width: 100%;\n margin: 0 auto;\n padding: 10px 20px 5px 20px;\n color: #333333;\n font-size: 12px;\n line-height: 1.38;\n\n ${breakpoint.m`\n width: calc(100% - 40px);\n margin: 0 20px;\n font-size: 13px;\n `};\n`;\n\nexport const ContinueButton = styled.button`\n float: right;\n min-width: 155px;\n height: 50px;\n padding: 0px 20px;\n\n color: #fff;\n font-weight: 600;\n font-size: 15px;\n line-height: 50px;\n text-align: center;\n text-transform: uppercase;\n background-color: ${({ disabled }) => (disabled ? '#efefef' : '#ffb43c')};\n\n border: solid 1px ${({ disabled }) => (disabled ? '#efefef' : '#ffb43c')};\n cursor: pointer;\n\n ${breakpoint.m`\n min-width: 250px;\n margin: 0 20px 20px 0;\n `};\n`;\n\nexport const ButtonWrapper = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n box-sizing: border-box;\n margin-top: 60px;\n padding: 0 10px 20px 10px;\n width: 100%;\n\n ${breakpoint.xs`\n padding: 0 20px 20px 20px;\n `};\n ${breakpoint.m`\n padding: 0;\n `};\n`;\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/reservation/default/styled-components.jsx","import React from 'react';\n\nexport const SeoBanner = ({ title, description, photo }) => (\n
\n);\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/offers/components/SeoBanner.jsx","import React from 'react';\nimport { Tab } from 'react-tabs';\n\nimport { T } from '../../../../../common/locale/translate';\nimport { offersListTabsIds } from '../../../common/objects/consts';\nimport { insertIf } from '../../../services/services';\n\nconst tabsData = [\n {\n id: offersListTabsIds.SEO_OFFERS_LIST,\n iconClass: 'fa fa-list',\n text: 'seo_offers_list'\n },\n {\n id: offersListTabsIds.SEO_REGION_INFORMATION,\n iconClass: 'fa fa-globe',\n text: 'seo_region_information'\n },\n {\n id: offersListTabsIds.SEO_PRACTICAL_INFORMATION,\n iconClass: 'fa fa-list',\n text: 'seo_practical_information'\n },\n {\n id: offersListTabsIds.SEO_MAP,\n iconClass: 'fa fa-map-marker',\n text: 'seo_map'\n }\n];\n\nconst createTab = ({ id, text, iconClass }, onClick, key) => (\n
onClick(id)} key={key}>\n \n \n {T(text)}\n \n \n);\n\nexport const createSeoTabs = (\n onTabClick,\n isRegionInfoTabVisible,\n isUsefulInfoTabVisible,\n isMapTabVisible\n) => [\n createTab(tabsData[0], onTabClick, 'seo-tab-0'),\n ...insertIf(\n isRegionInfoTabVisible,\n createTab(tabsData[1], onTabClick, 'seo-tab-1')\n ),\n ...insertIf(\n isUsefulInfoTabVisible,\n createTab(tabsData[2], onTabClick, 'seo-tab-2')\n ),\n ...insertIf(isMapTabVisible, createTab(tabsData[3], onTabClick, 'seo-tab-3'))\n];\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/offers/components/SeoTabs.jsx","import React from 'react';\nimport { Carousel } from 'react-responsive-carousel';\n\nimport { T } from '../../../../../common/locale/translate';\nimport AdvantageItem from './AdvantageItem';\n\nconst advantages = [\n {\n icon: '/img/icons/piggy_bank.svg',\n icon_title: T('cheaper_holidays_title'),\n text: T('cheaper_holidays'),\n alt: T('cheaper_holidays_alt')\n },\n {\n icon: '/img/icons/insurance.svg',\n icon_title: T('protected_holidays_title'),\n text: T('protected_holidays'),\n alt: T('protected_holidays_alt'),\n fine_print: T('more_requirements')\n },\n {\n icon: '/img/icons/five_stars_hotel.svg',\n icon_title: T('better_quality_title'),\n text: T('better_quality'),\n alt: T('better_quality_alt')\n },\n {\n icon: '/img/icons/description.svg',\n icon_title: T('compliance_with_description_title'),\n text: T('compliance_with_description'),\n alt: T('compliance_with_description_alt')\n },\n {\n icon: '/img/icons/flight.svg',\n icon_title: T('more_destinations_title'),\n text: T('more_destinations'),\n alt: T('more_destinations_alt')\n }\n];\n\nconst GermanOperatorsBanner = () => (\n
\n \n \n {advantages.map((advantage, i) => (\n \n ))}\n {advantages &&\n advantages.length && (\n \n {advantages.map((advantage, i) => (\n \n ))}\n \n )}\n \n \n \n);\n\nexport default GermanOperatorsBanner;\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/common/components/german_operators_banner/GermanOperatorsBanner.jsx","import React from 'react';\n\nconst AdvantageItem = ({ icon, icon_title, alt, text, fine_print }) => (\n
\n
\n \n \n \n \n {fine_print && (\n \n )}\n \n
\n
\n);\n\nexport default AdvantageItem;\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/common/components/german_operators_banner/AdvantageItem.jsx","import React, { PureComponent } from 'react';\nimport OffersSeoWrapper from './components/index';\nimport OfferTypeTabs from './components/tabs/index';\n\nexport default class OffersPage extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n breadcrumbs: null,\n pristine: true\n };\n }\n\n render() {\n const {\n initial_params,\n params,\n seo_params,\n curiosities,\n region_information,\n is_from_germany\n } = this.props;\n const breadcrumbs = this.state.breadcrumbs || this.props.breadcrumbs;\n\n return (\n
\n \n \n
\n );\n }\n\n getBreadcrumbsList = breadcrumbs => {\n if (this.state.pristine) {\n this.setState({ pristine: false });\n } else {\n this.setState({ breadcrumbs });\n const jsonBreadcrumbs = document.getElementById('json-breadcrumbs');\n if (jsonBreadcrumbs) {\n jsonBreadcrumbs.innerHTML = JSON.stringify(breadcrumbs);\n }\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/offers/index.jsx","import React, { PureComponent } from 'react';\nimport OfferTypeTabs from './components/tabs/index';\nimport HotelNameSearcher from './components/HotelNameSearcher';\n\nimport {\n createRegionsObject,\n fetchFilterData,\n isFilterExpired,\n localstorageAvailable\n} from '../../services/services';\nimport { T } from '../../../../common/locale/translate';\n\nexport default class RegionsPage extends PureComponent {\n constructor(props) {\n super(props);\n this.state = {\n breadcrumbs: null,\n regions: {},\n regions_list: [],\n special_regions: [],\n open_subregions: [],\n offer_type: props.offer_type || 'S',\n hotel_name: props.hotel_name\n };\n }\n\n componentDidMount = () => {\n this.setInitialData();\n };\n\n render() {\n const { params, not_found } = this.props;\n const breadcrumbs = this.state.breadcrumbs || this.props.breadcrumbs;\n let searcher = this.renderSearcher();\n let destinations = this.renderDestinations();\n\n return (\n
\n
\n this.setState({ offer_type })}\n />\n \n
{searcher}
\n {not_found && (\n
{T('no_hotels_found')}
\n )}\n
{destinations}
\n
\n );\n }\n\n renderSearcher = () => (\n
\n );\n\n renderDestinations = () => {\n let main_destinations = this.state.regions.main_regions || [];\n return (\n
\n {this.renderDestinationGroups()}\n
\n {T('all_directions')} \n
\n
\n {this.renderDestinationElement(main_destinations)}\n
\n
\n );\n };\n\n renderDestinationGroups = () => {\n let special_regions = this.state.special_regions;\n return special_regions.map((group, index) => (\n
\n
\n \n {' '}\n {group.name} {T('destinations')}{' '}\n \n
\n
\n {this.renderDestinationElement(group.subregions, 'special-regions')}\n
\n
\n ));\n };\n\n renderDestinationElement = (destinations, nameSuffix) => {\n const suffix = nameSuffix ? nameSuffix : '';\n return destinations.map((region, i) => {\n const destination = this.state.regions[region];\n if (destination.subregions || !destination.parent) {\n // main region\n\n let isOpen = this.state.open_subregions.indexOf(destination.id) > -1;\n let arrow = destination.subregions ? (\n
\n ) : (\n ''\n );\n\n return (\n
\n \n {' '}\n {destination.name}{' '}\n {' '}\n {arrow}\n {destination.subregions ? (\n \n {' '}\n {this.renderDestinationElement(\n destination.subregions,\n suffix\n )}{' '}\n
\n ) : (\n ''\n )}\n \n );\n } else {\n // subregions\n\n return (\n
\n \n {' '}\n {destination.name}{' '}\n \n \n );\n }\n });\n };\n\n handleSubregionsIndicatorClick = id => {\n if (this.state.open_subregions.indexOf(id) > -1) {\n let open_subregions = this.state.open_subregions.filter(v => v !== id);\n this.setState({ open_subregions }, () => {\n this.forceUpdate();\n });\n } else {\n let open_subregions = this.state.open_subregions;\n open_subregions.push(id);\n this.setState({ open_subregions }, () => {\n this.forceUpdate();\n });\n }\n };\n\n setInitialData = () => {\n if (localstorageAvailable()) {\n if (isFilterExpired('regions', this.state.filterDataCacheTime)) {\n this.updateFilterSource();\n } else {\n const filter_data = JSON.parse(localStorage.getItem('regions_filter'));\n this.setState({\n regions: filter_data.regions,\n regions_list: filter_data.regions_list,\n special_regions: filter_data.special_regions\n });\n }\n } else {\n this.updateFilterSource();\n }\n };\n\n updateFilterSource = () => {\n fetchFilterData('regions_filter').then(\n response => {\n const filter_data = createRegionsObject(response.data);\n if (localstorageAvailable()) {\n localStorage.setItem('regions_filter', JSON.stringify(filter_data));\n localStorage.setItem(\n 'regions_filter_last_update',\n new Date().getTime()\n );\n }\n this.setState({\n regions: filter_data.regions,\n regions_list: filter_data.regions_list,\n special_regions: filter_data.special_regions\n });\n },\n error => {\n console.log('Error when fetching regions', error);\n }\n );\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/offers/regions.jsx","import React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { T } from '../../../../../common/locale/translate';\n\nexport default class HotelNameForm extends React.Component {\n constructor(props) {\n super();\n this.state = {\n hotel_name: props.hotel_name,\n active_modal: false,\n active_input: false\n };\n\n this.inputRef = null;\n this.setInputRef = element => {\n this.inputRef = element;\n };\n\n this.modalRef = null;\n this.setModalRef = element => {\n this.modalRef = element;\n };\n }\n\n componentDidMount = () => {\n document.addEventListener(\n 'click',\n this.handleClickOutside.bind(this),\n true\n );\n document.addEventListener('click', this.handleLoseFocus.bind(this), true);\n };\n\n render() {\n return (\n
\n \n \n
\n \n
\n
\n {' '}\n {T('filter_results')}{' '}\n {' '}\n
\n \n
\n
\n {T('search_for_hotel')}
\n \n \n
\n \n \n
\n
\n \n \n
\n \n \n
\n
\n \n );\n }\n\n handleMobileToggle = () => {\n if (document) {\n document.body.classList.toggle('modal-visible');\n }\n this.setState({ active_modal: !this.state.active_modal });\n };\n\n handleChange = event => this.setState({ hotel_name: event.target.value });\n\n handleClickOutside = event => {\n const domNode = ReactDOM.findDOMNode(this.modalRef);\n if (\n (!domNode || !domNode.contains(event.target)) &&\n this.state.active_modal\n ) {\n this.handleMobileToggle();\n }\n };\n\n handleLoseFocus = event => {\n const domNode = ReactDOM.findDOMNode(this.inputRef);\n if (\n (!domNode || !domNode.contains(event.target)) &&\n this.state.active_input\n ) {\n this.setState({ active_input: false });\n }\n };\n\n handleFocus = () => {\n this.setState({ active_input: true });\n };\n\n handleSearch = () => {\n this.props.search(this.state.hotel_name);\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/offers/components/HotelNameForm.jsx","import React from 'react';\nimport axios from 'axios';\n\nimport OfferTypeTabs from './components/tabs/index';\nimport Loader from './components/hotels_list/loader';\nimport HotelNameSearcher from './components/HotelNameSearcher';\n\nimport {\n link2OfferDescriptionWithHotel,\n fetchHotelsList\n} from '../../services/services';\nimport { T } from '../../../../common/locale/translate';\nimport { historyService } from '../../services/history';\n\nexport default class HotelsList extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n breadcrumbs: null,\n loader: false,\n sort_by: 'name',\n sort_asc: true,\n offer_type: props.offer_type || 'S',\n region_id: props.region_id,\n region_name: props.region_name,\n region_slug: props.region_slug,\n hotel_name: props.hotel_name,\n hotels: []\n };\n }\n\n componentDidMount = () => {\n this.setState(\n {\n loader: true\n },\n () => {\n fetchHotelsList(\n this.state.offer_type,\n this.state.region_id,\n this.state.hotel_name\n ).then(\n response => {\n if (response.status == 204) {\n this.setState(\n {\n loader: false\n },\n () => this.redirectToRegionsList()\n );\n } else {\n this.setState(\n {\n loader: false,\n hotels: response.data.hotels\n },\n () => this.forceUpdate()\n );\n }\n },\n error => {\n if (axios.isCancel(error)) {\n console.log('GetHotelsList - Request canceled');\n } else {\n this.setState({\n loader: false\n });\n }\n }\n );\n }\n );\n };\n\n render = () => {\n const { params } = this.props;\n const breadcrumbs = this.state.breadcrumbs || this.props.breadcrumbs;\n let hotelsHeader = this.renderHotelsHeader();\n let goBackHeader = this.renderGoBackHeader();\n let hotelsElement = this.renderHotels();\n let loaderElement = this.renderLoader();\n\n return (\n
\n
\n {this.props.region_type == 'search-results' && [\n
{this.renderSearcher()}
,\n
\n {T('hotel_name_search_message')} \n \n {this.state.hotel_name}:\n \n
\n ]}\n
{hotelsHeader}
\n
{goBackHeader}
\n
{hotelsElement}
\n
{loaderElement}
\n
\n );\n };\n\n getLocationHeader = () => {\n switch (this.props.region_type) {\n case 'search-results':\n return 'country-region-city';\n case 'country':\n return 'region-city';\n case 'region':\n return 'city';\n default:\n return 'location';\n }\n };\n\n getLocation = hotel => {\n switch (this.props.region_type) {\n case 'search-results':\n return this.renderCountriesHotelListLink(hotel);\n case 'country':\n return this.renderRegionsHotelListLink(hotel);\n case 'region':\n return hotel.city;\n default:\n return '-';\n }\n };\n\n renderSearcher = () => (\n
\n );\n\n renderCountriesHotelListLink = hotel => [\n hotel.country && [\n
\n {hotel.country}\n ,\n
, \n ],\n hotel.region && [\n
\n {hotel.region}\n ,\n
, \n ],\n
{hotel.city}\n ];\n\n renderRegionsHotelListLink = hotel => [\n
\n {hotel.region}\n ,\n
, ,\n
{hotel.city}\n ];\n\n renderHotelsHeader = () => (\n
\n {['name', `${this.getLocationHeader()}`, 'rating', 'opinions'].map(\n headerCategory => (\n
this.handleSortHeaderClick(headerCategory)}\n >\n
{T(`hotel-${headerCategory}`)}\n {this.state.sort_by == headerCategory && (\n
\n \n
\n )}\n
\n )\n )}\n
\n );\n\n renderGoBackHeader = () => (\n
\n );\n\n getSortFunc = () => {\n let func = null;\n switch (this.state.sort_by) {\n case 'rating':\n case 'opinions':\n func = (a, b) =>\n parseFloat(a[this.state.sort_by]) - parseFloat(b[this.state.sort_by]);\n break;\n case 'country-region-city':\n func = (a, b) =>\n a.country != b.country\n ? (a.country || '').localeCompare(b.country || '')\n : a.region != b.region\n ? (a.region || '').localeCompare(b.region || '')\n : (a.city || '').localeCompare(b.city || '');\n break;\n case 'region-city':\n func = (a, b) =>\n a.region != b.region\n ? (a.region || '').localeCompare(b.region || '')\n : (a.city || '').localeCompare(b.city || '');\n break;\n case 'name':\n case 'city':\n default:\n func = (a, b) =>\n (a[this.state.sort_by] || '').localeCompare(\n b[this.state.sort_by] || ''\n );\n }\n return (a, b) => func(a, b) * (this.state.sort_asc ? 1 : -1);\n };\n\n renderHotels = () => {\n if (this.state.loader || this.state.hotels.length > 0) {\n const sortFunc = this.getSortFunc();\n\n return this.state.hotels.sort(sortFunc).map((hotel, index) => (\n
\n ));\n } else {\n return (\n
\n {T('no_hotels_found')}\n
\n );\n }\n };\n\n hotelHref = hotel =>\n link2OfferDescriptionWithHotel(this.offerLinkParams(hotel));\n\n handleSortHeaderClick = header_name => {\n if (this.state.sort_by == header_name) {\n this.setState(prevState => ({\n ...prevState,\n sort_asc: !prevState.sort_asc\n }));\n } else {\n this.setState({ sort_by: header_name, sort_asc: true });\n }\n };\n\n handleOfferTabClick = offer_type => {\n let params = historyService.params();\n params =\n typeof params['offer_type'] == 'undefined' ? this.props.params : params;\n if (offer_type !== params['offer_type']) {\n params['offer_type'] = offer_type;\n const url = offer_type\n ? `/hotele/${this.state.region_slug ||\n 'szukaj'}?${historyService.parseObject2Params(params)}`\n : null;\n window.location.href = url;\n }\n };\n\n redirectToRegionsList = () => {\n let params = historyService.params();\n const url = `/hotele?not_found=true${\n typeof params['hotel_name'] != 'undefined'\n ? `&hotel_name=${this.state.hotel_name}`\n : ''\n }`;\n window.location.href = url;\n };\n\n offerLinkParams = hotel => ({\n id: hotel.id.split('|')[0],\n operator_code: hotel.id.split('|')[1],\n parser: hotel.parserAlias,\n offer_type: this.state.offer_type\n });\n\n renderLoader = () => (\n
\n );\n}\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/offers/hotels_list.jsx","import React from 'react';\nimport { animateProgress } from '../../../../services/animate';\n\nexport default class Loader extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n current_progress: 0,\n title: 'Jeszcze moment!',\n subtitle: 'Szukamy hoteli!',\n width: 0,\n loadTime: 20000,\n initialDelayTime: 300,\n delayTime: 100,\n active: true,\n pristine: true\n };\n }\n\n componentDidMount() {\n this.startAnimation();\n }\n\n componentWillReceiveProps(nextProps) {\n if (!this.state.pristine && nextProps.active !== this.state.active) {\n nextProps.active ? this.startAnimation() : this.finishAnimation();\n }\n }\n\n render = () => (\n
\n
\n {this.props.title ? this.props.title : this.state.title}\n
\n
\n {this.props.subtitle ? this.props.subtitle : this.state.subtitle}\n
\n
\n
\n
\n );\n\n updateLoader = currentProgress => this.setState({ width: currentProgress });\n\n closeLoader = () => {\n this.setState({ active: false }, () => {\n setTimeout(() => {\n this.setState({ width: 0 });\n }, 100);\n });\n };\n\n startAnimation = () => {\n const state = this.state.pristine;\n this.setState({ pristine: false, active: true }, () => {\n const delay = state ? this.state.initialDelayTime : this.state.delayTime;\n animateProgress(\n this.updateLoader,\n false,\n 0,\n 95,\n this.state.loadTime,\n 'easeOutCubic',\n delay\n );\n });\n };\n\n finishAnimation = () => {\n localStorage.setItem('offersLock', new Date().getTime());\n animateProgress(\n this.updateLoader,\n this.closeLoader,\n this.state.width,\n 100,\n 100,\n 'linear'\n );\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/offers/components/hotels_list/loader.js","import React from 'react';\nimport moment from 'moment';\nimport styled from 'styled-components';\nimport { Carousel } from 'react-responsive-carousel';\n\nimport { T } from '../../../../common/locale/translate';\n\nimport { prepareBreadcrumbs } from '../../common/offer_utils';\n\nconst WHITE_LOGO_PATH = '/img/amigos-logo-white.svg';\nconst TV_OFFERS_BACKGROUND_PATH = '/img/tvoffers/background.png';\nconst PHONE_NUMBER = '+48 75 753 26 01';\nconst MOBILE_NUMBER = '509 663 169';\n\nconst InfoWrapper = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n padding: 20px;\n background-color: rgba(255, 255, 255, 0.8);\n border-radius: 10px;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n`;\n\nconst InfoContent = styled.div`\n text-align: center;\n color: #084172;\n font-size: 3vh;\n font-weight: 600;\n max-width: 80%;\n`;\n\nconst InfoComponent = ({ children }) => (\n
\n {children}\n \n);\n\nclass TvOffers extends React.Component {\n constructor(props) {\n super(props);\n this.state = {\n refreshKey: 0\n };\n this.refreshInterval = null;\n }\n\n componentDidMount() {\n this.checkAndStartRefreshInterval();\n }\n\n componentDidUpdate() {\n this.checkAndStartRefreshInterval();\n }\n\n componentWillUnmount() {\n this.stopRefreshInterval();\n }\n\n checkAndStartRefreshInterval = () => {\n if (\n !this.props.groupedTvOffers ||\n this.props.groupedTvOffers.length === 0\n ) {\n this.startRefreshInterval();\n } else {\n this.stopRefreshInterval();\n }\n };\n\n startRefreshInterval = () => {\n if (!this.refreshInterval) {\n this.refreshInterval = setInterval(() => {\n window.location.reload();\n this.setState(prevState => ({ refreshKey: prevState.refreshKey + 1 }));\n }, 5000);\n }\n };\n\n stopRefreshInterval = () => {\n if (this.refreshInterval) {\n clearInterval(this.refreshInterval);\n this.refreshInterval = null;\n }\n };\n render = () => {\n const { groupedTvOffers, category, info } = this.props;\n\n if (!groupedTvOffers || groupedTvOffers.length === 0) {\n return (\n
\n \n {info}\n \n );\n } else {\n return (\n
\n \n\n \n {groupedTvOffers.map((group, groupIdx) => (\n \n {group.map(offer => {\n const breadcrumbs = prepareBreadcrumbs(offer.subject);\n\n return (\n \n {this.renderOfferCategories(offer)}\n \n \n \n \n \n {offer.subject.name} \n {offer.subject.rating && (\n \n )}\n \n \n \n \n \n {breadcrumbs.length ? breadcrumbs[0] : null}\n \n \n {breadcrumbs.length > 1\n ? breadcrumbs.slice(1).join(', ')\n : null}\n \n \n \n {T('from')} \n {Math.ceil(\n offer.offer_check && offer.offer_check.price_pln\n ? offer.offer_check.price_pln\n : offer.price_pln\n )}{' '}\n {T('pln_per_person')}\n \n \n \n\n \n\n \n \n {offer.departure_date &&\n offer.return_date && (\n \n \n {moment\n .utc(offer.departure_date)\n .format('DD.MM.YY')}\n {'-'}\n {moment\n .utc(offer.return_date)\n .format('DD.MM.YY')}\n
\n )}\n {offer.flights &&\n offer.flights.length &&\n offer.flights[0].departure_airport_name && (\n \n \n {T('departure_colon')}{' '}\n {offer.flights[0].departure_airport_name}\n
\n )}\n {offer.boards &&\n offer.boards.length &&\n offer.boards[0].name && (\n \n \n {offer.boards[0].name}\n
\n )}\n \n {offer.qr_code && (\n \n {T('scan_qr')}\n \n \n )}\n \n \n \n );\n })}\n \n ))}\n \n \n \n );\n }\n };\n\n renderOfferCategories = offer => (\n
\n {offer.is_allinclusive && (\n \n {' '}\n {T('all_inclusive')}{' '}\n \n )}\n {offer.is_lastminute && (\n \n {' '}\n {T('last_minute')}{' '}\n \n )}\n {offer.is_firstminute && (\n \n {' '}\n {T('first_minute')}{' '}\n \n )}\n \n );\n}\n\nconst OffersSwiper = styled.div`\n height: 100%;\n display: grid;\n grid-template-rows: 1fr 1fr;\n grid-template-columns: 1fr 1fr 1fr;\n column-gap: 4vw;\n row-gap: 4vw;\n place-items: center;\n justify-content: space-between;\n margin: 0 6vw !important;\n`;\n\nconst OfferWrapper = styled.div`\n height: 100%;\n width: 100%;\n background: #ffffff;\n border-radius: 1vh;\n position: relative;\n`;\n\nconst OverflowWrapper = styled.div`\n width: 100%;\n height: 100%;\n overflow: hidden;\n display: flex;\n color: #084172;\n padding: 2vh !important;\n flex-direction: column;\n justify-content: space-between;\n row-gap: 1vh;\n`;\n\nconst Thumbnail = styled.img`\n && {\n height: 14vh;\n margin-left: -4vh;\n border-radius: 0 1vh 1vh 0;\n object-fit: cover;\n }\n`;\n\nconst HotelInfo = styled.div`\n display: flex;\n flex-direction: row;\n flex-grow: 2;\n`;\n\nconst LeftHotelPanel = styled.div`\n width: 50%;\n display: flex;\n flex-direction: column;\n row-gap: 1.5vh;\n`;\n\nconst HotelName = styled.div`\n font-weight: 600;\n text-align: left;\n font-size: 1.5vh;\n max-height: 3rem;\n overflow: hidden;\n text-overflow: ellipsis;\n`;\n\nconst RightHotelPanel = styled.div`\n width: 50%;\n display: flex;\n flex-direction: column;\n row-gap: 1vh;\n text-align: left;\n`;\n\nconst QRCode = styled.img`\n &&&& {\n height: 100%;\n max-height: 6vh;\n width: auto;\n image-rendering: pixelated;\n }\n`;\n\nconst Breadcrumbs = styled.div``;\n\nconst MainBreadcrumb = styled.div`\n text-align: left;\n font-weight: 600;\n font-size: 2vh;\n text-transform: uppercase;\n`;\n\nconst RestBreadcrumbs = styled.div`\n text-align: left;\n font-weight: 600;\n font-size: 1.5vh;\n text-transform: uppercase;\n color: #0797af;\n`;\n\nconst Price = styled.div`\n text-align: left;\n font-weight: 600;\n font-size: 3vh;\n\n span {\n font-weight: 500;\n }\n`;\n\nconst OfferInfo = styled.div`\n display: flex;\n flex-direction: row;\n align-items: end;\n align-items: stretch;\n column-gap: 1vh;\n`;\n\nconst LeftInfoPanel = styled.div`\n display: flex;\n flex-direction: column;\n font-size: 1.3vh;\n text-align: left;\n text-transform: capitalize;\n row-gap: 0.3vh;\n flex-basis: 90%;\n justify-content: end;\n row-gap: 0.5vh;\n\n i.fa {\n width: 2vh;\n }\n`;\n\nconst RightInfoPanel = styled.div`\n display: flex;\n flex-direction: row;\n column-gap: 1vh;\n font-size: 1.2vh;\n align-items: end;\n text-align: left;\n`;\n\nconst TvOffersWrapper = styled.div`\n width: 100vw;\n height: 100vh;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n\n .curiosity-slider {\n background: rgba(0, 0, 0, 0.3) url(${TV_OFFERS_BACKGROUND_PATH});\n background-size: cover;\n background-position: center;\n background-blend-mode: darken;\n height: 0;\n flex-grow: 5;\n\n .carousel-slider {\n height: 100%;\n display: flex;\n\n .slider-wrapper {\n height: 87.5%;\n\n ul.slider {\n height: 100%;\n }\n }\n\n .dot {\n background: #ffffff 0% 0% no-repeat padding-box !important;\n border: 1px solid #707070 !important;\n opacity: 0.58 !important;\n width: 1.75vh !important;\n height: 1.75vh !important;\n\n &.selected {\n opacity: 1 !important;\n }\n }\n }\n }\n`;\n\nconst Header = styled.div`\n padding: 2vh 6vw;\n background: #084172;\n display: flex;\n justify-content: space-between;\n align-items: center;\n`;\n\nconst Title = styled.div`\n font-size: 4vh;\n line-height: 4vh;\n color: #ffffff;\n text-transform: uppercase;\n font-weight: 600;\n display: flex;\n justify-content: space-between;\n`;\n\nconst Logo = styled.img`\n max-height: 7.5vh;\n`;\n\nconst StyledSeparator = styled.div`\n border-top: 0.1vw dashed #aaaaaa;\n`;\n\nconst Footer = styled.div`\n padding: 2vh 6vw;\n background: #084172;\n display: flex;\n justify-content: space-between;\n`;\n\nconst FooterColumn = styled.div`\n display: flex;\n column-gap: 1vw;\n`;\n\nconst FooterElement = styled.div`\n font-size: 2vh;\n line-height: 2vh;\n color: #ffffff;\n text-transform: uppercase;\n\n i.fa {\n margin: 0 10px;\n }\n`;\n\nconst OfferCategories = styled.div`\n position: absolute;\n top: 3vh;\n left: -4vh;\n text-align: center;\n`;\n\nconst OfferCategory = styled.span`\n && {\n display: block;\n font-size: 0.5rem;\n font-weight: 700;\n text-transform: uppercase;\n color: #fff;\n width: 110px;\n box-sizing: border-box;\n padding: 0.35rem 0;\n margin: 0.3rem 0;\n }\n`;\n\nexport default TvOffers;\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/offers/tv_offers.jsx","import ReactOnRails from 'react-on-rails';\n\nimport NewsletterForm from './../../layout/components/newsletter/newsletter_form';\n\nimport OfferTypeTabs from './components/tabs/index';\nimport AdvancedSearchForm from './components/advanced_search/index';\nimport OffersList from './components/offers_list/index';\nimport LoggedInNotification from './../../layout/components/logged_in_notify';\nimport OffersSeoWrapper from './components/index';\nimport OffersPage from './index';\nimport RegionsPage from './regions';\nimport HotelsListPage from './hotels_list';\nimport TvOffers from './tv_offers';\n\nReactOnRails.register({\n NewsletterForm,\n OfferTypeTabs,\n AdvancedSearchForm,\n OffersList,\n LoggedInNotification,\n OffersSeoWrapper,\n OffersPage,\n RegionsPage,\n HotelsListPage,\n TvOffers\n});\n\n\n\n// WEBPACK FOOTER //\n// ./app/javascript/pages/offers/registration.jsx"],"sourceRoot":""}