{"version":3,"sources":["webpack:///./app/javascript/controllers/frontend sync _controller\\.js$","webpack:///./app/javascript/controllers/frontend/accordion_controller.js","webpack:///./app/javascript/controllers/frontend/alt_gallery_controller.js","webpack:///./app/javascript/controllers/frontend/authenticity_controller.js","webpack:///./app/javascript/controllers/frontend/author_profile_controller.js","webpack:///./app/javascript/controllers/frontend/autogrow_textarea_controller.js","webpack:///./app/javascript/controllers/frontend/card_link_controller.js","webpack:///./app/javascript/controllers/frontend/contents_list_controller.js","webpack:///./app/javascript/controllers/frontend/deal_sidebar_controller.js","webpack:///./app/javascript/controllers/frontend/eon_tag_controller.js","webpack:///./app/javascript/controllers/frontend/ev_tax_calculator_controller.js","webpack:///./app/javascript/controllers/frontend/features_controller.js","webpack:///./app/javascript/controllers/frontend/filter_reviews_controller.js","webpack:///./app/javascript/controllers/frontend/ga_car_card_controller.js","webpack:///./app/javascript/controllers/frontend/ga_controller.js","webpack:///./app/javascript/controllers/frontend/ga_data_list_controller.js","webpack:///./app/javascript/controllers/frontend/ga_filters_controller.js","webpack:///./app/javascript/controllers/frontend/ga_model_controller.js","webpack:///./app/javascript/controllers/frontend/gallery_controller.js","webpack:///./app/javascript/controllers/frontend/get_current_url_controller.js","webpack:///./app/javascript/controllers/frontend/hero_content_toggle_controller.js","webpack:///./app/javascript/controllers/frontend/image_preview_controller.js","webpack:///./app/javascript/controllers/frontend/imagin_hero_controller.js","webpack:///./app/javascript/controllers/frontend/internal_anchor_controller.js","webpack:///./app/javascript/controllers/frontend/load_more_controller.js","webpack:///./app/javascript/controllers/frontend/load_more_pagination_controller.js","webpack:///./app/javascript/controllers/frontend/make_mobile_filter_controller.js","webpack:///./app/javascript/controllers/frontend/model_filter_controller.js","webpack:///./app/javascript/controllers/frontend/nav_controller.js","webpack:///./app/javascript/controllers/frontend/other_offers_controller.js","webpack:///./app/javascript/controllers/frontend/price_switch_controller.js","webpack:///./app/javascript/controllers/frontend/quotation_acceptance_controller.js","webpack:///./app/javascript/controllers/frontend/quotation_controller.js","webpack:///./app/javascript/controllers/frontend/related_deals_controller.js","webpack:///./app/javascript/controllers/frontend/review_controller.js","webpack:///./app/javascript/controllers/frontend/review_filter_controller.js","webpack:///./app/javascript/controllers/frontend/scroll_slider_controller.js","webpack:///./app/javascript/controllers/frontend/selectbox_navigation_controller.js","webpack:///./app/javascript/controllers/frontend/slideshow_controller.js","webpack:///./app/javascript/controllers/frontend/split_test_hide_controller.js","webpack:///./app/javascript/controllers/frontend/split_test_script_controller.js"],"names":["map","webpackContext","req","id","webpackContextResolve","__webpack_require__","o","e","Error","code","keys","Object","resolve","module","exports","slideToggle","elem","hidden","style","height","scrollHeight","$button","classList","toggle","shown","contains","setAttribute","$target","this","element","querySelector","getAttribute","event","target","buttonTargets","forEach","$el","_handle","setTimeout","containerTargets","Controller","targets","handleCustomEvent","bind","document","addEventListener","removeEventListener","preventDefault","dataset","url","type","showLightbox","detail","imageUrl","lightboxElement","getElementById","mainElement","getElementsByTagName","length","body","overflowY","zIndex","display","lightboxEvent","CustomEvent","window","dispatchEvent","matches","values","exteriorImages","Array","interiorImages","token","content","input","createElement","appendChild","Rails","fire","reviewsSortFormTarget","querySelectorAll","remove","newSortedReviews","inputTargets","resize","lineHeight","minHeight","inputTarget","overflow","linkTarget","click","string","toLowerCase","replace","listTarget","title","headingElement","listItems","from","contentsTarget","heading","text","innerText","slug","name","sluggify","push","innerHTML","join","updateSidebarPosition","isSticky","isStopped","stickyScrollPosition","stoppedScrollPosition","sidebar","sidebarWrapper","parentElement","sidebarRect","getBoundingClientRect","viewportHeight","innerHeight","stopScrollLocation","bottom","scrollY","sidebarBottomPosition","shouldStick","makeSticky","shouldUnstick","removeSticky","shouldStop","stopSidebar","shouldResume","resumeSticky","add","sidebarHeight","position","top","scrollBackDistance","Math","max","toggleableValue","isMobileDevice","hideTag","hiddenClass","showTag","hasScrollTargetValue","scrollTargetValue","trim","targetElement","scrollIntoView","behavior","block","innerWidth","classes","toggleable","Boolean","default","scrollTarget","String","LITRES_PER_GALLON","calculate","updateSlider","number","round","toLocaleString","avgIceFuelPrice","dieselPriceValue","petrolPriceValue","avgIceMpg","dieselMpgValue","petrolMpgValue","iceTotalLitres","mileageInputTarget","value","iceCostEstimate","efficiency","realRangeValue","usableBatteryValue","requiredKWh","electricCostEstimate","epgOffPeakValue","electricHomeCostEstimate","homeOffPeakValue","estimatedSavings","epgCostPerMile","homeCostPerMile","dieselTotalLitres","dieselCostPerMile","petrolTotalLitres","petrolCostPerMile","mileageTarget","formatNumberWithCommas","savingTarget","iceCostEstimateTarget","electricCostEstimateTarget","offPeakCostEstimateTarget","avgIceFuelPriceTarget","toFixed","updateTargets","min","background","usableBattery","Number","realRange","epgOffPeak","homeOffPeak","dieselPrice","petrolPrice","dieselMpg","petrolMpg","resultsTargetSelector","previousScrollY","channel","make","fetch","then","response","html","newRecords","DOMParser","parseFromString","scrollTo","scrollX","carCardGridTarget","observeElementInViewport","observer","IntersectionObserver","entries","entry","isIntersecting","pushDataLayer","unobserve","threshold","observe","pathValue","itemBrandValue","itemNameValue","itemIdValue","priceValueRaw","priceValue","itemCategoryValue","itemVariantValue","index","children","indexOf","data","ecommerce","item_list_id","listIdValue","item_list_name","listNameValue","items","item_brand","item_name","item_variant","item_id","price","affiliation","item_category","quantity","dataLayer","closest","slice","attributeName","elementWithData","eventType","getGoogleAnaylticsAttribute","eventName","eventAction","filterName","filterOption","idValue","localStorage","setItem","path","pillCountAction","sortApplied","pillCount","includes","filter_action","filter_category_name","filter_option","pill_count","sort_applied","tagName","options","selectedIndex","featured_deals_interaction","model_table_filter_applied_category","model_table_filter_applied_option","getSelectedOption","model_table_model_clicked","swipe_featured_cards","$thumb","currentTarget","thumb_index","thumbTargets","image_index","imageTargets","fieldTarget","location","href","triggers","trigger","output","outputTarget","files","reader","FileReader","onload","src","result","readAsDataURL","angleSteps","currentStepIndex","imaginHeroImageUrl","paint","getPaintFromUrl","deferPreloadImages","updateImage","handlePopState","initialUrl","touchstartX","touchendX","addHorizontalSwipeListeners","imageTarget","changedTouches","screenX","handleGesture","next","previous","angle","Image","getImageUrlWithAngle","requestIdleCallback","preloadImages","URL","searchParams","set","optionId","description","toString","newAngle","showSpinner","hideSpinner","newPaint","paintPreviewId","get","optionIds","getAll","paintsArray","JSON","parse","imaginHeroPaintsArray","matchedPaint","find","parseInt","spinnerTarget","galleryEvent","gallery","galleryElement","scrollBehaviorValue","scrollBehavior","hash","match","floor","scrollBy","left","currentPage","totalRecords","nextPageUrl","pathname","append","triggerTarget","disabled","trackingKeyAttribute","loading","restoreLastClickedResultInViewport","trackLastClickedResult","lastClickedResult","getItem","LastClickedResultPosition","restoreElementPositionInViewport","removeItem","trackableResult","direction","button","insertPosition","resultsLocation","oppositeDirection","ajax","success","insertAdjacentHTML","outerHTML","hideElement","history","replaceState","turbolinks","error","_load","updateCount","modelCount","checkboxTargets","reduce","sum","checkbox","checked","makeMobileFilterCount","total","buttonTarget","textContent","radio","form","Event","bubbles","closeDrawer","drawer","hasPopStateListener","dataType","modelPath","currentUrl","params","fromEntries","derivativesContainer","currentOffset","requestParams","limit","offset","URLSearchParams","showLoadMoreButtonClass","loadMoreButton","total_entries","$triggers","$","targetContainer","split","$triggerWrapper","i","targetContainerNested","collapse","removeClass","item","$activeDropdown","containerTarget","loader","selector","replaceWith","isBusiness","valueTarget","cookie","Turbolinks","visit","arrangementFee","isPersonalQuoteType","arrangementTarget","personal","business","parseFloat","maintenanceTypeTarget","maintenanceTarget","readOnly","hasQuoteTypeTarget","updateArrangementFee","quoteTypeTarget","toggleFixedCommissionValueType","hasFunderTarget","funderTarget","changeFunder","isFinanceLease","showBallotPayment","hideBallotPayment","updateMessageFields","updateCommissionType","fixedCommissionValueTypeTarget","prevType","newType","updateInputMessage","updatePresetMessages","updatedMessage","messageTarget","messagePresetTarget","updatedValue","messageIndex","messageId","messagePreset","line","focus","maintenanceType","maintenancePrice","maintenanceprice","maintainedRental","monthlyRentalTarget","maintainedrental","monthlyRental","monthlyrental","isUsedVehicle","optionsTarget","newOption","optionTarget","cloneNode","initialPayments","customInitialPaymentTarget","funderId","fixedCommissionSelect","fixedCommissionHidden","fixedCommissionValueType","channelId","commissionValue","commission_value","totalCommissionTarget","isNaN","quoteType","personalQuoteTypesValue","financeLeaseTypesValue","container","personalQuoteTypes","financeLeaseTypes","documentElement","$relatedDeals","$tabs","cap_id","contentTarget","accept","_xhr","_status","console","log","formTarget","updateQuery","filterPath","additionalParams","formToQueryString","pushState","ScrollSliderController","initializeSlider","addEventListeners","autoScrollValue","startAutoScroll","removeEventListeners","stopAutoScroll","itemWidth","itemsTarget","scrollWidth","totalItems","scrollPositions","getItemWidth","showDotsValue","initializeDots","checkButtonVisibility","boundHandleResize","handleResize","boundHandleScroll","handleScroll","passive","handleMouseDown","handleTouchStart","handleTouchMove","resetScrollPosition","updateActiveDot","isDragging","startX","pageX","offsetLeft","scrollLeft","handleMouseMove","handleMouseUp","walk","touchStartX","touches","clientX","touchStartY","clientY","moveX","moveY","abs","currentPosition","currentIndex","minDistance","Infinity","distance","nextIndex","scrollToIndex","prevIndex","amount","newScrollLeft","maxScrollLeft","offsetWidth","width","hasPreviousButtonTarget","hasNextButtonTarget","isOverflowing","previousButtonTarget","nextButtonTarget","shouldShowDots","dotsTarget","autoScrollInterval","setInterval","intervalValue","clearInterval","hasDotsTarget","dotCount","fill","activeIndex","dot","autoScroll","interval","showDots","selectbox","selectedOption","showCurrentSlide","updateButtonStates","mutationObserver","MutationObserver","attributes","attributeOldValue","attributeFilter","disconnect","slideTargets","previousButton","nextButton","variant","styleUpdateSplitTest","SplitTestFeature","nameValue","start","scriptSplitTest"],"mappings":"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","file":"js/application~9e81cfc5-3592d13a1a8a7f287aba.chunk.js","sourcesContent":["var map = {\n\t\"./accordion_controller.js\": 766,\n\t\"./alt_gallery_controller.js\": 767,\n\t\"./authenticity_controller.js\": 768,\n\t\"./author_profile_controller.js\": 769,\n\t\"./autogrow_textarea_controller.js\": 770,\n\t\"./card_link_controller.js\": 771,\n\t\"./contents_list_controller.js\": 772,\n\t\"./deal_sidebar_controller.js\": 773,\n\t\"./eon_tag_controller.js\": 774,\n\t\"./ev_tax_calculator_controller.js\": 775,\n\t\"./features_controller.js\": 776,\n\t\"./filter_reviews_controller.js\": 777,\n\t\"./ga_car_card_controller.js\": 778,\n\t\"./ga_controller.js\": 779,\n\t\"./ga_data_list_controller.js\": 780,\n\t\"./ga_filters_controller.js\": 781,\n\t\"./ga_model_controller.js\": 782,\n\t\"./gallery_controller.js\": 783,\n\t\"./get_current_url_controller.js\": 784,\n\t\"./hero_content_toggle_controller.js\": 785,\n\t\"./image_preview_controller.js\": 786,\n\t\"./imagin_hero_controller.js\": 787,\n\t\"./internal_anchor_controller.js\": 788,\n\t\"./load_more_controller.js\": 789,\n\t\"./load_more_pagination_controller.js\": 790,\n\t\"./make_mobile_filter_controller.js\": 791,\n\t\"./model_filter_controller.js\": 792,\n\t\"./nav_controller.js\": 793,\n\t\"./other_offers_controller.js\": 794,\n\t\"./price_switch_controller.js\": 795,\n\t\"./quotation_acceptance_controller.js\": 796,\n\t\"./quotation_controller.js\": 797,\n\t\"./related_deals_controller.js\": 798,\n\t\"./review_controller.js\": 799,\n\t\"./review_filter_controller.js\": 800,\n\t\"./scroll_slider_controller.js\": 801,\n\t\"./selectbox_navigation_controller.js\": 802,\n\t\"./slideshow_controller.js\": 803,\n\t\"./split_test_hide_controller.js\": 804,\n\t\"./split_test_script_controller.js\": 805,\n\t\"./tabs_controller.js\": 806,\n\t\"./tooltip_controller.js\": 807,\n\t\"./ui_accordion_controller.js\": 808,\n\t\"./ui_other_offers_controller.js\": 809,\n\t\"./ui_recommended_tabs_controller.js\": 810,\n\t\"./ui_tabs_controller.js\": 811,\n\t\"./validation_controller.js\": 812\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 765;","import { Controller } from '@hotwired/stimulus';\n\nconst slideToggle = (elem, hidden) => {\n  elem.style.height = `${hidden ? elem.scrollHeight : 0}px`;\n};\n\nexport default class extends Controller {\n  static targets = ['button', 'container'];\n\n  _handle($button) {\n    $button.classList.toggle('open');\n\n    const shown = $button.classList.contains('open');\n\n    $button.setAttribute('aria-expanded', shown);\n\n    const $target = this.element.querySelector($button.getAttribute('data-target'));\n\n    slideToggle($target, shown);\n  }\n\n  toggle(event) {\n    const $button = event.target;\n\n    // take care of any other open sections\n    if (!$button.classList.contains('open')) {\n      this.buttonTargets.forEach(($el) => {\n        if ($el.classList.contains('open')) {\n          this._handle($el);\n        }\n      });\n    }\n\n    this._handle($button);\n  }\n\n  connect() {\n    // Delay the slideToggle call by an arbitrary amount of time, e.g., 500ms\n    // The reason is to calculate needed heigh after the fonts are loaded\n    setTimeout(() => {\n      slideToggle(this.containerTargets[0], true);\n    }, 500); // Adjust the time as needed\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static values = {\n    exteriorImages: Array,\n    interiorImages: Array,\n  };\n\n  initialize() {\n    this.handleCustomEvent = this.handleCustomEvent.bind(this);\n    document.addEventListener('alt-gallery:open', this.handleCustomEvent);\n  }\n\n  disconnect() {\n    document.removeEventListener('alt-gallery:open', this.handleCustomEvent);\n  }\n\n  openLightbox(event) {\n    event.preventDefault();\n    const { url, type } = event.target.dataset;\n\n    this.showLightbox(url, type);\n  }\n\n  handleCustomEvent(event) {\n    const { imageUrl, type } = event.detail;\n    this.showLightbox(imageUrl, type);\n  }\n\n  showLightbox(imageUrl, type = 'all') {\n    const lightboxElement = document.getElementById('alt-gallery-lightbox');\n    const mainElement = document.getElementsByTagName('main');\n    if (lightboxElement && mainElement.length > 0) {\n      document.body.style.overflowY = 'hidden';\n      mainElement[0].style.zIndex = '3';\n      lightboxElement.style.display = 'flex';\n\n      // Dispatch event for React component\n      const lightboxEvent = new CustomEvent('lightbox:open', {\n        detail: {\n          imageUrl,\n          type,\n        },\n      });\n      window.dispatchEvent(lightboxEvent);\n    }\n  }\n\n  closeLightbox(event) {\n    const mainElement = document.getElementsByTagName('main');\n    // Allow closing when clicking on the background (drv-lightbox-modal) or the close button\n    if (!event.target.matches('.drv-lightbox-modal, .drv-lightbox-modal__close')) {\n      return;\n    }\n\n    document.body.style.overflowY = 'auto';\n    mainElement[0].style.zIndex = '1';\n    this.element.style.display = 'none';\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  connect() {\n    const token = document.querySelector('[name=csrf-token]').content;\n\n    const input = document.createElement('input');\n\n    input.setAttribute('type', 'hidden');\n    input.setAttribute('name', 'authenticity_token');\n    input.setAttribute('value', token);\n\n    // append to form element.\n    this.element.appendChild(input);\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport Rails from '@rails/ujs';\n\nexport default class extends Controller {\n  static targets = ['reviewsSortForm'];\n\n  searchReviewSort() {\n    Rails.fire(this.reviewsSortFormTarget, 'submit');\n  }\n\n  handleReviewsSortResult(event) {\n    const oldReviewsPages = this.element.querySelectorAll('[data-load-more-pagination-id-value=\"reviews\"]');\n\n    oldReviewsPages.forEach((element) => element.remove());\n\n    const newSortedReviews = event.detail[0].querySelector('[data-load-more-pagination-id-value=\"reviews\"]');\n    this.element.appendChild(newSortedReviews);\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['input'];\n\n  connect() {\n    this.inputTargets.forEach((input) => {\n      input.style.resize = 'none';\n      input.style.lineHeight = '1.5em';\n      input.style.height = 'calc(1.5em + 0.75rem + 2px)';\n      input.style.minHeight = `${this.inputTarget.scrollHeight}px`;\n      input.style.overflow = 'hidden';\n    });\n  }\n\n  resize(event) {\n    event.target.style.height = '5px';\n    event.target.style.height = `${event.target.scrollHeight}px`;\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['link'];\n\n  clickOnLink() {\n    this.linkTarget.click();\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['list', 'contents'];\n\n  sluggify(string) {\n    return string.toLowerCase().replace(/[^\\w]/g, '-');\n  }\n\n  connect() {\n    if (!this.listTarget) return;\n\n    const title = this.element.getAttribute('data-contents-list-title');\n    const headingElement = this.element.getAttribute('data-contents-list-heading-element');\n\n    const listItems = [];\n\n    Array.from(this.contentsTarget.querySelectorAll(headingElement)).forEach((heading) => {\n      const text = heading.innerText;\n      const slug = heading.name || this.sluggify(heading.innerText);\n\n      heading.setAttribute('name', slug);\n\n      listItems.push(`\n        <li>\n          <a data-section-scroll href=\"#${slug}\">${text}</a>\n        </li>\n      `);\n    });\n\n    this.listTarget.innerHTML = `\n      <h2>${title}</h2>\n\n      <ol class=\"pl-3\" style=\"list-style: disc\">\n        ${listItems.join('\\n')}\n      </ol>\n    `;\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  connect() {\n    this.updateSidebarPosition = this.updateSidebarPosition.bind(this);\n    window.addEventListener('scroll', this.updateSidebarPosition);\n    this.isSticky = false; // Track sticky state\n    this.isStopped = false; // Track stop state\n    this.stickyScrollPosition = null; // Track sidebar sticky scroll position\n    this.stoppedScrollPosition = null; // Track sidebar stop scroll position\n  }\n\n  disconnect() {\n    window.removeEventListener('scroll', this.updateSidebarPosition);\n  }\n\n  updateSidebarPosition() {\n    const sidebar = this.element;\n    const sidebarWrapper = sidebar.parentElement;\n    const sidebarRect = sidebar.getBoundingClientRect();\n    const viewportHeight = window.innerHeight;\n    const stopElement = document.getElementById('trustpilot-reviews');\n    const stopScrollLocation = stopElement.getBoundingClientRect().bottom + window.scrollY - 155;\n    const sidebarBottomPosition = window.scrollY + sidebarRect.bottom;\n\n    if (this.shouldStick(sidebarRect, viewportHeight)) {\n      this.makeSticky(sidebar);\n    } else if (this.shouldUnstick()) {\n      this.removeSticky(sidebar);\n    }\n\n    if (this.shouldStop(sidebarBottomPosition, stopScrollLocation)) {\n      this.stopSidebar(sidebar, sidebarWrapper, stopScrollLocation, sidebarRect.height);\n    }\n\n    if (this.shouldResume()) {\n      this.resumeSticky(sidebar, sidebarWrapper, stopScrollLocation, sidebarRect.height);\n    }\n  }\n\n  shouldStick(sidebarRect, viewportHeight) {\n    return !this.isSticky && sidebarRect.bottom <= viewportHeight && !this.isStopped;\n  }\n\n  shouldUnstick() {\n    return this.isSticky && window.scrollY <= this.stickyScrollPosition;\n  }\n\n  shouldStop(sidebarBottomPosition, stopScrollLocation) {\n    return !this.isStopped && sidebarBottomPosition >= stopScrollLocation;\n  }\n\n  shouldResume() {\n    return this.isStopped && window.scrollY < this.stoppedScrollPosition;\n  }\n\n  makeSticky(sidebar) {\n    sidebar.classList.add('sticky');\n    this.isSticky = true;\n    this.stickyScrollPosition = window.scrollY; // Save the scroll position when it becomes sticky\n  }\n\n  removeSticky(sidebar) {\n    sidebar.classList.remove('sticky');\n    this.isSticky = false;\n  }\n\n  stopSidebar(sidebar, sidebarWrapper, stopScrollLocation, sidebarHeight) {\n    this.isStopped = true;\n    this.stoppedScrollPosition = window.scrollY; // Save the scroll position when the sidebar stops\n    sidebar.classList.remove('sticky');\n    sidebarWrapper.style.position = 'absolute';\n    sidebarWrapper.style.top = `${stopScrollLocation - sidebarHeight}px`;\n  }\n\n  resumeSticky(sidebar, sidebarWrapper, stopScrollLocation, sidebarHeight) {\n    const scrollBackDistance = this.stoppedScrollPosition - window.scrollY;\n    sidebarWrapper.style.top = `${Math.max(stopScrollLocation - sidebarHeight - scrollBackDistance, 0)}px`;\n\n    if (window.scrollY < stopScrollLocation) {\n      sidebar.classList.add('sticky');\n      sidebarWrapper.style.position = 'absolute';\n      sidebarWrapper.style.top = '';\n      this.isStopped = false;\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['tag', 'offer'];\n\n  static classes = ['hidden'];\n\n  static values = {\n    toggleable: { type: Boolean, default: false },\n    scrollTarget: { type: String, default: '' },\n  };\n\n  connect() {\n    // Only initialize toggle behavior on mobile devices\n    if (this.toggleableValue && this.isMobileDevice()) {\n      this.hideTag();\n    }\n  }\n\n  toggle() {\n    // Only handle toggle if the component is toggleable and on mobile devices\n    if (!this.toggleableValue || !this.isMobileDevice()) return;\n\n    if (this.element.classList.contains(this.hiddenClass)) {\n      this.showTag();\n    } else {\n      this.hideTag();\n    }\n  }\n\n  scrollToTarget(event) {\n    // Only handle if we have a scroll target\n    if (!this.hasScrollTargetValue || this.scrollTargetValue.trim() === '') return;\n\n    // Prevent default link behavior\n    event.preventDefault();\n\n    const targetElement = document.getElementById(this.scrollTargetValue);\n    if (targetElement) {\n      // Scroll the target element to the center of the viewport\n      targetElement.scrollIntoView({\n        behavior: 'smooth',\n        block: 'center',\n      });\n    }\n  }\n\n  hideTag() {\n    this.element.classList.add(this.hiddenClass);\n  }\n\n  showTag() {\n    this.element.classList.remove(this.hiddenClass);\n  }\n\n  // Helper method to check if the device is mobile (viewport width <= 560px)\n  isMobileDevice() {\n    return window.innerWidth <= 560;\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nconst LITRES_PER_GALLON = 4.54609188;\n\nexport default class extends Controller {\n  static targets = [\n    'mileageInput',\n    'mileage',\n    'saving',\n    'efficiency',\n    'iceCostEstimate',\n    'electricCostEstimate',\n    'offPeakCostEstimate',\n    'avgIceFuelPrice',\n    'avgIceMpg',\n  ];\n\n  static values = {\n    usableBattery: Number,\n    realRange: Number,\n    epgOffPeak: Number,\n    homeOffPeak: Number,\n    dieselPrice: Number,\n    petrolPrice: Number,\n    dieselMpg: Number,\n    petrolMpg: Number,\n  };\n\n  connect() {\n    this.calculate();\n    this.updateSlider();\n  }\n\n  formatNumberWithCommas(number) {\n    return Math.round(number).toLocaleString('en-GB');\n  }\n\n  calculate() {\n    const avgIceFuelPrice = (this.dieselPriceValue + this.petrolPriceValue) / 2;\n    const avgIceMpg = (this.dieselMpgValue + this.petrolMpgValue) / 2;\n    const iceTotalLitres = (this.mileageInputTarget.value / avgIceMpg) * LITRES_PER_GALLON;\n    const iceCostEstimate = (this.mileageInputTarget.value / avgIceMpg) * LITRES_PER_GALLON * (avgIceFuelPrice / 100);\n    const efficiency = this.realRangeValue / this.usableBatteryValue;\n    const requiredKWh = this.mileageInputTarget.value / efficiency;\n    const electricCostEstimate = (requiredKWh * this.epgOffPeakValue) / 100;\n    const electricHomeCostEstimate = (requiredKWh * this.homeOffPeakValue) / 100;\n    const estimatedSavings = iceCostEstimate - electricCostEstimate;\n    const epgCostPerMile = (electricCostEstimate / this.mileageInputTarget.value) * 100;\n    const homeCostPerMile = (electricHomeCostEstimate / this.mileageInputTarget.value) * 100;\n\n    const dieselTotalLitres = (this.mileageInputTarget.value / this.dieselMpgValue) * LITRES_PER_GALLON;\n    const dieselAnnualCost = (this.dieselPriceValue * dieselTotalLitres) / 100;\n    const dieselCostPerMile = (dieselAnnualCost / this.mileageInputTarget.value) * 100;\n\n    const petrolTotalLitres = (this.mileageInputTarget.value / this.petrolMpgValue) * LITRES_PER_GALLON;\n    const petrolAnnualCost = (this.petrolPriceValue * petrolTotalLitres) / 100;\n    const petrolCostPerMile = (petrolAnnualCost / this.mileageInputTarget.value) * 100;\n\n    this.mileageTarget.innerHTML = this.formatNumberWithCommas(this.mileageInputTarget.value);\n    this.savingTarget.innerHTML = this.formatNumberWithCommas(estimatedSavings);\n    this.iceCostEstimateTarget.innerHTML = this.formatNumberWithCommas(iceCostEstimate);\n    this.electricCostEstimateTarget.innerHTML = this.formatNumberWithCommas(electricCostEstimate);\n    this.offPeakCostEstimateTarget.innerHTML = this.formatNumberWithCommas(electricHomeCostEstimate);\n    this.avgIceFuelPriceTarget.innerHTML = (avgIceFuelPrice / 100).toFixed(2);\n\n    this.updateTargets('mileage', this.formatNumberWithCommas(this.mileageInputTarget.value));\n    this.updateTargets('ice-total-litres', this.formatNumberWithCommas(iceTotalLitres));\n    this.updateTargets('required-KWh', this.formatNumberWithCommas(requiredKWh));\n    this.updateTargets('epg-off-peak', this.epgOffPeakValue);\n    this.updateTargets('home-off-peak', this.homeOffPeakValue);\n    this.updateTargets('ev-efficiency', efficiency);\n    this.updateTargets('diesel-mpg', this.dieselMpgValue);\n    this.updateTargets('petrol-mpg', this.petrolMpgValue);\n    this.updateTargets('ice-average-price', (avgIceFuelPrice / 100).toFixed(2));\n    this.updateTargets('diesel-price', (this.dieselPriceValue / 100).toFixed(2));\n    this.updateTargets('petrol-price', (this.petrolPriceValue / 100).toFixed(2));\n    this.updateTargets('epg-cost-per-mile', epgCostPerMile.toFixed(1));\n    this.updateTargets('home-cost-per-mile', homeCostPerMile.toFixed(1));\n    this.updateTargets('ice-average-mpg', avgIceMpg.toFixed(1));\n    this.updateTargets('ice-annual-cost', this.formatNumberWithCommas(iceCostEstimate.toFixed(2)));\n    this.updateTargets('epg-annual-cost', electricCostEstimate.toFixed(2));\n    this.updateTargets('home-annual-cost', electricHomeCostEstimate.toFixed(2));\n    this.updateTargets('diesel-cost-per-mile', dieselCostPerMile.toFixed(1));\n    this.updateTargets('petrol-cost-per-mile', petrolCostPerMile.toFixed(1));\n  }\n\n  updateSlider() {\n    const value =\n      ((this.mileageInputTarget.value - this.mileageInputTarget.min) /\n        (this.mileageInputTarget.max - this.mileageInputTarget.min)) *\n      100;\n\n    this.mileageInputTarget.style.background = `linear-gradient(to right, #00a3e0 0%, #00a3e0 ${value}%, #eaeaea ${value}%, #eaeaea 100%)`;\n  }\n\n  updateTargets(target, value) {\n    document.querySelectorAll(`[data-target=${target}]`).forEach((element) => {\n      element.innerHTML = value;\n    });\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['general', 'performance', 'economy', 'practicality'];\n\n  switch(event) {\n    this.element.querySelector('.tab-pane.active').classList.remove('active');\n    this[`${event.target.value}Target`].classList.add('active');\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['trigger', 'results'];\n\n  onChange(event) {\n    const resultsTargetSelector = '[data-filter-reviews-target=\"results\"]';\n    const previousScrollY = window.scrollY;\n\n    const { channel } = event.target.dataset;\n    const make = event.target.value;\n\n    fetch(`/${channel}/reviews${make ? `/${make}` : ''}`)\n      .then((response) => response.text())\n      .then((html) => {\n        const parser = new DOMParser();\n        const doc = parser.parseFromString(html, 'text/html');\n        const newRecords = doc.querySelector(resultsTargetSelector).innerHTML;\n        // insert the new records\n        document.querySelector(resultsTargetSelector).innerHTML = newRecords;\n        // reset scroll position\n        window.scrollTo(window.scrollX, previousScrollY);\n      });\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  connect() {\n    if (!this.carCardGridTarget()) return;\n\n    this.observeElementInViewport(this.element);\n  }\n\n  observeElementInViewport(element) {\n    const options = { threshold: 0.5 };\n\n    const observer = new IntersectionObserver((entries) => {\n      entries.forEach((entry) => {\n        if (entry.isIntersecting) {\n          this.pushDataLayer(element);\n          observer.unobserve(entry.target);\n        }\n      });\n    }, options);\n\n    observer.observe(element);\n  }\n\n  pushDataLayer(element) {\n    const pathValue = element.getAttribute('data-ga-car-card-path');\n    const itemBrandValue = element.getAttribute('data-ga-car-card-item-brand');\n    const itemNameValue = element.getAttribute('data-ga-car-card-item-name');\n    const itemIdValue = element.getAttribute('data-ga-car-card-item-id');\n    const priceValueRaw = element.getAttribute('data-ga-car-card-price');\n    const priceValue = priceValueRaw ? Number(priceValueRaw.replace(/£|,|\\./g, '')) : null;\n    const itemCategoryValue = element.getAttribute('data-ga-car-card-item-category');\n    const itemVariantValue = element.getAttribute('data-ga-car-card-item-variant');\n\n    const index = [...this.carCardGridTarget().children].indexOf(element);\n\n    const data = {\n      event: 'view_item_list',\n      ecommerce: {\n        item_list_id: this.listIdValue(pathValue),\n        item_list_name: this.listNameValue(pathValue),\n        items: [\n          {\n            item_list_id: this.listIdValue(pathValue),\n            item_list_name: this.listNameValue(pathValue),\n            item_brand: itemBrandValue,\n            item_name: itemNameValue,\n            item_variant: itemVariantValue,\n            item_id: itemIdValue,\n            price: priceValue,\n            affiliation: 'Select Car Leasing',\n            item_category: itemCategoryValue,\n            index: index + 1,\n            quantity: 1,\n          },\n        ],\n      },\n    };\n\n    dataLayer.push({ ecommerce: null });\n    dataLayer.push(data);\n  }\n\n  carCardGridTarget() {\n    return this.element.closest('[data-ga-car-card-target=\"car-card-grid\"]');\n  }\n\n  listIdValue(value) {\n    return value.slice(1).replace(/\\//g, '-');\n  }\n\n  listNameValue(value) {\n    return value.slice(1).replace(/\\//g, ' ').replace(/-/g, ' ');\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nconst debug = false;\n\nexport default class extends Controller {\n  getGoogleAnaylticsAttribute(element, name) {\n    const attributeName = `data-ga-${name}`;\n    const elementWithData = element.closest(`[${attributeName}]`);\n    return elementWithData\n      ? elementWithData.getAttribute(attributeName)\n      : element.getAttribute('data-ga-parent-title') || null;\n  }\n\n  push(event) {\n    const eventType = this.getGoogleAnaylticsAttribute(event.target, 'event');\n    const eventName = this.getGoogleAnaylticsAttribute(event.target, 'event-name');\n    const eventAction = this.getGoogleAnaylticsAttribute(event.target, 'event-action');\n    const filterName = this.getGoogleAnaylticsAttribute(event.target, 'filter-name');\n    const filterOption = this.getGoogleAnaylticsAttribute(event.target, 'filter-option');\n\n    const data = {\n      event: eventType,\n      eventName,\n      eventAction,\n    };\n\n    if (filterName) {\n      data.filterName = filterName;\n    }\n\n    if (filterOption) {\n      data.filterOption = filterOption;\n    }\n\n    if (eventType && eventName && eventAction) {\n      dataLayer.push(data);\n    } else if (debug) {\n      console.warn('Google Analytics event: Unable to create event with missing data', data);\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static values = {\n    path: String,\n    id: String,\n  };\n\n  push() {\n    if (this.pathValue && this.idValue) {\n      window.localStorage.setItem('listPath', this.pathValue);\n      window.localStorage.setItem('listID', this.idValue);\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  pillCountAction = [\n    'selected_filter_option',\n    'deselected_filter_option',\n    'pill_deleted',\n    'applied_filter_category_desktop',\n    'applied_filters_mobile',\n  ];\n\n  getGoogleAnaylticsAttribute(element, name) {\n    const attributeName = `data-ga-filters-${name}`;\n    const elementWithData = element.closest(`[${attributeName}]`);\n    return elementWithData\n      ? elementWithData.getAttribute(attributeName)\n      : element.getAttribute('data-ga-filters-parent-title') || null;\n  }\n\n  push(event) {\n    const eventType = this.getGoogleAnaylticsAttribute(event.target, 'event');\n    const eventAction = this.getGoogleAnaylticsAttribute(event.target, 'event-action');\n    const filterName = this.getGoogleAnaylticsAttribute(event.target, 'filter-name') || 'N/A';\n    const filterOption = this.getGoogleAnaylticsAttribute(event.target, 'filter-option') || 'N/A';\n    const sortApplied = this.getGoogleAnaylticsAttribute(event.target, 'sort-applied') || 'N/A';\n\n    let pillCount = 'N/A';\n\n    if (this.pillCountAction.includes(eventAction)) {\n      pillCount = document.querySelectorAll('[data-ga-filters] [data-ga-filters-event-action=\"pill_deleted\"]').length;\n\n      if (eventAction === 'pill_deleted') {\n        pillCount -= 1;\n      }\n    }\n\n    const data = {\n      event: eventType,\n      filter_action: eventAction,\n      filter_category_name: filterName,\n      filter_option: filterOption,\n      pill_count: pillCount,\n      sort_applied: eventAction === 'sort_applied' ? sortApplied : 'N/A',\n    };\n\n    dataLayer.push(data);\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  getGoogleAnaylticsAttribute(element, name) {\n    const attributeName = `data-ga-model-${name}`;\n    const elementWithData = element.closest(`[${attributeName}]`);\n    return elementWithData ? elementWithData.getAttribute(attributeName) : null;\n  }\n\n  getSelectedOption(element) {\n    return element.tagName === 'SELECT' ? element.options[element.selectedIndex].text : null;\n  }\n\n  push(event) {\n    const featuredDealsInteraction = this.getGoogleAnaylticsAttribute(event.target, 'featured-deals-interaction');\n    const filterAppliedCategory = this.getGoogleAnaylticsAttribute(event.target, 'filter-applied-category');\n    const filterAppliedOption = this.getSelectedOption(event.target);\n    const modelClicked = this.getGoogleAnaylticsAttribute(event.target, 'model-clicked');\n    const isSwiped = event.type === 'slide-stop';\n\n    const data = {\n      event: 'model_page',\n      featured_deals_interaction: featuredDealsInteraction || 'N/A',\n      model_table_filter_applied_category: filterAppliedCategory || 'N/A',\n      model_table_filter_applied_option: filterAppliedOption || 'N/A',\n      model_table_model_clicked: modelClicked || 'N/A',\n      swipe_featured_cards: isSwiped ? 'swiped' : 'N/A',\n    };\n\n    dataLayer.push(data);\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['image', 'thumb'];\n\n  show(event) {\n    const $thumb = event.currentTarget;\n    const thumb_index = this.thumbTargets.indexOf($thumb);\n\n    for (let image_index = 0; image_index < this.imageTargets.length; image_index++) {\n      if (image_index === thumb_index) {\n        this.imageTargets[image_index].style.display = 'inline';\n      } else {\n        this.imageTargets[image_index].style.display = 'none';\n      }\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['field'];\n\n  connect() {\n    this.fieldTarget.value = window.location.href;\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['content', 'trigger'];\n\n  toggle(event) {\n    event.preventDefault();\n\n    const name = event.currentTarget.getAttribute('data-toggle');\n    const content = document.querySelector(`[data-toggle-target=\"${name}\"]`);\n    const triggers = document.querySelectorAll(`[data-toggle=\"${name}\"]`);\n\n    content.classList.toggle('show');\n\n    triggers.forEach((trigger) => {\n      trigger.classList.toggle('show');\n    });\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['input', 'output'];\n\n  readImage() {\n    const input = this.inputTarget;\n    const output = this.outputTarget;\n\n    if (input.files && input.files[0]) {\n      const reader = new FileReader();\n      reader.onload = function () {\n        output.src = reader.result;\n      };\n      reader.readAsDataURL(input.files[0]);\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['image', 'paintButton', 'spinner'];\n\n  static values = {\n    scrollBehavior: { type: String, default: 'smooth' },\n  };\n\n  connect() {\n    this.angleSteps = [1, 29, 23, 22, 17, 13, 9, 5];\n    this.currentStepIndex = 0;\n    this.imageUrl = this.element.dataset.imaginHeroImageUrl;\n    this.paint = this.getPaintFromUrl() || null;\n    window.addEventListener('load', this.deferPreloadImages.bind(this));\n    if (this.paint) {\n      this.updateImage();\n    }\n    window.addEventListener('popstate', this.handlePopState.bind(this));\n\n    this.initialUrl = window.location.href;\n\n    this.touchstartX = 0;\n    this.touchendX = 0;\n    this.addHorizontalSwipeListeners();\n  }\n\n  addHorizontalSwipeListeners() {\n    this.imageTarget.addEventListener('touchstart', (event) => {\n      this.touchstartX = event.changedTouches[0].screenX;\n    });\n\n    this.imageTarget.addEventListener('touchend', (event) => {\n      this.touchendX = event.changedTouches[0].screenX;\n      this.handleGesture();\n    });\n  }\n\n  handleGesture() {\n    if (this.touchstartX - this.touchendX > 70) {\n      this.next();\n    }\n\n    if (this.touchstartX - this.touchendX < -70) {\n      this.previous();\n    }\n  }\n\n  preloadImages() {\n    this.angleSteps.forEach((angle) => {\n      const img = new Image();\n      img.src = this.getImageUrlWithAngle(angle);\n    });\n  }\n\n  deferPreloadImages() {\n    if ('requestIdleCallback' in window) {\n      requestIdleCallback(() => {\n        this.preloadImages();\n      });\n    } else {\n      // Fallback for browsers that do not support requestIdleCallback\n      setTimeout(() => {\n        this.preloadImages();\n      }, 0);\n    }\n  }\n\n  getImageUrlWithAngle(angle) {\n    const url = new URL(this.imageUrl);\n    url.searchParams.set('angle', angle);\n    if (this.paint) {\n      url.searchParams.set('paintId', this.paint.optionId);\n      url.searchParams.set('paintDescription', this.paint.description.replace(/\\+/g, '%20'));\n    }\n    return url.toString();\n  }\n\n  next() {\n    this.currentStepIndex = (this.currentStepIndex + 1) % this.angleSteps.length;\n    this.updateImage();\n  }\n\n  previous() {\n    this.currentStepIndex = (this.currentStepIndex - 1 + this.angleSteps.length) % this.angleSteps.length;\n    this.updateImage();\n  }\n\n  updateImage() {\n    const newAngle = this.angleSteps[this.currentStepIndex];\n    this.showSpinner();\n    this.imageTarget.src = this.getImageUrlWithAngle(newAngle);\n    this.imageTarget.onload = () => {\n      this.hideSpinner();\n    };\n  }\n\n  updateUrl() {\n    const url = new URL(window.location);\n    url.searchParams.set('paintId', this.paint.optionId);\n    url.searchParams.set('paintDescription', this.paint.description.replace(/\\+/g, '%20'));\n  }\n\n  handlePopState() {\n    const newPaint = this.getPaintFromUrl();\n\n    if (this.paint === null || (newPaint && newPaint.optionId !== this.paint.optionId)) {\n      this.paint = newPaint;\n      this.updateImage();\n      this.preloadImages();\n    }\n  }\n\n  getPaintFromUrl() {\n    const url = new URL(window.location);\n    const paintPreviewId = url.searchParams.get('paint_preview');\n    const optionIds = url.searchParams.getAll('option_ids[]');\n    const paintsArray = JSON.parse(this.element.dataset.imaginHeroPaintsArray);\n\n    if (paintPreviewId && !optionIds.length) {\n      const matchedPaint = paintsArray.find((paint) => paint.optionId === parseInt(paintPreviewId, 10));\n      if (matchedPaint) {\n        return matchedPaint;\n      }\n    }\n\n    if (optionIds.length > 0) {\n      for (const optionId of optionIds) {\n        const matchedPaint = paintsArray.find((paint) => paint.optionId === parseInt(optionId, 10));\n        if (matchedPaint) {\n          return matchedPaint;\n        }\n      }\n    }\n    return null;\n  }\n\n  showSpinner() {\n    this.spinnerTarget.classList.remove('hidden');\n  }\n\n  hideSpinner() {\n    this.spinnerTarget.classList.add('hidden');\n  }\n\n  openGallery(event) {\n    event.preventDefault();\n\n    const galleryEvent = new CustomEvent('galleryParamChanged', {\n      detail: { gallery: 'interior' },\n    });\n    window.dispatchEvent(galleryEvent);\n\n    const galleryElement = document.getElementById('image-gallery');\n    if (galleryElement) {\n      galleryElement.scrollIntoView({\n        behavior: this.scrollBehaviorValue,\n        block: 'center',\n      });\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  click(event) {\n    if (!event.target.hash.match(/^#.+/)) return;\n\n    const target = document.querySelector(event.target.hash);\n\n    if (!target) return;\n\n    event.preventDefault();\n\n    // the use of 100 here is an attempt to ensure\n    // that the huge sticky header doesn't cover the content\n    const top = Math.floor(target.getBoundingClientRect().top) - 100;\n\n    window.scrollBy({ top, left: 0, behavior: 'smooth' });\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['trigger', 'results'];\n\n  nextPage() {\n    const currentPage = parseInt(this.data.get('current-page'), 10);\n    const totalRecords = parseInt(this.data.get('total-records'), 10);\n    const resultsTargetSelector = '[data-load-more-target=\"results\"]';\n    const previousScrollY = window.scrollY;\n\n    const nextPageUrl = `${window.location.pathname}.js?page=${currentPage + 1}`;\n\n    fetch(nextPageUrl)\n      .then((response) => response.text())\n      .then((html) => {\n        const parser = new DOMParser();\n        const doc = parser.parseFromString(html, 'text/html');\n        const newRecords = doc.querySelectorAll(`${resultsTargetSelector} > *`);\n\n        // insert the new records\n        document.querySelector(resultsTargetSelector).append(...newRecords);\n        // update the page counter\n        this.data.set('current-page', currentPage + 1);\n        // reset scroll position\n        window.scrollTo(window.scrollX, previousScrollY);\n\n        // disable button if reached total records\n        if (document.querySelectorAll(`${resultsTargetSelector} > *`).length === totalRecords) {\n          this.triggerTarget.disabled = true;\n        }\n      });\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport Rails from '@rails/ujs';\n\nconst trackingKeyAttribute = 'data-key';\n\nexport default class extends Controller {\n  static targets = ['nextContainer', 'previousContainer', 'nextButton', 'previousButton'];\n\n  static values = {\n    id: String,\n  };\n\n  connect() {\n    this.loading = false;\n\n    if (window.localStorage) {\n      /**\n       * delay the restore of result position\n       * to ensure it doesn't clash with the browser trying to do the same\n       */\n      window.setTimeout(() => this.restoreLastClickedResultInViewport(), 500);\n      this.trackLastClickedResult();\n    }\n  }\n\n  /**\n   * When someone clicks back from a result to the list,\n   * we want to reposition the viewport on the result they clicked so they can carry on browsing.\n   */\n  restoreLastClickedResultInViewport() {\n    const lastClickedResult = window.localStorage.getItem('LastClickedResult');\n    const LastClickedResultPosition = window.localStorage.getItem('LastClickedResultPosition');\n\n    if (lastClickedResult) {\n      this.restoreElementPositionInViewport(\n        this.element.querySelector(`[${trackingKeyAttribute}=\"${lastClickedResult}\"]`),\n        LastClickedResultPosition,\n      );\n\n      window.localStorage.removeItem('LastClickedResult');\n      window.localStorage.removeItem('LastClickedResultPosition');\n    }\n  }\n\n  /**\n   * To support restoreLastClickedResultInViewport,\n   * we stored the unique ID of the last clicked result.\n   */\n  trackLastClickedResult() {\n    this.element.addEventListener('click', (event) => {\n      const trackableResult = event.target.closest(`[${trackingKeyAttribute}]`);\n\n      if (trackableResult) {\n        window.localStorage.setItem('LastClickedResult', trackableResult.getAttribute(trackingKeyAttribute));\n        // Gets last clicked top position relative to the top of window.\n        window.localStorage.setItem('LastClickedResultPosition', trackableResult.getBoundingClientRect().top);\n      }\n    });\n  }\n\n  /**\n   * Restores a DOM elements position relative to the top of window.\n   */\n  restoreElementPositionInViewport(element, position) {\n    if (!element) return;\n\n    element.scrollIntoView();\n    window.scrollBy(0, -position);\n  }\n\n  /**\n   * We want to keep the buttons in the DOM in case we need them later.\n   */\n  hideElement(element) {\n    if (element) {\n      element.style.display = 'none';\n    }\n  }\n\n  /**\n   * Handles the Ajax loading of an anchor.\n   */\n  _load(direction) {\n    if (this.loading) return;\n\n    const button = this[`${direction}ButtonTarget`];\n    const insertPosition = direction === 'next' ? 'afterend' : 'beforebegin';\n    const resultsLocation = direction === 'next' ? 'nextSibling' : 'previousSibling';\n    const oppositeDirection = direction === 'next' ? 'previous' : 'next';\n\n    this.loading = true;\n\n    Rails.ajax({\n      url: button.href,\n      type: 'GET',\n      success: (result) => {\n        const newRecordsById = result.querySelector(`[data-load-more-pagination-id-value=\"${this.idValue}\"]`);\n\n        const newRecords = newRecordsById || result.querySelector('[data-controller=\"load-more-pagination\"]');\n\n        // add the new results before/after the current ones\n        this.element.insertAdjacentHTML(insertPosition, newRecords.outerHTML);\n\n        // hide the other direction's button\n        // e.g. if you've clicked \"View next results\" button,\n        // hide the \"View previous results\" from the new results\n        this.hideElement(\n          this.element[resultsLocation].querySelector(\n            `[data-load-more-pagination-target=\"${oppositeDirection}Container\"]`,\n          ),\n        );\n\n        // hide the clicked button\n        this.hideElement(this.element.querySelector(`[data-load-more-pagination-target=\"${direction}Container\"]`));\n\n        // add to browser history\n        // using replace state here, as really you're \"on the same page\",\n        // and we provide an alternative way of viewing the previous page's results\n        window.history.replaceState({ turbolinks: {} }, '', button.href);\n\n        this.loading = false;\n      },\n      error: () => {\n        this.loading = false;\n      },\n    });\n  }\n\n  next(event) {\n    event.preventDefault();\n\n    this._load('next');\n  }\n\n  previous(event) {\n    event.preventDefault();\n\n    this._load('previous');\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['checkbox', 'button'];\n\n  connect() {\n    this.updateCount();\n  }\n\n  updateCount() {\n    const modelCount = this.checkboxTargets.reduce((sum, checkbox) => {\n      return checkbox.checked ? sum + parseInt(checkbox.dataset.makeMobileFilterCount, 10) : sum;\n    }, 0);\n\n    const total = modelCount === 0 ? 'all' : modelCount;\n\n    this.buttonTarget.textContent = `View ${total} models`;\n  }\n\n  checkboxSelect(event) {\n    const checkbox = event.currentTarget.querySelector('input[type=\"checkbox\"]');\n    if (event.target.tagName !== 'INPUT') {\n      event.preventDefault();\n      checkbox.checked = !checkbox.checked;\n    }\n    this.updateCount();\n  }\n\n  radioSelect(event) {\n    const radio = event.currentTarget.querySelector('input[type=\"radio\"]');\n    const form = this.element.closest('form');\n\n    if (radio && !radio.checked) {\n      radio.checked = true;\n      form.dispatchEvent(new Event('submit', { bubbles: true }));\n    } else if (event.target === radio) {\n      form.dispatchEvent(new Event('submit', { bubbles: true }));\n    }\n\n    this.closeDrawer();\n  }\n\n  clearAll() {\n    this.checkboxTargets.forEach((checkbox) => {\n      checkbox.checked = false;\n    });\n\n    this.updateCount();\n  }\n\n  closeDrawer() {\n    const drawer = document.querySelector('.drawer-open');\n\n    if (drawer) {\n      drawer.classList.remove('drawer-open');\n      document.querySelector('body').classList.remove('has-drawer');\n      document.querySelector('.drawer-overlay').style.display = 'none';\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport Rails from '@rails/ujs';\n\nexport default class extends Controller {\n  connect() {\n    if (!window.hasPopStateListener) {\n      window.addEventListener('popstate', () => {\n        Rails.ajax({\n          url: window.location.href,\n          type: 'get',\n          dataType: 'script',\n        });\n      });\n      window.hasPopStateListener = true;\n    }\n  }\n\n  loadMore() {\n    const modelPath = this.element.getAttribute('data-model-filter-path');\n    const currentUrl = new URL(window.location.href);\n    const params = Object.fromEntries(currentUrl.searchParams);\n\n    // Get current offset from the derivatives container\n    const derivativesContainer = document.querySelector('[data-render-target=\"groups#derivatives\"]');\n    const currentOffset = derivativesContainer.children.length;\n\n    // Add pagination params to existing URL params\n    const requestParams = {\n      ...params,\n      limit: 20,\n      offset: currentOffset,\n    };\n\n    const url = `${modelPath}/deal_rows?${new URLSearchParams(requestParams)}`;\n\n    Rails.ajax({\n      url,\n      type: 'get',\n      dataType: 'json',\n      success: (result) => {\n        // Append new content to the derivatives container\n        derivativesContainer.innerHTML += result.html;\n\n        // Handle load more button visibility\n        const showLoadMoreButtonClass = 'g-derivatives__more--show';\n        const loadMoreButton = document.querySelector('.g-derivatives__more');\n\n        if (result.total_entries > derivativesContainer.children.length) {\n          loadMoreButton.classList.add(showLoadMoreButtonClass);\n        } else {\n          loadMoreButton.classList.remove(showLoadMoreButtonClass);\n        }\n      },\n    });\n  }\n\n  submit() {\n    this.closeDrawer();\n  }\n\n  closeDrawer() {\n    const drawer = document.querySelector('.drawer-open');\n    if (drawer) {\n      drawer.classList.remove('drawer-open');\n      document.querySelector('body').classList.remove('has-drawer');\n      document.querySelector('.drawer-overlay').style.display = 'none';\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  toggle(event) {\n    event.preventDefault();\n    const $triggers = $('[data-nav-collapse]');\n    const trigger = event.currentTarget;\n    const targetContainer = `#${trigger.href.split('#')[1]}`;\n    const $triggerWrapper = $('.g-search__options')[0];\n\n    if ($triggers && $triggers.length) {\n      $triggerWrapper.classList.remove('is-active');\n\n      for (let i = 0; i < $triggers.length; i++) {\n        const targetContainerNested = `#${$triggers[i].href.split('#')[1]}`;\n\n        $triggers[i].classList.remove('is-active');\n\n        if (trigger === $triggers[i]) {\n          $(`${targetContainerNested}`).collapse('hide');\n        } else {\n          $(`${targetContainerNested}`).removeClass('show');\n        }\n      }\n    }\n\n    $triggerWrapper.classList.add('is-active');\n\n    document.querySelectorAll(`[data-nav-collapse][aria-controls=\"${targetContainer}\"]`).forEach((item) => {\n      item.classList.add('is-active');\n    });\n\n    $(targetContainer).collapse('show');\n    $('.lazy', targetContainer).removeClass('lazy');\n  }\n\n  hide(event) {\n    const $triggerWrapper = $('.g-search__options')[0];\n    const $activeDropdown = $('.g-search__reveals .collapse.show')[0];\n\n    if (\n      event &&\n      ($(event.target).closest('[data-nav-collapse]').length || $(event.target).closest('[data-nav-dropdown]').length)\n    ) {\n      return;\n    }\n\n    if ($activeDropdown) {\n      $triggerWrapper.classList.remove('is-active');\n      $(`#${$activeDropdown.id}`).collapse('hide');\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport Rails from '@rails/ujs';\n\nexport default class extends Controller {\n  static targets = ['container'];\n\n  load(event) {\n    if (this.element.getAttribute('data-other-offers-loaded')) {\n      return;\n    }\n\n    this.containerTarget.style.position = 'relative';\n    this.containerTarget.style.minHeight = '140px';\n\n    const loader = document.createElement('div');\n    loader.id = 'loader';\n    this.containerTarget.appendChild(loader);\n\n    Rails.ajax({\n      url: event.target.getAttribute('data-other-offers-path'),\n      type: 'get',\n      success: (result) => {\n        const selector = '[data-render-target=\"groups#derivatives\"]';\n        $(selector).replaceWith($(selector, result));\n        this.element.setAttribute('data-other-offers-loaded', true);\n      },\n    });\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['value'];\n\n  toggle() {\n    const isBusiness = this.valueTarget.checked;\n\n    if (isBusiness) {\n      document.cookie = 'pricing_type=is-business;path=/';\n    } else {\n      document.cookie = 'pricing_type=is-personal;path=/';\n    }\n    Turbolinks.visit(window.location);\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['button'];\n\n  accept(event) {\n    const target = event.target;\n\n    if (target.checked) {\n      this.buttonTarget.disabled = false;\n      this.buttonTarget.classList.remove('disabled');\n    } else {\n      this.buttonTarget.disabled = true;\n      this.buttonTarget.classList.add('disabled');\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport Rails from '@rails/ujs';\n\nexport default class extends Controller {\n  static values = {\n    personalQuoteTypes: Array,\n    financeLeaseTypes: Array,\n  };\n\n  static targets = [\n    'quoteType',\n    'arrangement',\n    'message',\n    'maintenance',\n    'option',\n    'options',\n    'maintenanceType',\n    'monthlyRental',\n    'customInitialPayment',\n    'messagePreset',\n    'funder',\n    'totalCommission',\n    'fixedCommissionValueType',\n  ];\n\n  updateArrangementFee(target) {\n    const arrangementFee = this.isPersonalQuoteType(target)\n      ? this.arrangementTarget.dataset.personal\n      : this.arrangementTarget.dataset.business;\n\n    this.arrangementTarget.value = parseFloat(arrangementFee).toFixed(2);\n  }\n\n  connect() {\n    if (this.maintenanceTypeTarget.value === 'Non-maintained') {\n      this.maintenanceTarget.value = '';\n      this.maintenanceTarget.readOnly = true;\n    }\n\n    if (this.hasQuoteTypeTarget) {\n      this.updateArrangementFee(this.quoteTypeTarget.value);\n      this.toggleFixedCommissionValueType(this.quoteTypeTarget.value);\n    }\n    if (this.hasFunderTarget && this.funderTarget) {\n      this.changeFunder({ currentTarget: this.funderTarget });\n    }\n  }\n\n  changeQuoteType(event) {\n    this.updateArrangementFee(event.currentTarget.value);\n    this.toggleFixedCommissionValueType(event.currentTarget.value);\n\n    if (this.isFinanceLease(event.currentTarget.value)) {\n      this.showBallotPayment();\n    } else {\n      this.hideBallotPayment();\n    }\n\n    if (this.isPersonalQuoteType(event.currentTarget.value)) {\n      this.updateMessageFields('/business', '/personal');\n      this.updateCommissionType('Regulated');\n    } else {\n      this.updateMessageFields('/personal', '/business');\n      this.updateCommissionType('Non-regulated');\n    }\n  }\n\n  updateCommissionType(type) {\n    this.fixedCommissionValueTypeTarget.value = type;\n\n    if (this.funderTarget.value) {\n      this.changeFunder({ currentTarget: this.funderTarget });\n    }\n  }\n\n  updateMessageFields(prevType, newType) {\n    this.updateInputMessage(prevType, newType);\n    this.updatePresetMessages(prevType, newType);\n  }\n\n  updateInputMessage(prevType, newType) {\n    const updatedMessage = this.messageTarget.value.replace(prevType, newType);\n\n    this.messageTarget.value = updatedMessage;\n  }\n\n  updatePresetMessages(prevType, newType) {\n    this.messagePresetTarget.children.forEach((element) => {\n      const updatedValue = element.innerHTML.replace(prevType, newType);\n\n      element.innerHTML = updatedValue;\n    });\n  }\n\n  showBallotPayment() {\n    document.getElementById('effective_rental-container').classList.add('d-none');\n    document.getElementById('balloon_payment-container').classList.remove('d-none');\n  }\n\n  hideBallotPayment() {\n    document.getElementById('balloon_payment-container').classList.add('d-none');\n    document.getElementById('effective_rental-container').classList.remove('d-none');\n  }\n\n  changeMessageType(event) {\n    const messageType = event.currentTarget.value;\n    const messageIndex = messageType.match(/\\d+/g)[0];\n    const messageId = `message_preset_${messageIndex}`;\n    const messagePreset = document.getElementById(messageId);\n\n    this.messageTarget.value = messagePreset.innerHTML\n      .trim()\n      .split('\\n')\n      .map((line) => line.trim().replace(/\\s+/g, ' '))\n      .join('\\n\\n');\n\n    this.messageTarget.focus();\n  }\n\n  changeMaintenanceType(event) {\n    const maintenanceType = event.currentTarget.value;\n    const maintenancePrice = this.maintenanceTarget.dataset.maintenanceprice;\n    const maintainedRental = this.monthlyRentalTarget.dataset.maintainedrental;\n    const monthlyRental = this.monthlyRentalTarget.dataset.monthlyrental;\n    const isUsedVehicle = document.getElementById('quotation_vehicle_id') !== null;\n\n    if (maintenanceType === 'Maintained') {\n      this.monthlyRentalTarget.value = maintainedRental;\n    } else {\n      this.monthlyRentalTarget.value = monthlyRental;\n    }\n\n    if (maintenanceType === 'Maintained' || maintenanceType === 'Non-maintained with maintenance option') {\n      this.maintenanceTarget.value = maintenancePrice;\n    } else {\n      this.maintenanceTarget.value = '';\n    }\n\n    if (isUsedVehicle || maintenanceType === 'Non-maintained') {\n      this.maintenanceTarget.readOnly = true;\n    } else {\n      this.maintenanceTarget.readOnly = false;\n    }\n  }\n\n  removeOption(event) {\n    event.preventDefault();\n    const option = event.currentTarget;\n\n    option.parentElement.remove();\n  }\n\n  addOption(event) {\n    event.preventDefault();\n    const options = this.optionsTarget;\n    const option = this.optionTarget;\n    const newOption = option.cloneNode(true);\n\n    newOption.querySelector('input').value = '';\n    options.appendChild(newOption);\n  }\n\n  initialPayment(event) {\n    // the custom initial payments field should be enabled if the initial payments selected is zero\n    const initialPayments = event.target.value;\n    this.customInitialPaymentTarget.disabled = initialPayments !== '0';\n  }\n\n  changeFunder(event) {\n    const funderId = event.currentTarget.value;\n    const fixedCommissionSelect = document.querySelector('select[name=\"quotation[fixed_commission_value_type]\"]');\n    const fixedCommissionHidden = document.querySelector('input[name=\"quotation[fixed_commission_value_type]\"]');\n\n    const fixedCommissionValueType = fixedCommissionSelect?.value || fixedCommissionHidden?.value;\n\n    Rails.ajax({\n      url: `/${this.element.dataset.channelId}/quotations/commission_value/${funderId}`,\n      type: 'get',\n      data: `fixed_commission_value_type=${fixedCommissionValueType}`,\n      success: (data) => {\n        const commissionValue = parseFloat(data.commission_value);\n        this.totalCommissionTarget.value = !Number.isNaN(commissionValue) ? commissionValue.toFixed(2) : '';\n      },\n      error: () => {\n        this.totalCommissionTarget.value = '';\n      },\n    });\n  }\n\n  isPersonalQuoteType(quoteType) {\n    return this.personalQuoteTypesValue.includes(quoteType);\n  }\n\n  isFinanceLease(quoteType) {\n    return this.financeLeaseTypesValue.includes(quoteType);\n  }\n\n  changeFixedCommissionValueType() {\n    if (this.funderTarget.value) {\n      this.changeFunder({ currentTarget: this.funderTarget });\n    }\n  }\n\n  toggleFixedCommissionValueType(quoteType) {\n    const container = this.fixedCommissionValueTypeTarget.closest('.col-12');\n    if (quoteType.toLowerCase().includes('business')) {\n      container.classList.remove('d-none');\n    } else {\n      container.classList.add('d-none');\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport Rails from '@rails/ujs';\n\nexport default class extends Controller {\n  connect() {\n    Rails.ajax({\n      url: `/${this.element.getAttribute('data-channel-slug')}/related-deals/${this.element.getAttribute(\n        'data-derivative-id',\n      )}.js`,\n      type: 'GET',\n      success: (document) => {\n        this.element.outerHTML = document.documentElement.innerHTML;\n\n        const $relatedDeals = $('#related-deals');\n\n        if ($relatedDeals.length === 0) {\n          // no deals to show, so show the other deals, and remove the tabs\n          const $tabs = $relatedDeals.closest('.c-tabs');\n          $tabs.find('.c-tabs__nav-title:last')[0].click();\n          $tabs.find('.c-tabs__nav').remove();\n        }\n      },\n    });\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport Rails from '@rails/ujs';\n\nexport default class extends Controller {\n  static targets = ['content'];\n\n  connect() {\n    const cap_id = this.contentTarget.dataset.id;\n    const url = `/car-and-driving/${cap_id}`;\n\n    if (cap_id && url) {\n      Rails.ajax({\n        url,\n        type: 'GET',\n        dataType: 'json',\n        accept: 'application/json',\n        success: (result) => {\n          this.contentTarget.outerHTML = result.html;\n        },\n        error: (_xhr, _status, error) => {\n          console.log(error);\n        },\n      });\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport Rails from '@rails/ujs';\n\nimport { formToQueryString } from '../../utils';\n\nexport default class extends Controller {\n  static targets = ['form'];\n\n  search(event) {\n    Rails.fire(this.formTarget, 'submit');\n    this.updateQuery(event);\n  }\n\n  handleResults(event) {\n    const [data] = event.detail;\n    const selector = '[data-render-target=\"results\"]';\n    $(selector).replaceWith($(selector, data));\n  }\n\n  updateQuery(event) {\n    const filterPath = this.formTarget.getAttribute('data-filter-path');\n    const additionalParams = {};\n    additionalParams[event.target.name] = event.target.value;\n\n    const url = `${filterPath}?${formToQueryString(this.element, additionalParams)}`;\n    window.history.pushState({ turbolinks: {} }, '', url);\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class ScrollSliderController extends Controller {\n  static targets = ['items', 'previousButton', 'nextButton', 'dots'];\n\n  static values = {\n    autoScroll: Boolean,\n    interval: { type: Number, default: 3000 },\n    showDots: Boolean,\n  };\n\n  connect() {\n    this.initializeSlider();\n    this.addEventListeners();\n    if (this.autoScrollValue) this.startAutoScroll();\n  }\n\n  disconnect() {\n    this.removeEventListeners();\n    this.stopAutoScroll();\n  }\n\n  initializeSlider() {\n    this.itemWidth = this.itemsTarget.scrollWidth / this.itemsTarget.children.length;\n\n    // Store the total number of items for reference\n    this.totalItems = this.itemsTarget.children.length;\n\n    // Calculate the scroll positions for each item\n    this.scrollPositions = [];\n    for (let i = 0; i < this.totalItems; i++) {\n      const position = i * this.getItemWidth();\n      this.scrollPositions.push(position);\n    }\n\n    if (this.showDotsValue) this.initializeDots();\n    this.checkButtonVisibility();\n  }\n\n  addEventListeners() {\n    this.boundHandleResize = this.handleResize.bind(this);\n    this.boundHandleScroll = this.handleScroll.bind(this);\n    window.addEventListener('resize', this.boundHandleResize, { passive: true });\n    this.itemsTarget.addEventListener('scroll', this.boundHandleScroll, { passive: true });\n    this.itemsTarget.addEventListener('mousedown', this.handleMouseDown.bind(this), { passive: false });\n    this.itemsTarget.addEventListener('wheel', this.stopAutoScroll.bind(this), { passive: true });\n    this.itemsTarget.addEventListener('touchstart', this.handleTouchStart.bind(this), { passive: true });\n    this.itemsTarget.addEventListener('touchmove', this.handleTouchMove.bind(this), { passive: false });\n  }\n\n  removeEventListeners() {\n    window.removeEventListener('resize', this.boundHandleResize);\n    this.itemsTarget.removeEventListener('scroll', this.boundHandleScroll);\n    // Remove other event listeners...\n  }\n\n  handleResize() {\n    this.checkButtonVisibility();\n    this.resetScrollPosition();\n\n    // Recalculate scroll positions on resize\n    this.scrollPositions = [];\n    for (let i = 0; i < this.totalItems; i++) {\n      const position = i * this.getItemWidth();\n      this.scrollPositions.push(position);\n    }\n\n    if (this.showDotsValue) this.initializeDots();\n  }\n\n  handleScroll() {\n    this.updateActiveDot();\n  }\n\n  handleMouseDown(event) {\n    this.isDragging = true;\n    this.stopAutoScroll();\n    this.startX = event.pageX - this.itemsTarget.offsetLeft;\n    this.scrollLeft = this.itemsTarget.scrollLeft;\n    document.addEventListener('mousemove', this.handleMouseMove.bind(this), { passive: false });\n    document.addEventListener('mouseup', this.handleMouseUp.bind(this), { passive: true });\n  }\n\n  handleMouseMove(event) {\n    if (!this.isDragging) return;\n    event.preventDefault();\n    const x = event.pageX - this.itemsTarget.offsetLeft;\n    const walk = (x - this.startX) * 2;\n    this.itemsTarget.scrollLeft = this.scrollLeft - walk;\n  }\n\n  handleMouseUp() {\n    this.isDragging = false;\n    document.removeEventListener('mousemove', this.handleMouseMove);\n    document.removeEventListener('mouseup', this.handleMouseUp);\n  }\n\n  handleTouchStart(event) {\n    this.touchStartX = event.touches[0].clientX;\n    this.touchStartY = event.touches[0].clientY;\n  }\n\n  handleTouchMove(event) {\n    const moveX = event.touches[0].clientX - this.touchStartX;\n    const moveY = event.touches[0].clientY - this.touchStartY;\n    if (Math.abs(moveX) > Math.abs(moveY)) {\n      event.preventDefault();\n      this.itemsTarget.scrollLeft -= moveX;\n    }\n  }\n\n  next() {\n    // Find the current slide index\n    const currentPosition = this.itemsTarget.scrollLeft;\n\n    // Find the current index based on position\n    let currentIndex = 0;\n    let minDistance = Infinity;\n\n    for (let i = 0; i < this.scrollPositions.length; i++) {\n      const distance = Math.abs(currentPosition - this.scrollPositions[i]);\n      if (distance < minDistance) {\n        minDistance = distance;\n        currentIndex = i;\n      }\n    }\n\n    // Calculate next index with proper wrapping\n    const nextIndex = (currentIndex + 1) % this.totalItems;\n\n    this.scrollToIndex(nextIndex);\n  }\n\n  previous() {\n    // Find the current slide index\n    const currentPosition = this.itemsTarget.scrollLeft;\n\n    // Find the current index based on position\n    let currentIndex = 0;\n    let minDistance = Infinity;\n\n    for (let i = 0; i < this.scrollPositions.length; i++) {\n      const distance = Math.abs(currentPosition - this.scrollPositions[i]);\n      if (distance < minDistance) {\n        minDistance = distance;\n        currentIndex = i;\n      }\n    }\n\n    // Calculate previous index with proper wrapping\n    const prevIndex = (currentIndex - 1 + this.totalItems) % this.totalItems;\n\n    this.scrollToIndex(prevIndex);\n  }\n\n  scrollToIndex(index) {\n    this.itemsTarget.scrollLeft = this.scrollPositions[index];\n    this.checkButtonVisibility();\n    this.updateActiveDot();\n  }\n\n  scroll(amount) {\n    const currentScrollLeft = this.itemsTarget.scrollLeft;\n    const newScrollLeft = currentScrollLeft + amount;\n    const maxScrollLeft = this.itemsTarget.scrollWidth - this.itemsTarget.offsetWidth;\n\n    if (newScrollLeft < 0) {\n      this.itemsTarget.scrollLeft = maxScrollLeft;\n    } else if (newScrollLeft > maxScrollLeft) {\n      this.itemsTarget.scrollLeft = 0;\n    } else {\n      this.itemsTarget.scrollLeft = newScrollLeft;\n    }\n\n    this.checkButtonVisibility();\n    this.updateActiveDot();\n  }\n\n  getItemWidth() {\n    return Math.floor(this.itemsTarget.children[0].getBoundingClientRect().width);\n  }\n\n  checkButtonVisibility() {\n    if (!this.hasPreviousButtonTarget || !this.hasNextButtonTarget) return;\n\n    const isOverflowing = this.itemsTarget.scrollWidth > this.itemsTarget.offsetWidth;\n\n    this.previousButtonTarget.style.display = isOverflowing ? 'block' : 'none';\n    this.nextButtonTarget.style.display = isOverflowing ? 'block' : 'none';\n    this.itemsTarget.classList.toggle('slider-enabled', isOverflowing);\n\n    if (this.showDotsValue) {\n      const shouldShowDots = isOverflowing && this.dotsTarget.children.length > 1;\n      this.dotsTarget.style.display = shouldShowDots ? 'flex' : 'none';\n    }\n  }\n\n  startAutoScroll() {\n    this.stopAutoScroll();\n    this.autoScrollInterval = setInterval(() => this.next(), this.intervalValue);\n  }\n\n  stopAutoScroll() {\n    clearInterval(this.autoScrollInterval);\n  }\n\n  autoScrollValueChanged() {\n    this.autoScrollValue ? this.startAutoScroll() : this.stopAutoScroll();\n  }\n\n  initializeDots() {\n    if (!this.hasDotsTarget) return;\n\n    const itemCount = this.itemsTarget.children.length;\n\n    // Use the actual number of items for dots\n    const dotCount = itemCount;\n\n    this.dotsTarget.innerHTML = Array(dotCount).fill('<span class=\"slider-dot\"></span>').join('');\n\n    this.updateActiveDot();\n    this.checkButtonVisibility();\n  }\n\n  updateActiveDot() {\n    if (!this.showDotsValue || !this.hasDotsTarget) return;\n\n    // Find the closest slide to the current scroll position\n    const currentPosition = this.itemsTarget.scrollLeft;\n    let activeIndex = 0;\n    let minDistance = Infinity;\n\n    for (let i = 0; i < this.scrollPositions.length; i++) {\n      const distance = Math.abs(currentPosition - this.scrollPositions[i]);\n      if (distance < minDistance) {\n        minDistance = distance;\n        activeIndex = i;\n      }\n    }\n\n    Array.from(this.dotsTarget.children).forEach((dot, index) => {\n      dot.classList.toggle('active', index === activeIndex);\n    });\n  }\n\n  resetScrollPosition() {\n    this.itemsTarget.scrollLeft = 0;\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  change(event) {\n    const selectbox = event.target;\n    const selectedOption = selectbox.options[selectbox.selectedIndex];\n\n    window.location.href = selectedOption.getAttribute('value');\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\n\nexport default class extends Controller {\n  static targets = ['slide'];\n\n  initialize() {\n    this.element.dataset.index = 0;\n    this.showCurrentSlide();\n    this.updateButtonStates();\n\n    this.mutationObserver = new MutationObserver(() => {\n      this.showCurrentSlide();\n      this.updateButtonStates();\n    });\n  }\n\n  connect() {\n    this.mutationObserver.observe(this.element, {\n      attributes: true,\n      attributeOldValue: true,\n      attributeFilter: ['data-index'],\n    });\n  }\n\n  disconnect() {\n    this.mutationObserver.disconnect();\n  }\n\n  next() {\n    if (this.element.dataset.index === this.slideTargets.length - 1) {\n      return;\n    }\n\n    this.element.dataset.index++;\n  }\n\n  previous() {\n    if (this.element.dataset.index === 0) {\n      return;\n    }\n\n    this.element.dataset.index--;\n  }\n\n  showCurrentSlide() {\n    this.slideTargets.forEach((element, index) => {\n      element.hidden = index !== Number(this.element.dataset.index);\n    });\n  }\n\n  updateButtonStates() {\n    const previousButton = this.element.querySelector('[data-action=\"slideshow#previous\"]');\n    const nextButton = this.element.querySelector('[data-action=\"slideshow#next\"]');\n\n    if (Number(this.element.dataset.index) === 0) {\n      previousButton.disabled = true;\n    } else {\n      previousButton.disabled = false;\n    }\n\n    if (Number(this.element.dataset.index) === this.slideTargets.length - 1) {\n      nextButton.disabled = true;\n    } else {\n      nextButton.disabled = false;\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { SplitTestFeature } from '../../splitTesting';\n\nexport default class extends Controller {\n  static values = {\n    name: String,\n  };\n\n  initialize() {\n    const variant = 'Hidden';\n    const styleUpdateSplitTest = new SplitTestFeature(this.nameValue, [variant]);\n    styleUpdateSplitTest.start();\n\n    if (styleUpdateSplitTest.variant === variant) {\n      this.element.style = 'display:none;';\n    }\n  }\n}\n","import { Controller } from '@hotwired/stimulus';\nimport { SplitTestFeature } from '../../splitTesting';\n\nexport default class extends Controller {\n  static values = {\n    name: String,\n  };\n\n  initialize() {\n    const variant = 'Hidden';\n    const scriptSplitTest = new SplitTestFeature(this.nameValue, [variant]);\n    scriptSplitTest.start();\n\n    window[`split-test-${this.nameValue}`] = scriptSplitTest.variant;\n  }\n}\n"],"sourceRoot":""}