CINXE.COM
TestFit
<!DOCTYPE html><!-- Last Published: Tue Nov 26 2024 16:12:13 GMT+0000 (Coordinated Universal Time) --><html data-wf-domain="www.testfit.io" data-wf-page="65a54c59a6cb13e169e4f52c" data-wf-site="649073100d78123d88ea2422" lang="en" data-wf-collection="65a54c59a6cb13e169e4f487" data-wf-item-slug="parking"><head><meta charset="utf-8"/><title>TestFit</title><meta content="width=device-width, initial-scale=1" name="viewport"/><meta content="wuich_jdcbdW8PFolb18VKUILS4IiqAImv8D_Zkh7aM" name="google-site-verification"/><link href="https://cdn.prod.website-files.com/649073100d78123d88ea2422/css/testfit-91f846.webflow.8af83d14b.min.css" rel="stylesheet" type="text/css"/><script src="https://use.typekit.net/rlu8pdd.js" type="text/javascript"></script><script type="text/javascript">try{Typekit.load();}catch(e){}</script><script type="text/javascript">!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script><link href="https://cdn.prod.website-files.com/649073100d78123d88ea2422/649c63c68fa05e0c60791b02_testfit-favicon.png" rel="shortcut icon" type="image/x-icon"/><link href="https://cdn.prod.website-files.com/649073100d78123d88ea2422/649c63ced47800655a19c3d3_testfit-webclip.png" rel="apple-touch-icon"/><link href="https://www.testfit.io/filters-resources/parking" rel="canonical"/><script async="" src="https://www.googletagmanager.com/gtag/js?id=G-NQ0Y560SLW"></script><script type="text/javascript">window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}gtag('js', new Date());gtag('set', 'developer_id.dZGVlNj', true);gtag('config', 'G-NQ0Y560SLW');</script><style> .navbar_background { opacity: 0; } /* Dynamic Tabs */ .dynamic-tabs_tab-link .dynamic-tabs_unselected-icon { display: flex; } .dynamic-tabs_tab-link .dynamic-tabs_selected-icon { display: none; } .dynamic-tabs_tab-link.w--current .dynamic-tabs_unselected-icon { display: none; } .dynamic-tabs_tab-link.w--current .dynamic-tabs_selected-icon { display: flex; } </style> <!-- Swiper Styles --> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@8/swiper-bundle.min.css"/> <!-- [Attributes by Finsweet] Disable scrolling --> <script defer src="https://cdn.jsdelivr.net/npm/@finsweet/attributes-scrolldisable@1/scrolldisable.js"></script> <!-- HubSpot Embed Code --> <script type="text/javascript" id="hs-script-loader" async="" defer="" src="//js-na1.hs-scripts.com/3486113.js"></script> <!-- HubSpot Forms --> <script charset="utf-8" type="text/javascript" src="//js.hsforms.net/forms/embed/v2.js"></script> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-P4QJP7NM');</script> <!-- End Google Tag Manager --> <!-- Optibase script --> <script src="https://app.optibase.io/script.js" public-api-key="clw6ilmu1006bg66353k9rpqj"></script> <!-- Chargebee --> <script src="https://js.chargebee.com/v2/chargebee.js" data-cb-site="testfit-inc"></script></head><body><div></div><script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=649073100d78123d88ea2422" type="text/javascript" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script><script src="https://cdn.prod.website-files.com/649073100d78123d88ea2422/js/webflow.9e438d25e.js" type="text/javascript"></script><!-- GSAP --> <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.4/gsap.min.js"></script> <!-- ScrollTrigger--> <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.4/ScrollTrigger.min.js"></script> <!-- Cookies --> <script src="https://cdn.jsdelivr.net/npm/js-cookie@rc/dist/js.cookie.min.js"></script> <!-- Swiper --> <script src="https://cdn.jsdelivr.net/npm/swiper@8/swiper-bundle.min.js"></script> <!-- Count Up --> <script src="https://cdn.jsdelivr.net/npm/countup@1.8.2/countUp.js"></script> <!-- HTMX --> <script src="https://unpkg.com/htmx.org@1.9.12" integrity="sha384-ujb1lZYygJmzgSwoxRggbCHcjc0rB2XoQrxeTUQyRjrOnlCoYta87iKBWq3EsdM2" crossorigin="anonymous"></script> <script> if ($(".fs-toc_component").length > 0) { window.fsAttributes = window.fsAttributes || []; window.fsAttributes.push([ 'toc', (listInstances) => { console.log("toc initialized"); initializeScrollTriggers(); }, ]); } else { initializeScrollTriggers(); } function initializeScrollTriggers() { // [ Navbar ] let currentNavbarColor = $(".navbar_component").attr("navbar-color"); let navbarBlack = false; if ($(".navbar_component").attr("navbar-color") == "black") { navbarBlack = true; } ScrollTrigger.create({ trigger: ".main-wrapper", start: "top+=50 top", end: "+=0", onEnter: () => { if (navbarBlack) { $(".navbar_component").attr("navbar-color", "white"); currentNavbarColor = $(".navbar_component").attr("navbar-color"); } $(".navbar_background").addClass("is-scrolling"); }, onEnterBack: () => { if (navbarBlack) { $(".navbar_component").attr("navbar-color", "black"); currentNavbarColor = $(".navbar_component").attr("navbar-color"); } $(".navbar_background").removeClass("is-scrolling"); } }); $(".navbar_menu-button").on("click", function () { $(".navbar_background").toggleClass("is-menu-open"); if ($(".navbar_background").hasClass("is-menu-open")) { $(".navbar_component").attr("navbar-color", "white"); } else { $(".navbar_component").attr("navbar-color", currentNavbarColor); } }); // [ Big Numbers - Count Up ] $("[count-up]").each(function (index) { // assign ID let thisId = "countup" + index; $(this).attr("id", thisId); // create variables let startNumber = +$(this).attr("start-number"); let endNumber = +$(this).text(); let decimals = $(this).attr("decimals"); let duration = $(this).attr("count-duration"); // animate number let myCounter = new CountUp(thisId, startNumber, endNumber, decimals, duration); // create numbertimeline let numberTimeline = gsap.timeline({ paused: true }); numberTimeline.fromTo($(this).parent(), { y: "50%", opacity: 0, scale: 0.5 }, { y: "0%", opacity: 1, scale: 1, duration: 0.5, ease: "power2.out" }); // Scroll into view trigger ScrollTrigger.create({ trigger: $(this), start: "bottom bottom", end: "bottom top", onEnter: () => { numberTimeline.play(); myCounter.start(); } }); }); // [ Big Numbers - Slide Up ] $("[bn-slide-up]").each(function () { let number = $(this).find(".big-numbers_number-wrapper"); let description = $(this).find(".heading-style-h5"); let timeline = gsap.timeline({ paused: true, ease: "power2.out" }); timeline.fromTo(number, { opacity: 0, y: "2rem" }, { opacity: 1, y: "0rem", duration: 0.5 }); timeline.fromTo(description, { opacity: 0 }, { opacity: 1, duration: 0.5 }, "<0.25"); ScrollTrigger.create({ trigger: $(this), start: "bottom bottom", end: "bottom top", onEnter: () => { timeline.play(); } }); }); } // [ Button Animation ] function setButtonsAnim() { $("[button-animate]").each(function () { let buttonTimeline = gsap.timeline({ paused: true }); buttonTimeline.to($(this).find("[button-icon-3]"), { x: "100%", opacity: 0, duration: 0.3, ease: "sine.inOut" }); buttonTimeline.to($(this).find("[button-icon-2]"), { x: "100%", opacity: 0, duration: 0.3, ease: "sine.inOut" }, "<50%"); buttonTimeline.to($(this).find("[button-icon-1]"), { x: "100%", opacity: 0, duration: 0.3, ease: "sine.inOut" }, "<50%"); buttonTimeline.set($(this).find("[button-icon-3]"), { x: "-100%" }); buttonTimeline.set($(this).find("[button-icon-2]"), { x: "-100%" }, "<"); buttonTimeline.set($(this).find("[button-icon-1]"), { x: "-100%" }, "<"); buttonTimeline.to($(this).find("[button-icon-3]"), { x: "0%", opacity: 1, duration: 0.3, ease: "sine.inOut" }); buttonTimeline.to($(this).find("[button-icon-2]"), { x: "0%", opacity: 1, duration: 0.3, ease: "sine.inOut" }, "<50%"); buttonTimeline.to($(this).find("[button-icon-1]"), { x: "0%", opacity: 1, duration: 0.3, ease: "sine.inOut" }, "<50%"); $(this).on("mouseenter", function () { if (buttonTimeline.paused) { buttonTimeline.restart(); } }); }); } // We need to use a method because we need to configurate the timeline again when fs load more adds more items to the page setButtonsAnim(); // [ Custom Form Submit ] $("[form-custom-submit]").each(function () { $(this).on("click", function () { $(this).next(".w-button").click(); }); }); // [ Footer Copyright ] $('.footer_copyright-year').text(new Date().getFullYear()); // [ Customers Marquee] if ($(".customers-marquee_component").length >= 1) { // Create two clones of the original collection let customerMarqueeWrapper = $(".customers-marquee_wrapper"); $(customerMarqueeWrapper).clone().appendTo(".customers-marquee_collection-wrapper"); $(customerMarqueeWrapper).clone().appendTo(".customers-marquee_collection-wrapper"); let duration = $(".customers-marquee_component").find(".customers-marquee_item").length; duration = duration * 10; // Configure the animation let customersMarqueeTimeline = gsap.timeline({ repeat: -1 }); customersMarqueeTimeline.to($(".customers-marquee_wrapper"), { x: "-200%", duration: duration, ease: "linear" }); } // [ Swiper JS ] $(".swiper-main_component").each(function () { const swiper = new Swiper($(this).find(".swiper")[0], { slidesPerView: "auto", slideActiveClass: "is-active", pagination: { el: $(this).find(".swiper-bullet-wrapper")[0], bulletActiveClass: "is-active", bulletClass: "swiper-bullet", bulletElement: "button", clickable: true }, navigation: { nextEl: $(this).find(".swiper-navigation.is-next")[0], prevEl: $(this).find(".swiper-navigation.is-prev")[0], disabledClass: "is-disabled" } }); }); // [ Add quotes to blockquotes ] $("blockquote").each(function () { $(".blockquotes-elements").find(".testimonials_top-detail.is-large").clone().appendTo(this); }); // Hides upcoming section if list is empty $("[hide-if-empty-inside]").has(".w-dyn-empty[]").css("display", "none"); // [ Compare Table ] $('.compare-table_table').each(function () { const tableBody = $(this).find(".compare-table_body"); const tableContent = $(this).next('[compare-table="content"]'); const sourceFeatureRow = $(this).find('[compare-table="feature-row"]'); const sourceRow = $(this).find('[compare-table="row"]'); const sourceContentCheck = $(this).find('[compare-table="content-check"]'); const sourceContentCross = $(this).find('[compare-table="content-cross"]'); const sourceContentText = $(this).find('[compare-table="content-text"]'); let featureRow; let row; let content; $(tableContent).children().each(function (index, element) { if ($(element).is("h2")) { featureRow = sourceFeatureRow.clone().appendTo(tableBody); featureRow.removeAttr("compare-table-delete"); featureRow.text($(element).text()); } else if ($(element).is("h3")) { row = sourceRow.clone().appendTo(tableBody); row.removeAttr("compare-table-delete"); row.find(".compare-table_feature").text($(element).text()); } else { if ($(element).text() == "✅") { content = sourceContentCheck.clone().appendTo(row); } else if ($(element).text() == "❌") { content = sourceContentCross.clone().appendTo(row); } else { content = sourceContentText.clone().appendTo(row); content.text($(element).text()); } content.removeAttr("compare-table-delete"); } }); $(this).find('[compare-table-delete]').remove(); tableContent.remove(); // For some reason the component is being set with a text that can't be rmeoved, // so we are using css to hide it }); </script> <!-- Code Snippets --> <script> // Hide section if collection is empty $('.w-dyn-empty').parents('[hide-if-empty]').each(function () { $(this).hide() }); </script><script> setTimeout(() => { window.location.href = "/resources?Topics=Parking"; }, 100); </script></body></html>