{"version":3,"file":"js/views/homepage/show-7616a65c04ee625b1cce-v10.js","mappings":"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","sources":["webpack:///./app/javascript/legacy/views/carousels/CardCarousel.js","webpack:///./app/javascript/legacy/views/carousels/CarouselScroller.js","webpack:///./app/javascript/legacy/views/carousels/ListingCardCarousel.js","webpack:///./app/javascript/legacy/lib/Browser.js","webpack:///./app/javascript/legacy/pages/HomePage.js","webpack:///./app/javascript/packs/views/homepage/show.js","webpack:///../../shared/node_modules/js-cookie/dist/js.cookie.mjs"],"sourcesContent":["import $ from 'legacy/vendor/jquery.custom'\n\nimport CarouselScroller from 'legacy/views/carousels/CarouselScroller'\n\nexport default class CardCarousel {\n static bind(selector) {\n return new CardCarousel(selector)\n }\n\n constructor(el) {\n this.$carousel = $(el)\n\n if (!this.$carousel.length) return\n\n this.$dots = this.$carousel.find('.carousel-dots')\n this.scroller = new CarouselScroller(this.$carousel)\n\n this.$carousel\n .on(CarouselScroller.EVENTS.PAGE_CHANGE, () => this.renderActiveDot())\n .on(CarouselScroller.EVENTS.TOTAL_PAGES_CHANGE, () => this.renderDots())\n .on('click', '.dot', this.onDotClick)\n\n this.renderDots()\n }\n\n onDotClick = ({ currentTarget: dot }) => {\n this.scroller.scrollToPage($(dot).parent().index())\n }\n\n onPageChange = () => {\n this.renderActiveDot()\n }\n\n renderDots() {\n requestAnimationFrame(() => {\n const totalDots = this.scroller.totalPages\n this.$dots.toggleClass('hidden', totalDots <= 1)\n\n if (totalDots <= 1) return\n\n this.$dots.empty()\n\n for (let i = 0; i < totalDots; i += 1) {\n this.$dots.append(\n `
  • \n \n
  • `,\n )\n }\n\n this.renderActiveDot()\n })\n }\n\n renderActiveDot() {\n requestAnimationFrame(() => {\n const previouslyActive = this.$dots.find('.dot.active')\n previouslyActive.removeClass('active')\n previouslyActive.removeAttr('aria-current')\n\n const currentlyActive = this.$dots.find(`.dot:eq(${this.scroller.currentPage})`)\n currentlyActive.addClass('active')\n currentlyActive.attr('aria-current', 'true')\n\n this.updateAccessibilityAttributes()\n })\n }\n\n updateAccessibilityAttributes = () => {\n const carouselScroller = this.$carousel.find('.js-carousel-scroller')[0]\n const liItems = Array.from(carouselScroller.querySelectorAll('li'))\n\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n const isIntersecting = entry.isIntersecting\n this.updateAriaHidden(entry.target, isIntersecting)\n this.updateTabIndex(entry.target, isIntersecting)\n })\n }, { threshold: 0.5 })\n\n liItems.forEach((item) => {\n observer.observe(item)\n })\n }\n\n updateAriaHidden = (target, isIntersecting) => {\n $(target).attr('aria-hidden', !isIntersecting)\n }\n\n updateTabIndex = (target, isIntersecting) => {\n const focusableElements = target.querySelectorAll(`\n a[href],\n button:not([disabled]),\n input:not([disabled]),\n select:not([disabled]),\n textarea:not([disabled]),\n [tabindex]:not([disabled]):not([tabindex=\"-1\"])\n `)\n\n focusableElements.forEach((element) => {\n $(element).attr('tabindex', isIntersecting ? '0' : '-1')\n })\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\n\nexport function lastClosestIndex(collection, target) {\n return collection.lastIndexOf(collection.reduce((bestFit, x) => (\n Math.abs(x - target) < Math.abs(bestFit - target) ? x : bestFit\n )))\n}\nexport function firstClosestIndex(collection, target) {\n return collection.indexOf(collection.reduce((bestFit, x) => (\n Math.abs(x - target) < Math.abs(bestFit - target) ? x : bestFit\n )))\n}\n\nexport default class CarouselScroller {\n static smoothScrollSpeed = 400\n\n static EVENTS = {\n ITEM_CHANGE: 'change.lastItemInViewport',\n PAGE_CHANGE: 'change.currentPage',\n TOTAL_PAGES_CHANGE: 'change.totalPages',\n }\n\n scroller = null // DOM Element\n $scroller = null // jQuery Element\n\n lastItemInViewport = 0\n firstItemInViewport = 0\n currentPage = 0\n itemEndPoints = [] // Coordinates for the end of each list item\n itemStartPoints = [] // Coordinates for the beginning of each list item\n pageStartPoints = [] // Coordinates for the start of each “page”\n maxScrollLeft = 0 // The max we can scroll to (without “rubber-banding”)\n scrollerWidth = 0\n\n // TODO: Remove this when browser support improves\n // See https://caniuse.com/#feat=mdn-api_scrolltooptions_behavior\n nativeSmoothingSupported = ('scrollBehavior' in document.documentElement.style);\n\n get totalPages() { return this.pageStartPoints.length }\n\n constructor(el) {\n // Set up data\n this.$scroller = $(el).find('.js-carousel-scroller')\n this.scroller = this.$scroller.get(0)\n this.$buttons = $(el).find('.carousel-button')\n this.totalItems = this.scroller.children.length\n\n this.updateMetrics()\n\n\n // Attach Events\n\n $(window).on('resize', this.onResize)\n\n this.$scroller\n .on('scroll', this.onScroll)\n .on(CarouselScroller.EVENTS.PAGE_CHANGE, () => this.renderButtonStates())\n .on(CarouselScroller.EVENTS.TOTAL_PAGES_CHANGE, () => this.renderButtons())\n\n if (!this.nativeSmoothingSupported) {\n ['touchstart', 'pointerdown', 'wheel'].forEach((event) => {\n this.scroller.addEventListener(event, this.cancelAnimation, { passive: true })\n })\n }\n\n this.$buttons.on('click', this.onButtonClick)\n\n\n // Render\n\n this.renderButtons()\n }\n\n next = ({ smooth = true } = {}) => this.move({ direction: 1, smooth })\n prev = ({ smooth = true } = {}) => this.move({ direction: -1, smooth })\n\n scrollToPage(i, { smooth = true } = {}) {\n const target = this.pageStartPoints[i]\n this.scrollTo(target, { smooth })\n }\n\n\n // ---------------------------------------------------------------------\n // Private methods\n // ---------------------------------------------------------------------\n\n onButtonClick = ({ currentTarget: button }) => {\n // call this.next() / .prev()\n this[button.dataset.direction]()\n }\n\n onResize = () => {\n requestAnimationFrame(() => this.updateMetrics())\n }\n\n onScroll = () => {\n requestAnimationFrame(() => this.updateClosestItemAndPage())\n }\n\n renderButtons() {\n requestAnimationFrame(() => {\n this.$buttons.toggleClass('hidden', this.totalPages <= 1)\n this.renderButtonStates()\n })\n }\n\n renderButtonStates() {\n requestAnimationFrame(() => {\n const [prev, next] = this.$buttons.get()\n\n prev.disabled = this.currentPage <= 0\n next.disabled = this.currentPage >= this.totalPages - 1\n })\n }\n\n cancelAnimation = () => {\n this.$scroller.stop()\n }\n\n updateClosestItemAndPage() {\n const scrollStart = this.scroller.scrollLeft\n const scrollEnd = scrollStart + this.scrollerWidth\n const closestPage = lastClosestIndex(this.pageStartPoints, scrollStart)\n const closestItem = lastClosestIndex(this.itemEndPoints, scrollEnd)\n const firstItem = firstClosestIndex(this.itemStartPoints, scrollStart)\n\n if (closestPage !== this.currentPage) {\n this.currentPage = closestPage\n this.$scroller.trigger(CarouselScroller.EVENTS.PAGE_CHANGE, {\n currentPage: this.currentPage,\n })\n }\n\n if (closestItem !== this.lastItemInViewport) {\n this.lastItemInViewport = closestItem\n this.$scroller.trigger(CarouselScroller.EVENTS.ITEM_CHANGE, {\n lastItemInViewport: this.lastItemInViewport,\n })\n }\n\n if (firstItem !== this.firstItemInViewport) {\n this.firstItemInViewport = firstItem\n }\n }\n\n updateMetrics() {\n const prevTotalPages = this.totalPages\n\n // Reset\n this.itemEndPoints = []\n this.itemStartPoints = []\n this.pageStartPoints = []\n\n // Record Metrics\n this.scrollerWidth = this.scroller.clientWidth\n this.maxScrollLeft = this.scroller.scrollWidth - this.scrollerWidth\n\n\n // Recalculate start/end points for items and pages\n // ------------------------------------------------\n\n const children = [...this.scroller.children]\n\n // NOTE: We have to be careful here, to reduce reflow/layout thrashing\n // See: https://gist.github.com/paulirish/5d52fb081b3570c81e3a\n children.forEach((item) => {\n const start = item.offsetLeft\n const end = start + item.offsetWidth\n const hasSnapPoint = !window.getComputedStyle(item).scrollSnapAlign?.endsWith('none')\n\n if (hasSnapPoint && start < this.maxScrollLeft) {\n this.pageStartPoints.push(start)\n }\n\n this.itemEndPoints.push(end)\n this.itemStartPoints.push(start)\n })\n\n this.pageStartPoints.push(this.maxScrollLeft)\n\n // ------------------------------------------------\n\n if (this.totalPages !== prevTotalPages) {\n this.$scroller.trigger(CarouselScroller.EVENTS.TOTAL_PAGES_CHANGE)\n }\n\n this.updateClosestItemAndPage()\n }\n\n // direction = 1 (next) or -1 (prev)\n move({ direction = 1, smooth = true }) {\n let nextPage = this.currentPage + direction\n\n // Looping\n if (nextPage < 0) nextPage = this.totalPages - 1\n if (nextPage >= this.totalPages) nextPage = 0\n\n this.scrollToPage(nextPage, { smooth })\n }\n\n scrollTo(x, { smooth = true } = {}) {\n const scrollLeft = Math.min(x, this.maxScrollLeft)\n\n if (this.nativeSmoothingSupported || !smooth) {\n this.scroller.scrollTo({ left: scrollLeft, behavior: smooth ? 'smooth' : 'auto' })\n return\n }\n\n this.cancelAnimation()\n this.$scroller.animate({ scrollLeft }, CarouselScroller.smoothScrollSpeed)\n }\n}\n","import $ from 'legacy/vendor/jquery.custom'\n\nimport ComponentLoader from 'legacy/lib/ComponentLoader'\nimport EstatelyEvents from 'legacy/lib/EstatelyEvents'\n\nimport CardCarousel from 'legacy/views/carousels/CardCarousel'\n\nexport default class ListingCardCarousel extends ComponentLoader {\n static initialize() {\n $('.js-listing-card-carousel').one(EstatelyEvents.AJAX_CONTENT.LOADED, this.onCarouselFetched)\n }\n\n static onCarouselFetched = (event) => {\n event.currentTarget\n .querySelectorAll('.js-card-carousel')\n .forEach((carousel) => {\n CardCarousel.bind(carousel)\n this.onClickToListingCard(carousel)\n })\n }\n\n static onClickToListingCard = (carousel) => {\n $(carousel).find('.listing-card').on('click', (event) => {\n window.location.href = event.currentTarget.dataset.path\n })\n }\n}\n","const Browser = {\n get isAndroid() {\n return /(android)/i.test(window.navigator.userAgent)\n },\n\n get isMobile() {\n return !!window.estately.data.is_mobile\n },\n\n get isSafari() {\n return /^((?!chrome|android).)*safari/i.test(window.navigator.userAgent)\n },\n}\n\nexport default Browser\n","import DefaultPage from 'legacy/pages/DefaultPage'\nimport $ from 'legacy/vendor/jquery.custom'\nimport { oneLine } from 'common-tags'\n\nimport Browser from 'legacy/lib/Browser'\nimport Cookies from 'legacy/lib/Cookies'\n\nimport ListingCardCarousel from 'legacy/views/carousels/ListingCardCarousel'\n\nexport default class HomePage extends DefaultPage {\n static childComponents = [\n ...super.childComponents,\n\n ListingCardCarousel,\n ]\n\n static async initialize() {\n await super.initialize()\n\n // Focus search input if we’re on desktop and not scrolled down\n if (!Browser.isMobile && !window.scrollY) $('#search-location').focus()\n\n this.showRecentSearch()\n\n $('.js-homepage-referral-form').on('submit', (event) => {\n event.preventDefault()\n this.onReferralRequest(event)\n })\n }\n\n static onReferralRequest = async (event) => {\n const $form = $(event.currentTarget)\n const $errors = $form.find('.js-referral-request-errors')\n const $submitButton = $form.find('[type=submit]')\n\n $submitButton.prop('disabled', true)\n $errors.hide()\n\n try {\n await $.post($form.prop('action'), $form.serialize())\n } catch (xhr) {\n $submitButton.prop('disabled', false)\n return void $errors.html(this.formattedErrors(xhr)).show()\n }\n\n $('.js-hide-from-users-after-request').remove()\n $('.js-show-to-users-after-request').removeClass('hidden')\n }\n\n static formattedErrors(xhr) {\n try {\n const { errors } = xhr.responseJSON\n\n if (xhr.status === 500) throw new Error('Server error')\n if (!errors) throw new Error('Response has no errors object')\n\n return oneLine`\n \n `\n } catch (e) {\n return oneLine`\n We were unable to process your request.\n If you continue to have problems, you can contact us via phone\n by calling us at 1-800-341-8685.\n We apologize for the inconvenience.\n `\n }\n }\n\n static showRecentSearch() {\n const lastSearch = Cookies.get('permalinkv2')\n\n if (!lastSearch?.search_path) return\n\n const $recentSearch = $('.js-recent-search')\n const label = lastSearch.search_label?.replace(/\\+/g, ' ') // decodeURIComponent doesn’t change \"+\" to space.\n\n $recentSearch.find('a').attr('href', lastSearch.search_path)\n $recentSearch.removeClass('invisible')\n\n if (label) {\n $recentSearch.find('.js-search-label').text(label)\n $recentSearch.find('.js-search-with-label').removeClass('hidden')\n } else {\n $recentSearch.find('.js-search-without-label').removeClass('hidden')\n }\n }\n}\n","import HomePage from 'legacy/pages/HomePage'\n\nHomePage.register()\n","/*! js-cookie v3.0.5 | MIT */\n/* eslint-disable no-var */\nfunction assign (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n target[key] = source[key];\n }\n }\n return target\n}\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\nvar defaultConverter = {\n read: function (value) {\n if (value[0] === '\"') {\n value = value.slice(1, -1);\n }\n return value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent)\n },\n write: function (value) {\n return encodeURIComponent(value).replace(\n /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,\n decodeURIComponent\n )\n }\n};\n/* eslint-enable no-var */\n\n/* eslint-disable no-var */\n\nfunction init (converter, defaultAttributes) {\n function set (name, value, attributes) {\n if (typeof document === 'undefined') {\n return\n }\n\n attributes = assign({}, defaultAttributes, attributes);\n\n if (typeof attributes.expires === 'number') {\n attributes.expires = new Date(Date.now() + attributes.expires * 864e5);\n }\n if (attributes.expires) {\n attributes.expires = attributes.expires.toUTCString();\n }\n\n name = encodeURIComponent(name)\n .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)\n .replace(/[()]/g, escape);\n\n var stringifiedAttributes = '';\n for (var attributeName in attributes) {\n if (!attributes[attributeName]) {\n continue\n }\n\n stringifiedAttributes += '; ' + attributeName;\n\n if (attributes[attributeName] === true) {\n continue\n }\n\n // Considers RFC 6265 section 5.2:\n // ...\n // 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n // character:\n // Consume the characters of the unparsed-attributes up to,\n // not including, the first %x3B (\";\") character.\n // ...\n stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n }\n\n return (document.cookie =\n name + '=' + converter.write(value, name) + stringifiedAttributes)\n }\n\n function get (name) {\n if (typeof document === 'undefined' || (arguments.length && !name)) {\n return\n }\n\n // To prevent the for loop in the first place assign an empty array\n // in case there are no cookies at all.\n var cookies = document.cookie ? document.cookie.split('; ') : [];\n var jar = {};\n for (var i = 0; i < cookies.length; i++) {\n var parts = cookies[i].split('=');\n var value = parts.slice(1).join('=');\n\n try {\n var found = decodeURIComponent(parts[0]);\n jar[found] = converter.read(value, found);\n\n if (name === found) {\n break\n }\n } catch (e) {}\n }\n\n return name ? jar[name] : jar\n }\n\n return Object.create(\n {\n set,\n get,\n remove: function (name, attributes) {\n set(\n name,\n '',\n assign({}, attributes, {\n expires: -1\n })\n );\n },\n withAttributes: function (attributes) {\n return init(this.converter, assign({}, this.attributes, attributes))\n },\n withConverter: function (converter) {\n return init(assign({}, this.converter, converter), this.attributes)\n }\n },\n {\n attributes: { value: Object.freeze(defaultAttributes) },\n converter: { value: Object.freeze(converter) }\n }\n )\n}\n\nvar api = init(defaultConverter, { path: '/' });\n/* eslint-enable no-var */\n\nexport { api as default };\n"],"names":["CardCarousel","bind","selector","constructor","el","_defineProperty","_ref","currentTarget","dot","this","scroller","scrollToPage","$","parent","index","renderActiveDot","carouselScroller","$carousel","find","liItems","Array","from","querySelectorAll","observer","IntersectionObserver","entries","forEach","entry","isIntersecting","updateAriaHidden","target","updateTabIndex","threshold","item","observe","attr","element","length","$dots","CarouselScroller","on","EVENTS","PAGE_CHANGE","TOTAL_PAGES_CHANGE","renderDots","onDotClick","requestAnimationFrame","totalDots","totalPages","toggleClass","empty","i","append","previouslyActive","removeClass","removeAttr","currentlyActive","currentPage","addClass","updateAccessibilityAttributes","lastClosestIndex","collection","lastIndexOf","reduce","bestFit","x","Math","abs","pageStartPoints","_this","document","documentElement","style","smooth","arguments","undefined","move","direction","button","dataset","updateMetrics","updateClosestItemAndPage","$scroller","stop","get","$buttons","totalItems","children","window","onResize","onScroll","renderButtonStates","renderButtons","nativeSmoothingSupported","event","addEventListener","cancelAnimation","passive","onButtonClick","scrollTo","prev","next","disabled","scrollStart","scrollLeft","scrollEnd","scrollerWidth","closestPage","closestItem","itemEndPoints","firstItem","itemStartPoints","indexOf","trigger","lastItemInViewport","ITEM_CHANGE","firstItemInViewport","prevTotalPages","clientWidth","maxScrollLeft","scrollWidth","start","offsetLeft","end","offsetWidth","getComputedStyle","scrollSnapAlign","endsWith","push","_ref2","nextPage","min","animate","smoothScrollSpeed","left","behavior","ListingCardCarousel","ComponentLoader","initialize","one","EstatelyEvents","AJAX_CONTENT","LOADED","onCarouselFetched","_ListingCardCarousel","carousel","onClickToListingCard","location","href","path","isAndroid","test","navigator","userAgent","isMobile","estately","data","is_mobile","isSafari","HomePage","DefaultPage","super","Browser","scrollY","focus","showRecentSearch","preventDefault","onReferralRequest","formattedErrors","xhr","errors","responseJSON","status","Error","oneLine","Object","values","map","e","join","lastSearch","Cookies","search_path","$recentSearch","label","search_label","replace","text","_HomePage","async","$form","$errors","$submitButton","prop","hide","post","serialize","html","show","remove","register","assign","source","key","api","init","converter","defaultAttributes","set","name","value","attributes","expires","Date","now","toUTCString","encodeURIComponent","decodeURIComponent","escape","stringifiedAttributes","attributeName","split","cookie","write","create","cookies","jar","parts","slice","found","read","withAttributes","withConverter","freeze"],"sourceRoot":""}