1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0"> 6 <title>Portugal Textile - Sustainable Clothing Manufacturer Group</title> 7<meta name="description" content="Portugal Textile offers sustainable clothing manufacturing with a focus on quality for brands and influencers."> 8 9 <link rel="icon" href="./assets/imgs/favicon.webp" sizes="32x32" /> 10<link rel="icon" href="./assets/imgs/favicon.webp" sizes="192x192" /> 11<link rel="apple-touch-icon" href="./assets/imgs/favicon.webp" /> 12<meta name="msapplication-TileImage" content="./assets/imgs/favicon.webp" /> 13 <!-- Fonts --> 14<link media="print" onload="this.media='all'" rel="preconnect" href="https://fonts.googleapis.com"> 15<link media="print" onload="this.media='all'" rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 16<link media="print" onload="this.media='all'" href="https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet"> 17 18 19 <!-- Google Tag Manager -->
20<script>
vendor: 327 bytes, lines 20-24
20(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 21new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 22j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 23'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 24})(window,document,'script','dataLayer','
24GTM-NWRT6VNV
vendor: 3 bytes, line 24
24');
24</script>
24 25<!-- End Google Tag Manager --> 26 27 28 <!-- Font Awesome for icons --> 29 <link media="print" onload="this.media='all'" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> 30 <!-- GSAP Libraries --> 31
31<script async src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js"></script>
31 32
32<script async src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/ScrollTrigger.min.js"></script>
32 33 <!-- Cookie Consent Script --> 34 <!-- SEO Meta Tags --> 35 36 <meta name="keywords" content="sustainable clothing, textile manufacturing, Portugal textile, fashion brand development, eco-friendly clothing production, sustainable fashion, clothing collection development"> 37 38 <!-- Open Graph / Facebook --> 39 <meta property="og:type" content="website"> 40 <meta property="og:url" content="https://www.portugaltextile.com/"> 41 <meta property="og:title" content="Portugal Textile - Premium Sustainable Clothing Manufacturers Group"> 42 <meta property="og:description" content="Create sustainable clothing collections with Portugal Textile. We are manufacturers, focusing on eco-friendly materials and ethical production since 2007."> 43 <meta property="og:image" content="https://portugaltextile.com/wp-content/uploads/elementor/thumbs/IMG_4722-q7inb2fsiq7bfx6xszbf2fe3a3dmzw7fgbyplmo9po.png?v=1.0"> 44 <meta property="og:image:width" content="1140" /> 45 <meta property="og:image:height" content="600" /> 46 47 <!-- Twitter Card --> 48 <meta name="twitter:card" content="summary_large_image"> 49 <meta name="twitter:url" content="https://www.portugaltextile.com/"> 50 <meta name="twitter:title" content="Portugal Textile - Premium Sustainable Clothing Manufacturers Group"> 51 <meta name="twitter:description" content="Portugal Textile produces for fashion brands with premium Portuguese manufacturers, offering sustainable clothing development services with a focus on eco-friendly materials. From design to production, we manage your entire clothing collection creation process with quality and environmental responsibility."> 52 <meta name="twitter:image" content="https://portugaltextile.com/wp-content/uploads/elementor/thumbs/IMG_4722-q7inb2fsiq7bfx6xszbf2fe3a3dmzw7fgbyplmo9po.png?v=1.0"> 53 54 <!-- Canonical URL --> 55 <link rel="canonical" href="https://portugaltextile.com/"> 56 57 <!-- Robots Meta Tag --> 58 <meta name="robots" content="index, follow"> 59 60 <!-- Geo Tags --> 61 <meta name="geo.region" content="PT"> 62 <meta name="geo.placename" content="Portugal"> 63 <meta name="geo.position" content="39.5501;-8.1452"> 64 <meta name="ICBM" content="39.5501, -8.1452"> 65
65<script> 66 function supportsWebP(callback) { 67 let img = new Image(); 68 img.onload = img.onerror = function () { 69 callback(img.width === 1); 70 }; 71 img.src = 72 "data:image/webp;base64,UklGRhoAAABXRUJQVlA4TAYAAAAvAAAAFQAAQUxQSAEAAAABAAEAAABQSwA="; 73 } 74 75 supportsWebP(function (supported) { 76 if (supported) { 77 document.querySelectorAll("img").forEach((img) => { 78 let webpSrc = img.src.replace(/\.(jpg|png)$/, ".webp"); 79 img.src = webpSrc; 80 }); 81 } 82 }); 83 </script>
83 84 85 <!-- Schema.org Organizational Markup --> 86
86<script type="application/ld+json"> 87{ 88 "@context": "https://schema.org", 89 "@type": "Organization", 90 "name": "Portugal Textile", 91 "url": "https://www.portugaltextile.com", 92 "logo": "https://portugaltextile.com/wp-content/uploads/2023/05/cropped-slogan_update-1-ai4.png", 93 "description": "Sustainable clothing development group creating fashion brands with premium Portuguese manufacturers since 2007.", 94 "foundingDate": "2007", 95 "founder": { 96 "@type": "Person", 97 "name": "Paulo Silva" 98 }, 99 "address": { 100 "@type": "PostalAddress", 101 "addressCountry": "PT" 102 }, 103 "contactPoint": { 104 "@type": "ContactPoint", 105 "telephone": "+351 915 085 106", 106 "contactType": "Customer Service", 107 "availableLanguage": ["en", "pt"] 108 }, 109 "sameAs": [ 110 "https://www.facebook.com/portugaltextile/", 111 "https://www.instagram.com/portugaltextile/", 112 "https://www.linkedin.com/portugaltextile", 113 "https://pt.pinterest.com/portugaltextile/" 114 ], 115 "offers": { 116 "@type": "Offer", 117 "itemOffered": { 118 "@type": "Service", 119 "name": "Clothing Manufacturing", 120 "description": "End-to-end sustainable clothing manufacturing, including design, sourcing, sampling, production, and quality control." 121 } 122 }, 123 "areaServed": { 124 "@type": "Country", 125 "name": "Worldwide" 126 }, 127"award": [ 128 "Award of Exportation and Internationalization", 129 "Top 1000 Companies" 130] 131} 132</script>
132 133 134
134<script type="application/ld+json"> 135{ 136 "@context": "https://schema.org", 137 "@type": "FAQPage", 138 "mainEntity": [ 139 { 140 "@type": "Question", 141 "name": "How can I work with you?", 142 "acceptedAnswer": { 143 "@type": "Answer", 144 "text": "To begin working with us, you just need to contact us, sending your request about the project through this form or email. You send us your tech packs as well as the quantities per style color, price targets and deadline of the collection. Then, our commercial department will analyze the project to understand your vision, what the brand is looking for and how we can fulfill all your needs." 145 } 146 }, 147 { 148 "@type": "Question", 149 "name": "How can I do a tech pack and submit it for you?", 150 "acceptedAnswer": { 151 "@type": "Answer", 152 "text": "A Tech Pack is a framework for sharing your ideas in a structured way. Tech Packs are illustrated designs and specifications of your garment design. A Tech Pack is often required to obtain a quote from a manufacturer or agency, and to ensure that people understand how to make your design and its specifications. You can submit your designs, tech packs, sketches or image references to us via our contact form. Alternatively, you can also email us at [email protected]. Note: If you don't have a tech pack, you can always send us physical samples from similar styles for what you want to produce." 153 } 154 }, 155 { 156 "@type": "Question", 157 "name": "What are your minimum order quantities?", 158 "acceptedAnswer": { 159 "@type": "Answer", 160 "text": "Our minimum order quantities (MOQs) are customized for each project and may vary based on style and color requirements. Send us your project at [email protected] or at www.portugaltextile.com/create-your-collection." 161 } 162 }, 163 { 164 "@type": "Question", 165 "name": "What is your production lead times?", 166 "acceptedAnswer": { 167 "@type": "Answer", 168 "text": "The project timeline is dependent on your specific needs. Send us your project at [email protected] or at www.portugaltextile.com/create-your-collection." 169 } 170 }, 171 { 172 "@type": "Question", 173 "name": "What types of materials are you able to source?", 174 "acceptedAnswer": { 175 "@type": "Answer", 176 "text": "We can source all type of materials for textile development, sustainable materials included, for examples: organic cotton, EcoVero, Tencel, cactus leather, grape leather, etc. See here some of the innovative options." 177 } 178 }, 179 { 180 "@type": "Question", 181 "name": "Do you do the quality control?", 182 "acceptedAnswer": { 183 "@type": "Answer", 184 "text": "Yes! We have an internal team dedicated to the quality control of all the stages of the process. Every material is inspected before and after any procedure. Our quality controller team will measure, check flaws, test quality, functionality, comfort, durability, and any other important detail for you." 185 } 186 }, 187 { 188 "@type": "Question", 189 "name": "How do you take care of the packaging?", 190 "acceptedAnswer": { 191 "@type": "Answer", 192 "text": "We provide sustainable, recycled, and biodegradable custom labels, tags, packaging and accessories to create a fully branded product. You should send us your requirements (size, material, colors, etc.) and artworks, and we will make it happen." 193 } 194 }, 195 { 196 "@type": "Question", 197 "name": "How do you take care of transport/delivery of the collection?", 198 "acceptedAnswer": { 199 "@type": "Answer", 200 "text": "We work with several transport companies with land, air, and sea shipments, in order to send the collection to any destination in the world. For each place we have references to provide you the best solutions." 201 } 202 } 203 ] 204} 205</script>
205 206<link media="print" onload="this.media='all'" rel="stylesheet" href="./assets/css/main.css">
207<script src="./assets/js/cookie-consent.js"></script>
vendor: 1 bytes, line 207
207
208<script src="./assets/js/safarimenu.js"></script>
208 209 <style> 210 /* Global Reset and Variables */ 211 :root{--primary-gradient:linear-gradient(300deg,#E4A644 0%,#C14ADC 100%);--color-gold:#E4A644;--color-purple:#C14ADC;--color-black:#000000;--color-white:#FFFFFF;--color-light-gray:#f9f9f9;--color-dark-gray:#666}*{margin:0;padding:0;box-sizing:border-box}html{scroll-behavior:smooth}body{font-family:'Montserrat',sans-serif;line-height:1.6;color:var(--color-black);overscroll-behavior-x:none}img{max-width:100%;height:auto}ul{list-style:none}a{text-decoration:none;color:inherit}.container{max-width:1200px;margin:0 auto;padding:0 20px}.section{padding:80px 0;position:relative}.section-title{text-align:center;margin-bottom:40px;font-size:2.5rem;background:var(--primary-gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.btn{display:inline-block;padding:12px 25px;border-radius:8px;font-weight:500;cursor:pointer;transition:all .3s ease}.btn-primary{background:var(--primary-gradient);color:var(--color-white);border:none}.btn-secondary{border:2px solid var(--color-black);color:var(--color-black);background:transparent}.btn:hover{transform:translateY(-5px);box-shadow:0 10px 20px rgba(0,0,0,0.1)}.header{position:fixed;width:100%;top:0;background:white;box-shadow:0 2px 10px rgba(0,0,0,0.1);z-index:1000;transition:all .3s ease}.header .container{display:flex;justify-content:space-between;align-items:center}.logo img{margin-top:3px}.nav-menu{display:flex;align-items:center;gap:30px}.nav-link{text-decoration:none;color:var(--color-black);position:relative;transition:color .3s ease;font-weight:500}.nav-link::after{content:'';position:absolute;width:0;height:2px;bottom:-5px;left:0;background:var(--primary-gradient);transition:width .3s ease}.nav-link:hover::after{width:100%}.mobile-toggle{background:none;border:none;font-size:1.5rem;cursor:pointer;color:var(--color-black)}.mobiledivtoggle{position:relative;z-index:999;display:none}.mobile-menu-header,.mobile-menu-content,.mobile-menu-social{display:none}.footer-logo-bottom{display:block;margin:20px auto 0;max-width:140px}.hero{padding:180px 0 120px;background:linear-gradient(135deg,rgba(228,166,68,0.1) 0%,rgba(193,74,220,0.1) 100%);position:relative;overflow:hidden}.hero-container{display:grid;grid-template-columns:1fr 1fr;gap:60px;align-items:center}.hero-content{max-width:650px}.hero-title{font-size:3rem;margin-bottom:25px;color:var(--color-black);line-height:1.2}.hero-subtitle{font-size:2rem;color:var(--color-black);margin-bottom:25px;font-weight:500}.hero-text{font-size:1.2rem;color:var(--color-dark-gray);margin-bottom:35px}.hero-cta{display:flex;gap:25px}.hero-video{width:100%;height:auto;border-radius:20px;box-shadow:0 25px 60px rgba(0,0,0,0.15);overflow:hidden}#background-video{width:100%;height:auto;display:block}.clients{background-color:white;padding:40px 0;overflow:hidden}.clients-title{text-align:center;margin-bottom:0;font-size:2rem;color:var(--color-black)}.clients-autoscroll-container{width:100%;position:relative;overflow:hidden;padding:20px 0}.clients-autoscroll{display:flex;animation:scrollLogos 20s linear infinite;width:max-content}@keyframes scrollLogos{0%{transform:translateX(0)}100%{transform:translateX(calc(-250px * 3))}}.client-logo{width:250px;height:180px;margin:0 50px;flex-shrink:0;display:flex;flex-direction:column;justify-content:center;align-items:center;transition:all .4s ease}.client-logo img{max-width:200px;max-height:120px;object-fit:contain;filter:grayscale(100%);opacity:.7;transition:all .4s ease;margin-bottom:15px}.client-logo:hover img{filter:grayscale(0%);opacity:1;transform:scale(1.05)}.client-name{font-weight:500;color:var(--color-dark-gray);margin-top:10px;text-align:center}.process{background-color:var(--color-light-gray);padding:80px 0}.process-title{text-align:center;margin-bottom:15px;font-size:2.5rem;background:var(--primary-gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.process-subtitle{text-align:center;color:var(--color-dark-gray);margin-bottom:60px;font-size:1.2rem}.process-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:30px}.process-card{background-color:white;border-radius:20px;padding:40px 30px;text-align:center;box-shadow:0 10px 30px rgba(0,0,0,0.05);transition:all .3s ease;opacity:1!important;transform:translateY(0)!important}.process-card:hover{transform:translateY(-10px)!important;box-shadow:0 15px 40px rgba(0,0,0,0.1)}.process-number{width:80px;height:80px;margin:0 auto 20px;display:flex;align-items:center;justify-content:center;background:var(--primary-gradient);border-radius:50%;color:white;font-size:2rem;font-weight:bold}.process-card-title{margin-bottom:15px;font-size:1.5rem}.process-card-text{color:var(--color-dark-gray);line-height:1.6}.about{padding:80px 0;background-color:white}.about-container{display:grid;grid-template-columns:1fr 1fr;gap:60px;align-items:center}.about-image{width:100%;height:auto;border-radius:20px;box-shadow:0 20px 50px rgba(0,0,0,0.1);object-fit:cover;opacity:1!important;transform:translateX(0)!important}.about-content{opacity:1!important;transform:translateX(0)!important}.about-content h2{margin-bottom:20px;font-size:2.5rem;background:var(--primary-gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.about-content h3{margin-bottom:20px;font-size:1.5rem;color:var(--color-black)}.about-content p{margin-bottom:20px;color:var(--color-dark-gray);line-height:1.8}.about-btn{text-align:center;display:inline-block;text-decoration:none;padding:12px 30px;border:2px solid var(--color-black);color:var(--color-black);border-radius:8px;font-weight:500;transition:all .3s ease}.about-btn:hover{background:var(--primary-gradient);color:white;border-color:transparent;transform:translateY(-5px);box-shadow:0 10px 20px rgba(0,0,0,0.1)}
211.benefits{background-color:var(--color-light-gray);padding:80px 0}.benefits-subtitle{text-align:center;color:var(--color-dark-gray);margin-bottom:60px;font-size:1.2rem}.benefits-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:30px}.benefit-card{background-color:white;border-radius:20px;padding:30px;transition:all .3s ease;box-shadow:0 10px 30px rgba(0,0,0,0.05);opacity:1!important;transform:translateY(0)!important}.benefit-card:hover{transform:translateY(-10px)!important;box-shadow:0 15px 40px rgba(0,0,0,0.1)}.benefit-header{display:flex;align-items:center;margin-bottom:20px;gap:15px}.benefit-icon{width:50px;height:50px;display:flex;align-items:center;justify-content:center;background:var(--primary-gradient);border-radius:50%}.benefit-icon img{width:25px;height:25px;filter:brightness(0) invert(1)}.benefit-title{font-size:1.3rem;margin:0}.benefit-text{color:var(--color-dark-gray);line-height:1.6}.workflow{padding:80px 0;background-color:var(--color-light-gray)}.workflow-container{display:grid;grid-template-columns:1fr 1fr;gap:60px;align-items:center}.workflow-content{opacity:1!important;transform:translateX(0)!important}.workflow-content h2{margin-bottom:20px;font-size:2.5rem;background:var(--primary-gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.workflow-content h3{margin-bottom:20px;font-size:1.5rem;color:var(--color-black)}.workflow-content p{margin-bottom:20px;color:var(--color-dark-gray);line-height:1.8}.workflow-slider{position:relative;overflow:hidden;border-radius:20px;box-shadow:0 20px 50px rgba(0,0,0,0.1);opacity:1!important;transform:translateX(0)!important}.workflow-track{display:flex;transition:transform .5s ease}.workflow-slide{min-width:100%;position:relative}.workflow-image{width:100%;height:500px;display:block;object-fit:cover}.workflow-caption{position:absolute;bottom:0;left:0;right:0;padding:20px;background:white;color:var(--color-black);text-align:center;border-top:1px solid #eee}.workflow-caption h3{margin-bottom:5px;font-size:1.2rem}.workflow-navigation{display:flex;justify-content:center;margin:20px;gap:10px}.workflow-dot{width:12px;height:12px;border-radius:50%;background-color:#ddd;cursor:pointer;transition:all .3s ease}.workflow-dot.active{background:var(--primary-gradient);width:24px;border-radius:10px}.workflow-arrows{display:flex;justify-content:space-between;position:absolute;top:50%;transform:translateY(-50%);width:100%;padding:0 20px;z-index:5;pointer-events:none}.workflow-arrow{width:40px;height:40px;background:var(--color-white);border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 5px 15px rgba(0,0,0,0.1);pointer-events:auto;color:var(--color-black);font-size:1.2rem;border:none;transition:all .3s ease}.workflow-arrow:hover{background:var(--primary-gradient);color:var(--color-white)}.materials{background-color:white;padding:80px 0}.materials-title{text-align:center;margin-bottom:20px;font-size:2.5rem;background:var(--primary-gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.materials-subtitle{text-align:center;color:var(--color-dark-gray);margin-bottom:60px;font-size:1.2rem}.materials-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:30px}.material-card{background-color:white;border-radius:20px;overflow:hidden;box-shadow:0 10px 30px rgba(0,0,0,0.05);transition:all .3s ease;height:100%;opacity:1!important;transform:translateY(0)!important}.material-card:hover{transform:translateY(-10px)!important;box-shadow:0 15px 40px rgba(0,0,0,0.1)}.material-image{width:100%;height:200px;object-fit:cover}.material-content{padding:20px}.material-name{font-size:1.3rem;margin-bottom:10px;color:var(--color-black)}.material-description{color:var(--color-dark-gray);font-size:.9rem;line-height:1.6}.accessories{padding:80px 0;background-color:white}.accessories-title{text-align:center;margin-bottom:20px;font-size:2.5rem;background:var(--primary-gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.accessories-subtitle{text-align:center;color:var(--color-dark-gray);margin-bottom:60px;font-size:1.2rem}.accessories-container{max-width:1200px;margin:0 auto}.accessories-card{display:flex;background:var(--color-light-gray);border-radius:20px;overflow:hidden;box-shadow:0 10px 30px rgba(0,0,0,0.07);margin-bottom:30px;transition:all .3s ease}.accessories-card:hover{transform:translateY(-10px);box-shadow:0 15px 40px rgba(0,0,0,0.12)}.accessories-image{width:40%;min-height:300px;object-fit:cover}.accessories-content{width:60%;padding:40px;
211display:flex;flex-direction:column;justify-content:center}.accessories-content h3{font-size:1.8rem;margin-bottom:15px;color:var(--color-black)}.accessories-content p{color:var(--color-dark-gray);line-height:1.7;margin-bottom:20px}.material-badge{display:inline-block;background:var(--primary-gradient);color:white;font-size:.9rem;padding:5px 15px;border-radius:20px;width:fit-content;margin-bottom:15px}.accessories-btn{display:inline-block;padding:10px 25px;background:transparent;border:2px solid var(--color-black);color:var(--color-black);border-radius:8px;font-weight:500;transition:all .3s ease;margin-top:10px;align-self:flex-start}.accessories-btn:hover{background:var(--primary-gradient);color:white;border-color:transparent}.testimonials{background-color:var(--color-light-gray);padding:80px 0}.testimonials-header{text-align:center;margin-bottom:60px}.testimonials-title{font-size:2.5rem;margin-bottom:20px;background:var(--primary-gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.testimonials-subtitle{font-size:1.1rem;max-width:800px;margin:0 auto;color:var(--color-dark-gray)}.testimonials-slider{position:relative;overflow:hidden;padding:30px 0}.testimonials-container{display:flex;transition:transform .5s ease}.testimonial-item{flex:0 0 100%;padding:0 20px}.testimonial-card{background:white;border-radius:15px;padding:30px;box-shadow:0 10px 30px rgba(0,0,0,0.05)}.testimonial-content{position:relative;padding:20px 0;margin-bottom:20px;font-size:1.1rem;line-height:1.8;color:var(--color-dark-gray)}.testimonial-content::before{content:'"';position:absolute;top:-20px;left:-10px;font-size:5rem;color:rgba(0,0,0,0.1);line-height:1}.testimonial-author{display:flex;align-items:center}.author-image{width:60px;height:60px;border-radius:50%;object-fit:cover;margin-right:15px}.author-info h4{font-size:1.1rem;margin-bottom:5px;color:var(--color-black)}.author-info p{font-size:.9rem;color:var(--color-dark-gray)}.slider-nav{display:flex;justify-content:center;margin-top:30px;gap:10px}.slider-dot{width:12px;height:12px;border-radius:50%;background:rgba(0,0,0,0.2);cursor:pointer;transition:background .3s ease}.slider-dot.active{background:var(--color-purple);display:none}.cta{padding:80px 0;background-color:white}.cta-container{max-width:900px;margin:0 auto;text-align:center;opacity:1!important;transform:translateY(0)!important}.cta-title{font-size:2.5rem;margin-bottom:20px;background:var(--primary-gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.cta-subtitle{font-size:1.5rem;color:var(--color-black);margin-bottom:30px}.cta-text{color:var(--color-dark-gray);margin-bottom:40px;max-width:700px;margin-left:auto;margin-right:auto;padding:0 20px}.cta-button{display:inline-block;text-decoration:none;padding:15px 40px;background:var(--primary-gradient);color:white;border-radius:8px;font-weight:500;transition:all .3s ease}.cta-button:hover{transform:translateY(-5px);box-shadow:0 10px 30px rgba(0,0,0,0.1)}footer{background-color:var(--color-light-gray);padding:80px 0 40px}.footer-grid{display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:40px}.footer-logo{margin-bottom:20px}.footer-logo img{max-height:50px;width:200px}.footer-about{color:var(--color-dark-gray);margin-bottom:20px;line-height:1.6}.footer-social{display:flex;gap:15px}.social-icon{width:40px;height:40px;border-radius:50%;background:var(--primary-gradient);display:flex;align-items:center;justify-content:center;color:white;text-decoration:none;transition:transform .3s ease}.social-icon:hover{transform:translateY(-5px)}.footer-column h3{color:var(--color-black);margin-bottom:20px;font-size:1.2rem}.footer-links{list-style:none}.footer-links li{margin-bottom:10px}.footer-links a{color:var(--color-dark-gray);text-decoration:none;transition:color .3s ease}.footer-links a:hover{color:var(--color-purple)}#mc_embed_signup{width:100%}#mc_embed_signup_scroll h3{color:var(--color-black);margin-bottom:20px;font-size:1.2rem}.newsletter-input{width:100%;padding:12px;border:1px solid #ddd;border-radius:8px;margin-bottom:15px}.mc-field-group{margin-bottom:15px}.newsletter-button{width:100%;padding:12px;background:var(--primary-gradient);color:white;border:none;border-radius:8px;
211cursor:pointer;transition:transform .3s ease}.newsletter-button:hover{transform:translateY(-3px)}.checkbox.subfield{display:flex;align-items:center;gap:8px;margin-bottom:15px}.footer-bottom{text-align:center;margin-top:60px;padding-top:20px;border-top:1px solid #ddd;color:var(--color-dark-gray)}#consent-popup{position:fixed;bottom:20px;left:20px;background:white;padding:20px;border-radius:10px;box-shadow:0 5px 20px rgba(0,0,0,0.1);z-index:1000;max-width:400px;display:none}#consent-popup h3{margin-bottom:10px}#consent-popup p{margin-bottom:15px;color:var(--color-dark-gray)}#consent-buttons{display:flex;gap:10px}#consent-buttons button{padding:8px 15px;border:none;border-radius:5px;cursor:pointer}#accept-consent{background:var(--primary-gradient);color:white}#deny-consent{background:#eee;color:var(--color-black)}.modal-link{color:var(--color-purple);text-decoration:underline;cursor:pointer;display:block;margin-bottom:15px}.hero-video{position:relative;width:100%;aspect-ratio:1/1;border-radius:20px;overflow:hidden;box-shadow:0 25px 60px rgba(0,0,0,0.15);cursor:pointer}#background-video{width:100%;height:100%;object-fit:cover}.video-controls{position:absolute;bottom:15px;left:15px;right:15px;display:flex;justify-content:space-between;background:rgba(0,0,0,0.5);border-radius:30px;padding:10px 15px;z-index:10;transition:opacity .3s ease;backdrop-filter:blur(10px);opacity:0}.video-controls-left,.video-controls-right{display:flex;align-items:center;gap:15px}.video-btn{background:none;border:none;color:white;font-size:1.2rem;cursor:pointer;transition:all .3s ease;display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden}.video-btn::before{content:'';position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(300deg,#E4A644 0%,#C14ADC 100%);opacity:0;transition:opacity .3s ease;z-index:-1;border-radius:8px}.video-btn:hover::before{opacity:.2}.video-btn:hover{transform:scale(1.1);color:white}.volume-slider{width:100px;margin-left:10px;appearance:none;height:5px;background:rgba(255,255,255,0.3);outline:none;opacity:.7;transition:opacity .2s;border-radius:5px}.about-image{aspect-ratio:1/1;object-position:center}.volume-slider::-webkit-slider-thumb{appearance:none;width:15px;height:15px;background:linear-gradient(300deg,#E4A644 0%,#C14ADC 100%);cursor:pointer;border-radius:50%}.volume-slider::-moz-range-thumb{width:15px;height:15px;background:linear-gradient(300deg,#E4A644 0%,#C14ADC 100%);cursor:pointer;border-radius:50%;border:none}.video-progress{position:absolute;bottom:0;left:0;right:0;height:5px;background:rgba(255,255,255,0.3)}.video-progress-filled{height:100%;background:linear-gradient(300deg,#E4A644 0%,#C14ADC 100%);width:0}.hero-video:hover .video-controls{opacity:1}.brand-nav{background-color:#f9f7fc;padding:6px 20px;display:flex;align-items:center}.brand-divider{color:#ddd;margin:0 10px;font-size:14px}.current-site{opacity:1}.other-site{opacity:.65;transition:opacity .3s ease}.other-site:hover{opacity:1}.brand-logo{height:18px;width:auto}.absologo{height:17px}.mobile-menu-cta2{display:none}@media (max-width:1024px){.hero-title{font-size:3.5rem}.process-grid{grid-template-columns:repeat(3,1fr)}.benefits-grid{grid-template-columns:repeat(2,1fr)}.workflow-container,.about-container{grid-template-columns:1fr;gap:40px}.about-content,.workflow-content{order:2}.materials-grid{grid-template-columns:repeat(3,1fr)}.footer-grid{grid-template-columns:1fr}.accessories-card{flex-direction:column}.accessories-image,.accessories-content{width:100%}.accessories-image{height:300px}@keyframes scrollLogos{0%{transform:translateX(0)}100%{transform:translateX(calc(-220px * 3))}}.client-logo{width:220px;height:160px;margin:0 30px}.client-logo img{max-width:180px;max-height:100px}.hero-container{grid-template-columns:1fr}.header .container{padding:0 15px}.mobile-toggle{z-index:1002}.mobiledivtoggle{display:flex}.mobiledivtoggle>.btn-primary{font-size:.9rem;margin:0 10px;z-index:999}.nav-menu{position:fixed;top:0;left:0;right:0;bottom:0;background:white;flex-direction:column;padding:100px 0 80px;box-shadow:0 5px 10px rgba(0,0,0,0.1);transform:translateY(-100%);opacity:0;pointer-events:none;transition:all .4s ease;gap:30px;align-items:center;justify-content:center;height:100vh;width:100vw;z-index:1001;overflow-y:auto}.nav-menu.active{transform:translateY(0);opacity:1;pointer-events:auto;z-index:1001;background-color:var(--color-light-gray)}.mobile-menu-cta2{display:block}.mobile-menu-header{display:block;position:absolute;top:0;left:0;right:0;padding:30px 20px;text-align:center;border-bottom:1px solid #f1f1f1;width:100%;background:white}.mobile-menu-logo{max-height:40px}.mobile-menu-social{display:flex;position:absolute;bottom:0;left:0;right:0;padding:25px 20px;justify-content:center;gap:15px;background:white;border-top:1px solid #f1f1f1}.mobile-social-icon{width:36px;height:36px;border-radius:50%;background:var(--primary-gradient);display:flex;align-items:center;justify-content:center;color:white;font-size:.9rem;transition:transform .3s ease}.mobile-social-icon:hover{transform:translateY(-3px)}}@media (max-width:768px){.brand-nav{padding:4px 15px}.clients{padding:20px 0}.clients-title{font-size:1.4rem}.brand-divider{margin:0 8px;font-size:12px}.brand-logo{height:12px}.absologo{height:12px}.hero{padding:120px 0 80px}.hero-container{grid-template-columns:1fr;gap:0}.hero-content{text-align:center;margin-bottom:40px}.hero-title{font-size:3rem;margin-bottom:15px}.hero-subtitle{font-size:1.6rem;margin-bottom:15px}.hero-text{font-size:1.1rem;margin-bottom:20px}.hero-cta{justify-content:center}.video-controls{opacity:0}
211.hero-video.controls-visible .video-controls{opacity:1}@keyframes scrollLogos{0%{transform:translateX(0)}100%{transform:translateX(calc(-180px * 3))}}.client-logo{width:180px;height:150px;margin:0 20px}.client-logo img{max-width:150px;max-height:90px}.process-grid{grid-template-columns:1fr}.benefits-grid{grid-template-columns:1fr}.materials-grid{grid-template-columns:1fr}.footer-grid{grid-template-columns:1fr;gap:30px}.accessories-content{padding:25px}.accessories-content h3{font-size:1.5rem}.nav-link{font-size:1.2rem}.mobile-menu-logo{max-height:30px}}@media (max-width:576px){.section{padding:60px 0}.section-title{font-size:2rem}.hero-title{font-size:1.8rem}.hero-subtitle{font-size:1.5rem}.hero-btn{width:100%}.hero-cta{flex-direction:column;width:100%;gap:15px}.hero-video{aspect-ratio:16/9}.process-card,.benefit-card,.testimonial-card{padding:20px}.process-number{width:60px;height:60px;font-size:1.5rem}.about-content h2,.workflow-content h2{font-size:2rem}.footer-social{justify-content:center}@keyframes scrollLogos{0%{transform:translateX(0)}100%{transform:translateX(calc(-160px * 3))}}.client-logo{width:160px;height:140px;margin:0 15px}.client-logo img{max-width:130px;max-height:80px}.mobiledivtoggle>.btn-primary{font-size:.8rem;padding:8px 15px;margin:0 5px}.header .container{padding:10px 12px}.mobile-toggle{font-size:1.3rem}}.scroll-progress-container{position:absolute;left:0;bottom:0;width:100%;height:3px;z-index:1000;pointer-events:none;overflow:hidden}.scroll-progress-bar{position:absolute;left:0;top:0;height:100%;width:0;background:linear-gradient(to right,#E4A644,#C14ADC);transition:width .1s ease}@media (min-width:769px) and (max-width:1024px){.hero-video{aspect-ratio:16/9;max-height:500px}.hero-container{grid-template-columns:1fr;align-items:center}.hero-content{order:1}.hero-video{order:2}}.cookie-settings{position:fixed;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:1001;display:none;align-items:center;justify-content:center}.cookie-settings-content{background-color:white;border-radius:10px;width:90%;max-width:600px;max-height:90vh;overflow-y:auto;box-shadow:0 10px 30px rgba(0,0,0,0.2);padding:25px}.cookie-settings-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px}.cookie-settings-header h3{margin:0;font-size:1.5rem}.close-settings{background:none;border:none;font-size:1.5rem;cursor:pointer;color:var(--color-dark-gray);transition:color .3s ease}.close-settings:hover{color:var(--color-black)}.cookie-options{margin:25px 0}.cookie-option{border:1px solid #eee;border-radius:8px;padding:15px;margin-bottom:15px}.cookie-option-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.cookie-label{display:flex;align-items:center;gap:10px;cursor:pointer}.cookie-name{font-weight:600}.cookie-status{font-size:.8rem;color:var(--color-purple)}.cookie-description{font-size:.9rem;color:var(--color-dark-gray);margin:0}.cookie-settings-footer{display:flex;justify-content:flex-end}.save-preferences{background:var(--primary-gradient);color:white;border:none;padding:10px 20px;border-radius:6px;cursor:pointer;font-weight:500;transition:all .3s ease}.save-preferences:hover{transform:translateY(-3px);box-shadow:0 5px 15px rgba(0,0,0,0.1)}.cookie-label input[type="checkbox"]{appearance:none;-webkit-appearance:none;width:20px;height:20px;border:2px solid #ddd;border-radius:4px;outline:none;cursor:pointer;position:relative;transition:all .2s ease}.cookie-label input[type="checkbox"]:checked{background:var(--primary-gradient);border-color:transparent}.cookie-label input[type="checkbox"]:checked::after{content:'â';position:absolute;color:white;font-size:14px;top:50%;left:50%;transform:translate(-50%,-50%)}.cookie-label input[type="checkbox"]:disabled{opacity:.7;cursor:not-allowed}.header{position:fixed;width:100%;top:0;background:white;box-shadow:0 2px 10px rgba(0,0,0,0.1);z-index:10000;transition:all .3s ease}.brand-nav{position:relative;z-index:10001}.header .container,.logo,.mobiledivtoggle,.mobile-toggle{position:relative;z-index:10001}.nav-menu{z-index:9999}.scroll-progress-container{position:absolute;
211left:0;bottom:0;width:100%;height:3px;z-index:9500;pointer-events:none;overflow:hidden}@media (max-width:1024px){.nav-menu{position:fixed;top:0;left:0;right:0;bottom:0;background:white;flex-direction:column;padding-top:120px;padding-bottom:80px;box-shadow:0 5px 10px rgba(0,0,0,0.1);transform:translateY(-100%);opacity:0;pointer-events:none;transition:all .4s ease;gap:30px;align-items:flex-start;justify-content:center;height:100vh;width:100vw;z-index:9999;overflow-y:auto}.nav-menu.active{transform:translateY(0);opacity:1;pointer-events:auto}}.header{position:fixed;width:100%;top:0;background:white;box-shadow:0 2px 10px rgba(0,0,0,0.1);z-index:9999;transition:all .3s ease}.header .container,.logo,.mobiledivtoggle,.mobile-toggle{position:relative;z-index:9999}.nav-menu{z-index:9998}.scroll-progress-container{z-index:10000}@media (max-width:1024px){.mobiledivtoggle{display:flex}.mobile-menu-header{display:none!important}.about-image{aspect-ratio:16/9;object-position:bottom}.nav-menu{position:fixed;top:0;left:0;right:0;bottom:0;background:white;flex-direction:column;padding-top:120px;padding-bottom:80px;box-shadow:0 5px 10px rgba(0,0,0,0.1);transform:translateY(-100%);opacity:0;pointer-events:none;transition:all .4s ease;gap:30px;align-items:center;justify-content:center;height:100vh;width:100vw;z-index:9998;overflow-y:auto}.nav-menu.active{transform:translateY(0);opacity:1;pointer-events:auto}}.header .container.header-container{display:flex;justify-content:space-between;align-items:center;position:relative}.header-left{display:flex;align-items:center;gap:20px}.header-right{display:flex;align-items:center}.header-cta{display:inline-block;white-space:nowrap}@media (max-width:1024px){.nav-menu.active{display:flex;flex-direction:column}.header-left{gap:15px}.header-right{position:absolute;right:15px;top:50%;transform:translateY(-50%);z-index:9999}.header-cta{font-size:.9rem;padding:8px 15px}}@media (max-width:768px){.header-left{gap:10px}.about-image{aspect-ratio:1/1;object-position:center}.header-cta{font-size:.8rem;padding:6px 12px}}@media (max-width:576px){.header-left{gap:10px}.logo img{max-height:35px}.header-cta{font-size:.75rem;padding:6px 10px}}@media (min-width:1024px){.mobile-toggle{display:none!important}.header-container{justify-content:space-between}.nav-menu{display:flex!important;align-items:center;gap:30px}}.mobile-menu-cta{display:block;margin:20px auto;text-align:center;font-size:1rem;padding:12px 20px;background:var(--primary-gradient);color:white;border-radius:8px;text-decoration:none;transition:transform .3s ease}.mobile-menu-cta:hover{transform:translateY(-5px);box-shadow:0 10px 20px rgba(0,0,0,0.1)}@media (min-width:1025px){.header-right{display:none}}@media (max-width:1024px){.nav-menu{background:white;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;text-align:center;padding:100px 20px 80px;gap:40px;height:100vh;pointer-events:auto!important}.nav-menu.active{display:flex!important;flex-direction:column!important}.nav-menu .nav-link{color:var(--color-black);font-size:1.1rem;font-weight:600;position:relative;transition:all .3s ease;opacity:.8}.nav-menu .nav-link::after{content:'';position:absolute;width:0;height:3px;bottom:-8px;left:50%;background:var(--primary-gradient);transition:all .3s ease;transform:translateX(-50%)}.nav-menu .nav-link:hover{transform:scale(1.05);color:var(--color-purple);opacity:1}.nav-menu .nav-link:hover::after{width:100%}.mobile-menu-cta{max-width:400px;margin:0;font-size:1.2rem;padding:15px 25px;background:var(--primary-gradient);color:white;border-radius:10px;transition:all .3s ease}.mobile-menu-cta2{max-width:400px;margin:0;font-size:1.2rem;padding:15px 25px;border-radius:10px;transition:all .3s ease}.mobile-menu-cta:hover{transform:translateY(-5px);box-shadow:0 10px 20px rgba(0,0,0,0.1)}.mobile-menu-social{display:flex;justify-content:center;gap:20px;margin-top:40px}.mobile-social-icon{width:50px;height:50px;border-radius:50%;background:var(--primary-gradient);color:white;display:flex;align-items:center;justify-content:center;font-size:1.2rem;transition:transform .3s ease}.mobile-social-icon:hover{transform:translateY(-5px)}.mobile-menu-header{display:flex;justify-content:center;position:absolute;top:40px;left:0;right:0}.mobile-menu-logo{max-height:50px;opacity:.8}}@media (max-width:1024px){.nav-menu{background:white;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;text-align:center;gap:40px;height:100vh;overflow-y:auto}.mobile-menu-social{display:flex;justify-content:center;gap:20px;margin-top:30px;padding-bottom:60px;width:100%}.mobile-social-icon{width:50px;height:50px;border-radius:50%;background:var(--primary-gradient);color:white;display:flex;align-items:center;justify-content:center;font-size:1.2rem;transition:transform .3s ease}.mobile-social-icon:hover{transform:translateY(-5px)}.nav-menu{-webkit-overflow-scrolling:touch;overscroll-behavior-y:contain}}@media (max-width:1024px){.nav-menu .nav-link{font-size:1.5rem!important;text-align:center!important;width:100%!important;display:block!important}.nav-menu{align-items:center!important;text-align:center!important;padding:120px 30px 80px!important}}
211.cookie-settings{position:fixed;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:99999!important;display:none;align-items:center;justify-content:center}.cookie-settings-content{position:relative;z-index:100000!important}@media (max-width:768px){.benefit-icon{width:45px;height:45px;aspect-ratio:1/1;min-width:45px;min-height:45px}.benefit-icon img{width:22px;height:22px;object-fit:contain;max-width:100%;max-height:100%}}@media (max-width:1024px){@supports (-webkit-touch-callout:none){.nav-menu{padding-top:80px;padding-bottom:100px;gap:20px}.nav-menu .nav-link{font-size:1.1rem!important;margin-bottom:5px!important}.mobile-menu-cta,.mobile-menu-cta2{padding:10px 15px!important;font-size:1rem!important;margin:5px auto!important}.mobile-social-icon{width:40px!important;height:40px!important}.nav-menu.active{max-height:100%;overflow-y:auto;-webkit-overflow-scrolling:touch}.mobile-menu-social{padding-bottom:120px!important}}}@media (max-width:376px){.nav-menu{gap:10px!important;padding:60px 15px 50px!important}.nav-menu .nav-link{font-size:1rem!important;margin-bottom:0!important;padding:5px 0!important}.mobile-menu-cta,.mobile-menu-cta2{padding:6px 12px!important;font-size:.85rem!important;margin:2px auto!important;width:90%!important}.mobile-social-icon{width:30px!important;height:30px!important;font-size:.8rem!important}.mobile-menu-social{gap:10px;margin-top:15px;padding-bottom:25px}.nav-menu>div{gap:8px!important}}@media (max-width:600px){.nav-menu .nav-link{font-size:1.2rem!important;text-align:center!important;width:100%!important;display:block!important;margin-bottom:1px!important}.mobile-menu-cta,.mobile-menu-cta2{padding:10px 20px!important;font-size:1.2rem!important;width:100%!important}.mobile-social-icon{width:50px!important;height:50px!important;font-size:1.2rem!important}.mobile-menu-social{gap:20px!important;margin-top:30px!important;padding-bottom:60px!important}}@media (min-width:360px){.nav-menu .nav-link{font-size:1rem!important}.mobile-menu-cta,.mobile-menu-cta2{font-size:1rem!important}}.logo-container{position:relative;display:inline-flex;align-items:center}.external-icon{font-size:12px;margin-left:4px;color:#999;transition:color .3s ease}.other-site:hover .external-icon{color:var(--color-purple)}@media (max-width:768px){.external-icon{font-size:10px;margin-left:2px}}.notification-bar{background:var(--primary-gradient);color:var(--color-white);padding:0px 0;text-align:center;position:relative;z-index:10002;transition:transform .3s ease,opacity .3s ease}.notification-bar.hidden{transform:translateY(-100%);opacity:0}.notification-bar .container{display:flex;justify-content:center;align-items:center;padding:0}.notification-bar p{margin:0;font-weight:500;font-size:10px;letter-spacing:.3px}.notification-cta{font-weight:700;margin-left:5px;text-decoration:underline;cursor:pointer}body.has-notification .header{top:45px!important;}body.has-notification .hero{padding-top:220px}@media (max-width:768px){.notification-bar p{font-size:.5rem}body.has-notification .hero{padding-top:150px}}@media (max-width:480px){.notification-bar{padding:0px 0}.notification-cta{display:inline}}.video-play-button{cursor:pointer;pointer-events:auto!important}.video-paused .video-overlay{opacity:1;pointer-events:auto}.video-paused .video-play-button{opacity:1;transform:scale(1)}.video-overlay.hover-overlay{opacity:0;transition:opacity .3s ease;background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,0.5))}.hero-video:not(.video-paused):hover .video-overlay.hover-overlay{opacity:1}.video-pause-button{width:80px;height:80px;background:linear-gradient(300deg,#E4A644 0%,#C14ADC 100%);border-radius:50%;display:flex;justify-content:center;align-items:center;cursor:pointer;box-shadow:0 10px 20px rgba(0,0,0,0.2);transform:scale(.8);transition:transform .3s ease,opacity .3s ease;opacity:0}.hero-video:not(.video-paused):hover .video-pause-button{opacity:1;transform:scale(1)}.video-pause-button i{color:white;font-size:30px}.hero-video{position:relative;z-index:1}.video-overlay{z-index:5}#background-video{pointer-events:none}.hero-badges{display:flex;flex-wrap:wrap;gap:1.2rem;margin-bottom:2.4rem}.hero-badge{font-size:10px!important;padding:.8rem 1.6rem;background:white;border-radius:100px;font-size:1.4rem;font-weight:600;
211box-shadow:var(--box-shadow-sm);color:var(--color-black);position:relative;overflow:hidden}@media (max-width:1024px){.hero-badges{justify-content:center}}@media (max-width:768px){.hero-badges{gap:.8rem;margin-bottom:1.8rem;justify-content:center}.hero-badge{padding:.6rem 1.2rem;font-size:1.2rem}}@media (max-width:576px){.hero-badges{gap:.6rem;margin-bottom:1.5rem}}@media (max-width:375px){.hero-badge{padding:.5rem 1rem;font-size:1.1rem}.hero-badge::before{width:3px}}.hero{padding:140px 0 80px!important}body.has-notification .hero{padding-top:160px!important}.hero-container{padding:0 20px}@media (max-width:768px){.hero-badges{display:flex;flex-wrap:wrap;justify-content:center;gap:.4rem;margin-bottom:1.5rem;width:100%;overflow-x:auto;max-width:100%;padding-bottom:5px;-webkit-overflow-scrolling:touch;scrollbar-width:none;padding-right:15px!important;margin-left:15px!important}.hero-badges::-webkit-scrollbar{display:none}.hero-badge{padding:.3rem .7rem;font-size:.85rem!important;white-space:nowrap;flex:0 0 auto;transform:scale(.95)}.hero-badge i{margin-right:4px!important}.hero{padding-top:130px!important}body.has-notification .hero{padding-top:150px!important}}@media (max-width:480px){.hero-badge{padding:.25rem .5rem;font-size:.6rem!important;transform:scale(.9)}.hero{padding-top:110px!important}body.has-notification .hero{padding-top:130px!important}.hero-badge i{font-size:.75rem;margin-right:3px!important}.hero-badges{gap:.3rem}}.trust-badges{display:flex;justify-content:center;align-items:center;gap:3rem;flex-wrap:wrap;margin-top:3rem}.trust-badge{display:flex;align-items:center;gap:.3rem;color:gray;font-size:1.2rem}.trust-badge i{font-size:2rem;color:var(--color-gold)}@media (max-width:768px){.trust-badges{gap:0;margin-top:2rem}.trust-badge{display:flex;align-items:center;color:gray;font-size:.7rem;padding:10px}}.categories-section{padding:80px 0;background-color:var(--color-light-gray)}.categories-header{text-align:center;margin-bottom:50px}.categories-header h2{font-size:2.5rem;margin-bottom:15px;background:var(--primary-gradient);-webkit-background-clip:text;-webkit-text-fill-color:transparent}.categories-header p{font-size:1.2rem;color:var(--color-dark-gray);max-width:700px;margin:0 auto}.categories-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:30px;max-width:1200px;margin:0 auto}.category-card{background-color:white;border-radius:12px;overflow:hidden;box-shadow:0 10px 20px rgba(0,0,0,0.08);transition:transform .3s ease,box-shadow .3s ease}.category-card:hover{transform:translateY(-10px);box-shadow:0 15px 30px rgba(0,0,0,0.12)}.category-image-container{position:relative;overflow:hidden;height:250px}.category-image{width:100%;height:100%;object-fit:cover;transition:transform .5s ease}.category-card:hover .category-image{transform:scale(1.05)}.category-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.4);display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .3s ease}.category-card:hover .category-overlay{opacity:1}.category-link{display:inline-block;padding:10px 25px;background:var(--primary-gradient);color:white;border-radius:30px;font-weight:500;text-decoration:none;transform:translateY(20px);transition:transform .3s ease}.category-card:hover .category-link{transform:translateY(0)}.category-info{padding:25px}.category-name{font-size:1.4rem;margin-bottom:10px;color:var(--color-black)}.category-desc{color:var(--color-dark-gray);font-size:.95rem;line-height:1.6}.faq-section{background-color:white;padding:100px 0}.accordion{max-width:800px;margin:0 auto}.accordion-item{margin-bottom:20px;border-radius:10px;overflow:hidden;box-shadow:0 5px 15px rgba(0,0,0,0.05);transition:all .3s ease}.accordion-item:hover{box-shadow:0 10px 30px rgba(0,0,0,0.1)}.accordion-header{background-color:white;padding:20px;cursor:pointer;display:flex;justify-content:space-between;align-items:center}.accordion-header h3{font-size:1.2rem;margin:0;transition:color .3s ease}.accordion-icon{transition:transform .3s ease}.accordion-item.active .accordion-icon{transform:rotate(180deg)}.accordion-item.active .accordion-header h3{color:var(--color-purple)}.accordion-body{max-height:0;overflow:hidden;transition:max-height .5s ease;background-color:white}.accordion-item.active .accordion-body{max-height:500px}.accordion-content{padding:0 20px 20px;color:var(--color-dark-gray);line-height:1.6}.accordion-content a{color:var(--color-purple);text-decoration:underline}@media (max-width:1024px){.categories-grid{grid-template-columns:repeat(2,1fr);gap:25px}}@media (max-width:768px){.categories-section{padding:60px 0}.categories-header h2{font-size:2rem}.categories-header p{font-size:1rem}
211.category-image-container{height:220px}.category-name{font-size:1.2rem}}@media (max-width:576px){.categories-grid{grid-template-columns:1fr;max-width:400px}.category-image-container{height:200px}.categories-header h2{font-size:1.8rem}.category-info{padding:20px}}.faq-section{display:block!important;background-color:white;padding:80px 0}.accordion{max-width:800px;margin:0 auto}.accordion-item{margin-bottom:20px;border-radius:10px;overflow:hidden;box-shadow:0 5px 15px rgba(0,0,0,0.05);transition:all .3s ease;display:block!important}.accordion-header{background-color:white;padding:20px;cursor:pointer;display:flex;justify-content:space-between;align-items:center}.accordion-body{max-height:0;overflow:hidden;transition:max-height .5s ease;background-color:white}.accordion-item.active .accordion-body{max-height:500px}.accordion-content{padding:0 20px 20px;color:var(--color-dark-gray);line-height:1.6}.accordion-icon i{transition:transform .3s ease}.accordion-item.active .accordion-icon i{transform:rotate(180deg)}.faq-section{display:block!important;visibility:visible!important;opacity:1!important;height:auto!important}.accordion{display:block!important;max-width:800px!important;margin:0 auto!important;visibility:visible!important;opacity:1!important}.accordion-item{display:block!important;margin-bottom:20px!important;border-radius:10px!important;overflow:hidden!important;box-shadow:0 5px 15px rgba(0,0,0,0.05)!important;transition:all .3s ease!important;visibility:visible!important;opacity:1!important;background-color:white!important}.accordion-header{background-color:white!important;padding:20px!important;cursor:pointer!important;display:flex!important;justify-content:space-between!important;align-items:center!important}.accordion-body{max-height:0!important;overflow:hidden!important;transition:max-height .5s ease!important;background-color:white!important}.accordion-item.active .accordion-body{max-height:800px!important}.accordion-content{padding:20px!important;color:#666!important;line-height:1.6!important}.accordion-icon i{transition:transform .3s ease!important}.accordion-item.active .accordion-icon i{transform:rotate(180deg)!important}.accordion-header h3{margin:0!important;font-size:1.2rem!important;color:#000!important}.accordion-item.active .accordion-header h3{color:#C14ADC!important} 212 /* Blog Section Styles */ 213.blog-section { 214 background-color: white; 215 padding: 80px 0; 216 position: relative; 217} 218 219.blog-subtitle { 220 text-align: center; 221 color: var(--color-dark-gray); 222 margin-bottom: 50px; 223 font-size: 1.2rem; 224 max-width: 800px; 225 margin-left: auto; 226 margin-right: auto; 227} 228 229.blog-grid { 230 display: grid; 231 grid-template-columns: repeat(3, 1fr); 232 gap: 30px; 233 margin-bottom: 50px; 234} 235 236.blog-card { 237 background-color: white; 238 border-radius: 15px; 239 overflow: hidden; 240 box-shadow: 0 10px 25px rgba(0,0,0,0.08); 241 transition: all 0.3s ease; 242 height: 100%; 243 display: flex; 244 flex-direction: column; 245} 246 247.blog-card:hover { 248 transform: translateY(-10px); 249 box-shadow: 0 15px 35px rgba(0,0,0,0.12); 250} 251 252.blog-image-container { 253 position: relative; 254 overflow: hidden; 255} 256 257.blog-image { 258 width: 100%; 259 height: 220px; 260 object-fit: cover; 261 transition: transform 0.5s ease; 262} 263 264.blog-card:hover .blog-image { 265 transform: scale(1.05); 266} 267 268.blog-date { 269 position: absolute; 270 top: 15px; 271 right: 15px; 272 background: var(--primary-gradient); 273 color: white; 274 padding: 10px; 275 border-radius: 8px; 276 text-align: center; 277 line-height: 1.1; 278 font-weight: 600; 279 display: flex; 280 flex-direction: column; 281 min-width: 60px; 282} 283 284.date-day { 285 font-size: 1.2rem; 286} 287 288.date-month { 289 font-size: 0.9rem; 290 text-transform: uppercase; 291} 292 293.blog-content { 294 padding: 25px; 295 display: flex; 296 flex-direction: column; 297 flex-grow: 1; 298} 299 300.blog-title { 301 font-size: 1.3rem; 302 margin-bottom: 15px; 303 line-height: 1.4; 304 color: var(--color-black); 305} 306 307.blog-excerpt { 308 color: var(--color-dark-gray); 309 font-size: 0.95rem; 310 line-height: 1.7; 311 margin-bottom: 20px; 312 flex-grow: 1; 313} 314 315.blog-meta { 316 display: flex; 317 justify-content: space-between; 318 color: var(--color-dark-gray); 319 font-size: 0.85rem; 320 margin-bottom: 15px; 321} 322 323.blog-category i, 324.blog-read-time i { 325 margin-right: 5px; 326 color: var(--color-purple); 327} 328 329.blog-read-more {
330 align-self: flex-start; 331 color: var(--color-purple); 332 font-weight: 500; 333 display: inline-flex; 334 align-items: center; 335 transition: all 0.3s ease; 336 text-decoration: none; 337 position: relative; 338 padding-bottom: 3px; 339} 340 341.blog-read-more::after { 342 content: ''; 343 position: absolute; 344 width: 0; 345 height: 2px; 346 bottom: 0; 347 left: 0; 348 background: var(--primary-gradient); 349 transition: width 0.3s ease; 350} 351 352.blog-read-more:hover::after { 353 width: 100%; 354} 355 356.blog-read-more i { 357 margin-left: 8px; 358 transition: transform 0.3s ease; 359} 360 361.blog-read-more:hover i { 362 transform: translateX(5px); 363} 364 365.blog-cta-container { 366 text-align: center; 367 margin-top: 40px; 368} 369 370.blog-view-all { 371 display: inline-block; 372 padding: 12px 30px; 373 background: var(--primary-gradient); 374 color: white; 375 font-weight: 500; 376 border-radius: 8px; 377 text-decoration: none; 378 transition: all 0.3s ease; 379 box-shadow: 0 8px 20px rgba(0,0,0,0.1); 380} 381 382.blog-view-all:hover { 383 transform: translateY(-5px); 384 box-shadow: 0 12px 25px rgba(0,0,0,0.15); 385} 386 387.blog-view-all i { 388 margin-left: 8px; 389 transition: transform 0.3s ease; 390} 391 392.blog-view-all:hover i { 393 transform: translateX(5px); 394} 395 396/* Media Queries */ 397@media (max-width: 1024px) { 398 .blog-grid { 399 grid-template-columns: repeat(2, 1fr); 400 } 401} 402 403@media (max-width: 768px) { 404 .blog-section { 405 padding: 60px 0; 406 } 407 408 .blog-grid { 409 grid-template-columns: 1fr; 410 gap: 25px; 411 } 412 413 .blog-image { 414 height: 200px; 415 } 416} 417 418@media (max-width: 576px) { 419 .blog-section { 420 padding: 40px 0; 421 } 422 423 .blog-subtitle { 424 font-size: 1rem; 425 margin-bottom: 30px; 426 } 427 428 .blog-content { 429 padding: 20px; 430 } 431 432 .blog-title { 433 font-size: 1.2rem; 434 } 435 436 .blog-date { 437 top: 10px; 438 right: 10px; 439 padding: 8px; 440 min-width: 50px; 441 } 442 443 .date-day { 444 font-size: 1rem; 445 } 446 447 .date-month { 448 font-size: 0.8rem; 449 } 450} 451 452/* Adjust testimonial logo size for mobile devices */ 453@media (max-width: 768px) { 454 .author-image-container { 455 width: 120px; /* Smaller width for mobile (from 180px) */ 456 height: 120px; /* Smaller height for mobile */ 457 margin-bottom: 10px; /* Slightly reduced margin */ 458 } 459} 460 461/* For very small screens, make it even smaller */ 462@media (max-width: 480px) { 463 .author-image-container { 464 width: 90px; /* Even smaller for very small screens */ 465 height: 90px; 466 } 467} 468 469.category-arrow { 470 position: absolute; 471 bottom: 15px; 472 right: 15px; 473 background: linear-gradient(300deg, #E4A644 0%, #C14ADC 100%); 474 color: white; 475 width: 40px; 476 height: 40px; 477 border-radius: 50%; 478 display: flex; 479 align-items: center; 480 justify-content: center; 481 box-shadow: 0 5px 15px rgba(0,0,0,0.1); 482 transition: transform 0.3s ease, box-shadow 0.3s ease; 483 z-index: 10; 484} 485 486.category-arrow:hover { 487 transform: translateY(-5px) scale(1.05); 488 box-shadow: 0 10px 20px rgba(0,0,0,0.15); 489} 490 491.category-info { 492 position: relative; 493 padding-bottom: 30px; 494} 495 496/* Catalog Notification */ 497.catalog-notification { 498 position: fixed; 499 bottom: 30px; 500 left: 50%; 501 transform: translateX(-50%); 502 background: var(--primary-gradient); 503 color: white; 504 padding: 15px 30px; 505 border-radius: 8px; 506 box-shadow: 0 5px 15px rgba(0,0,0,0.2); 507 z-index: 9999; 508 text-align: center; 509 font-weight: 500; 510 animation: slideUp 0.3s ease forwards; 511 512} 513 514@keyframes slideUp { 515 from { 516 opacity: 0; 517 transform: translate(-50%, 20px); 518 } 519 to { 520 opacity: 1; 521 transform: translate(-50%, 0); 522 } 523} 524 525.catalog-notification.fade-out { 526 animation: fadeOut 0.5s ease forwards; 527} 528 529@keyframes fadeOut { 530 from { 531 opacity: 1; 532 transform: translate(-50%, 0); 533 } 534 to { 535 opacity: 0; 536 transform: translate(-50%, -20px); 537 } 538} 539 540/* Categories Section Styles */ 541.categories-section { 542 padding: 80px 0; 543 background-color: var(--color-light-gray); 544} 545 546.categories-header { 547 text-align: center; 548 margin-bottom: 50px; 549} 550 551.categories-header h2 { 552 font-size: 2.5rem; 553 margin-bottom: 15px; 554 background: var(--primary-gradient); 555 -webkit-background-clip: text; 556 -webkit-text-fill-color: transparent; 557} 558 559.categories-header p { 560 font-size: 1.2rem; 561 color: var(--color-dark-gray); 562 max-width: 700px; 563 margin: 0 auto; 564} 565 566.categories-grid { 567 display: grid; 568 grid-template-columns: repeat(3, 1fr); 569 gap: 30px; 570 max-width: 1200px; 571 margin: 0 auto; 572} 573 574.category-card { 575 background-color: white; 576 border-radius: 12px; 577 overflow: hidden; 578 box-shadow: 0 10px 20px rgba(0,0,0,0.08); 579 transition: transform 0.3s ease, box-shadow 0.3s ease; 580} 581 582.category-card:hover { 583 transform: translateY(-10px); 584 box-shadow: 0 15px 30px rgba(0,0,0,0.12); 585} 586 587.category-image-container { 588 position: relative; 589 overflow: hidden; 590 height: 250px; 591} 592 593.category-image { 594 width: 100%; 595 height: 100%; 596 object-fit: cover; 597 transition: transform 0.5s ease; 598} 599 600.category-card:hover .category-image { 601 transform: scale(1.05); 602} 603 604.category-overlay { 605 position: absolute; 606 top: 0; 607 left: 0; 608 right: 0; 609 bottom: 0; 610 background: rgba(0,0,0,0.4); 611 display: flex; 612 align-items: center; 613 justify-content: center; 614 opacity: 0; 615 transition: opacity 0.3s ease; 616} 617 618.category-card:hover .category-overlay { 619 opacity: 1; 620} 621 622.category-link { 623 display: inline-block; 624 padding: 10px 25px; 625 background: var(--primary-gradient); 626 color: white; 627 border-radius: 30px; 628 font-weight: 500; 629 text-decoration: none; 630 transform: translateY(20px); 631 transition: transform 0.3s ease; 632} 633 634.category-card:hover .category-link { 635 transform: translateY(0); 636} 637 638.category-info { 639 padding: 25px; 640} 641 642.category-name { 643 font-size: 1.4rem; 644 margin-bottom: 10px; 645 color: var(--color-black); 646} 647 648.category-desc { 649 color: var(--color-dark-gray); 650 font-size: 0.95rem; 651 line-height: 1.6; 652} 653 654/* Responsive Adjustments */ 655@media (max-width: 1024px) { 656 .categories-grid { 657 grid-template-columns: repeat(2, 1fr); 658 gap: 25px; 659 } 660} 661 662@media (max-width: 768px) { 663 .categories-section { 664 padding: 60px 0; 665 } 666 667 .categories-header h2 { 668 font-size: 2rem; 669 } 670 671 .categories-header p { 672 font-size: 1rem; 673 } 674 675 .category-image-container { 676 height: 220px; 677 } 678 679 .category-name { 680 font-size: 1.2rem; 681 } 682} 683 684@media (max-width: 576px) { 685 .categories-grid { 686 grid-template-columns: 1fr; 687 max-width: 400px; 688 } 689 690 .category-image-container { 691 height: 200px; 692 } 693 694 .categories-header h2 { 695 font-size: 1.8rem; 696 } 697 698 .category-info { 699 padding: 20px; 700 } 701} 702 703.sr-only { 704 position: absolute; 705 width: 1px; 706 height: 1px; 707 padding: 0; 708 margin: -1px; 709 overflow: hidden; 710 clip: rect(0, 0, 0, 0); 711 white-space: nowrap; 712 border-width: 0; 713} 714 715 716 717 718 719/* Estilos para a nova estrutura de lista de navegação */ 720 721/* 1. Reset básico da lista e configuração flex para o novo <ul> */ 722.nav-menu .nav-list { 723 display: flex; 724 align-items: center; 725 gap: 30px; /* Mantém o espaçamento original entre os links */ 726 list-style: none; 727 margin: 0; 728 padding: 0; 729} 730 731/* 2. Ocultar o container dos botões apenas para móvel na versão desktop */ 732.mobile-only-cta-container { 733} 734 735/* 3. Ajustes para a visualização móvel */ 736@media (max-width: 1024px) { 737 /* Torna o <ul> um container flex vertical */ 738 .nav-menu .nav-list { 739 flex-direction: column; 740 width: 100%; 741 align-items: center; /* Centraliza os itens como no design original */ 742 gap: 40px; /* Mantém o espaçamento móvel original */ 743 } 744 745 /* Garante que os itens da lista ocupem toda a largura */ 746 .nav-menu .nav-list .nav-item { 747 width: 100%; 748 } 749 750 /* Exibe o container dos botões apenas para móvel */ 751 .mobile-only-cta-container { 752 display: block; 753 width: 100%; 754 } 755} 756 </style> 757 758 <meta name="msvalidate.01" content="72E555E85FFCC10015D252685F65AFE1" /> 759 760</head> 761<body> 762 <!-- Header --> 763 <!-- Header --> 764<!-- Updated Header Structure --> 765<div class="notification-bar" id="notification-bar"> 766 <div class="container"> 767 <a href='https://www.portugaltextile.com/launchlab'> 768 <p>Meet Launch Lab: A low-risk approach for your brand <span class="notification-cta">Click to learn more!<i style="color: white;" class="fas fa-external-link-alt external-icon"></i></span></p> 769 </a> 770 </div> 771</div> 772 773<!-- Google Tag Manager (noscript) -->
vendor: 68 bytes, lines 773-774
773 774<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
774GTM-NWRT6VNV
vendor: 83 bytes, lines 774-775
774" 775height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
776<!-- End Google Tag Manager (noscript) --> 777 778<!-- Completely separate the brand nav from the notification bar --> 779<div class="brand-nav" style="position: relative; z-index: 10003;"> 780 <a target="_blank" href="https://www.portugalshoes.com/" class="other-site" onclick="event.stopPropagation();"> 781 <div class="logo-container"> 782 <img loading="lazy" class="brand-logo" src="https://portugalshoes.com/assets/imgs/logoshoes.png" alt="Portugal Textile Logo"> 783 <i class="fas fa-external-link-alt external-icon"></i> 784 </div> 785 </a> 786 <span class="brand-divider">|</span> 787 <a target="_blank" href="https://www.absolutarget.com/" class="other-site" onclick="event.stopPropagation();"> 788 <div class="logo-container"> 789 <img loading="lazy" class="brand-logo absologo" src="https://portugalshoes.com/assets/imgs/absologo.png" alt="Absolutarget Logo"> 790 <i class="fas fa-external-link-alt external-icon"></i> 791 </div> 792 </a> 793</div> 794<header class="header"> 795 <div class="container header-container"> 796 <div class="header-left"> 797 <!-- Mobile only: Hamburger menu on the left --> 798 <button id="mobileToggle" class="mobile-toggle" aria-label="Toggle menu"> 799 <i class="fas fa-bars"></i> 800 </button> 801 802 <!-- Logo --> 803 <a href="/" class="logo"> 804 <img loading="lazy" src="https://portugaltextile.com/wp-content/uploads/2023/05/cropped-slogan_update-1-ai4.png" alt="Portugal Textile Logo"> 805 </a> 806 </div> 807 808 <!-- Navigation menu --> 809 <!-- Updated Navigation Menu Structure --> 810<nav class="nav-menu" id="navMenu"> 811 <ul class="nav-list" role="menubar" aria-label="Main Navigation"> 812 <li class="nav-item" role="none"><a href="./about/index.html" class="nav-link" role="menuitem">About</a></li> 813 <li class="nav-item" role="none"><a href="./services/index.html" class="nav-link" role="menuitem">Services</a></li> 814 <li class="nav-item" role="none"><a href="./portfolio/index.html" class="nav-link" role="menuitem">Portfolio</a></li> 815 <li class="nav-item" role="none"><a href="https://www.portugaltextile.com/influencers/" class="nav-link" role="menuitem">Influencers</a></li> 816 <li class="nav-item" role="none"><a href="./sustainability/index.html" class="nav-link" role="menuitem">Sustainability</a></li> 817 <li class="nav-item" role="none"><a href="./certifications/index.html" class="nav-link" role="menuitem">Certifications</a></li> 818 819 <li class="nav-item mobile-only-cta-container"> 820 <div style="display: flex; justify-content: center; align-items: center; flex-direction: column; gap: 20px; width: 100%;"> 821 <a style="width: 100%; max-width: 100%;" href="https://www.portugaltextile.com/create-your-collection" class="btn btn-primary mobile-menu-cta">Create My Collection</a> 822 <a style="width: 100%; max-width: 100%;" href="./services/index.html" class="btn btn-secondary mobile-menu-cta2">Explore Our Process</a> 823 </div> 824 </li> 825 </ul> 826 827 <div class="mobile-menu-header"> 828 <img loading='lazy' src="https://portugalshoes.com/assets/imgs/logoshoes.png" alt="Portugal Shoes Logo" class="mobile-menu-logo"> 829 </div> 830</nav> 831 832 <div class="header-right"> 833 <!-- CTA Button - Always visible and on the right --> 834 <a href="https://www.portugaltextile.com/create-your-collection" class="btn btn-primary header-cta">Create My Collection</a> 835 </div> 836 </div> 837 <!-- Progress bar --> 838 <div class="scroll-progress-container"> 839 <div class="scroll-progress-bar"></div> 840 </div> 841</header> 842 843 <!-- Hero Section - ADJUSTED FOR MOBILE --> 844 <section class="hero"> 845 <div class="container hero-container"> 846 <div> 847 <div class="hero-badges"> 848 <div class="hero-badge"><i class="fas fa-check-circle" style="color: var(--color-purple); margin-right: 8px;"></i>Apparel Manufacturer</div> 849 <div class="hero-badge"><i class="fas fa-check-circle" style="color: var(--color-purple); margin-right: 8px;"></i>Sustainable Clothes</div> 850 851 </div> 852 <div style="margin-bottom:80px;" class="hero-content"> 853 <h1 class="hero-title">Clothing manufacturer group from Portugal </h1> 854 <h2 class="hero-subtitle">We develop sustainable clothing </h2> 855 <p class="hero-text">Sustainable clothing development and manufacturing for fashion brands & influencers </p> 856 <div class="hero-cta"> 857 <a href="https://www.portugaltextile.com/create-your-collection" class="btn btn-primary">Create My Collection</a> 858 <a href="./services/index.html" class="btn btn-secondary">Explore Our Process</a> 859 </div> 860 861 </div> 862 </div> 863 <div class="hero-video" id="heroVideo"> 864 <video fetchpriority='high' preload="none" id="background-video" poster="https://portugaltextile.com//wp-content/uploads/2023/01/videothumbnail.png" playsinline loop autoplay muted> 865 <source src="https://portugaltextile.com/fianl-textile-site.webm" type="video/webm"> 866 </video> 867 868 <!-- Play button overlay - shown when video is paused --> 869 <div class="video-overlay"> 870 <div class="video-play-button"> 871 <i class="fas fa-play"></i> 872 </div> 873 </div> 874 875 <!-- Pause button overlay - shown on hover when video is playing --> 876 <div class="video-overlay hover-overlay"> 877 <div class="video-pause-button"> 878 <i class="fas fa-pause"></i> 879 </div> 880 </div> 881 882 <div class="video-progress"> 883 <div id="progress-filled" class="video-progress-filled"></div> 884 </div> 885</div> 886 </div> 887 </section> 888 889 <!-- Clients Section - UPDATED with AUTO-SCROLLING and COMPANY NAMES --> 890 <section class="clients"> 891 <div class="container"> 892 <h2 class="clients-title">Some of our clients:</h2> 893 <div class="clients-autoscroll-container"> 894 <div class="clients-autoscroll"> 895 <!-- First set of logos --> 896 <div class="client-logo"> 897 <img loading="lazy" src="https://portugaltextile.com/wp-content/uploads/2023/09/310234733_490573683082919_4878952062882500090_n.png" alt="Client 1"> 898 </div> 899 <div class="client-logo"> 900 <img loading="lazy" src="https://portugaltextile.com/test-static/assets/imgs/malina%20logo.webp" alt="Client 2"> 901 </div> 902 <div class="client-logo"> 903 <img loading="lazy" src="https://portugalshoes.com/wp-content/uploads/elementor/thumbs/image-4-qkke1d98wlrhb7dv0uo720rgbe7nkpluhs9cu4fobs.png" alt="Client 3"> 904 </div> 905
906 <!-- Duplicated logos for continuous scrolling --> 907 <div class="client-logo"> 908 <img loading="lazy" src="https://portugaltextile.com/wp-content/uploads/2023/09/310234733_490573683082919_4878952062882500090_n.png" alt="Client 1"> 909 </div> 910 <div class="client-logo"> 911 <img loading="lazy" src="https://portugaltextile.com/test-static/assets/imgs/malina%20logo.webp" alt="Client 2"> 912 </div> 913 <div class="client-logo"> 914 <img loading='lazy' src="https://portugalshoes.com/wp-content/uploads/elementor/thumbs/image-4-qkke1d98wlrhb7dv0uo720rgbe7nkpluhs9cu4fobs.png" alt="Client 3"> 915 </div> 916 </div> 917 </div> 918 </div> 919 </section> 920 921 <!-- Process Section - FIXED VISIBILITY --> 922 <section class="process" id="process"> 923 <div class="container"> 924 <h2 class="process-title">Step by Step</h2> 925 <p class="process-subtitle">Do it sustainable and easily with Portugal Textile </p> 926 <div class="process-grid"> 927 <div class="process-card"> 928 <div class="process-number">1</div> 929 <h3 class="process-card-title">You request...</h3> 930 <p class="process-card-text">You send us your request for the project and share your technical sheets or products as a reference for what you want to develop for your clothing collection. </p> 931 </div> 932 <div class="process-card"> 933 <div class="process-number">2</div> 934 <h3 class="process-card-title">We analyze...</h3> 935 <p class="process-card-text">Our commercial department will analyze your project and get back to you as soon as possible. </p> 936 </div> 937 <div class="process-card"> 938 <div class="process-number">3</div> 939 <h3 class="process-card-title">Let's go!</h3> 940 <p class="process-card-text">When we are all in the same page is time to start working together on your textile collection! </p> 941 </div> 942 </div> 943 </div> 944 </section> 945<!-- 946 Static slider solution - no JavaScript required 947 Copy this entire block into your HTML where the slider should appear 948--> 949 950 <!-- About Section - FIXED VISIBILITY --> 951 <section class="about" id="about"> 952 <div class="container about-container"> 953 <div class="about-content"> 954 <h2>Our approach</h2> 955 <h3>Portugal based textile manufacturer group founded in 2007 </h3> 956 <p>During our years working in the textile industry, at Portugal Textile, our team acquired a huge know-how of the market, as well as a large network of manufacturers in Portugal. 957 958 </p> 959 <p>Working in this industry since 2007 and helping international fashion brands placing their clothing productions at the right factories in Portugal, Paulo Silva, the founder identified a lack in the fashion market. So, in 2007 he created Portugal Textile, a sustainable clothing development and manufacturer group that helps influencers & fashion brands producing in Portugal. 960 961 </p> 962 <a href="./about/index.html" class="about-btn">Tell me more</a> 963 </div> 964 <img loading="lazy" src="https://portugaltextile.com/wp-content/uploads/elementor/thumbs/IMG_8631-scaled-qww8zcjkecms10g9ai2bapnjz97zwffxxozf0gc3n4.webp" alt="Portugal Shoes Team" class="about-image"> 965 </div> 966 </section> 967 968 <!-- Benefits Section - FIXED VISIBILITY --> 969 <section class="benefits" id="benefits"> 970 <div class="container"> 971 <h2 class="section-title">Why Choose Us</h2> 972 <p class="benefits-subtitle">Discover some of the strengths of working with us</p> 973 <div class="benefits-grid"> 974 <div class="benefit-card"> 975 <div class="benefit-header"> 976 <div class="benefit-icon"> 977 <img loading="lazy" src="https://portugalshoes.com/wp-content/uploads/2022/11/handshake_FILL0_wght400_GRAD0_opsz48.svg" alt="Handshake Icon"> 978 </div> 979 <h3 class="benefit-title">Reliable partner</h3> 980 </div> 981 <p class="benefit-text">We are committed to build trustworthy business relationships with all the stakeholders, while we provide the best customer experience possible to our clients.</p> 982 </div> 983 <div class="benefit-card"> 984 <div class="benefit-header"> 985 <div class="benefit-icon"> 986 <img loading="lazy" src="https://portugalshoes.com/wp-content/uploads/2022/12/favorite_FILL0_wght700_GRAD-25_opsz48.svg" alt="Made in Portugal Icon"> 987 </div> 988 <h3 class="benefit-title">Made in Portugal</h3> 989 </div> 990 <p class="benefit-text">The "made in Portugal" label has achieved an international reputation and notoriety that currently places the clothing industry among the best performing manufacturing industries in the world. In terms of fair production and ethical practices Portugal is a leader.</p> 991 </div> 992 <div class="benefit-card"> 993 <div class="benefit-header"> 994 <div class="benefit-icon"> 995 <img loading="lazy" src="./assets/imgs/white-molecule-file.svg" alt="Contact Icon"> 996 </div> 997 <h3 class="benefit-title">One point of contact</h3> 998 </div> 999 <p class="benefit-text">You can forget all the struggles of being in touch with many people and services during the process. Our team is going to be your one and only point of contact. Each step of product development process benefits from a close follow up, so that everything is in place and runs smoothly.</p> 1000 </div> 1001 <div class="benefit-card"> 1002 <div class="benefit-header"> 1003 <div class="benefit-icon"> 1004 <img loading="lazy" src="https://portugalshoes.com/wp-content/uploads/2022/11/eco_FILL0_wght400_GRAD0_opsz48.svg" alt="Sustainability Icon"> 1005 </div> 1006 <h3 class="benefit-title">Sustainable oriented process</h3> 1007 </div> 1008 <p class="benefit-text">Our innovative service provides a sustainable solution that has in mind all the supply chain. We work with more than 20 factories. Our team will select the right manufacturer according to your needs, having in mind meeting your deadlines and quality standards.</p> 1009 </div> 1010 </div><br><br> 1011 <a style="width: fit-content;" href="https://www.portugaltextile.com/create-your-collection" class="btn btn-primary mobile-menu-cta">Create My Collection</a> 1012 1013 </div> 1014 1015 1016 1017 1018 </section> 1019 <section class="materials" id="sustainability"> 1020 <div class="container"> 1021 <h2 class="materials-title">Develop your clothing collection with sustainable materials </h2> 1022 <p class="materials-subtitle">See the innovative options:</p> 1023 <div class="materials-grid"> 1024 <div class="material-card"> 1025 <img loading="lazy" src="https://portugaltextile.com/wp-content/uploads/elementor/thumbs/IMG_8175-1-scaled-qrom0ph4bltrbmocxdc9bu5is9d5ouo07l2nzyruzk.webp" alt="Recycled Tire" class="material-image"> 1026 <div class="material-content"> 1027 <h3 class="material-name">Organic Cotton</h3> 1028 <p class="material-description">Innovative material made from recycled tires, creating durable and eco-friendly soles for your footwear.</p> 1029 </div> 1030 </div> 1031 <div class="material-card"> 1032 <img loading="lazy" src="https://portugalshoes.com/wp-content/uploads/elementor/thumbs/recycled-pet-plastic-scaled-qotpgnct1c
1032hfbpevd0t0wsk4yju45ilics3k9qzrfk.jpg" alt="Pet Plastic" class="material-image"> 1033 <div class="material-content"> 1034 <h3 class="material-name">PET Plastic</h3> 1035 <p class="material-description">Sustainable materials created from recycled plastic bottles, reducing waste while providing quality footwear components.</p> 1036 </div> 1037 </div> 1038 <div class="material-card"> 1039 <img loading="lazy" src="https://portugalshoes.com/wp-content/uploads/elementor/thumbs/wouter-supardi-salari-HE_MjmWh9eQ-unsplash-q0i3a22yccrguxoj3l6barjeuvnctdup18tf4i6bvk.jpg" alt="Corn" class="material-image"> 1040 <div class="material-content"> 1041 <h3 class="material-name">Corn</h3> 1042 <p class="material-description">Plant-based material derived from corn, offering a renewable and biodegradable alternative for sustainable footwear.</p> 1043 </div> 1044 </div> 1045 <div class="material-card"> 1046 <img loading="lazy" src="https://portugalshoes.com/wp-content/uploads/elementor/thumbs/Novo-Projeto46-q0quca7k2hexvkgrgtsp13dkwp9f2ipas1t4tay080.png" alt="Cork" class="material-image"> 1047 <div class="material-content"> 1048 <h3 class="material-name">Cork</h3> 1049 <p class="material-description">Natural cork harvested sustainably from Portuguese cork oak trees, creating comfortable and eco-friendly footwear components.</p> 1050 </div> 1051 </div> 1052 <div class="material-card"> 1053 <img loading="lazy" src="https://portugalshoes.com/wp-content/uploads/elementor/thumbs/adrienne-leonard-KUFKZ1EXh6c-unsplash1-scaled-qotpggrxpi8f2fofffymxc7wsuqjnmvdzvj5wt9in4.jpg" alt="Cactus Leather" class="material-image"> 1054 <div class="material-content"> 1055 <h3 class="material-name">Cactus Leather</h3> 1056 <p class="material-description">Innovative vegan leather alternative made from cactus plants, offering a sustainable and cruelty-free option.</p> 1057 </div> 1058 </div> 1059 <div class="material-card"> 1060 <img loading="lazy" src="https://portugalshoes.com/wp-content/uploads/elementor/thumbs/matheus-cenali-wXuzS9xR49M-unsplash-q0i3h7mqcyk183afboi39yjpmgdxeg95cnkgmbkgio.jpg" alt="Apple Leather" class="material-image"> 1061 <div class="material-content"> 1062 <h3 class="material-name">Apple Leather</h3> 1063 <p class="material-description">Eco-friendly leather alternative created from apple industry waste, providing a luxurious feel with minimal environmental impact.</p> 1064 </div> 1065 </div> 1066 </div> 1067 <div style='display:flex; justify-content:center;width:100%; align-content:center;padding:60px;'> 1068 <a href="./services/index.html" class="about-btn">Explore our services</a> 1069 </div> 1070 </div> 1071 </section> 1072 <!-- Workflow Section - FIXED VISIBILITY --> 1073 <section class="workflow" id="services"> 1074 <div class="container workflow-container"> 1075 <div class="workflow-slider"> 1076 <div class="workflow-track" id="workflowTrack"> 1077 <!-- Initial slide loaded here --> 1078 </div> 1079 <div class="workflow-arrows"> 1080 <button class="workflow-arrow prev" id="prevSlide"> 1081 <i class="fas fa-chevron-left"></i> 1082 </button> 1083 <button class="workflow-arrow next" id="nextSlide"> 1084 <i class="fas fa-chevron-right"></i> 1085 </button> 1086 </div> 1087 <div class="workflow-navigation" id="workflowDots"> 1088 <!-- Dots generated by JS --> 1089 </div> 1090 </div> 1091 <div class="workflow-content"> 1092 <h2>Our service</h2> 1093 <h3>Here are a few things we can do for you</h3> 1094 1095 <p>We provide an innovative service to fulfill all your needs during the development of your current fashion brand or among the process of building your new one.</p> 1096 <p>Our fashion business solution will help you dealing with every process easily. This will enable you to meet your deadlines, and take off the stress involved in bringing a footwear collection to life.</p> 1097 <a href="./services/index.html" class="about-btn">Explore our process</a> 1098 </div> 1099 </div> 1100 </section> 1101 1102<style> 1103 .slider-container { 1104 width: 100%; 1105 background: linear-gradient(135deg, rgba(228,166,68,0.1) 0%, rgba(193,74,220,0.1) 100%); 1106 padding: 20px 0; 1107 overflow: hidden; 1108 position: relative; 1109 font-family: 'Montserrat', sans-serif; 1110 } 1111 1112 .slider-container::before, 1113 .slider-container::after { 1114 content: ''; 1115 position: absolute; 1116 top: 0; 1117 width: 100px; 1118 height: 100%; 1119 z-index: 2; 1120 pointer-events: none; 1121 } 1122 1123 .slider-container::before { 1124 left: 0; 1125 background: linear-gradient(to right, rgba(228,166,68,0.1), transparent); 1126 } 1127 1128 .slider-container::after { 1129 right: 0; 1130 background: linear-gradient(to left, rgba(193,74,220,0.1), transparent); 1131 } 1132 1133 .keywords-slider { 1134 display: flex; 1135 white-space: nowrap; 1136 animation: marquee 25s linear infinite; 1137 } 1138 1139 @keyframes marquee { 1140 0% { transform: translateX(20%); } 1141 100% { transform: translateX(-100%); } 1142 } 1143 1144 .keyword { 1145 display: inline-block; 1146 font-size: 1rem; 1147 font-weight: 600; 1148 margin: 0 40px; 1149 color: #000000; 1150 letter-spacing: 1px; 1151 } 1152 1153 @media (max-width: 1024px) { 1154 .keyword { 1155 font-size: 1.5rem; 1156 } 1157 } 1158 1159 @media (max-width: 768px) { 1160 .keyword { 1161 font-size: 1.2rem; 1162 margin: 0 30px; 1163 } 1164 } 1165 1166 @media (max-width: 576px) { 1167 .keyword { 1168 font-size: 1rem; 1169 margin: 0 25px; 1170 } 1171 } 1172</style> 1173 1174<div class="slider-container"> 1175 <div class="keywords-slider"> 1176 <div class="keyword">Luxury Clothing Manufacturers</div> 1177 <div class="keyword">Clothes Manufacturer</div> 1178 <div class="keyword">Garment Manufacturer</div> 1179 <div class="keyword">Custom Clothing Manufacturers</div> 1180 <div class="keyword">Brand</div> 1181 <div class="keyword">Portugal Factory</div> 1182 <div class="keyword">Woven Supplier</div> 1183 <div class="keyword">Clothing Supplier</div>
1184 <!-- Duplicate keywords for continuous effect --> 1185 <div class="keyword">Luxury Clothing Manufacturers</div> 1186 <div class="keyword">Clothes Manufacturer</div> 1187 <div class="keyword">Garment Manufacturer</div> 1188 <div class="keyword">Custom Clothing Manufacturers</div> 1189 <div class="keyword">Brand</div> 1190 <div class="keyword">Portugal Factory</div> 1191 <div class="keyword">Woven Supplier</div> 1192 <div class="keyword">Clothing Supplier</div> 1193 </div> 1194</div> 1195 <!-- Materials Section - FIXED VISIBILITY --> 1196 <section class="categories-section"> 1197 <div class="container"> 1198 <div class="categories-header"> 1199 <h2 class="section-title">Clothing Categories</h2> 1200 <p>Explore our expertise across various apparel categories</p> 1201 </div> 1202 1203 <div class="categories-grid"> 1204 <!-- Category 1 --> 1205 <div class="category-card"> 1206 <div class="category-image-container"> 1207 <img loading="lazy" src="./assets/basics.webp" alt="Basics Collection" class="category-image"> 1208 </div> 1209 <div class="category-info"> 1210 <h3 class="category-name">Basics</h3> 1211 <p class="category-desc">Create versatile collections with timeless essentials such as t-shirts, hoodies, shorts, and joggers, designed for everyday style.</p> 1212 </div> 1213 </div> 1214 1215 <!-- Category 2 --> 1216 <div class="category-card"> 1217 <div class="category-image-container"> 1218 <img loading="lazy" src="./assets/activewear.webp" alt="Activewear Collection" class="category-image"> 1219 </div> 1220 <div class="category-info"> 1221 <h3 class="category-name">Activewear</h3> 1222 <p class="category-desc">Develop high-performance activewear collections using breathable, flexible fabrics that support movement and athletic performance.</p> 1223 </div> 1224 </div> 1225 1226 <!-- Category 3 --> 1227 <div class="category-card"> 1228 <div class="category-image-container"> 1229 <img loading="lazy" src="./assets/swimwear.webp" alt="Swimwear Collection" class="category-image"> 1230 </div> 1231 <div class="category-info"> 1232 <h3 class="category-name">Swimwear</h3> 1233 <p class="category-desc">Offer swimwear collections featuring bikinis, swimsuits, and shorts, crafted from durable materials to ensure both style and lasting performance in the water.</p> 1234 </div> 1235 </div> 1236 1237 <!-- Category 4 --> 1238 <div class="category-card"> 1239 <div class="category-image-container"> 1240 <img loading="lazy" src="./assets/denim.webp" alt="Denim Collection" class="category-image"> 1241 </div> 1242 <div class="category-info"> 1243 <h3 class="category-name">Denim</h3> 1244 <p class="category-desc">Build a denim collection that combines classic cuts and modern fits, offering a variety of jeans, jackets, and skirts with multiple wash options.</p> 1245 </div> 1246 </div> 1247 1248 <!-- Category 5 --> 1249 <div class="category-card"> 1250 <div class="category-image-container"> 1251 <img loading="lazy" src="./assets/loungewear.webp" alt="Loungewear Collection" class="category-image"> 1252 </div> 1253 <div class="category-info"> 1254 <h3 class="category-name">Loungewear</h3> 1255 <p class="category-desc">Design relaxed and stylish loungewear collections, including robes, pajamas, and accessories, ideal for relaxed at-home days.</p> 1256 </div> 1257 </div> 1258 1259 <!-- Category 6 --> 1260 <div class="category-card"> 1261 <div class="category-image-container"> 1262 <img loading="lazy" src="./assets/underwear.webp" style='object-position:top;' alt="Underwear Collection" class="category-image"> 1263 </div> 1264 <div class="category-info"> 1265 <h3 class="category-name">Underwear</h3> 1266 <p class="category-desc">Develop a collection of high-quality bras, briefs, boxers, and lingerie, focused on comfort, fit, and support for everyday wear.</p> 1267 </div> 1268 </div> 1269 1270 <!-- Category 7 --> 1271 <div class="category-card"> 1272 <div class="category-image-container"> 1273 <img loading="lazy" src="./assets/outerwear.webp" style='object-position:top;' alt="Outerwear Collection" class="category-image"> 1274 </div> 1275 <div class="category-info"> 1276 <h3 class="category-name">Outerwear</h3> 1277 <p class="category-desc">Add jackets, coats, trenchcoats, and parkas to your brand, offering both weather protection and trendy designs.</p> 1278 </div> 1279 </div> 1280 1281 <!-- Category 8 --> 1282 <div class="category-card"> 1283 <div class="category-image-container"> 1284 <img loading="lazy" src="./assets/kidswear.webp" style='object-position:top;' alt="Kidswear Collection" class="category-image"> 1285 </div> 1286 <div class="category-info"> 1287 <h3 class="category-name">Kidswear</h3> 1288 <p class="category-desc">
1288For babies and children, create a collection with comfortable pieces featuring playful prints, vibrant colors, and easy-to-wear fits.</p> 1289 </div> 1290 </div> 1291 1292 <!-- Category 9 --> 1293 <div class="category-card"> 1294 <div class="category-image-container"> 1295 <img loading="lazy" src="./assets/suits.webp" style='object-position:top;' alt="Suits Collection" class="category-image"> 1296 </div> 1297 <div class="category-info"> 1298 <h3 class="category-name">Suits</h3> 1299 <p class="category-desc">Craft finely tailored blazers, trousers, and skirts, with structured cuts and premium fabrics for formal, casual or professional occasions.</p> 1300 </div> 1301 </div> 1302 </div> 1303 </div> 1304</section> 1305 1306 <!-- Beyond Footwear Section - REDESIGNED --> 1307 <section class="accessories" id="portfolio"> 1308 <div class="container"> 1309 <h2 class="accessories-title">Beyond Clothing</h2> 1310 <p class="accessories-subtitle">Discover our sustainable accessories collection</p> 1311 <div class="accessories-container"> 1312 <div class="accessories-card"> 1313 <img loading="lazy" src="./assets/imgs/bedding.jpg" alt="Luxury Bags" class="accessories-image"> 1314 <div class="accessories-content"> 1315 <h3>Bedding</h3> 1316 <p>Complete your home textiles collection with our bedding range, which includes pillowcases, duvet covers, and blankets. Made from high-quality materials, it can be the ideal complement to your loungewear lines.</p> 1317 <a href="https://www.portugaltextile.com/bedding" class="accessories-btn">Explore More</a> 1318 </div> 1319 </div> 1320 <div class="accessories-card"> 1321 <img loading="lazy" src="./assets/imgs/robe.jpg" alt="Designer Belts" class="accessories-image"> 1322 <div class="accessories-content"> 1323 <h3>Homeware</h3> 1324 <p>Create the perfect collection of home essentials. From kitchen accessories like aprons and gloves to table decoration such as towels and placemats. Complete your selection with cozy robes and sleep masks, or everyday makeup bags and organizers.</p> 1325 <a href="https://www.portugaltextile.com/homeware" class="accessories-btn">Explore More</a> 1326 </div> 1327 </div> 1328 <div class="accessories-card"> 1329 <img loading="lazy" src="./assets/imgs/tote-bag.jpg" alt="Eco Backpacks" class="accessories-image"> 1330 <div class="accessories-content"> 1331 <h3>Accessories</h3> 1332 <p> No outfit is ready without accessories: we also offer textile accessories such as tote bags, scarves, gloves and s
1332ocks. And for the hair? Scrunchies and headbands add the finishing touch.</p> 1333 <a href="https://www.portugaltextile.com/accessories" class="accessories-btn">Explore More</a> 1334 </div> 1335 </div> 1336 1337 <div class="accessories-card"> 1338 <img loading='lazy' src="./assets/imgs/jewels.jpg" alt="Eco Backpacks" class="accessories-image"> 1339 <div class="accessories-content"> 1340 <h3>Jewelry</h3> 1341 <p>We manufacture high-quality jewelry designed to stand out. From minimalist pieces to bold designs, we produce earrings, rings, bracelets, and necklaces tailored to your brand. Made with care. Made to impress.</p> 1342 <a href="https://www.portugaltextile.com/jewelry" class="accessories-btn">Explore More</a> 1343</div> 1344 1345 </div> 1346 </div> 1347 </div> 1348 </section> 1349 1350 <!-- Testimonials Section - REDESIGNED using influencer page style --> 1351 1352 <section class="testimonials" id="testimonials"> 1353 <div class="container"> 1354 <div class="testimonials-header"> 1355 <h2 class="testimonials-title">We worked with the best brands</h2> 1356 <p class="testimonials-subtitle">Testimonials from our clients</p> 1357 </div> 1358 <div class="testimonials-slider"> 1359 <div class="testimonials-container" id="testimonialsContainer"> 1360 <div class="testimonial-item"> 1361 <div class="testimonial-card"> 1362 <div class="testimonial-content"> 1363 To work with Portugal Textile has really been such an important part of our journey to where we are as a company today. They were our first partner in producing our items and they are a great partner to us still four years later. Their personal service and engagement is a constant help in our work and we can wholeheartedly recommend them as a partner in the textile business. 1364 </div> 1365 <div class="testimonial-author"> 1366 <div class="author-image-container"> 1367 <img loading="lazy" src="https://portugaltextile.com/wp-content/uploads/2023/09/310234733_490573683082919_4878952062882500090_n.png" alt="Djerf Avenue" class="author-image"> 1368 </div> 1369 <div class="author-info"> 1370 <h3>Matilda Djerf</h3> 1371 <p>CEO & Founder</p> 1372 </div> 1373 </div> 1374 </div> 1375 </div> 1376 </div> 1377 <div class="slider-nav" id="sliderNav"> 1378 <div class="slider-dot active" data-index="0"></div> 1379 <div class="slider-dot" data-index="1"></div> 1380 </div> 1381 </div> 1382 </div> 1383</section> 1384 1385<style> 1386/* Modified testimonial card layout */ 1387.testimonial-card { 1388 background: white; 1389 border-radius: 15px; 1390 padding: 30px; 1391 box-shadow: 0 10px 30px rgba(0,0,0,0.05); 1392 display: flex; 1393 flex-direction: row; 1394 align-items: center; 1395 gap: 30px; 1396} 1397 1398.testimonial-content { 1399 flex: 1; 1400 position: relative; 1401 padding: 20px 0; 1402 font-size: 1.1rem; 1403 line-height: 1.8; 1404 color: var(--color-dark-gray); 1405 margin-bottom: 0; 1406} 1407 1408.testimonial-content::before { 1409 content: '"'; 1410 position: absolute; 1411 top: -20px; 1412 left: -10px; 1413 font-size: 5rem; 1414 color: rgba(0,0,0,0.1); 1415 line-height: 1; 1416} 1417 1418.testimonial-author { 1419 min-width: 260px; 1420 display: flex; 1421 flex-direction: column; 1422 align-items: center; 1423 text-align: center; 1424} 1425 1426/* Round image with gradient border */ 1427.author-image-container { 1428 position: relative; 1429 width: 180px; 1430 height: 180px; /* Make it square to ensure perfect circle */ 1431 margin-bottom: 15px; 1432} 1433 1434.author-image-container::before { 1435 content: ''; 1436 position: absolute; 1437 top: -4px; 1438 left: -4px; 1439 right: -4px; 1440 bottom: -4px; 1441 background: linear-gradient(300deg, #E4A644 0%, #C14ADC 100%); 1442 border-radius: 50%; /* Make it circular */ 1443 z-index: 0; 1444} 1445 1446.author-image { 1447 position: relative; 1448 display: block; 1449 width: 100%; 1450 height: 100%; 1451 border-radius: 50%; /* Make it circular */ 1452 z-index: 1; 1453 object-fit: cover; /* Ensures the image covers the area without distortion */ 1454} 1455 1456.author-info h4 { 1457 font-size: 1.1rem; 1458 margin-bottom: 5px; 1459 color: var(--color-black); 1460} 1461 1462.author-info p { 1463 font-size: .9rem; 1464 color: var(--color-dark-gray); 1465} 1466 1467/* Responsive styles for mobile */ 1468@media (max-width: 768px) { 1469 .testimonial-card { 1470 flex-direction: column; 1471 } 1472 1473 .testimonial-content { 1474 padding-right: 0; 1475 margin-bottom: 20px; 1476 } 1477 1478 .testimonial-author { 1479 width: 100%; 1480 } 1481} 1482</style> 1483 </div> 1484 </section> 1485<section class="faq-section section" id="faq-section"> 1486 <div class="container"> 1487 <h2 class="section-title">Frequently Asked Questions</h2> 1488 <div class="accordion"> 1489 <div class="accordion-item"> 1490 <div class="accordion-header"> 1491 <h3>How can I work with you?</h3>
1492 <span class="accordion-icon"><i class="fas fa-chevron-down"></i></span> 1493 </div> 1494 <div class="accordion-body"> 1495 <div class="accordion-content"> 1496 1497 <p>To begin working with us, you just need to contact us, sending your request about the project through <a href="https://portugaltextile.com/create-my-collection">this form</a> or <a href="mailto:[email protected]">email</a>. You send us your tech packs as well as the quantities per style color, price targets and deadline of the collection. Then, our commercial department will analyze the project to understand your vision, what the brand is looking for and how we can fulfill all your needs.</p> 1498 1499 1500 1501 </div> 1502 </div> 1503 </div> 1504 1505 <div class="accordion-item"> 1506 <div class="accordion-header"> 1507 <h3>How can I do a tech pack and submit it for you?</h3> 1508 <span class="accordion-icon"><i class="fas fa-chevron-down"></i></span> 1509 </div> 1510 <div class="accordion-body"> 1511 <div class="accordion-content"> 1512 <p>A Tech Pack is a framework for sharing your ideas in a structured way. Tech Packs are illustrated designs and specifications of your garment design. A Tech Pack is often required to obtain a quote from a manufacturer or agency, and to ensure that people understand how to make your design and its specifications.</p> 1513 <br><p>You can submit your designs, tech packs, sketches or image references to us via our <a href="https://portugaltextile.com/create-my-collection">contact form</a>. Alternatively, you can also email us at <a href="mailto:[email protected]">[email protected]</a></p> 1514 <p>Note: If you don't have a tech pack, you can always send us physical samples from similar styles for what you want to produce.</p> 1515 </div> 1516 </div> 1517 </div> 1518 1519 <div class="accordion-item"> 1520 <div class="accordion-header"> 1521 <h3>What are your minimum order quantities?</h3> 1522 <span class="accordion-icon"><i class="fas fa-chevron-down"></i></span> 1523 </div> 1524 <div class="accordion-body"> 1525 <div class="accordion-content"> 1526 <p>Our minimum order quantities (MOQs) are customized for each project and may vary based on style and color requirements. Send us your project at <a href='mailto:[email protected]'>[email protected]</a> or at <a href='https://www.portugaltextile.com/create-your-collection'>www.portugaltextile.com/create-your-collection</a>.</p> 1527 </div> 1528 </div> 1529 </div> 1530 1531 <div class="accordion-item"> 1532 <div class="accordion-header"> 1533 <h3>What is your production lead times?</h3> 1534 <span class="accordion-icon"><i class="fas fa-chevron-down"></i></span> 1535 </div> 1536 <div class="accordion-body"> 1537 <div class="accordion-content"> 1538 <p>The project timeline is dependent on your specific needs. Send us your project at <a href='mailto:[email protected]'>[email protected]</a> or at <a href='https://www.portugaltextile.com/create-your-collection'>www.portugaltextile.com/create-your-collection</a>.</p> 1539 </div> 1540 </div> 1541 </div> 1542 1543 <div class="accordion-item"> 1544 <div class="accordion-header"> 1545 <h3>What types of materials are you able to source?</h3> 1546 <span class="accordion-icon"><i class="fas fa-chevron-down"></i></span> 1547 </div> 1548 <div class="accordion-body"> 1549 <div class="accordion-content"> 1550 <p>We can source all type of materials for textile development, sustainable materials included, for examples: organic cotton, EcoVero, Tencel, cactus leather, grape leather, etc. <a href="./sustainability/index.html">
1550See here some of the innovative options.</a></p> 1551 </div> 1552 </div> 1553 </div> 1554 1555 <div class="accordion-item"> 1556 <div class="accordion-header"> 1557 <h3>Do you do the quality control?</h3> 1558 <span class="accordion-icon"><i class="fas fa-chevron-down"></i></span> 1559 </div> 1560 <div class="accordion-body"> 1561 <div class="accordion-content"> 1562 <p>Yes! We have an internal team dedicated to the quality control of all the stages of the process. Every material is inspected before and after any procedure. Our quality controller team will measure, check flaws, test quality, functionality, comfort, durability, and any other important detail for you.</p> 1563 </div> 1564 </div> 1565 </div> 1566 1567 <div class="accordion-item"> 1568 <div class="accordion-header"> 1569 <h3>How do you take care of the packaging?</h3> 1570 <span class="accordion-icon"><i class="fas fa-chevron-down"></i></span> 1571 </div> 1572 <div class="accordion-body"> 1573 <div class="accordion-content"> 1574 <p>We provide sustainable, recycled, and biodegradable custom labels, tags, packaging and accessories to create a fully branded product. You should send us your requirements (size, material, colors, etc.) and artworks, and we will make it happen.</p> 1575 </div> 1576 </div> 1577 </div> 1578 1579 <div class="accordion-item"> 1580 <div class="accordion-header"> 1581 <h3>How do you take care of transport/delivery of the collection?</h3> 1582 <span class="accordion-icon"><i class="fas fa-chevron-down"></i></span> 1583 </div> 1584 <div class="accordion-body"> 1585 <div class="accordion-content"> 1586 <p>We work with several transport companies with land, air, and sea shipments, in order to send the collection to any destination in the world. For each place we have references to provide you the best solutions.</p> 1587 </div> 1588 </div> 1589 </div> 1590 </div> 1591 </div> 1592</section> 1593<!-- Blog Section --> 1594<section class="blog-section" id="blog"> 1595 <div class="container"> 1596 <h2 class="section-title">Latest From Our Blog</h2> 1597 <p class="blog-subtitle">Insights and updates from the sustainable fashion world</p> 1598 1599 <div class="blog-grid"> 1600 <!-- Blog Post 1 --> 1601 <div class="blog-card"> 1602 <div class="blog-image-container"> 1603 <img loading="lazy" src="https://portugaltextile.com/wp-content/uploads/2024/09/Design-sem-nome-54.png" alt="Sustainable Materials in Textile Production" class="blog-image"> 1604 <div class="blog-date"> 1605 <span class="date-day">24</span> 1606 <span class="date-month">Sep</span> 1607 </div> 1608 </div> 1609 <div class="blog-content"> 1610 <h3 class="blog-title">What Makes Portugal a Good Location for Fashion Manufacturing?</h3> 1611 <p class="blog-excerpt">Many fashion brands believe that manufacturing high-quality clothing means choosing big-name countries like Italy or France⦠1612 1613But what if I told you they've been overlooking a hidden gem in the fashion world? A place where tradition, craftsmanship, and cutting-edge technology meet in perfect harmony?</p> 1614 <div class="blog-meta"> 1615 <span class="blog-category"><i class="fas fa-tag"></i> Sustainability</span> 1616 <span class="blog-read-time"><i class="fas fa-clock"></i> 7 min read</span> 1617 </div> 1618 <a href="https://portugaltextile.com/what-makes-portugal-a-good-location-for-fashion-manufacturing/" class="blog-read-more">Read More <i class="fas fa-arrow-right"></i></a> 1619 </div> 1620 </div> 1621 1622 <!-- Blog Post 2 --> 1623 <div class="blog-card"> 1624 <div class="blog-image-container"> 1625 <img loading="lazy" src="https://portugaltextile.com/wp-content/uploads/2025/01/cwa4MhJpStqPZEIt2WcmlQ-1.webp" alt="Ethical Manufacturing Practices" class="blog-image"> 1626 <div class="blog-date">
1627 <span class="date-day">15</span> 1628 <span class="date-month">Apr</span> 1629 </div> 1630 </div> 1631 <div class="blog-content"> 1632 <h3 class="blog-title">Why Choosing a Textile Factory in Portugal?</h3> 1633 <p class="blog-excerpt">When sourcing high-quality, sustainable, and ethically produced textiles, more brands are turning their eyes to Europeâand one country continues to lead the charge: Portugal. From luxury fashion labels to up-and-coming startups, brands across the globe are tapping into the expertise and innovation that a textile factory in Portugal can offer.</p> 1634 <div class="blog-meta"> 1635 <span class="blog-category"><i class="fas fa-tag"></i> Manufacturing</span> 1636 <span class="blog-read-time"><i class="fas fa-clock"></i> 4 min read</span> 1637 </div> 1638 <a href="https://portugaltextile.com/why-choosing-a-textile-factory-in-portugal/" class="blog-read-more">Read More <i class="fas fa-arrow-right"></i></a> 1639 </div> 1640 </div> 1641 1642 <!-- Blog Post 3 --> 1643 <div class="blog-card"> 1644 <div class="blog-image-container"> 1645 <img loading="lazy" src="https://portugaltextile.com/wp-content/uploads/2025/01/Novo-Projeto-7.png" alt="Manufacturing a Fashion Brand" class="blog-image"> 1646 <div class="blog-date"> 1647 <span class="date-day">24</span> 1648 <span class="date-month">Apr</span> 1649 </div> 1650 </div> 1651 <div class="blog-content"> 1652 <h3 class="blog-title">Portugal: The Epicenter of Clothing Manufacturing Excellence</h3> 1653 <p class="blog-excerpt">Portugal has not only built a legacy on its centuries-old textile tradition, but it has also evolved into a modern powerhouse of innovation, quality, and sustainability. For any brand on the hunt for an outstanding clothing manufacturer in Portugal, the country's advanced production methods, ethical manufacturing practices, and customer-centric approach set the ideal stage for creative excellence.</p> 1654 <div class="blog-meta"> 1655 <span class="blog-category"><i class="fas fa-tag"></i>Manufacturing</span> 1656 <span class="blog-read-time"><i class="fas fa-clock"></i> 6 min read</span> 1657 </div> 1658 <a href="https://portugaltextile.com/clothing-manufacturer-portugal/" class="blog-read-more">Read More <i class="fas fa-arrow-right"></i></a> 1659 </div> 1660 </div> 1661 </div> 1662 1663 <div class="blog-cta-container"> 1664 <a href="https://portugaltextile.com/blog/" class="blog-view-all">View All Articles <i class="fas fa-long-arrow-alt-right"></i></a> 1665 </div> 1666 </div> 1667</section> 1668 1669 <!-- CTA Section - FIXED VISIBILITY --> 1670 <section class="cta" id="contact"> 1671 <div class="cta-container"> 1672 <h2 class="cta-title">Ready to elevate your clothing brand?</h2> 1673 <h3 class="cta-subtitle">Let's collaborate to create exceptional clothing.</h3> 1674 <p class="cta-text">Contact us today to discuss your project requirements, explore customization options, and discover how Portugal Textile can help you elevate your brand. We look forward to hearing from you!</p> 1675 1676 <div class="trust-badges"> 1677 <div class="trust-badge"> 1678 <i class="fas fa-check-circle"></i> 1679 <span>Free Technical Consultation</span> 1680 </div> 1681 <div class="trust-badge"> 1682 <i class="fas fa-check-circle"></i> 1683 <span>Transparent Pricing</span> 1684 </div> 1685 <div class="trust-badge"> 1686 <i class="fas fa-check-circle"></i> 1687 <span>No Commitment Required</span> 1688 </div> 1689 </div> 1690 1691 <a style="margin-top:40px;" href="https://www.portugaltextile.com/create-your-collection" class="cta-button">Get a quote â</a> 1692 </div> 1693 </section> 1694 1695 <!-- Footer --> 1696 <footer> 1697 <div class="container"> 1698 <div class="footer-grid"> 1699 <div class="footer-column"> 1700 <a href="#"> <div class="footer-logo"> 1701 <img loading='lazy' src="https://portugaltextile.com/wp-content/uploads/2023/05/cropped-slogan_update-1-ai4.png" alt="Portugal Textile Logo"> 1702 </div></a> 1703 <p class="footer-about">Portugal Textile works with the best sustainable clothing manufacturers in Portugal, producing high-quality garments for international fashion brands since 2007. 1704<br> 1705We provide comprehensive manufacturing solutions with a focus on eco-friendly materials and ethical production processes. </p> 1706 <div class="footer-social"> 1707 <a href="https://www.facebook.com/portugaltextile/" class="social-icon"> 1708 <i class="fab fa-facebook-f"></i> 1709 </a> 1710 <a href="https://www.instagram.com/portugaltextile/" class="social-icon"> 1711 <i class="fab fa-instagram"></i> 1712 </a> 1713 <a href="https://www.linkedin.com/company/portugaltextile" class="social-icon"> 1714 <i class="fab fa-linkedin-in"></i> 1715 </a> 1716
1717 <a href="https://api.whatsapp.com/send?phone=351915085106" class="social-icon"> 1718 <i class="fab fa-whatsapp"></i> 1719 </a> 1720 <a href="https://pt.pinterest.com/portugaltextile/" class="social-icon"> 1721 <i class="fab fa-pinterest-p"></i> 1722 </a> 1723 </div> 1724 </div> 1725 <div class="footer-column"> 1726 <h3>Company</h3> 1727 <ul class="footer-links"> 1728 <li><a href="./about/index.html">About</a></li> 1729 <li><a href="./services/index.html">Services</a></li> 1730 <li><a href="./influencers/index.html">Influencers</a></li> 1731 <li><a href="./brands/index.html">Brands</a></li> 1732 1733 <li><a href="./portfolio/index.html">Portfolio</a></li> 1734 <li><a href="./certifications/index.html">Certifications</a></li> 1735 <li><a href="./sustainability/index.html">Sustainability</a></li> 1736 <li><a href="https://www.portugaltextile.com/fairs/">Fairs</a></li> 1737 1738 <li><a href="./uniforms-and-merchandise/">Uniforms & Merchandise</a></li> 1739 1740 <li><a href="https://portugaltextile.com/blog/">Blog</a></li> 1741 </ul> 1742 </div> 1743 <div class="footer-column"> 1744 <h3>Help</h3> 1745 <ul class="footer-links"> 1746 <li><a href="https://portugaltextile.com/contact-us/">Contact Us</a></li> 1747 <li><a href="./about/index.html#faq-section">FAQs</a></li> 1748 <li><a href="./private-policy/index.html">Private Policy</a></li> 1749 <li><a href="./terms-and-conditions/index.html">Terms and Conditions</a></li> 1750 <li><a href="./portfolio/index.html">Portfolio</a></li> 1751 <li><a href="./accessibility-statement/index.html">Accessibility Statement</a></li> 1752 <li><a href="https://absolutarget.com/wp-content/uploads/2024/11/Absolutarget_CODE-OF-ETHICS-AND-CONDUCT.pdf">Code of Conduct</a></li> 1753 </ul> 1754 </div> 1755 <!-- Mailchimp Newsletter Integration --> 1756 <div class="footer-column"> 1757 <div id="mc_embed_signup"> 1758 <form action="https://portugaltextile.us15.list-manage.com/subscribe/post?u=c198d3e32d44a21ce33633123&id=fd6f2eaaa5&f_id=00669de1f0" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank"> 1759 <div id="mc_embed_signup_scroll"> 1760 <h3>Subscribe to our newsletter</h3> 1761 <p class="footer-about">Get the latest updates about the fashion industry and our business.</p> 1762 <div class="mc-field-group"> 1763 <input type="email" name="EMAIL" class="newsletter-input required email" id="mce-EMAIL" placeholder="Your email address" required> 1764 </div> 1765 <div id="mergeRow-gdpr" class="mergeRow gdpr-mergeRow content__gdprBlock mc-field-group"> 1766 <div class="content__gdpr"> 1767 <fieldset style="border: none;" class="mc_fieldset gdprRequired mc-field-group" name="interestgroup_field"> 1768 <legend class="sr-only">Marketing Agreement</legend> 1769 <label class="checkbox subfield" for="gdpr28278"> 1770 <input type="checkbox" id="gdpr_28278" name="gdpr[28278]" class="gdpr" value="Y" required> 1771 <span>Agree with <a href="./terms-and-conditions/index.html" style="text-decoration: underline;">Terms and Conditions</a></span> 1772 </label> 1773 </fieldset> 1774 </div> 1775 </div> 1776 <div class="clear"> 1777 <input type="submit" name="subscribe" id="mc-embedded-subscribe" class="newsletter-button" value="Subscribe"> 1778 </div> 1779 </div> 1780 </form> 1781 </div> 1782 </div> 1783 </div> 1784 <div class="footer-bottom"> 1785 <p>© 2026 Portugal Textile. All rights reserved. <br><br> Made with ð for sustainable clothing.</p> 1786 <!-- Added the new logo at the bottom of the footer --> 1787 <div style=" display: flex 1788 ; 1789 width: 100%; 1790 justify-content: center; 1791 align-items: center; 1792 flex-wrap: wrap;" > 1793 <img loading="lazy" style="margin: 10px;" src="https://portugaltextile.com/wp-content/uploads/2024/02/Novo-Projeto-2-pdf-4.png" alt="GOTS Logo" class="footer-logo-bottom"> 1794 </div> 1795 </div> 1796 </div> 1797 </footer> 1798 1799 <!-- Cookie Consent --> 1800 <div id="consent-popup"> 1801 <h3>
1801Cookie Consent</h3> 1802 <p>We use cookies to enhance your browsing experience and analyze our traffic.</p> 1803 <a href="#" class="modal-link" id="open-preferences">Cookie Settings</a> 1804 <div id="consent-buttons"> 1805 <button id="deny-consent">Deny All</button> 1806 <button id="accept-consent">Accept All</button> 1807 </div> 1808 </div> 1809 <div id="cookie-settings" class="cookie-settings"> 1810 <div class="cookie-settings-content"> 1811 <div class="cookie-settings-header"> 1812 <h3>Cookie Settings</h3> 1813 <button id="close-settings" class="close-settings">×</button> 1814 </div> 1815 <p>Customize your cookie preferences. Essential cookies are always enabled as they are necessary for the website to function properly.</p> 1816 1817 <div class="cookie-options"> 1818 <div class="cookie-option"> 1819 <div class="cookie-option-header"> 1820 <label class="cookie-label"> 1821 <input type="checkbox" id="essential-cookies" checked disabled> 1822 <span class="cookie-name">Essential Cookies</span> 1823 </label> 1824 <span class="cookie-status">Always Active</span> 1825 </div> 1826 <p class="cookie-description">These cookies are necessary for the website to function and cannot be switched off.</p> 1827 </div> 1828 1829 <div class="cookie-option"> 1830 <div class="cookie-option-header"> 1831 <label class="cookie-label"> 1832 <input type="checkbox" id="analytics-cookies"> 1833 <span class="cookie-name">Analytics Cookies</span> 1834 </label> 1835 </div> 1836 <p class="cookie-description">These cookies allow us to count visits and traffic sources so we can measure and improve the performance of our site.</p> 1837 </div> 1838 1839 <div class="cookie-option"> 1840 <div class="cookie-option-header"> 1841 <label class="cookie-label"> 1842 <input type="checkbox" id="marketing-cookies"> 1843 <span class="cookie-name">Marketing Cookies</span> 1844 </label> 1845 </div> 1846 <p class="cookie-description">These cookies may be set through our site by our advertising partners to build a profile of your interests.</p> 1847 </div> 1848 1849 <div class="cookie-option"> 1850 <div class="cookie-option-header"> 1851 <label class="cookie-label"> 1852 <input type="checkbox" id="preferences-cookies"> 1853 <span class="cookie-name">Preferences Cookies</span> 1854 </label> 1855 </div> 1856 <p class="cookie-description">These cookies enable the website to provide enhanced functionality and personalization.</p> 1857 </div> 1858 </div> 1859 1860 <div class="cookie-settings-footer"> 1861 <button id="save-preferences" class="save-preferences">Save Preferences</button> 1862 </div> 1863 </div> 1864 </div> 1865
1865<script> 1866// Video Controls Script 1867document.addEventListener('DOMContentLoaded', () => { 1868 const video = document.getElementById('background-video'); 1869 const heroVideo = document.getElementById('heroVideo'); 1870 1871 if (!video || !heroVideo) { 1872 console.error("Video elements not found"); 1873 return; 1874 } 1875 1876 // Get or create overlay elements 1877 let playOverlay = heroVideo.querySelector('.video-overlay:not(.hover-overlay)'); 1878 let playButton = playOverlay?.querySelector('.video-play-button'); 1879 let hoverOverlay = heroVideo.querySelector('.video-overlay.hover-overlay'); 1880 let pauseButton = hoverOverlay?.querySelector('.video-pause-button'); 1881 1882 // Create missing elements if needed 1883 if (!playOverlay) { 1884 playOverlay = document.createElement('div'); 1885 playOverlay.className = 'video-overlay'; 1886 heroVideo.appendChild(playOverlay); 1887 } 1888 1889 if (!playButton) { 1890 playButton = document.createElement('div'); 1891 playButton.className = 'video-play-button'; 1892 playButton.innerHTML = '<i class="fas fa-play"></i>'; 1893 playOverlay.appendChild(playButton); 1894 } 1895 1896 if (!hoverOverlay) { 1897 hoverOverlay = document.createElement('div'); 1898 hoverOverlay.className = 'video-overlay hover-overlay'; 1899 heroVideo.appendChild(hoverOverlay); 1900 } 1901 1902 if (!pauseButton) { 1903 pauseButton = document.createElement('div'); 1904 pauseButton.className = 'video-pause-button'; 1905 pauseButton.innerHTML = '<i class="fas fa-pause"></i>'; 1906 hoverOverlay.appendChild(pauseButton); 1907 } 1908 1909 // Check if device is mobile 1910 const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); 1911 1912 // Initial state setup based on video status 1913 updateVideoState(video.paused); 1914 1915 // Main function to update the video's visual state 1916 function updateVideoState(isPaused) { 1917 if (isPaused) { 1918 heroVideo.classList.add('video-paused'); 1919 heroVideo.classList.remove('video-playing'); 1920 playOverlay.style.opacity = '1'; 1921 playOverlay.style.pointerEvents = 'auto'; 1922 hoverOverlay.style.opacity = '0'; 1923 hoverOverlay.style.pointerEvents = 'none'; 1924 } else { 1925 heroVideo.classList.remove('video-paused'); 1926 heroVideo.classList.add('video-playing'); 1927 playOverlay.style.opacity = '0'; 1928 playOverlay.style.pointerEvents = 'none'; 1929 1930 if (isMobile) { 1931 hoverOverlay.style.opacity = '0'; 1932 hoverOverlay.style.pointerEvents = 'none'; 1933 } else { 1934 hoverOverlay.style.opacity = ''; 1935 hoverOverlay.style.pointerEvents = ''; 1936 } 1937 } 1938 } 1939 1940 // Video container click 1941 heroVideo.addEventListener('click', (e) => { 1942 if (e.target.closest('.video-play-button') || e.target.closest('.video-pause-button')) { 1943 return; 1944 } 1945 1946 togglePlayState(); 1947 1948 if (isMobile && !video.paused) { 1949 hoverOverlay.style.opacity = '1'; 1950 hoverOverlay.style.pointerEvents = 'auto'; 1951 1952 setTimeout(() => { 1953 if (!video.paused) { 1954 hoverOverlay.style.opacity = '0'; 1955 hoverOverlay.style.pointerEvents = 'none'; 1956 } 1957 }, 3000); 1958 } 1959 }); 1960 1961 // Play button click 1962 playButton.addEventListener('click', (e) => { 1963 e.stopPropagation(); 1964 playVideo(); 1965 }); 1966 1967 // Pause button click 1968 pauseButton.addEventListener('click', (e) => { 1969 e.stopPropagation(); 1970 pauseVideo(); 1971 }); 1972 1973 // Video event handlers 1974 video.addEventListener('play', () => updateVideoState(false)); 1975 video.addEventListener('pause', () => updateVideoState(true)); 1976 video.addEventListener('ended', () => { 1977 if (!video.loop) updateVideoState(true); 1978 }); 1979 1980 // Helper functions 1981 function togglePlayState() { 1982 if (video.paused) { 1983 playVideo(); 1984 } else { 1985 pauseVideo(); 1986 } 1987 } 1988 1989 function playVideo() { 1990 const playPromise = video.play(); 1991 if (playPromise !== undefined) { 1992 playPromise 1993 .then(() => updateVideoState(false)) 1994 .catch(error => { 1995 console.error("Video play error:", error); 1996 updateVideoState(true); 1997 }); 1998 } 1999 } 2000 2001 function pauseVideo() { 2002 video.pause(); 2003 updateVideoState(true); 2004 } 2005 2006 // Progress bar 2007 const progressFilled = document.getElementById('progress-filled'); 2008 if (progressFilled) { 2009 video.addEventListener('timeupdate', () => { 2010 const progress = (video.currentTime / video.duration) * 100; 2011 progressFilled.style.width = `${progress}%`; 2012 }); 2013 } 2014 2015 // Desktop hover effects 2016 if (!isMobile) { 2017 heroVideo.addEventListener('mouseenter', () => { 2018 if (!video.paused) { 2019 hoverOverlay.style.opacity = '1'; 2020 hoverOverlay.style.pointerEvents = 'auto'; 2021 } 2022 }); 2023 2024 heroVideo.addEventListener('mouseleave', () => { 2025 hoverOverlay.style.opacity = '0'; 2026 hoverOverlay.style.pointerEvents = 'none'; 2027 }); 2028 } 2029 2030 // Add additional styles to ensure overlays work correctly 2031 const styleEl = document.createElement('style'); 2032 styleEl.textContent = ` 2033 /* Enhanced video overlay styling */ 2034 .hero-video { 2035 position: relative; 2036 overflow: hidden; 2037 z-index: 1; 2038 } 2039 2040 .video-overlay { 2041 position: absolute; 2042 top: 0; 2043 left: 0; 2044 width: 100%; 2045 height: 100%; 2046 display: flex; 2047 justify-content: center; 2048 align-items: center; 2049 transition: opacity 0.3s ease; 2050 z-index: 5; 2051 background: linear-gradient(transparent, rgba(0,0,0,0.3)); 2052 } 2053 2054 .video-paused .video-overlay:not(.hover-overlay) { 2055 opacity: 1; 2056 pointer-events: auto; 2057 } 2058 2059 /* Hover state for playing video - only used for non-mobile */ 2060 .hero-video.video-playing:hover .video-overlay.hover-overlay { 2061 opacity: 1; 2062 pointer-events: auto; 2063 } 2064 2065 /* Default state for hover overlay */ 2066 .video-overlay.hover-overlay { 2067 opacity: 0; 2068 pointer-events: none; 2069 transition: opacity 0.3s ease; 2070 } 2071 2072 .video-play-button, .video-pause-button { 2073 width: 80px; 2074 height: 80px; 2075 background: linear-gradient(300deg, #E4A644 0%, #C14ADC 100%); 2076 border-radius: 50%; 2077 display: flex; 2078 justify-content: center; 2079 align-items: center; 2080 cursor: pointer; 2081 box-shadow: 0 10px 20px rgba(0,0,0,0.2); 2082 transition: transform 0.3s ease; 2083 } 2084 2085 .video-play-button:hover, .video-pause-button:hover { 2086 transform: scale(1.1); 2087 } 2088 2089 .video-play-button i, .video-pause-button i { 2090 color: white; 2091 font-size: 30px; 2092 } 2093 2094 #background-video { 2095 display: block; 2096 width: 100%; 2097 height: 100%; 2098 object-fit: cover; 2099 } 2100 `; 2101 document.head.appendChild(styleEl); 2102}); 2103 2104// WebP Support Detection 2105function supportsWebP(callback) { 2106 let img = new Image(); 2107 img.onload = img.onerror = function () { 2108 callback(img.width === 1); 2109 }; 2110 img.src = "data:image/webp;base64,UklGRhoAAABXRUJQVlA4TAYAAAAvAAAAFQAAQUxQSAEAAAABAAEAAABQSwA="; 2111} 2112 2113supportsWebP(function (supported) { 2114 if (supported) { 2115 document.querySelectorAll("img").forEach((img) => { 2116 let webpSrc = img.src.replace(/\.(jpg|png)$/, ".webp"); 2117 img.src = webpSrc; 2118 }); 2119 } 2120}); 2121 2122// MAIN DOCUMENT READY FUNCTION 2123document.addEventListener('DOMContentLoaded', () => { 2124 // ===== MOBILE MENU LOGIC ===== 2125 const mobileToggle = document.getElementById('mobileToggle'); 2126 const navMenu = document.getElementById('navMenu'); 2127 const scrollProgressBar = document.querySelector('.scroll-progress-bar'); 2128 let originalProgressWidth = ''; 2129 2130 if (mobileToggle && navMenu) { 2131 mobileToggle.addEventListener('click', () => { 2132 navMenu.classList.toggle('active'); 2133 document.body.style.overflow = navMenu.classList.contains('active') ? 'hidden' : ''; 2134 mobileToggle.innerHTML = navMenu.classList.contains('active') 2135 ? '<i class="fas fa-times"></i>' 2136 : '<i class="fas fa-bars"></i>'; 2137 2138 if (scrollProgressBar) { 2139 if (navMenu.classList.contains('active')) { 2140 originalProgressWidth = scrollProgressBar.style.width; 2141 scrollProgressBar.style.width = '0%'; 2142 } else { 2143 if (originalProgressWidth) { 2144 scrollProgressBar.style.width = originalProgressWidth; 2145 } else { 2146 const scrollTop = window.scrollY; 2147 const scrollHeight = document.documentElement.scrollHeight - window.innerHeight; 2148 const progress = (scrollTop / scrollHeight) * 100; 2149 scrollProgressBar.style.width = `${progress}%`; 2150 } 2151 } 2152 } 2153 }); 2154 } 2155 2156 // Close mobile menu when clicking on a link 2157 const navLinks = document.querySelectorAll('.nav-link, .nav-menu .btn-primary'); 2158 navLinks.forEach(link => { 2159 link.addEventListener('click', () => { 2160 if (navMenu && navMenu.classList.contains('active')) { 2161 navMenu.classList.remove('active'); 2162 document.body.style.overflow = ''; 2163 if (mobileToggle) { 2164 mobileToggle.innerHTML = '<i class="fas fa-bars"></i>'; 2165 } 2166 2167 if (scrollProgressBar) { 2168 if (originalProgressWidth) { 2169 scrollProgressBar.style.width = originalProgressWidth; 2170 } else { 2171 const scrollTop = window.scrollY; 2172 const scrollHeight = document.documentElement.scrollHeight - window.innerHeight; 2173 const progress = (scrollTop / scrollHeight) * 100; 2174 scrollProgressBar.style.width = `${progress}%`; 2175 } 2176 } 2177 } 2178 }); 2179 }); 2180 2181 // ===== GSAP ANIMATIONS ===== 2182 if (typeof gsap !== 'undefined') { 2183 if (gsap.registerPlugin && typeof ScrollTrigger !== 'undefined') { 2184 gsap.registerPlugin(ScrollTrigger); 2185 } 2186 2187 if (typeof ScrollTrigger !== 'undefined') { 2188 // Process cards 2189 gsap.utils.toArray('.process-card').forEach((card, i) => { 2190 gsap.from(card, { 2191 scrollTrigger: { trigger: card, start: "top 80%", toggleActions: "play none none none" }, 2192 y: 50, opacity: 0, duration: 0.8, delay: i * 0.2, ease: "power2.out" 2193 }); 2194 }); 2195 2196 // About section 2197 gsap.from('.about-image', { 2198 scrollTrigger: { trigger: '.about-image', start: "top 80%", toggleActions: "play none none none" }, 2199 x: -50, opacity: 0, duration: 1, ease: "power2.out" 2200 }); 2201 2202 gsap.from('.about-content', { 2203 scrollTrigger: { trigger: '.about-content', start: "top 80%", toggleActions: "play none none none" }, 2204 x: 50, opacity: 0, duration: 1, ease: "power2.out" 2205 }); 2206 2207 // Benefits cards 2208 gsap.utils.toArray('.benefit-card').forEach((card, i) => { 2209 gsap.from(card, { 2210 scrollTrigger: { trigger: card, start: "top 80%", toggleActions: "play none none none" }, 2211 y: 50, opacity: 0, duration: 0.8, delay: i * 0.15, ease: "power2.out" 2212 }); 2213 }); 2214 2215 // Material cards 2216 gsap.utils.toArray('.material-card').forEach((card, i) => { 2217 gsap.from(card, { 2218 scrollTrigger: { trigger: card, start: "top 80%", toggleActions: "play none none none" }, 2219 y: 50, opacity: 0, duration: 0.8, delay: i * 0.1, ease: "power2.out" 2220 }); 2221 }); 2222 2223 // Accessories cards 2224 gsap.utils.toArray('.accessories-card').forEach((card, i) => { 2225 gsap.from(card, { 2226 scrollTrigger: { trigger: card, start: "top 80%", toggleActions: "play none none none" }, 2227 y: 30, opacity: 0, duration: 0.8, delay: i * 0.2, ease: "power2.out" 2228 }); 2229 }); 2230 2231 // CTA section 2232 gsap.from('.cta-container', { 2233 scrollTrigger: { trigger: '.cta-container', start: "top 80%", toggleActions: "play none none none" }, 2234 y: 50, opacity: 0, duration: 1, ease: "power3.out" 2235 }); 2236 2237 // Categories section 2238 gsap.from('.categories-header', { 2239 scrollTrigger: { trigger: '.categories-section', start: 'top 80%' }, 2240 opacity: 0, y: 30, duration: 0.8, ease: 'power3.out' 2241 }); 2242 2243 gsap.from('.category-card', { 2244 scrollTrigger: { trigger: '.categories-section', start: 'top 70%' }, 2245 opacity: 0, y: 40, stagger: 0.15, duration: 0.7, ease: 'power3.out' 2246 }); 2247 2248 // FAQ section 2249 gsap.from('.accordion-item', { 2250 scrollTrigger: { trigger: '.faq-section', start: 'top 80%' }, 2251 opacity: 0, y: 30, stagger: 0.1, duration: 0.6, ease: 'power3.out' 2252 }); 2253 } 2254 } 2255 2256 // Header scroll effect 2257 window.addEventListener('scroll', () => { 2258 const header = document.querySelector('.header'); 2259 if (header) { 2260 if (window.scrollY > 50) { 2261 header.style.background = 'rgba(255,255,255,0.9)'; 2262 header.style.backdropFilter = 'blur(10px)'; 2263 } else { 2264 header.style.background = 'white'; 2265 header.style.backdropFilter = 'none'; 2266 } 2267 } 2268 }); 2269 2270 // ===== WORKFLOW SLIDER WITH FIXED DRAG FUNCTIONALITY ===== 2271 const materialsSlides = [ 2272 { 2273 image: "https://portugaltextile.com/wp-content/uploads/elementor/thumbs/IMG_8175-1-scaled-qrom0ph4bltrbmocxdc9bu5is9d5ouo07l2nzyruzk.webp", 2274 title: "Organic Cotton", 2275 description: "Cotton grown without synthetic pesticides or fertilizers, using methods that have a lower impact on the environment. Organic farming practices promote biodiversity and healthier soil." 2276 }, 2277 { 2278 image: "https://portugaltextile.com/wp-content/uploads/elementor/thumbs/Instagram-story-64-qrohe6ehi9uyeokjcdxqkuzm0q63zbjzbc7t55otcw.webp", 2279 title: "Cupro", 2280 description: "A regenerated cellulose fiber made from cotton linter (the short fibers adhering to cotton seeds after ginning). Considered a by-product of the cotton industry with silk-like properties." 2281 }, 2282 { 2283 image: "https://portugaltextile.com/wp-content/uploads/elementor/thumbs/Novo-Projeto-28-qrojdbsott9b837yvn43temorphbmj0jfhxxw670dc.png", 2284 title: "Lyocell", 2285 description: "A sustainable fiber made from wood pulp, typically eucalyptus, using an environmentally responsible closed-loop process that reuses solvents. Known for its exceptional softness." 2286 }, 2287 { 2288 image: "https://portugaltextile.com/wp-content/uploads/elementor/thumbs/IMG_8175-2-scaled-qrom7qbpe1fw2qh2wwmwgkcikwqw7fjsucka3ecyhs.webp", 2289 title: "Ecovero", 2290 description: "A type of viscose fiber derived from sustainable wood sources with EU Ecolabel certification. Ecovero has up to 50% lower emissions and water impact than conventional viscose." 2291 }, 2292 { 2293 image: "https://portugaltextile.com/wp-content/uploads/elementor/thumbs/Novo-Projeto-qrtipi5arz9zjt9jccyby7nqzjt54dl5qlrnvtk2ow.webp", 2294 title: "Recycled Wool", 2295 description: "Wool fibers reclaimed from pre-consumer or post-consumer textile waste, processed, and respun into new yarn. This reduces the need for virgin wool production and diverts textile waste." 2296 }, 2297 { 2298 image: "https://portugaltextile.com/wp-content/uploads/elementor/thumbs/Novo-Projeto-30-1-qrtjc617k6avhccf05mi2hrum03qpnk66s14fzyco0.png",
2299 title: "Biodegradable polyester", 2300 description: "An innovative alternative to conventional polyester that maintains performance properties while being designed to break down at the end of its lifecycle, reducing long-term plastic pollution." 2301 } 2302 ]; 2303 2304 const slides = materialsSlides; 2305 2306 // Update workflow content 2307 const workflowContent = document.querySelector('.workflow-content'); 2308 if (workflowContent) { 2309 workflowContent.innerHTML = ` 2310 <h2>Sustainable Materials</h2> 2311 <h3>Develop your clothing collection with sustainable materials</h3> 2312 <p>We offer a variety of innovative, eco-friendly materials for your clothing collection that reduce environmental impact while maintaining quality and style.</p> 2313 <p>Our sustainable options include recycled, plant-based, and innovative alternatives to traditional materials, perfect for conscious brands looking to make a positive impact.</p> 2314 <a href="./sustainability/index.html" class="about-btn">Explore our materials</a> 2315 `; 2316 } 2317 2318 // Slider elements 2319 const slider = document.querySelector('.workflow-slider'); 2320 const track = document.getElementById('workflowTrack'); 2321 const dotsContainer = document.getElementById('workflowDots'); 2322 const prevSlideBtn = document.getElementById('prevSlide'); 2323 const nextSlideBtn = document.getElementById('nextSlide'); 2324 2325 // Drag variables 2326 let isDragging = false; 2327 let startPos = 0; 2328 let currentTranslate = 0; 2329 let prevTranslate = 0; 2330 let animationID = 0; 2331 let currentSlide = 0; 2332 2333 if (slider && track && slides.length > 0) { 2334 // Add enhanced drag styles with proper centering and mobile navigation 2335 const dragStyles = document.createElement('style'); 2336 dragStyles.textContent = ` 2337 .workflow-slider { 2338 cursor: grab; 2339 user-select: none; 2340 -webkit-user-select: none; 2341 -moz-user-select: none; 2342 -ms-user-select: none; 2343 overflow: hidden; 2344 position: relative; 2345 width: 100%; 2346 } 2347 2348 .workflow-slider.grabbing { 2349 cursor: grabbing; 2350 } 2351 2352 .workflow-track { 2353 display: flex; 2354 transition: transform 0.3s ease-out; 2355 will-change: transform; 2356 width: 100%; 2357 } 2358 2359 .workflow-slide { 2360 min-width: 100%; 2361 flex-shrink: 0; 2362 position: relative; 2363 display: flex; 2364 flex-direction: column; 2365 align-items: center; 2366 justify-content: center; 2367 } 2368 2369 .workflow-image { 2370 pointer-events: none; 2371 user-select: none; 2372 -webkit-user-drag: none; 2373 -webkit-user-select: none; 2374 -moz-user-select: none; 2375 -ms-user-select: none; 2376 width: 100%; 2377 height: 500px; 2378 object-fit: cover; 2379 display: block; 2380 } 2381 2382 .workflow-caption { 2383 position: absolute; 2384 bottom: 0; 2385 left: 0; 2386 right: 0; 2387 padding: 20px; 2388 background: white; 2389 color: var(--color-black); 2390 text-align: center; 2391 border-top: 1px solid #eee; 2392 } 2393 2394 .workflow-caption h3 { 2395 margin-bottom: 5px; 2396 font-size: 1.2rem; 2397 } 2398 2399 /* Enhanced mobile navigation */ 2400 .workflow-arrow { 2401 pointer-events: auto !important; 2402 touch-action: manipulation; 2403 -webkit-tap-highlight-color: transparent; 2404 position: relative; 2405 z-index: 10; 2406 } 2407 2408 .workflow-dot { 2409 pointer-events: auto !important; 2410 touch-action: manipulation; 2411 -webkit-tap-highlight-color: transparent; 2412 position: relative; 2413 z-index: 10; 2414 min-width: 14px; 2415 min-height: 14px; 2416 display: flex; 2417 align-items: center; 2418 justify-content: center; 2419 } 2420 2421 .workflow-navigation { 2422 pointer-events: auto !important; 2423 z-index: 10; 2424 position: relative; 2425 } 2426 2427 /* Mobile optimizations */ 2428 @media (max-width: 768px) { 2429 .workflow-slider { 2430 touch-action: pan-y pinch-zoom; 2431 -webkit-overflow-scrolling: touch; 2432 } 2433 2434 .workflow-slide { 2435 display: flex; 2436 flex-direction: column; 2437 align-items: center; 2438 justify-content: center; 2439 text-align: center; 2440 } 2441 2442 .workflow-image { 2443 height: 500px; 2444 width: 100%; 2445 object-fit: cover; 2446 object-position: center; 2447 margin: 0 auto; 2448 display: block; 2449 } 2450 2451 .workflow-caption { 2452 padding: 15px; 2453 width: 100%; 2454 box-sizing: border-box; 2455 } 2456 2457 .workflow-caption h3 { 2458 font-size: 1.1rem; 2459 } 2460 2461 .workflow-arrow { 2462 width: 50px !important; 2463 height: 50px !important; 2464 font-size: 1.4rem !important; 2465 } 2466 2467 .workflow-dot { 2468 width: 3px !important; 2469 height: 3px !important; 2470 min-width: 4px; 2471 min-height: 4px; 2472 margin: 0 4px; 2473 } 2474 } 2475 2476 @media (max-width: 576px) { 2477 .workflow-slide { 2478 display: flex; 2479 flex-direction: column; 2480 align-items: center; 2481 justify-content: center; 2482 text-align: center; 2483 width: 100%; 2484 } 2485 2486 .workflow-image { 2487 height: 450px; 2488 width: 100%; 2489 object-fit: cover; 2490 object-position: center; 2491 margin: 0 auto; 2492 display: block; 2493 } 2494 2495 .workflow-caption { 2496 padding: 12px; 2497 width: 100%; 2498 box-sizing: border-box; 2499 } 2500 2501 .workflow-arrow { 2502 width: 45px !important; 2503 height: 45px !important; 2504 font-size: 1.2rem !important; 2505 } 2506 2507 .workflow-dot { 2508 width: 10px !important; 2509 height: 10px !important; 2510 min-width: 10px; 2511 min-height: 10px; 2512 margin: 0 3px; 2513 } 2514 } 2515 `; 2516 document.head.appendChild(dragStyles); 2517 2518 // Create all slides 2519 function createAllSlides() { 2520 track.innerHTML = slides.map(slide => ` 2521 <div class="workflow-slide"> 2522 <img src="${slide.image}" alt="${slide.title}" class="workflow-image"> 2523 <div class="workflow-caption"> 2524 <h3>${slide.title}</h3> 2525 <p>${slide.description}</p> 2526 </div> 2527 </div> 2528 `).join(''); 2529 2530 setSliderPosition(); 2531 } 2532 2533 // Set slider position 2534 function setSliderPosition() { 2535 track.style.transform = `translateX(${currentTranslate}px)`; 2536 } 2537 2538 // Animation function 2539 function animation() { 2540 setSliderPosition(); 2541 if (isDragging) requestAnimationFrame(animation); 2542 } 2543 2544 // Set position by index 2545 function setPositionByIndex() { 2546 currentTranslate = currentSlide * -slider.offsetWidth; 2547 prevTranslate = currentTranslate; 2548 setSliderPosition(); 2549 updateDots(); 2550 } 2551 2552 // Update dots 2553 function updateDots() { 2554 const dots = document.querySelectorAll('.workflow-dot');
2555 dots.forEach((dot, i) => { 2556 dot.classList.toggle('active', i === currentSlide); 2557 }); 2558 } 2559 2560 // Drag event handlers with proper mobile button handling 2561 function dragStart(e) { 2562 // Don't start drag if clicking on navigation elements 2563 if (e.target.closest('.workflow-arrow') || 2564 e.target.closest('.workflow-dot') || 2565 e.target.closest('.workflow-navigation')) { 2566 return; 2567 } 2568 2569 e.preventDefault(); 2570 2571 if (e.type.includes('mouse')) { 2572 startPos = e.clientX; 2573 } else { 2574 startPos = e.touches[0].clientX; 2575 } 2576 2577 isDragging = true; 2578 animationID = requestAnimationFrame(animation); 2579 slider.classList.add('grabbing'); 2580 track.style.transition = 'none'; 2581 } 2582 2583 function dragMove(e) { 2584 if (!isDragging) return; 2585 2586 // Don't prevent default if touching navigation elements 2587 if (!e.target.closest('.workflow-arrow') && 2588 !e.target.closest('.workflow-dot') && 2589 !e.target.closest('.workflow-navigation')) { 2590 e.preventDefault(); 2591 } 2592 2593 let currentPosition; 2594 if (e.type.includes('mouse')) { 2595 currentPosition = e.clientX; 2596 } else { 2597 currentPosition = e.touches[0].clientX; 2598 } 2599 2600 const diff = currentPosition - startPos; 2601 currentTranslate = prevTranslate + diff; 2602 2603 // Boundary resistance 2604 const maxTranslate = 0; 2605 const minTranslate = -(slides.length - 1) * slider.offsetWidth; 2606 2607 if (currentTranslate > maxTranslate) { 2608 currentTranslate = maxTranslate + (currentTranslate - maxTranslate) * 0.3; 2609 } else if (currentTranslate < minTranslate) { 2610 currentTranslate = minTranslate + (currentTranslate - minTranslate) * 0.3; 2611 } 2612 } 2613 2614 function dragEnd(e) { 2615 if (!isDragging) return; 2616 2617 isDragging = false; 2618 cancelAnimationFrame(animationID); 2619 slider.classList.remove('grabbing'); 2620 track.style.transition = 'transform 0.3s ease-out'; 2621 2622 const moved = currentTranslate - prevTranslate; 2623 const threshold = slider.offsetWidth * 0.2; 2624 2625 if (moved < -threshold && currentSlide < slides.length - 1) { 2626 currentSlide += 1; 2627 } else if (moved > threshold && currentSlide > 0) { 2628 currentSlide -= 1; 2629 } 2630 2631 setPositionByIndex(); 2632 } 2633 2634 // Add event listeners with proper exclusions 2635 slider.addEventListener('mousedown', dragStart); 2636 slider.addEventListener('mouseup', dragEnd); 2637 slider.addEventListener('mouseleave', dragEnd); 2638 slider.addEventListener('mousemove', dragMove); 2639 2640 // Touch events with careful handling 2641 slider.addEventListener('touchstart', function(e) { 2642 // Allow normal touch behavior for navigation elements 2643 if (e.target.closest('.workflow-arrow') || 2644 e.target.closest('.workflow-dot') || 2645 e.target.closest('.workflow-navigation')) { 2646 return; 2647 } 2648 dragStart(e); 2649 }, { passive: false }); 2650 2651 slider.addEventListener('touchend', dragEnd); 2652 slider.addEventListener('touchmove', dragMove, { passive: false }); 2653 slider.addEventListener('contextmenu', e => e.preventDefault()); 2654 2655 // Create dots with enhanced mobile support 2656 if (dotsContainer) { 2657 dotsContainer.innerHTML = ''; 2658 slides.forEach((_, index) => { 2659 const dot = document.createElement('div'); 2660 dot.classList.add('workflow-dot'); 2661 if (index === 0) dot.classList.add('active'); 2662 2663 // Click events 2664 dot.addEventListener('click', (e) => { 2665 e.preventDefault(); 2666 e.stopPropagation(); 2667 currentSlide = index; 2668 setPositionByIndex(); 2669 }); 2670 2671 // Touch events for mobile 2672 dot.addEventListener('touchend', (e) => { 2673 e.preventDefault(); 2674 e.stopPropagation(); 2675 currentSlide = index; 2676 setPositionByIndex(); 2677 }); 2678 2679 dotsContainer.appendChild(dot); 2680 }); 2681 } 2682 2683 // Button handlers with enhanced mobile support 2684 if (prevSlideBtn) { 2685 // Mouse/click events 2686 prevSlideBtn.addEventListener('click', (e) => { 2687 e.preventDefault(); 2688 e.stopPropagation(); 2689 if (currentSlide > 0) { 2690 currentSlide--; 2691 setPositionByIndex(); 2692 } 2693 }); 2694 2695 // Touch events for mobile 2696 prevSlideBtn.addEventListener('touchend', (e) => { 2697 e.preventDefault(); 2698 e.stopPropagation(); 2699 if (currentSlide > 0) { 2700 currentSlide--; 2701 setPositionByIndex(); 2702 } 2703 }); 2704 } 2705 2706 if (nextSlideBtn) { 2707 // Mouse/click events 2708 nextSlideBtn.addEventListener('click', (e) => { 2709 e.preventDefault(); 2710 e.stopPropagation();
2711 if (currentSlide < slides.length - 1) { 2712 currentSlide++; 2713 setPositionByIndex(); 2714 } 2715 }); 2716 2717 // Touch events for mobile 2718 nextSlideBtn.addEventListener('touchend', (e) => { 2719 e.preventDefault(); 2720 e.stopPropagation(); 2721 if (currentSlide < slides.length - 1) { 2722 currentSlide++; 2723 setPositionByIndex(); 2724 } 2725 }); 2726 } 2727 2728 // Window resize handler 2729 window.addEventListener('resize', () => { 2730 setPositionByIndex(); 2731 }); 2732 2733 // Initialize 2734 createAllSlides(); 2735 setPositionByIndex(); 2736 2737 // Auto-advance with proper pause on interaction 2738 let slideInterval = setInterval(() => { 2739 if (currentSlide < slides.length - 1) { 2740 currentSlide++; 2741 } else { 2742 currentSlide = 0; 2743 } 2744 setPositionByIndex(); 2745 }, 5000); 2746 2747 // Pause on any interaction (hover, touch, or click) 2748 function pauseAutoAdvance() { 2749 clearInterval(slideInterval); 2750 } 2751 2752 function resumeAutoAdvance() { 2753 slideInterval = setInterval(() => { 2754 if (currentSlide < slides.length - 1) { 2755 currentSlide++; 2756 } else { 2757 currentSlide = 0; 2758 } 2759 setPositionByIndex(); 2760 }, 5000); 2761 } 2762 2763 // Desktop events 2764 slider.addEventListener('mouseenter', pauseAutoAdvance); 2765 slider.addEventListener('mouseleave', resumeAutoAdvance); 2766 2767 // Mobile events 2768 slider.addEventListener('touchstart', pauseAutoAdvance); 2769 2770 // Resume after touch interaction ends 2771 let touchEndTimer; 2772 slider.addEventListener('touchend', () => { 2773 clearTimeout(touchEndTimer); 2774 touchEndTimer = setTimeout(resumeAutoAdvance, 3000); // Resume after 3 seconds of no touch 2775 }); 2776 } 2777 2778 // Update materials section 2779 const materialsSection = document.getElementById('sustainability'); 2780 if (materialsSection) { 2781 const title = materialsSection.querySelector('.materials-title'); 2782 const subtitle = materialsSection.querySelector('.materials-subtitle'); 2783 2784 if (title) title.textContent = "Our services"; 2785 if (subtitle) subtitle.textContent = "Here are a few things we can do for you"; 2786 2787 const materialsGrid = materialsSection.querySelector('.materials-grid'); 2788 if (materialsGrid) { 2789 const workflowSlides = [ 2790 { image: "https://portugaltextile.com/wp-content/uploads/elementor/thumbs/IMG_8631-3-scaled-qwwadthld3q1f951ktg5oh5k92gi7ct37i0zobi3jk.webp", title: "Fashion Designs + Sketch & Tech Pack", description: "Our team can provide you fashion designs." }, 2791 { image: "https://portugaltextile.com/wp-content/uploads/2025/03/sourcing-of-materials.webp", title: "Sourcing", description: "Our sourcing team will start searching for the right materials." }, 2792 { image: "https://portugaltextile.com/wp-content/uploads/elementor/thumbs/IMG_4714-q7ih6a4m9axreaan2ts2oc88p84xmpqh50xsvc8dbk.png", title: "Sampling", description: "For each order we create a prototype for your approval." }, 2793 { image: "https://portugaltextile.com/wp-content/uploads/2025/05/women-sewing-clothes-1-e1746802850595.webp", title: "Production", description: "Clothing production is where your ideas come to life." }, 2794 { image: "https://portugaltextile.com/wp-content/uploads/elementor/thumbs/IMG_4722-q7inb2fvkd6egxl9u9hccmhzvfwpna8q5tfmz4vbsg.png", title: "Quality Control", description: "All stages are quality checked to ensure the highest standards." }, 2795 { image: "https://portugaltextile.com/wp-content/uploads/elementor/thumbs/unnamed-file-q7iofqwfc8v4xei2aui39cy5drekrpqj35u4o8jyi8.png", title: "Labels, tags, packaging", description: "We offer sustainable customized labels, tags and packaging." } 2796 ]; 2797 2798 materialsGrid.innerHTML = workflowSlides.map(slide => ` 2799 <div class="material-card"> 2800 <img src="${slide.image}" alt="${slide.title}" class="material-image"> 2801 <div class="material-content"> 2802 <h3 class="material-name">${slide.title}</h3> 2803 <p class="material-description">${slide.description}</p> 2804 </div> 2805 </div> 2806 `).join(''); 2807 } 2808 } 2809 2810 // ===== TESTIMONIALS SLIDER ===== 2811 const testimonialsContainer = document.getElementById('testimonialsContainer'); 2812 const sliderDots = document.querySelectorAll('.slider-dot'); 2813 const testimonialItems = document.querySelectorAll('.testimonial-item'); 2814 const slideCount = testimonialItems.length; 2815 2816 if (sliderDots.length > 0) {
2817 sliderDots.forEach((dot, i) => { 2818 if (i >= slideCount) { 2819 dot.style.display = 'none'; 2820 } else { 2821 dot.addEventListener('click', () => { 2822 const index = parseInt(dot.getAttribute('data-index')); 2823 showTestimonial(index); 2824 }); 2825 dot.classList.toggle('active', i === 0); 2826 } 2827 }); 2828 } 2829 2830 function showTestimonial(index) { 2831 if (!testimonialsContainer || index >= slideCount) return; 2832 2833 testimonialsContainer.style.transform = `translateX(-${index * 100}%)`; 2834 2835 sliderDots.forEach((dot, i) => { 2836 if (i < slideCount) { 2837 dot.classList.toggle('active', i === index); 2838 } 2839 }); 2840 } 2841 2842 showTestimonial(0); 2843 2844 // ===== ACCORDION FUNCTIONALITY ===== 2845 const accordionItems = document.querySelectorAll('.accordion-item'); 2846 2847 accordionItems.forEach(item => { 2848 const header = item.querySelector('.accordion-header'); 2849 if (header) { 2850 header.addEventListener('click', () => { 2851 accordionItems.forEach(otherItem => { 2852 if (otherItem !== item) { 2853 otherItem.classList.remove('active'); 2854 } 2855 }); 2856 item.classList.toggle('active'); 2857 }); 2858 } 2859 }); 2860 2861 if (accordionItems.length > 0) { 2862 accordionItems[0].classList.add('active'); 2863 } 2864 2865 // ===== SCROLL PROGRESS BAR ===== 2866 window.addEventListener('scroll', () => { 2867 const scrollTop = window.scrollY; 2868 const scrollHeight = document.documentElement.scrollHeight - window.innerHeight; 2869 const progress = (scrollTop / scrollHeight) * 100; 2870 2871 if (scrollProgressBar && (!navMenu || !navMenu.classList.contains('active'))) { 2872 scrollProgressBar.style.width = `${progress}%`; 2873 } 2874 }); 2875}); 2876 2877// Notification bar handling 2878document.addEventListener('DOMContentLoaded', function() { 2879 const notificationBar = document.getElementById('notification-bar'); 2880 const body = document.body; 2881 2882 if (notificationBar) { 2883 body.classList.add('has-notification'); 2884 2885 notificationBar.addEventListener('click', function() { 2886 window.location.href = 'https://www.portugaltextile.com/launchlab'; 2887 }); 2888 2889 let scrollThreshold = 0; 2890 let lastScrollTop = 0; 2891 2892 window.addEventListener('scroll', function() { 2893 let scrollTop = window.pageYOffset || document.documentElement.scrollTop; 2894 2895 if (scrollTop > scrollThreshold && !notificationBar.classList.contains('hidden')) { 2896 notificationBar.classList.add('hidden'); 2897 body.classList.remove('has-notification'); 2898 } 2899 2900 if (scrollTop < 50 && lastScrollTop > scrollTop && notificationBar.classList.contains('hidden')) { 2901 notificationBar.classList.remove('hidden'); 2902 body.classList.add('has-notification'); 2903 } 2904 2905 lastScrollTop = scrollTop; 2906 }); 2907 } 2908}); 2909 2910// Enhanced iOS Mobile Menu Fix 2911window.addEventListener('load', () => { 2912 const mobileToggle = document.getElementById('mobileToggle'); 2913 const navMenu = document.getElementById('navMenu'); 2914 const body = document.body; 2915 2916 if (mobileToggle && navMenu && !window.menuEnhanced) { 2917 window.menuEnhanced = true; 2918 2919 const newToggle = mobileToggle.cloneNode(true); 2920 mobileToggle.parentNode.replaceChild(newToggle, mobileToggle); 2921 2922 let scrollPosition = 0; 2923 const scrollProgressBar = document.querySelector('.scroll-progress-bar'); 2924 let originalProgressWidth = ''; 2925 2926 const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) || 2927 (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1); 2928 2929 newToggle.addEventListener('click', () => { 2930 const menuActive = navMenu.classList.contains('active'); 2931 2932 if (!menuActive) { 2933 scrollPosition = window.pageYOffset; 2934 body.classList.add('menu-open'); 2935 navMenu.classList.add('active'); 2936 newToggle.innerHTML = '<i class="fas fa-times"></i>'; 2937 2938 if (scrollProgressBar) { 2939 originalProgressWidth = scrollProgressBar.style.width; 2940 scrollProgressBar.style.width = '0%'; 2941 } 2942 2943 if (isIOS) { 2944 body.style.top = `-${scrollPosition}px`; 2945 body.style.width = '100%'; 2946 body.style.position = 'fixed'; 2947 } else { 2948 body.style.overflow = 'hidden'; 2949 } 2950 } else { 2951 body.classList.remove('menu-open'); 2952 navMenu.classList.remove('active'); 2953 newToggle.innerHTML = '<i class="fas fa-bars"></i>'; 2954 2955 if (scrollProgressBar) { 2956 if (originalProgressWidth) { 2957 scrollProgressBar.style.width = originalProgressWidth; 2958 } else { 2959 const scrollTop = window.scrollY; 2960 const scrollHeight = document.documentElement.scrollHeight - window.innerHeight; 2961 const progress = (scrollTop / scrollHeight) * 100; 2962 scrollProgressBar.style.width = `${progress}%`; 2963 } 2964 } 2965 2966 if (isIOS) { 2967 body.style.position = ''; 2968 body.style.top = ''; 2969 body.style.width = ''; 2970 window.scrollTo(0, scrollPosition); 2971 } else { 2972 body.style.overflow = ''; 2973 } 2974 } 2975 }); 2976 2977 function setMobileMenuHeight() { 2978 if (isIOS) { 2979 document.documentElement.style.setProperty(
2980 '--mobile-menu-height', 2981 `${window.innerHeight}px` 2982 ); 2983 2984 if (!document.getElementById('ios-height-fix')) { 2985 const style = document.createElement('style'); 2986 style.id = 'ios-height-fix'; 2987 style.textContent = ` 2988 .nav-menu.active { 2989 height: var(--mobile-menu-height, 100vh) !important; 2990 } 2991 `; 2992 document.head.appendChild(style); 2993 } 2994 } 2995 } 2996 2997 setMobileMenuHeight(); 2998 window.addEventListener('resize', setMobileMenuHeight); 2999 3000 // Menu links handler 3001 const navLinks = document.querySelectorAll('.nav-link, .nav-menu .btn-primary'); 3002 navLinks.forEach(link => { 3003 link.addEventListener('click', () => { 3004 if (navMenu.classList.contains('active')) { 3005 body.classList.remove('menu-open'); 3006 navMenu.classList.remove('active'); 3007 newToggle.innerHTML = '<i class="fas fa-bars"></i>'; 3008 3009 if (scrollProgressBar) { 3010 if (originalProgressWidth) { 3011 scrollProgressBar.style.width = originalProgressWidth; 3012 } else { 3013 const scrollTop = window.scrollY; 3014 const scrollHeight = document.documentElement.scrollHeight - window.innerHeight; 3015 const progress = (scrollTop / scrollHeight) * 100; 3016 scrollProgressBar.style.width = `${progress}%`; 3017 } 3018 } 3019 3020 if (isIOS) { 3021 body.style.position = ''; 3022 body.style.top = ''; 3023 body.style.width = ''; 3024 window.scrollTo(0, scrollPosition); 3025 } else { 3026 body.style.overflow = ''; 3027 } 3028 } 3029 }); 3030 }); 3031 } 3032}); 3033 3034// Cookie consent functionality 3035document.addEventListener('DOMContentLoaded', function() { 3036 const consentPopup = document.getElementById('consent-popup'); 3037 const acceptConsent = document.getElementById('accept-consent'); 3038 const denyConsent = document.getElementById('deny-consent'); 3039 const openPreferences = document.getElementById('open-preferences'); 3040 const cookieSettings = document.getElementById('cookie-settings'); 3041 const closeSettings = document.getElementById('close-settings'); 3042 const savePreferences = document.getElementById('save-preferences'); 3043 3044 if (!localStorage.getItem('cookieConsent')) { 3045 setTimeout(() => { 3046 if (consentPopup) consentPopup.style.display = 'block'; 3047 }, 2000); 3048 } 3049 3050 if (acceptConsent) { 3051 acceptConsent.addEventListener('click', () => { 3052 localStorage.setItem('cookieConsent', 'accepted'); 3053 localStorage.setItem('analyticsCookies', 'true'); 3054 localStorage.setItem('marketingCookies', 'true'); 3055 localStorage.setItem('preferencesCookies', 'true'); 3056 if (consentPopup) consentPopup.style.display = 'none'; 3057 }); 3058 } 3059 3060 if (denyConsent) { 3061 denyConsent.addEventListener('click', () => { 3062 localStorage.setItem('cookieConsent', 'denied'); 3063 localStorage.setItem('analyticsCookies', 'false'); 3064 localStorage.setItem('marketingCookies', 'false'); 3065 localStorage.setItem('preferencesCookies', 'false'); 3066 if (consentPopup) consentPopup.style.display = 'none'; 3067 }); 3068 } 3069 3070 if (openPreferences) { 3071 openPreferences.addEventListener('click', (e) => { 3072 e.preventDefault(); 3073 if (cookieSettings) cookieSettings.style.display = 'flex'; 3074 3075 const analyticsCookies = document.getElementById('analytics-cookies'); 3076 const marketingCookies = document.getElementById('marketing-cookies'); 3077 const preferencesCookies = document.getElementById('preferences-cookies'); 3078 3079 if (analyticsCookies) { 3080 analyticsCookies.checked = localStorage.getItem('analyticsCookies') === 'true'; 3081 } 3082 3083 if (marketingCookies) { 3084 marketingCookies.checked = localStorage.getItem('marketingCookies') === 'true'; 3085 } 3086 3087 if (preferencesCookies) { 3088 preferencesCookies.checked = localStorage.getItem('preferencesCookies') === 'true'; 3089 } 3090 }); 3091 } 3092 3093 if (closeSettings) { 3094 closeSettings.addEventListener('click', () => { 3095 if (cookieSettings) cookieSettings.style.display = 'none'; 3096 }); 3097 } 3098 3099 if (savePreferences) { 3100 savePreferences.addEventListener('click', () => { 3101 const analyticsCookies = document.getElementById('analytics-cookies'); 3102 const marketingCookies = document.getElementById('marketing-cookies'); 3103 const preferencesCookies = document.getElementById('preferences-cookies'); 3104 3105 localStorage.setItem('cookieConsent', 'customized'); 3106 3107 if (analyticsCookies) { 3108 localStorage.setItem('analyticsCookies', analyticsCookies.checked.toString()); 3109 } 3110 3111 if (marketingCookies) { 3112 localStorage.setItem('marketingCookies', marketingCookies.checked.toString()); 3113 } 3114 3115 if (preferencesCookies) { 3116 localStorage.setItem('preferencesCookies', preferencesCookies.checked.toString()); 3117 } 3118 3119 if (cookieSettings) cookieSettings.style.display = 'none'; 3120 if (consentPopup) consentPopup.style.display = 'none'; 3121 }); 3122 } 3123}); 3124 3125// Brand navigation scroll behavior 3126document.addEventListener("DOMContentLoaded", function() { 3127 const brandNavs = document.querySelectorAll('.brand-nav, .flex-h.fleeee'); 3128 3129 if (brandNavs.length === 0) return; 3130 3131 let lastScrollPosition = window.scrollY; 3132 let scrollThreshold = 50; 3133
3134 brandNavs.forEach(nav => { 3135 nav.style.transition = 'transform 0.3s ease, opacity 0.3s ease'; 3136 }); 3137 3138 function handleScroll() { 3139 const currentScrollPosition = window.scrollY; 3140 3141 if (currentScrollPosition > lastScrollPosition && currentScrollPosition > scrollThreshold) { 3142 brandNavs.forEach(nav => { 3143 nav.style.transform = 'translateY(-100%)'; 3144 nav.style.opacity = '0'; 3145 }); 3146 } 3147 else if (currentScrollPosition < scrollThreshold || currentScrollPosition < lastScrollPosition) { 3148 brandNavs.forEach(nav => { 3149 nav.style.transform = 'translateY(0)'; 3150 nav.style.opacity = '1'; 3151 }); 3152 } 3153 3154 lastScrollPosition = currentScrollPosition; 3155 } 3156 3157 let ticking = false; 3158 window.addEventListener('scroll', function() { 3159 if (!ticking) { 3160 window.requestAnimationFrame(function() { 3161 handleScroll(); 3162 ticking = false; 3163 }); 3164 ticking = true; 3165 } 3166 }); 3167}); 3168 3169// OVERLAY BUTTON MENU HANDLER - Additional mobile menu fix 3170(function() { 3171 document.addEventListener('DOMContentLoaded', function() { 3172 const originalToggle = document.getElementById('mobileToggle'); 3173 const navMenu = document.getElementById('navMenu'); 3174 3175 if (!originalToggle || !navMenu) return; 3176 3177 const overlayButton = document.createElement('div'); 3178 overlayButton.id = 'overlay-menu-button'; 3179 overlayButton.style.cssText = ` 3180 position: absolute; 3181 top: 0; 3182 left: 0; 3183 width: 60px; 3184 height: 60px; 3185 z-index: 99999; 3186 cursor: pointer; 3187 background: transparent; 3188 `; 3189 3190 function positionOverlay() { 3191 const rect = originalToggle.getBoundingClientRect(); 3192 overlayButton.style.position = 'fixed'; 3193 overlayButton.style.left = rect.left + 'px'; 3194 overlayButton.style.top = rect.top + 'px'; 3195 overlayButton.style.width = rect.width + 'px'; 3196 overlayButton.style.height = rect.height + 'px'; 3197 } 3198 3199 positionOverlay(); 3200 3201 window.addEventListener('resize', positionOverlay); 3202 window.addEventListener('scroll', positionOverlay); 3203 3204 document.body.appendChild(overlayButton); 3205 3206 overlayButton.addEventListener('click', function(e) { 3207 e.preventDefault(); 3208 e.stopPropagation(); 3209 3210 const isOpen = navMenu.classList.contains('active'); 3211 3212 if (!isOpen) { 3213 navMenu.classList.add('active'); 3214 document.body.style.overflow = 'hidden'; 3215 originalToggle.innerHTML = '<i class="fas fa-times"></i>'; 3216 } else { 3217 navMenu.classList.remove('active'); 3218 document.body.style.overflow = ''; 3219 originalToggle.innerHTML = '<i class="fas fa-bars"></i>'; 3220 } 3221 3222 return false; 3223 }, { 3224 capture: true, 3225 passive: false 3226 }); 3227 3228 document.querySelectorAll('.nav-link, .nav-menu .btn-primary').forEach(function(link) { 3229 link.addEventListener('click', function() { 3230 if (navMenu.classList.contains('active')) { 3231 navMenu.classList.remove('active'); 3232 document.body.style.overflow = ''; 3233 originalToggle.innerHTML = '<i class="fas fa-bars"></i>'; 3234 } 3235 }); 3236 }); 3237 3238 const style = document.createElement('style'); 3239 style.textContent = ` 3240 .nav-menu.active { 3241 transform: translateY(0) !important; 3242 opacity: 1 !important; 3243 pointer-events: auto !important; 3244 } 3245 `; 3246 document.head.appendChild(style); 3247 3248 originalToggle.addEventListener('click', function(e) { 3249 e.preventDefault(); 3250 e.stopPropagation(); 3251 return false; 3252 }, { 3253 capture: true, 3254 passive: false 3255 }); 3256 3257 console.log('Overlay button menu handler active'); 3258 }); 3259})(); 3260 3261// FAQ ACCORDION FIX - Enhanced accordion functionality 3262(function() { 3263 function initAccordion() { 3264 try { 3265 console.log("FAQ Accordion Fix: Initializing"); 3266 3267 const accordionItems = document.querySelectorAll('.accordion-item'); 3268 console.log("FAQ Accordion Fix: Found " + accordionItems.length + " accordion items"); 3269 3270 if (accordionItems.length > 0) {
3271 accordionItems.forEach(function(item, index) { 3272 const header = item.querySelector('.accordion-header'); 3273 const body = item.querySelector('.accordion-body'); 3274 3275 if (!header || !body) { 3276 console.error("FAQ Accordion Fix: Missing header or body in item", item); 3277 return; 3278 } 3279 3280 const newHeader = header.cloneNode(true); 3281 header.parentNode.replaceChild(newHeader, header); 3282 3283 newHeader.addEventListener('click', function() { 3284 const wasActive = item.classList.contains('active'); 3285 3286 accordionItems.forEach(function(otherItem) { 3287 otherItem.classList.remove('active'); 3288 const otherBody = otherItem.querySelector('.accordion-body'); 3289 if (otherBody) { 3290 otherBody.style.maxHeight = "0px"; 3291 } 3292 }); 3293 3294 if (!wasActive) { 3295 item.classList.add('active'); 3296 if (body) { 3297 body.style.maxHeight = body.scrollHeight + "px"; 3298 } 3299 } 3300 }); 3301 }); 3302 3303 if (!accordionItems[0].classList.contains('active')) { 3304 accordionItems[0].classList.add('active'); 3305 const firstBody = accordionItems[0].querySelector('.accordion-body'); 3306 if (firstBody) { 3307 firstBody.style.maxHeight = firstBody.scrollHeight + "px"; 3308 } 3309 } 3310 3311 console.log("FAQ Accordion Fix: Initialization complete"); 3312 } else { 3313 console.error("FAQ Accordion Fix: No accordion items found"); 3314 } 3315 } catch (error) { 3316 console.error("FAQ Accordion Fix: Error initializing accordion", error); 3317 } 3318 } 3319 3320 if (document.readyState === 'loading') { 3321 document.addEventListener('DOMContentLoaded', initAccordion); 3322 } else { 3323 initAccordion(); 3324 } 3325 3326 setTimeout(initAccordion, 500); 3327})(); 3328 3329// FINAL SCROLL POSITION FIX - Force scroll position restoration for mobile menu 3330(function() { 3331 window.addEventListener('load', function() { 3332 console.log("ð§ Installing forced scroll position fix..."); 3333 3334 const mobileToggle = document.getElementById('mobileToggle'); 3335 const navMenu = document.getElementById('navMenu'); 3336 3337 if (!mobileToggle || !navMenu) { 3338 console.log("â Critical elements not found"); 3339 return; 3340 } 3341 3342 window._savedScrollPosition = 0; 3343 3344 const styleEl = document.createElement('style'); 3345 styleEl.id = 'scroll-fix-styles'; 3346 styleEl.textContent = ` 3347 body.menu-is-active { 3348 position: fixed; 3349 width: 100%; 3350 overflow: hidden; 3351 } 3352 `; 3353 document.head.appendChild(styleEl); 3354 3355 window.addEventListener('scroll', function() { 3356 if (!navMenu.classList.contains('active')) { 3357 window._savedScrollPosition = window.pageYOffset; 3358 } 3359 }, { passive: true }); 3360 3361 function replaceMenuToggle() { 3362 const newToggle = mobileToggle.cloneNode(true); 3363 mobileToggle.parentNode.replaceChild(newToggle, mobileToggle); 3364 3365 newToggle.addEventListener('click', function(e) { 3366 e.preventDefault(); 3367 e.stopPropagation(); 3368 3369 if (navMenu.classList.contains('active')) { 3370 navMenu.classList.remove('active'); 3371 document.body.classList.remove('menu-is-active'); 3372 newToggle.innerHTML = '<i class="fas fa-bars"></i>'; 3373 3374 setTimeout(function() { 3375 window.scrollTo(0, window._savedScrollPosition); 3376 console.log("ð Restored scroll position:", window._savedScrollPosition); 3377 }, 400); 3378 3379 } else { 3380 window._savedScrollPosition = window.pageYOffset; 3381 console.log("ð Saved scroll position:", window._savedScrollPosition); 3382 3383 document.body.classList.add('menu-is-active'); 3384 document.body.style.top = `-${window._savedScrollPosition}px`; 3385 3386 navMenu.classList.add('active'); 3387 newToggle.innerHTML = '<i class="fas fa-times"></i>'; 3388 } 3389 3390 return false;
3391 }, { capture: true }); 3392 3393 console.log("â Menu toggle replacement complete"); 3394 } 3395 3396 function fixMenuLinks() { 3397 const menuLinks = navMenu.querySelectorAll('a'); 3398 3399 menuLinks.forEach(link => { 3400 const newLink = link.cloneNode(true); 3401 if (link.parentNode) { 3402 link.parentNode.replaceChild(newLink, link); 3403 } 3404 3405 newLink.addEventListener('click', function() { 3406 if (navMenu.classList.contains('active')) { 3407 navMenu.classList.remove('active'); 3408 document.body.classList.remove('menu-is-active'); 3409 3410 if (mobileToggle) { 3411 mobileToggle.innerHTML = '<i class="fas fa-bars"></i>'; 3412 } 3413 3414 setTimeout(function() { 3415 window.scrollTo(0, window._savedScrollPosition); 3416 console.log("ð Restored scroll position after link click:", window._savedScrollPosition); 3417 }, 400); 3418 } 3419 }); 3420 }); 3421 3422 console.log("â Menu links fixed"); 3423 } 3424 3425 try { 3426 const overlayBtn = document.getElementById('overlay-menu-button'); 3427 if (overlayBtn) { 3428 overlayBtn.remove(); 3429 console.log("ðï¸ Removed overlay menu button"); 3430 } 3431 3432 replaceMenuToggle(); 3433 fixMenuLinks(); 3434 3435 console.log("â Forced scroll position fix installed successfully"); 3436 } catch (error) { 3437 console.error("â Error installing scroll fix:", error); 3438 } 3439 3440 if (navMenu.classList.contains('active')) { 3441 navMenu.classList.remove('active'); 3442 document.body.classList.remove('menu-is-active'); 3443 window.scrollTo(0, window._savedScrollPosition); 3444 } 3445 }); 3446})(); 3447</script>
vendor: 1 bytes, line 3447
3447
3448<script> 3449document.addEventListener("DOMContentLoaded", function() { 3450 // Find brand navigation bars (works for both sites) 3451 const brandNavs = document.querySelectorAll('.brand-nav, .flex-h.fleeee'); 3452 3453 if (brandNavs.length === 0) return; 3454 3455 // Initial position 3456 let lastScrollPosition = window.scrollY; 3457 let scrollThreshold = 50; // How many pixels to scroll before hiding 3458 3459 // Add smooth transition to brand nav bars 3460 brandNavs.forEach(nav => { 3461 nav.style.transition = 'transform 0.3s ease, opacity 0.3s ease'; 3462 }); 3463 3464 // Function to handle scroll events 3465 function handleScroll() { 3466 const currentScrollPosition = window.scrollY; 3467 3468 // If scrolled down more than threshold 3469 if (currentScrollPosition > lastScrollPosition && currentScrollPosition > scrollThreshold) { 3470 // Hide the brand nav 3471 brandNavs.forEach(nav => { 3472 nav.style.transform = 'translateY(-100%)'; 3473 nav.style.opacity = '0'; 3474 }); 3475 } 3476 // If scrolled back to top or scrolling up 3477 else if (currentScrollPosition < scrollThreshold || currentScrollPosition < lastScrollPosition) { 3478 // Show the brand nav 3479 brandNavs.forEach(nav => { 3480 nav.style.transform = 'translateY(0)'; 3481 nav.style.opacity = '1'; 3482 }); 3483 } 3484 3485 lastScrollPosition = currentScrollPosition; 3486 } 3487 3488 // Throttle scroll events for better performance 3489 let ticking = false; 3490 window.addEventListener('scroll', function() { 3491 if (!ticking) { 3492 window.requestAnimationFrame(function() { 3493 handleScroll(); 3494 ticking = false; 3495 }); 3496 ticking = true; 3497 } 3498 }); 3499}); 3500</script>
3500 3501 3502</body> 3503</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.