Service&Maatwerk

Service & Maatwerk | BVS</titel> <stijl> :wortel { --primair: #0052cc; --primair-zacht: #e6f0ff; --accent: #00b894; --tekst-hoofd: #222222; --tekst gedempt: #666666; --bg-pagina: #f5f7fb; --bg-sectie: #ffffff; --border-zacht: #e0e4f0; --schaduw-zacht: 0 10px 30px rgba(15, 35, 52, 0,08); --straal-lg: 18px; --straal-md: 12px; --radius-pil: 999px; } * { doosgrootte: randdoos; marge: 0; opvulling: 0; } lichaam { lettertypefamilie: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; kleur: var(--tekst-hoofd); achtergrondkleur: var(--bg-pagina); lijnhoogte: 1,6; } een { kleur: var(--primair); tekstversiering: geen; } een: zweef { tekstversiering: onderstrepen; } .bvs-pagina { maximale breedte: 1200px; marge: 40px automatisch 60px; opvulling: 0 20px; } @media (min. breedte: 1200px) { .bvs-pagina { marge bovenaan: 60px; } } /* 顶部 Held */ .bvs-held { achtergrond: lineair verloop (135 graden, #ffffff 0%, #f5f8ff 55%, #eef6ff 100%); randradius: 26px; opvulling: 32px 24px 32px; box-shadow: var(--schaduw-zacht); rand: 1px effen var(--border-zacht); marge-onder: 32px; weergave: raster; grid-template-kolommen: minmax(0, 1.4fr) minmax(0, 1fr); opening: 24px; items uitlijnen: centreren; } @media (max. breedte: 900px) { .bvs-held { grid-template-kolommen: minmax(0, 1fr); } } .bvs-held-label { display: inline-flex; items uitlijnen: centreren; opening: 8px; opvulling: 4px 12px; grensradius: var(--radius-pil); achtergrond: rgba(0, 82, 204, 0,06); kleur: var(--primair); lettergrootte: 13px; lettertypegewicht: 600; letterafstand: 0,06em; teksttransformatie: hoofdletters; marge-onder: 10px; } .bvs-held-dot { breedte: 8px; hoogte: 8px; randradius: 50%; achtergrond: var(--accent); } .bvs-held-titel { lettergrootte: 28px; lijnhoogte: 1,25; lettertypegewicht: 700; letterafstand: 0,01em; marge-onder: 10px; kleur: #111827; } @media (min. breedte: 992px) { .bvs-held-titel { lettergrootte: 32px; } } .bvs-held-tekst { lettergrootte: 14px; kleur: var(--tekst-gedempt); maximale breedte: 560px; marge-onder: 16px; } .bvs-hero-tags { weergave: flex; flex-wrap: wikkel; opening: 8px; marge-onder: 18px; } .bvs-tag { lettergrootte: 11px; opvulling: 4px 9px; grensradius: var(--radius-pil); achtergrond: rgba(255, 255, 255, 0,9); rand: 1px effen rgba (15, 35, 52, 0,08); display: inline-flex; items uitlijnen: centreren; opening: 4px; kleur: var(--tekst-hoofd); achtergrondfilter: vervagen(6px); } .bvs-tag-dot { breedte: 6px; hoogte: 6px; randradius: 50%; achtergrond: var(--accent); } .bvs-held-ctas { weergave: flex; flex-wrap: wikkel; opening: 10px; items uitlijnen: centreren; } .bvs-btn-primair { display: inline-flex; items uitlijnen: centreren; opening: 6px; opvulling: 9px 16px; grensradius: var(--radius-pil); achtergrond: var(--primair); kleur: #ffffff; lettergrootte: 13px; lettertypegewicht: 500; tekstversiering: geen; rand: geen; vakschaduw: 0 9px 20px rgba(0, 82, 204, 0,35); cursor: aanwijzer; witruimte: nowrap; }.bvs-btn-secundair { display: inline-flex; items uitlijnen: centreren; opening: 6px; opvulling: 8px 14px; grensradius: var(--radius-pil); achtergrond: #ffffff; kleur: var(--primair); lettergrootte: 13px; lettertypegewicht: 500; rand: 1px effen rgba (0, 82, 204, 0,25); vakschaduw: 0 4px 12px rgba(0, 82, 204, 0,12); cursor: aanwijzer; witruimte: nowrap; tekstversiering: geen; } .bvs-btn-primaire svg, .bvs-btn-secundaire svg { breedte: 16px; hoogte: 16px; } .bvs-held-meta { lettergrootte: 12px; kleur: var(--tekst-gedempt); marge bovenaan: 6px; } .bvs-held-rechts { randradius: 20px; opvulling: 18px 18px 16px; achtergrond: #ffffff; rand: 1px effen rgba (15, 35, 52, 0,06); vakschaduw: 0 8px 22px rgba(15, 35, 52, 0,10); lettergrootte: 13px; weergave: flex; flex-richting: kolom; opening: 8px; } .bvs-held-rechts-titel { lettergrootte: 14px; lettertypegewicht: 600; kleur: #111827; } .bvs-held-rechts-lijst { lijststijl: geen; opvulling-links: 0; marge: 4px 0 0; weergave: flex; flex-richting: kolom; opening: 4px; } .bvs-held-rechts-lijst li { weergave: flex; align-items: flex-start; opening: 8px; } .bvs-bullet { breedte: 14px; hoogte: 14px; randradius: 50%; rand: 1px effen rgba (15, 35, 52, 0,16); display: inline-flex; items uitlijnen: centreren; rechtvaardigen-inhoud: midden; lettergrootte: 10px; kleur: var(--primair); flex-krimpen: 0; achtergrond: #f9fbff; marge bovenaan: 2px; } /* Sectie 标题 */ .bvs-sectie { marge-onder: 32px; } .bvs-sectie-header { marge-onder: 14px; } .bvs-sectie-wenkbrauw { lettergrootte: 12px; teksttransformatie: hoofdletters; letterafstand: 0,08em; kleur: var(--primair); lettertypegewicht: 600; marge-onder: 4px; } .bvs-sectie-titel { lettergrootte: 20px; lettertypegewicht: 700; kleur: #111827; marge-onder: 4px; } .bvs-sectie-tekst { lettergrootte: 13px; kleur: var(--tekst-gedempt); maximale breedte: 720px; } /* Services 概览:3 列卡foto */ .bvs-services-grid { weergave: raster; grid-template-kolommen: repeat(3, minmax(0, 1fr)); opening: 18px; } @media (max. breedte: 900px) { .bvs-services-grid { grid-template-kolommen: repeat(2, minmax(0, 1fr)); } } @media (max. breedte: 640px) { .bvs-services-grid { grid-template-kolommen: minmax(0, 1fr); } } .bvs-servicekaart { achtergrond: var(--bg-sectie); grensradius: var(--radius-md); opvulling: 16px 14px 16px; rand: 1px effen rgba (15, 35, 52, 0,06); vakschaduw: 0 6px 16px rgba(15, 35, 52, 0,05); lettergrootte: 13px; weergave: flex; flex-richting: kolom; opening: 6px; } .bvs-service-titel { lettergrootte: 14px; lettertypegewicht: 600; kleur: #111827; } .bvs-service-bijschrift { lettergrootte: 12px; kleur: var(--tekst-gedempt); } .bvs-servicelijst { lijststijl: geen; marge bovenaan: 4px; opvulling-links: 0; weergave: flex; flex-richting: kolom; opening: 3px; } /* 定制流程:时间轴式 1+4 步 */ .bvs-proces { achtergrond: #ffffff; grensradius: var(--radius-lg); rand: 1px effen rgba (15, 35, 52, 0,06); vakschaduw: 0 8px 24px rgba(15, 35, 52, 0,06); opvulling: 18px 18px 18px; lettergrootte: 13px; } .bvs-proces-header { weergave: flex; flex-wrap: wikkel; rechtvaardigen-inhoud: ruimte tussen; items uitlijnen: centreren; opening: 10px; marge-onder: 12px; }.bvs-proces-badge { opvulling: 3px 8px; grensradius: var(--radius-pil); achtergrond: var(--primair-zacht); kleur: var(--primair); lettergrootte: 11px; lettertypegewicht: 600; teksttransformatie: hoofdletters; letterafstand: 0,06em; } .bvs-procestitel { lettergrootte: 15px; lettertypegewicht: 600; kleur: #111827; } .bvs-processtappen { weergave: raster; grid-template-kolommen: repeat(4, minmax(0, 1fr)); opening: 14px; marge bovenaan: 10px; } @media (max. breedte: 900px) { .bvs-processtappen { grid-template-kolommen: repeat(2, minmax(0, 1fr)); } } @media (max. breedte: 600px) { .bvs-processtappen { grid-template-kolommen: minmax(0, 1fr); } } .bvs-stap { achtergrond: #f8f9ff; randradius: 12px; opvulling: 10px 10px 11px; rand: 1px effen rgba (15, 35, 52, 0,06); positie: relatief; } .bvs-stap-index { breedte: 20px; hoogte: 20px; randradius: 50%; achtergrond: var(--primair); kleur: #ffffff; lettergrootte: 11px; display: inline-flex; items uitlijnen: centreren; rechtvaardigen-inhoud: midden; marge-onder: 6px; } .bvs-staptitel { lettergrootte: 13px; lettertypegewicht: 600; marge-onder: 2px; kleur: #111827; } .bvs-stap-tekst { lettergrootte: 12px; kleur: var(--tekst-gedempt); } /* 兼容 / 行业支持区块(2 列) */ .bvs-twee-col { weergave: raster; grid-template-kolommen: minmax(0, 1.1fr) minmax(0, 1fr); opening: 18px; } @media (max. breedte: 900px) { .bvs-twee-col { grid-template-kolommen: minmax(0, 1fr); } } .bvs-box { achtergrond: #ffffff; grensradius: var(--radius-lg); opvulling: 16px 16px 14px; rand: 1px effen rgba (15, 35, 52, 0,08); vakschaduw: 0 8px 24px rgba(15, 35, 52, 0,06); lettergrootte: 13px; } .bvs-box-titel { lettergrootte: 14px; lettertypegewicht: 600; kleur: #111827; marge-onder: 4px; } .bvs-box-tekst { lettergrootte: 12px; kleur: var(--tekst-gedempt); marge-onder: 6px; } .bvs-pillenlijst { lijststijl: geen; opvulling-links: 0; weergave: flex; flex-wrap: wikkel; opening: 6px; marge bovenaan: 4px; } .bvs-pil { lettergrootte: 11px; opvulling: 4px 8px; grensradius: var(--radius-pil); achtergrond: #f3f6ff; rand: 1px effen rgba (15, 35, 52, 0,08); kleur: #111827; } /* 底部 CTA */ .bvs-bottom-cta { marge bovenaan: 28px; achtergrond: lineair verloop (135 graden, #0052cc, #2f7bff); randradius: 20px; opvulling: 18px 18px 16px; kleur: #ffffff; weergave: flex; flex-wrap: wikkel; rechtvaardigen-inhoud: ruimte tussen; opening: 10px; items uitlijnen: centreren; } .bvs-bottom-cta-tekst { lettergrootte: 13px; } .bvs-onder-cta-titel { lettergrootte: 15px; lettertypegewicht: 600; marge-onder: 2px; } .bvs-bottom-cta-sub { lettergrootte: 12px; dekking: 0,9; } .bvs-bottom-cta-acties { weergave: flex; flex-wrap: wikkel; opening: 8px; items uitlijnen: centreren; } .bvs-btn-wit { display: inline-flex; items uitlijnen: centreren; opening: 6px; opvulling: 7px 13px; grensradius: var(--radius-pil); achtergrond: #ffffff; kleur: #0052cc; lettergrootte: 12px; lettertypegewicht: 500; tekstversiering: geen; rand: geen; vakschaduw: 0 4px 14px rgba(0, 0, 0, 0,18); cursor: aanwijzer; witruimte: nowrap; }.bvs-btn-outline-light { display: inline-flex; items uitlijnen: centreren; opening: 6px; opvulling: 7px 13px; grensradius: var(--radius-pil); achtergrond: transparant; kleur: #ffffff; lettergrootte: 12px; lettertypegewicht: 500; rand: 1px effen rgba (255, 255, 255, 0,7); cursor: aanwijzer; witruimte: nowrap; tekstversiering: geen; } .bvs-btn-wit SVG, .bvs-btn-outline-light SVG { breedte: 15px; hoogte: 15px; } .bvs-aanpassing-image-wrapper { marge bovenaan: 10px; marge-onder: 4px; } .bvs-maatwerk-image-inner { grensradius: 18px; overloop: verborgen; } .bvs-maatwerk-image { weergave: blok; breedte: 100%; hoogte: automatisch; passend bij object: deksel; } </stijl> <main class="bvs-pagina"> <!-- Held:服务与定制总览 --> <section class="bvs-held"> <div> <div class="bvs-hero-label"> <span class="bvs-hero-dot"></span> <span>Service- enamp; Maatwerk</span> </div> <h1 class="bvs-hero-title"> Wereldleider in one-stop-intelligente visieoplossingen </h1> <p class="bvs-hero-text"> BVS biedt OEM/ODM-aanpassing, flexibele configuratie en betrouwbare ondersteuning – van concept en prototype tot massaproductie en after-sales service voor wereldwijde klanten. </p> <div class="bvs-hero-tags"> <span class="bvs-tag"> <span class="bvs-tag-dot"></span> <span>OEM/ODM-projecten</span> </span> <span class="bvs-tag"> <span class="bvs-tag-dot"></span> <span>Touch AIO · Paneel-pc · POS · Mini-pc</span> </span> <span class="bvs-tag"> <span class="bvs-tag-dot"></span> <span>ISO9001 · ISO14001 · CE · FCC · RoHS · CCC</span> </span> </div> <div class="bvs-hero-ctas"> <a class="bvs-btn-primary" href="https://www.lcdbvs.com/pages/contact-us" target="_blank" rel="noopener"> <span>Vraag een oplossing op maat aan</span> <svg viewbox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M5 10H15" stroke="white" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"></path> <pad d="M10 5L15 10L10 15" stroke="white" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"></path> </svg> </a> </div> <div class="bvs-hero-meta"> Opgericht in 2008 · Shenzhen & Fabrieken in Guangzhou · Magazijn in Hong Kong · Bedienen van industriële en commerciële klanten over de hele wereld. </div> </div> <aside class="bvs-hero-right"> <div class="bvs-hero-right-title">Waarmee we u kunnen helpen</div> <ul class="bvs-hero-right-list"> <li> <span class="bvs-bullet">✓</span> <span>Op maat gemaakte alles-in-één-pc's, panel-pc's, Android-/Windows-terminals en kassasystemen.</span> </li> <li> <span class="bvs-bullet">✓</span> <span>Hardwareconfiguratie, I/O-aanpassing, behuizingsontwerp en merkopties.</span> </li> <li> <span class="bvs-bullet">✓</span> <span>Voorbeeldopbouw, proefrun en stabiele massaproductie met kwaliteitscontrole.</span> </li> <li> <span class="bvs-bullet">✓</span> <span>After-sales en technische ondersteuning voor wereldwijde implementaties.</span> </li> </ul> </terzijde> </sectie> <!-- Sectie 1: Serviceoverzicht --> <section class="bvs-sectie"> <div class="bvs-section-header"> <div class="bvs-section-eyebrow">Diensten</div><h2 class="bvs-section-title">Wat de BVS-service omvat</h2> <p class="bvs-section-text"> Ons team ondersteunt uw project in elke fase: van de vroege bespreking van de vereisten tot de levenscyclusondersteuning op lange termijn voor industriële en commerciële toepassingen. </p> </div> <div class="bvs-services-grid"> <article class="bvs-servicekaart"> <div class="bvs-service-title">Reisadvies</div> <div class="bvs-service-caption">Verduidelijk uw scenario en technische behoeften.</div> <ul class="bvs-service-lijst"> <li>Applicatieanalyse en omgevingsbeoordeling.</li> <li>Interface-, I/O- en prestatieplanning.</li> <li>Discussie over naleving en certificering.</li> </ul> </artikel> <article class="bvs-servicekaart"> <div class="bvs-service-title">OEM/ODM maatwerk</div> <div class="bvs-service-caption">Hardware en uitstraling op maat.</div> <ul class="bvs-service-lijst"> <li>CPU-, RAM-, opslag- en I/O-configuratie.</li> <li>Behuizing, montage en ontwerp van de voorkant.</li> <li>Logo afdrukken en verpakking aanpassen.</li> </ul> </artikel> <article class="bvs-servicekaart"> <div class="bvs-service-title">Voorbeeld & prototypen</div> <div class="bvs-service-caption">Valideer uw idee op echte hardware.</div> <ul class="bvs-service-lijst"> <li>Voorbeeldbuild op basis van bevestigde specificaties.</li> <li>Ondersteuning voor compatibiliteit en veldtesten.</li> <li>Iteratie op basis van uw feedback.</li> </ul> </artikel> <article class="bvs-servicekaart"> <div class="bvs-service-title">Piloot & massaproductie</div> <div class="bvs-service-caption">Schaal op met stabiele kwaliteit.</div> <ul class="bvs-service-lijst"> <li>Proefdraaien om het proces en de opbrengst af te stemmen.</li> <li>Massaproductie met ISO9001-systeem.</li> <li>Flexibele batchindeling en logistiek.</li> </ul> </artikel> <article class="bvs-servicekaart"> <div class="bvs-service-title">Kwaliteit & certificering</div> <div class="bvs-service-caption">Ontworpen voor mondiale markten.</div> <ul class="bvs-service-lijst"> <li>ISO9001, ISO14001 managementsysteem.</li> <li>Ondersteuning voor naleving van CE, FCC, RoHS, CCC.</li> <li>Inbrandings- en betrouwbaarheidstestplannen.</li> </ul> </artikel> <article class="bvs-servicekaart"> <div class="bvs-service-title">After-sales & technische ondersteuning</div> <div class="bvs-service-caption">Houd uw implementatie draaiende.</div> <ul class="bvs-service-lijst"> <li>Technische probleemoplossing op afstand.</li> <li>Ondersteuning voor firmware-/BIOS-configuratie.</li> <li>Reserve-eenheden en samenwerking op lange termijn.</li> </ul> </artikel> </div> </sectie> <!-- Sectie 2: Aanpassingsproces --> <section class="bvs-sectie"> <div class="bvs-section-header"> <div class="bvs-section-eyebrow">Proces</div> <h2 class="bvs-section-title">Hoe ons aanpassingsproces werkt</h2> <p class="bvs-section-text"> We volgen een duidelijke, door engineering aangestuurde workflow om ervoor te zorgen dat uw OEM/ODM-project op tijd en volgens de specificaties wordt opgeleverd – van vereisten, ontwerp, monster, pilotrun tot massaproductie. </p></div> <div class="bvs-process"> <div class="bvs-process-header"> <div class="bvs-process-title">Van idee tot stabiele productie</div> <div class="bvs-process-badge">Projectstroom in 4 stappen</div> </div> <div class="bvs-process-steps"> <div class="bvs-stap"> <div class="bvs-step-index">1</div> <div class="bvs-step-title">Vereisten</div> <div class="bvs-step-text"> Wij werken met uw team om de applicatie, omgeving, interfaces, prestatiedoelstellingen, certificeringen en voorspelde volumes te begrijpen. </div> </div> <div class="bvs-stap"> <div class="bvs-step-index">2</div> <div class="bvs-step-title">Ontwerp & voorstel</div> <div class="bvs-step-text"> Onze ingenieurs ontwerpen hardware, structuur en I/O en stellen een stuklijst voor met opties voor CPU, display, touch, behuizing en montage. </div> </div> <div class="bvs-stap"> <div class="bvs-step-index">3</div> <div class="bvs-step-title">Prototype & validatie</div> <div class="bvs-step-text"> We bouwen voorbeelden voor uw laboratorium- en veldtests, helpen bij het besturingssysteemimage, stuurprogramma's en instellingen, en verfijnen op basis van feedback. </div> </div> <div class="bvs-stap"> <div class="bvs-step-index">4</div> <div class="bvs-step-title">Pilot & massaproductie</div> <div class="bvs-step-text"> Een proefrun verifieert de productielijn, waarna een stabiele massaproductie wordt gelanceerd met continue kwaliteitscontrole en traceerbaarheid. </div> </div> </div> </div> </sectie> <!-- Sectie 3: Compatibiliteit en industrieën --> <section class="bvs-sectie"> <div class="bvs-section-header"> <div class="bvs-section-eyebrow">Aanpassingsopties</div> <h2 class="bvs-section-title">Wat u kunt aanpassen met BVS</h2> <p class="bvs-section-text"> Of u nu een industriële panel-pc nodig heeft voor veeleisende omgevingen of een strak touch-kassasysteem voor de detailhandel, wij bieden flexibele hardware- en mechanische opties die zijn afgestemd op uw toepassing. </p> </div> <div class="bvs-customization-image-wrapper"> <div class="bvs-customization-image-inner"> <img src="https://cdn.shopify.com/s/files/1/0582/4351/4577/files/Service_Customization.jpg?v=1784533809" alt="BVS-aanpassingsopties voor industriële panel-pc's, kassasystemen en mini-pc's" class="bvs-customization-image"> </div> </div> <div class="bvs-two-col"> <div class="bvs-box"> <div class="bvs-box-title">Hardware & mechanisch maatwerk</div> <p class="bvs-box-text"> Kies de kernhardware en mechanische details die bij uw project passen, terwijl u een betrouwbare toeleveringsketen voor de lange termijn behoudt. </p> <ul class="bvs-pillenlijst"> <li class="bvs-pill">CPU-platform & prestatieniveau</li> <li class="bvs-pill">RAM & opslagcapaciteit</li> <li class="bvs-pill">Schermgrootte & helderheid</li> <li class="bvs-pill">Aanraaktype (PCAP / resistief)</li> <li class="bvs-pill">I/O-poorten & uitbreiding</li> <li class="bvs-pill">Montage (paneel, VESA, desktop, muur)</li> <li class="bvs-pill">Kleur behuizing & materiaal</li> <li class="bvs-pill">Logo, etiket & verpakking</li> </ul> </div> <div class="bvs-box"> <div class="bvs-box-title">Typische toepassingsscenario's</div> <p class="bvs-box-text"> BVS-producten worden gebruikt in een breed scala aan industriële en commerciële omgevingen die 24/7 werking en stabiele prestaties vereisen. </p><ul class="bvs-pillenlijst"> <li class="bvs-pill">Industriële automatisering & machines</li> <li class="bvs-pill">Slimme productie & MES-terminals</li> <li class="bvs-pill">Zelfbedieningskiosken & kaartverkoop</li> <li class="bvs-pill">Retail POS & kassa's</li> <li class="bvs-pill">Gastvrijheid & restaurantbestelling</li> <li class="bvs-pill">Transport & logistieke terminals</li> <li class="bvs-pill">Narrowcasting & informatieweergave</li> </ul> </div> </div> </sectie> <!-- 底部 CTA:引导联系与下载 --> <section class="bvs-bottom-cta"> <div class="bvs-bottom-cta-text"> <div class="bvs-bottom-cta-title">Klaar om uw OEM / ODM-project te starten met BVS?</div> <div class="bvs-bottom-cta-sub"> Deel uw wensen en ons team neemt contact met u op met een voorstel op maat voor touch-pc's, kassasystemen, mini-pc's of industriële monitoren. </div> </div> <div class="bvs-bottom-cta-actions"> <a class="bvs-btn-white" href="https://www.lcdbvs.com/pages/contact-us" target="_blank" rel="noopener"> <span>Neem contact op met BVS</span> <svg viewbox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d = "M5 10H15" stroke = "#0052cc" stroke-width = "1.6" stroke-linecap = "round" stroke-linejoin = "round"></path> <path d="M10 5L15 10L10 15" stroke="#0052cc" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"></path> </svg> </a> <a class="bvs-btn-outline-light" href="mailto:lcdbvs@lcdbvs.com"> <span>E-mail: lcdbvs@lcdbvs.com</span> </a> </div> </sectie> </hoofd> </body> </div> </div> </div> </main> <div id="shopify-section-footer" class="shopify-section"><section class="page-footer page-footer--with-sticky-footer" data-section-id="footer" data-section-type="footer" id="click-to-end"> <div class="page-footer__inner sticky-footer"> <div class="container"> <div class="page-width"> <nav class="footer-navigation grid"> <div class="grid__item three-quarters small-down--one-whole"><ul class="nav footer-nav footer-nav--dropdowns grid"> <li class="nav__item footer-nav__item footer-nav--has-submenu grid__item small-down--one-whole one-third"> <a href="/nl/pages/over-lcdbvs-com" class="nav__link footer-nav__link footer-nav__link--top"> Over BVS </a> <ul class="footer-nav__submenu"> <li > <a href="/nl/pages/neem-contact-met-ons-op" class=" nav__link footer-nav__link footer-nav__link--sub">Neem contact met ons op</a> </li> <li > <a href="/nl/pages/oprichter-gina" class=" nav__link footer-nav__link footer-nav__link--sub">Oprichter</a> </li> <li > <a href="/nl/pages/waarom-partner-met-bvs" class=" nav__link footer-nav__link footer-nav__link--sub">Partner eerst</a> </li> <li > <a href="/nl/pages/bvsion-certificaten" class=" nav__link footer-nav__link footer-nav__link--sub">Eer & Certificaten</a> </li> </ul> </li> <li class="nav__item footer-nav__item footer-nav--has-submenu grid__item small-down--one-whole one-third"> <a href="/nl/pages/steun" class="nav__link footer-nav__link footer-nav__link--top"> Productcentrum </a> <ul class="footer-nav__submenu"> <li > <a href="/nl/collections/pos-systemen-pos-randapparatuur" class=" nav__link footer-nav__link footer-nav__link--sub">POS-systemen en POS-randapparatuur</a> </li> <li > <a href="/nl/collections/embedded-box-pcs-edge-pc" class=" nav__link footer-nav__link footer-nav__link--sub">Ingebouwde box-pc's</a> </li> <li > <a href="/nl/collections/ingebed-industrieel-paneel-pcs-aio" class=" nav__link footer-nav__link footer-nav__link--sub">Ingebouwde industriële paneel-pc's</a> </li> <li > <a href="/nl/collections/android-panel-pcs-touchscreen-computers" class=" nav__link footer-nav__link footer-nav__link--sub">Android Panel-pc's</a> </li> <li > <a href="/nl/collections/industriele-monitoren-open-frame-display" class=" nav__link footer-nav__link footer-nav__link--sub">Industriële monitoren</a> </li> <li > <a href="/nl/collections/robuuste-tablets" class=" nav__link footer-nav__link footer-nav__link--sub">Robuuste tabletten</a> </li> </ul> </li> <li class="nav__item footer-nav__item footer-nav--has-submenu grid__item small-down--one-whole one-third"> <a href="/nl" class="nav__link footer-nav__link footer-nav__link--top"> Sollicitatie </a> <ul class="footer-nav__submenu"> <li > <a href="/nl" class=" nav__link footer-nav__link footer-nav__link--sub">Slim hotel</a> </li> <li > <a href="/nl" class=" nav__link footer-nav__link footer-nav__link--sub">Slimme stad</a> </li> <li > <a href="/nl" class=" nav__link footer-nav__link footer-nav__link--sub">Slimme gezondheidszorg</a> </li> <li > <a href="/nl" class=" nav__link footer-nav__link footer-nav__link--sub">Slimme vergadering</a> </li> <li > <a href="/nl" class=" nav__link footer-nav__link footer-nav__link--sub">Slimme productie</a> </li> <li > <a href="/nl" class=" nav__link footer-nav__link footer-nav__link--sub">Kunstmatige intelligentie</a> </li> <li > <a href="/nl" class=" nav__link footer-nav__link footer-nav__link--sub">Slim onderwijs</a> </li> <li > <a href="/nl" class=" nav__link footer-nav__link footer-nav__link--sub">Intelligent transport.</a> </li> </ul> </li> <li class="nav__item footer-nav__item footer-nav--has-submenu grid__item small-down--one-whole one-third"> <a href="/nl/blogs/pers-centrum" class="nav__link footer-nav__link footer-nav__link--top"> Nieuwscentrum </a> <ul class="footer-nav__submenu"> <li > <a href="/nl/blogs/bvs-nieuws" class=" nav__link footer-nav__link footer-nav__link--sub">Bedrijfsnieuws</a> </li> <li > <a href="/nl/blogs/trends-in-de-sector" class=" nav__link footer-nav__link footer-nav__link--sub">Industrietrends</a> </li> </ul> </li> <li class="nav__item footer-nav__item footer-nav--has-submenu grid__item small-down--one-whole one-third"> <a href="/nl/pages/steun" class="nav__link footer-nav__link footer-nav__link--top"> Steun </a> <ul class="footer-nav__submenu"> <li > <a href="/nl/policies/refund-policy" class=" nav__link footer-nav__link footer-nav__link--sub">Terugbetalingsbeleid</a> </li> <li > <a href="/nl/policies/shipping-policy" class=" nav__link footer-nav__link footer-nav__link--sub">Verzendbeleid</a> </li> <li > <a href="/nl/policies/privacy-policy" class=" nav__link footer-nav__link footer-nav__link--sub">Privacybeleid</a> </li> <li > <a href="/nl/policies/terms-of-service" class=" nav__link footer-nav__link footer-nav__link--sub">Servicevoorwaarden</a> </li> <li > <a href="/nl/pages/waarom-partner-met-bvs" class=" nav__link footer-nav__link footer-nav__link--sub">Veelgestelde vragen</a> </li> </ul> </li> </ul> </div> <div class="footer-social-icons grid__item small-down--one-whole one-quarter"> <p class="footer-social-icons__title">Volg ons</p> <div class="social-links "> <ul class="social-links__list"> <li><a aria-label="Facebook" class="facebook" target="_blank" rel="noopener" href="https://www.facebook.com/BVS.Display"><svg aria-hidden="true" focusable="false" role="presentation" class="icon svg-facebook" viewBox="0 0 24 24"><path d="M22.676 0H1.324C.593 0 0 .593 0 1.324v21.352C0 23.408.593 24 1.324 24h11.494v-9.294H9.689v-3.621h3.129V8.41c0-3.099 1.894-4.785 4.659-4.785 1.325 0 2.464.097 2.796.141v3.24h-1.921c-1.5 0-1.792.721-1.792 1.771v2.311h3.584l-.465 3.63H16.56V24h6.115c.733 0 1.325-.592 1.325-1.324V1.324C24 .593 23.408 0 22.676 0"/></svg></a></li> <li><a aria-label="Youtube" class="youtube" target="_blank" rel="noopener" href="https://www.youtube.com/channel/UCtW9nGeqlh1eYBw6xAWC12w"><svg aria-hidden="true" focusable="false" role="presentation" class="icon svg-youtube" viewBox="0 0 24 24"><path class="a" d="M23.495 6.205a3.007 3.007 0 0 0-2.088-2.088c-1.87-.501-9.396-.501-9.396-.501s-7.507-.01-9.396.501A3.007 3.007 0 0 0 .527 6.205a31.247 31.247 0 0 0-.522 5.805 31.247 31.247 0 0 0 .522 5.783 3.007 3.007 0 0 0 2.088 2.088c1.868.502 9.396.502 9.396.502s7.506 0 9.396-.502a3.007 3.007 0 0 0 2.088-2.088 31.247 31.247 0 0 0 .5-5.783 31.247 31.247 0 0 0-.5-5.805zM9.609 15.601V8.408l6.264 3.602z"/></svg></a></li> <li><a aria-label="Instagram" class="instagram" target="_blank" rel="noopener" href="https://www.instagram.com/lcdbvs/"><svg aria-hidden="true" focusable="false" role="presentation" class="icon svg-instagram" viewBox="0 0 24 24"><path d="M12 0C8.74 0 8.333.015 7.053.072 5.775.132 4.905.333 4.14.63c-.789.306-1.459.717-2.126 1.384S.935 3.35.63 4.14C.333 4.905.131 5.775.072 7.053.012 8.333 0 8.74 0 12s.015 3.667.072 4.947c.06 1.277.261 2.148.558 2.913a5.885 5.885 0 0 0 1.384 2.126A5.868 5.868 0 0 0 4.14 23.37c.766.296 1.636.499 2.913.558C8.333 23.988 8.74 24 12 24s3.667-.015 4.947-.072c1.277-.06 2.148-.262 2.913-.558a5.898 5.898 0 0 0 2.126-1.384 5.86 5.86 0 0 0 1.384-2.126c.296-.765.499-1.636.558-2.913.06-1.28.072-1.687.072-4.947s-.015-3.667-.072-4.947c-.06-1.277-.262-2.149-.558-2.913a5.89 5.89 0 0 0-1.384-2.126A5.847 5.847 0 0 0 19.86.63c-.765-.297-1.636-.499-2.913-.558C15.667.012 15.26 0 12 0zm0 2.16c3.203 0 3.585.016 4.85.071 1.17.055 1.805.249 2.227.415.562.217.96.477 1.382.896.419.42.679.819.896 1.381.164.422.36 1.057.413 2.227.057 1.266.07 1.646.07 4.85s-.015 3.585-.074 4.85c-.061 1.17-.256 1.805-.421 2.227a3.81 3.81 0 0 1-.899 1.382 3.744 3.744 0 0 1-1.38.896c-.42.164-1.065.36-2.235.413-1.274.057-1.649.07-4.859.07-3.211 0-3.586-.015-4.859-.074-1.171-.061-1.816-.256-2.236-.421a3.716 3.716 0 0 1-1.379-.899 3.644 3.644 0 0 1-.9-1.38c-.165-.42-.359-1.065-.42-2.235-.045-1.26-.061-1.649-.061-4.844 0-3.196.016-3.586.061-4.861.061-1.17.255-1.814.42-2.234.21-.57.479-.96.9-1.381.419-.419.81-.689 1.379-.898.42-.166 1.051-.361 2.221-.421 1.275-.045 1.65-.06 4.859-.06l.045.03zm0 3.678a6.162 6.162 0 1 0 0 12.324 6.162 6.162 0 1 0 0-12.324zM12 16c-2.21 0-4-1.79-4-4s1.79-4 4-4 4 1.79 4 4-1.79 4-4 4zm7.846-10.405a1.441 1.441 0 0 1-2.88 0 1.44 1.44 0 0 1 2.88 0z"/></svg></a></li> <li><a aria-label="Tiktok" class="tiktok" target="_blank" rel="noopener" href="https://www.tiktok.com/@lcdbvs.com"><svg class="icon svg-tiktok" width="15" height="16" viewBox="0 0 15 16" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="currentColor" d="M7.63849 0.0133333C8.51182 0 9.37849 0.00666667 10.2452 0C10.2985 1.02 10.6652 2.06 11.4118 2.78C12.1585 3.52 13.2118 3.86 14.2385 3.97333V6.66C13.2785 6.62667 12.3118 6.42667 11.4385 6.01333C11.0585 5.84 10.7052 5.62 10.3585 5.39333C10.3518 7.34 10.3652 9.28667 10.3452 11.2267C10.2918 12.16 9.98516 13.0867 9.44516 13.8533C8.57183 15.1333 7.05849 15.9667 5.50516 15.9933C4.55183 16.0467 3.59849 15.7867 2.78516 15.3067C1.43849 14.5133 0.491825 13.06 0.351825 11.5C0.338492 11.1667 0.331825 10.8333 0.345158 10.5067C0.465158 9.24 1.09183 8.02667 2.06516 7.2C3.17183 6.24 4.71849 5.78 6.16516 6.05333C6.17849 7.04 6.13849 8.02667 6.13849 9.01333C5.47849 8.8 4.70516 8.86 4.12516 9.26C3.70516 9.53333 3.38516 9.95333 3.21849 10.4267C3.07849 10.7667 3.11849 11.14 3.12516 11.5C3.28516 12.5933 4.33849 13.5133 5.45849 13.4133C6.20516 13.4067 6.91849 12.9733 7.30516 12.34C7.43182 12.12 7.57182 11.8933 7.57849 11.6333C7.64516 10.44 7.61849 9.25333 7.62516 8.06C7.63182 5.37333 7.61849 2.69333 7.63849 0.0133333Z"></path></svg> </a></li> <li> <a aria-label="Linkedin" class="social-custom" target="_blank" rel="noopener nofollow" href="https://www.linkedin.com/company/shenzhen-bvsion-technology-co-ltd/mycompany/?viewAsMember=true"> <img src="//www.lcdbvs.com/cdn/shop/files/linkedin_0665cab9-c869-4231-9356-d3f4649ed869_48x.png?v=1652410574" alt="Linkedin" width="60" height="60"/> </a> </li> </ul> </div> <!--关注我们--> <!--whatsapp--> <a class="listitem-pic" href="https://api.whatsapp.com/send/?phone=85293737704&text&type=phone_number&app_absent=0" target="_blank" rel="nofollow noopener noreferrer" data-wa-location="footer"> <img src="https://cdn.shopify.com/s/files/1/0582/4351/4577/files/WhatsApp_670a2cfd-0ae3-42a3-9f33-84c7a7771182.png?v=1783591715" class="socialMedia-icon" width=24px/> </a> <!--关注我们--> <div class="footer-contact-info"> <p><strong>Teams:</strong>bvsion</p> <p><strong>Email:</strong> <a href="mailto:lcdbvs@lcdbvs.com">lcdbvs@lcdbvs.com</a></p> <p><strong>Tel:</strong> <a href="tel:+8675523059953">(86) 755 23059953</a></p> <p><strong>Factory address:</strong> Building 9, Huafeng Science and Technology Park, Bao'an District, Shenzhen, Guangdong, China</p> </div> </div> </nav> <footer class="page-footer__end"> <div> </div> <div><div class="footer-localization"> <form method="post" action="/nl/localization" id="localization_form_footer" accept-charset="UTF-8" class="selectors-form" enctype="multipart/form-data"><input type="hidden" name="form_type" value="localization" /><input type="hidden" name="utf8" value="✓" /><input type="hidden" name="_method" value="put" /><input type="hidden" name="return_to" value="/nl/pages/service-aanpassing" /><div class="selectors-form__item"> <h2 class="visually-hidden" id="lang-heading-footer"> Taal </h2> <div class="disclosure" data-disclosure-locale> <button type="button" class="disclosure__toggle" aria-expanded="false" aria-controls="lang-list-footer" aria-describedby="lang-heading-footer" data-disclosure-toggle> Nederlands <span class="disclosure__toggle-arrow" role="presentation"><svg aria-hidden="true" focusable="false" role="presentation" class="icon feather-icon feather-chevron-down" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg> </span> </button> <ul id="lang-list-footer" class="disclosure-list" data-disclosure-list> <li class="disclosure-list__item "> <a class="disclosure-list__option" href="#" lang="en" data-value="en" data-disclosure-option> English </a> </li> <li class="disclosure-list__item "> <a class="disclosure-list__option" href="#" lang="de" data-value="de" data-disclosure-option> Deutsch </a> </li> <li class="disclosure-list__item "> <a class="disclosure-list__option" href="#" lang="ja" data-value="ja" data-disclosure-option> 日本語 </a> </li> <li class="disclosure-list__item "> <a class="disclosure-list__option" href="#" lang="fr" data-value="fr" data-disclosure-option> français </a> </li> <li class="disclosure-list__item "> <a class="disclosure-list__option" href="#" lang="ko" data-value="ko" data-disclosure-option> 한국어 </a> </li> <li class="disclosure-list__item "> <a class="disclosure-list__option" href="#" lang="es" data-value="es" data-disclosure-option> Español </a> </li> <li class="disclosure-list__item "> <a class="disclosure-list__option" href="#" lang="it" data-value="it" data-disclosure-option> Italiano </a> </li> <li class="disclosure-list__item "> <a class="disclosure-list__option" href="#" lang="pt-PT" data-value="pt-PT" data-disclosure-option> português (Portugal) </a> </li> <li class="disclosure-list__item "> <a class="disclosure-list__option" href="#" lang="ru" data-value="ru" data-disclosure-option> русский </a> </li> <li class="disclosure-list__item "> <a class="disclosure-list__option" href="#" lang="vi" data-value="vi" data-disclosure-option> Tiếng Việt </a> </li> <li class="disclosure-list__item disclosure-list__item--current"> <a class="disclosure-list__option" href="#" lang="nl" aria-current="true" data-value="nl" data-disclosure-option> Nederlands </a> </li> <li class="disclosure-list__item "> <a class="disclosure-list__option" href="#" lang="th" data-value="th" data-disclosure-option> ภาษาไทย </a> </li> <li class="disclosure-list__item "> <a class="disclosure-list__option" href="#" lang="tr" data-value="tr" data-disclosure-option> Türkçe </a> </li></ul> <input type="hidden" name="locale_code" id="LocaleSelector-footer" value="nl" data-disclosure-input/> </div> </div></form> </div> </div> </footer> </div> </div> </div> </section> </div> <div id="shopify-section-popup" class="shopify-section section-popup"> </div> <div class="floating-contact floating-contact--open" id="floating-contact" data-msg-required="Please fill in this field." data-msg-email="Please enter a valid email." data-msg-country-code="Please select a country code." data-msg-send-timeout="Sending is taking too long. Please check your network and try again." data-msg-confirm-send-download="Click Send to notify us and download the file."> <div class="floating-contact__rail"> <div class="bvs-floating-whatsapp"> <a href="https://wa.me/85293737704" class="bvs-whatsapp-icon-link" target="_blank" aria-label="Chat on WhatsApp" rel="noopener" data-wa-location="floating"> <svg viewBox="0 0 448 512" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M380.9 97.1C339 55.1 283.2 32 223.9 32c-122.4 0-222 99.6-222 222 0 39.1 10.2 77.3 29.6 111L0 480l117.7-30.9c32.4 17.7 68.9 27 106.1 27h.1c122.3 0 224.1-99.6 224.1-222 0-59.3-25.2-115-67.1-157zm-157 341.6c-33.2 0-65.7-8.9-94-25.7l-6.7-4-69.8 18.3L72 359.2l-4.4-7c-18.5-29.4-28.2-63.3-28.2-98.2 0-101.7 82.8-184.5 184.6-184.5 49.3 0 95.6 19.2 130.4 54.1 34.8 34.9 56.2 81.2 56.1 130.5 0 101.8-84.9 184.6-186.6 184.6zm101.2-138.2c-5.5-2.8-32.8-16.2-37.9-18-5.1-1.9-8.8-2.8-12.5 2.8-3.7 5.6-14.3 18-17.6 21.8-3.2 3.7-6.5 4.2-12 1.4-32.6-16.3-54-29.1-75.5-66-5.7-9.8 5.7-9.1 16.3-30.3 1.8-3.7.9-6.9-.5-9.7-1.4-2.8-12.5-30.1-17.1-41.2-4.5-10.8-9.1-9.3-12.5-9.5-3.2-.2-6.9-.2-10.6-.2-3.7 0-9.7 1.4-14.8 6.9-5.1 5.6-19.4 19-19.4 46.3 0 27.3 19.9 53.7 22.6 57.4 2.8 3.7 39.1 59.7 94.8 83.8 35.2 15.2 49 16.5 66.6 13.9 10.7-1.6 32.8-13.4 37.4-26.4 4.6-13 4.6-24.1 3.2-26.4-1.3-2.5-5-3.9-10.5-6.6z"></path></svg> </a> </div> <button type="button" class="floating-contact__tab" id="floating-contact-tab" aria-expanded="true" aria-controls="floating-contact-panel"> <span class="floating-contact__tab-label">Match mijn behoeften</span> </button> </div> <div class="floating-contact__panel" id="floating-contact-panel"> <div class="floating-contact__header"> <div class="floating-contact__title" id="floating-contact-panel-title">Match mijn behoeften</div> <button type="button" class="floating-contact__close btn btn--plain" aria-label="Dichtbij"> <span class="feather-icon"><svg aria-hidden="true" focusable="false" role="presentation" class="icon feather-x" viewBox="0 0 24 24"><path d="M18 6L6 18M6 6l12 12"/></svg></span> </button> </div> <div class="floating-contact__loading" data-match-needs-loading hidden aria-live="polite" aria-busy="false"> <div class="floating-contact__loading-spinner" aria-hidden="true"></div> <p class="floating-contact__loading-text">Sending…</p> </div> <div class="floating-contact__success-view" data-match-needs-success-view hidden> <div class="form-success floating-contact__success" data-match-needs-success> <p class="floating-contact__success-text">Bedankt om ons te contacteren. Wij nemen zo snel mogelijk contact met u op.</p> <p class="floating-contact__success-cta"> <a class="standard-link floating-contact__stock-link" href="/nl/pages/service-aanpassing" data-check-stock-link> Check Stock Here → </a> </p> </div> <p class="floating-contact__download-fallback" data-pending-download-fallback hidden> <a class="standard-link" href="#" target="_blank" rel="noopener">Click here to download</a> </p> </div> <form method="post" action="/nl/contact#floating-contact-form" id="floating-contact-form" accept-charset="UTF-8" class="floating-contact__form"><input type="hidden" name="form_type" value="contact" /><input type="hidden" name="utf8" value="✓" /> <div class="input-wrapper form-row" data-field> <label for="FloatingContactFormName"> Naam<span class="floating-contact__required" aria-hidden="true">*</span> </label> <input type="text" name="contact[name]" id="FloatingContactFormName" required value=""> <p class="floating-contact__error" data-error hidden>Please fill in this field.</p> </div> <div class="input-wrapper form-row" data-field> <label for="FloatingContactFormEmail"> E-mail<span class="floating-contact__required" aria-hidden="true">*</span> </label> <input type="email" name="contact[email]" id="FloatingContactFormEmail" required value="" spellcheck="false" autocomplete="off" autocapitalize="off"> <p class="floating-contact__error" data-error hidden>Please enter a valid email.</p> </div> <div class="input-wrapper form-row" data-field data-phone-field> <label for="FloatingContactFormPhone"> Telefoonnummer<span class="floating-contact__required" aria-hidden="true">*</span> </label> <div class="floating-contact__phone-row"> <label class="visually-hidden" for="FloatingContactFormPhoneCode">Code</label> <select id="FloatingContactFormPhoneCode" data-phone-country-code required aria-label="Code"> <option value="">Code</option> <option value="+86">+86 China</option> <option value="+852">+852 Hong Kong</option> <option value="+853">+853 Macao</option> <option value="+886">+886 Taiwan</option> <option value="+1">+1 USA / Canada</option> <option value="+44">+44 United Kingdom</option> <option value="+49">+49 Germany</option> <option value="+33">+33 France</option> <option value="+39">+39 Italy</option> <option value="+34">+34 Spain</option> <option value="+31">+31 Netherlands</option> <option value="+32">+32 Belgium</option> <option value="+41">+41 Switzerland</option> <option value="+43">+43 Austria</option> <option value="+45">+45 Denmark</option> <option value="+46">+46 Sweden</option> <option value="+47">+47 Norway</option> <option value="+48">+48 Poland</option> <option value="+351">+351 Portugal</option> <option value="+353">+353 Ireland</option> <option value="+358">+358 Finland</option> <option value="+7">+7 Russia</option> <option value="+81">+81 Japan</option> <option value="+82">+82 South Korea</option> <option value="+91">+91 India</option> <option value="+61">+61 Australia</option> <option value="+64">+64 New Zealand</option> <option value="+65">+65 Singapore</option> <option value="+60">+60 Malaysia</option> <option value="+66">+66 Thailand</option> <option value="+84">+84 Vietnam</option> <option value="+62">+62 Indonesia</option> <option value="+63">+63 Philippines</option> <option value="+971">+971 UAE</option> <option value="+966">+966 Saudi Arabia</option> <option value="+972">+972 Israel</option> <option value="+90">+90 Turkey</option> <option value="+55">+55 Brazil</option> <option value="+52">+52 Mexico</option> <option value="+54">+54 Argentina</option> <option value="+27">+27 South Africa</option> <option value="+234">+234 Nigeria</option> <option value="+20">+20 Egypt</option> </select> <input type="tel" id="FloatingContactFormPhone" data-phone-local required placeholder="Phone number" inputmode="numeric" autocomplete="tel-national"> <input type="hidden" name="contact[phone]" data-phone-combined value=""> </div> <p class="floating-contact__error" data-error hidden>Please fill in this field.</p> </div> <div class="input-wrapper form-row" data-field data-optional> <label for="FloatingContactFormWhatsapp"> WhatsApp </label> <input type="tel" name="contact[whatsapp]" id="FloatingContactFormWhatsapp" placeholder="" inputmode="tel" autocomplete="off" value=""> <p class="floating-contact__error" data-error hidden>Please fill in this field.</p> </div> <div class="input-wrapper form-row" data-field> <label for="FloatingContactFormCompany"> Company<span class="floating-contact__required" aria-hidden="true">*</span> </label> <input type="text" name="contact[company]" id="FloatingContactFormCompany" required value=""> <p class="floating-contact__error" data-error hidden>Please fill in this field.</p> </div> <div class="input-wrapper form-row floating-contact__message-row" data-field> <label for="FloatingContactFormMessage"> Waarmee kunnen wij u helpen?<span class="floating-contact__required" aria-hidden="true">*</span> </label> <textarea rows="3" name="contact[body]" id="FloatingContactFormMessage" required></textarea> <p class="floating-contact__error" data-error hidden>Please fill in this field.</p> </div> <div class="row"> <input type="submit" class="contact-form__submit btn" value="Verstuur"> </div> </form> <p class="floating-contact__send-status" data-match-needs-send-status hidden></p> </div> </div> <button type="button" class="back-to-top" id="back-to-top" aria-label="Back to top" hidden></button> <script> (function () { var root = document.getElementById('floating-contact'); var panel = document.getElementById('floating-contact-panel'); if (!root || root.dataset.initialized === 'true') return; root.dataset.initialized = 'true'; var tab = document.getElementById('floating-contact-tab'); var closeBtn = root.querySelector('.floating-contact__close'); var floatingForm = document.getElementById('floating-contact-form'); var panelPlaceholder = document.createComment('floating-contact-panel-placeholder'); var pendingDownloadUrl = null; var pendingDownloadName = null; if (panel) { root.insertBefore(panelPlaceholder, panel); } var PENDING_DOWNLOAD_KEY = 'bvsPendingMatchNeedsDownload'; var MATCH_NEEDS_COMPLETED_KEY = 'bvsMatchNeedsCompleted'; var FORM_DATA_KEY = 'bvsMatchNeedsFormData'; var RETURN_URL_KEY = 'bvsMatchNeedsReturnUrl'; var SENDING_KEY = 'bvsMatchNeedsSending'; var SUCCESS_KEY = 'bvsMatchNeedsShowSuccess'; var SEND_TRACKED_KEY = 'bvsMatchNeedsSendTracked'; var sendingTimeoutId = null; var captchaPollId = null; var SENDING_TIMEOUT_MS = 30000; function markPendingSuccess() { try { sessionStorage.setItem(SUCCESS_KEY, '1'); } catch (e) {} } function consumePendingSuccessFlag() { try { var pending = sessionStorage.getItem(SUCCESS_KEY) === '1'; if (pending) sessionStorage.removeItem(SUCCESS_KEY); return pending; } catch (e) { return false; } } function getSuccessView() { return (panel && panel.querySelector('[data-match-needs-success-view]')) || (root && root.querySelector('[data-match-needs-success-view]')); } function showSuccessView(form) { var view = getSuccessView(); var targetForm = form || floatingForm; hideSendingLoading(targetForm); setSendStatus(targetForm, ''); if (view) view.hidden = false; if (targetForm) targetForm.hidden = true; markMatchNeedsCompleted(); wireCheckStockLink(panel || targetForm); openPanel(); } function showFormView(options) { options = options || {}; var view = getSuccessView(); if (view) view.hidden = true; if (floatingForm) { floatingForm.hidden = false; if (!options.skipReset && floatingForm.reset) floatingForm.reset(); if (options.restoreSaved) restoreFormData(floatingForm); } hideSendingLoading(floatingForm); setSendStatus(floatingForm, ''); } function getLoadingEl() { return (panel && panel.querySelector('[data-match-needs-loading]')) || (root && root.querySelector('[data-match-needs-loading]')); } function getSendStatusEl(form) { return (form && form.querySelector('[data-match-needs-send-status]')) || (panel && panel.querySelector('[data-match-needs-send-status]')); } function setSendStatus(form, message) { var status = getSendStatusEl(form); if (!status) return; if (!message) { status.hidden = true; status.textContent = ''; return; } status.hidden = false; status.textContent = message; } function clearCaptchaPoll() { if (captchaPollId) { window.clearInterval(captchaPollId); captchaPollId = null; } } function hasVisibleCaptchaChallenge() { return !!( document.querySelector('.shopify-challenge__container') || document.querySelector('.h-captcha iframe') || document.querySelector('.g-recaptcha iframe') || document.querySelector('iframe[src*="hcaptcha"]') || document.querySelector('iframe[src*="recaptcha"]') || document.querySelector('iframe[src*="captcha"]') ); } function restoreBodyFromSaved(form) { var target = form || floatingForm; var bodyInput = target && target.querySelector('[name="contact[body]"]'); if (!bodyInput) return; var saved = readFormData(); if (saved && saved.body) { bodyInput.value = saved.body; return; } bodyInput.value = stripBodyPrefixes(bodyInput.value); } function clearSendingTimeout() { if (sendingTimeoutId) { window.clearTimeout(sendingTimeoutId); sendingTimeoutId = null; } } function setFormSendingState(form, isSending) { if (!form) return; form.classList.toggle('is-sending', !!isSending); var submitBtn = form.querySelector('[type="submit"], .contact-form__submit'); if (submitBtn) { if (isSending) { submitBtn.setAttribute('aria-busy', 'true'); } else { submitBtn.removeAttribute('aria-busy'); } } } function showSendingLoading(form) { setSendStatus(form, ''); var loading = getLoadingEl(); if (loading) { loading.hidden = false; loading.setAttribute('aria-busy', 'true'); } if (panel) panel.classList.add('floating-contact__panel--loading'); setFormSendingState(form || floatingForm, true); try { sessionStorage.setItem(SENDING_KEY, '1'); } catch (e) {} clearSendingTimeout(); clearCaptchaPoll(); // If Shopify CAPTCHA UI appears, drop the overlay so the user can complete it. captchaPollId = window.setInterval(function () { if (!hasVisibleCaptchaChallenge()) return; clearCaptchaPoll(); hideSendingLoading(form || floatingForm); setSendStatus( form || floatingForm, 'Please complete the verification, then click Send.' ); }, 250); sendingTimeoutId = window.setTimeout(function () { clearCaptchaPoll(); // Page never navigated (CAPTCHA / network stall). Unlock UI. hideSendingLoading(form || floatingForm); restoreBodyFromSaved(form || floatingForm); setSendStatus( form || floatingForm, (root && root.getAttribute('data-msg-send-timeout')) || 'Sending is taking too long. Please try again.' ); }, SENDING_TIMEOUT_MS); } function hideSendingLoading(form) { clearSendingTimeout(); clearCaptchaPoll(); var loading = getLoadingEl(); if (loading) { loading.hidden = true; loading.setAttribute('aria-busy', 'false'); } if (panel) panel.classList.remove('floating-contact__panel--loading'); setFormSendingState(form || floatingForm, false); try { sessionStorage.removeItem(SENDING_KEY); } catch (e) {} } function cleanReturnUrl(url) { if (!url) return ''; try { var parsed = new URL(url, window.location.origin); parsed.searchParams.delete('contact_posted'); parsed.searchParams.delete('mn_sent'); parsed.hash = ''; return parsed.pathname + parsed.search; } catch (e) { return String(url).split('#')[0]; } } function buildReturnToUrl(url) { // Shopify only redirects to return_to after a successful contact submit (email sent). var cleaned = cleanReturnUrl(url || getReturnUrl() || window.location.pathname); try { var parsed = new URL(cleaned, window.location.origin); parsed.searchParams.set('mn_sent', '1'); return parsed.pathname + parsed.search; } catch (e) { return cleaned + (cleaned.indexOf('?') >= 0 ? '&' : '?') + 'mn_sent=1'; } } function isSuccessfulContactReturn() { try { var params = new URLSearchParams(window.location.search); return params.get('mn_sent') === '1' || params.get('contact_posted') === 'true'; } catch (e) { return false; } } function clearSuccessQueryParam() { try { var parsed = new URL(window.location.href); if (!parsed.searchParams.has('mn_sent') && !parsed.searchParams.has('contact_posted')) return; parsed.searchParams.delete('mn_sent'); parsed.searchParams.delete('contact_posted'); window.history.replaceState({}, '', parsed.pathname + parsed.search + parsed.hash); } catch (e) {} } function saveReturnUrl(url) { var cleaned = cleanReturnUrl(url || window.location.href); if (!cleaned) return; try { sessionStorage.setItem(RETURN_URL_KEY, cleaned); } catch (e) {} } function getReturnUrl() { try { var stored = sessionStorage.getItem(RETURN_URL_KEY); if (stored) return stored; } catch (e) {} return cleanReturnUrl(window.location.href); } function resolveProductReturnUrl(trigger) { if (trigger) { var productLink = trigger.closest('.product-block, .quickbuy, .grid-product, [data-product-url]'); if (productLink) { var href = productLink.getAttribute('data-product-url') || (productLink.querySelector('a[href*="/products/"]') && productLink.querySelector('a[href*="/products/"]').getAttribute('href')); if (href) return cleanReturnUrl(href); } var triggerHref = trigger.getAttribute('href') || ''; if (triggerHref.indexOf('/products/') !== -1) return cleanReturnUrl(triggerHref); } if (window.location.pathname.indexOf('/products/') !== -1) { return cleanReturnUrl(window.location.href); } var canonical = document.querySelector('link[rel="canonical"]'); if (canonical && canonical.href && canonical.href.indexOf('/products/') !== -1) { return cleanReturnUrl(canonical.href); } return getReturnUrl(); } function ensureReturnToField(form, url) { if (!form) return; var input = form.querySelector('[data-match-needs-return-to], input[name="return_to"]'); if (!input) { input = document.createElement('input'); input.type = 'hidden'; input.name = 'return_to'; input.setAttribute('data-match-needs-return-to', ''); form.appendChild(input); } input.value = url || getReturnUrl() || window.location.pathname; } function wireCheckStockLink(container) { var scope = container || panel || document; var link = scope.querySelector('[data-check-stock-link]'); if (!link) return; // Back to the page where the user opened the form (product detail, etc.) var url = cleanReturnUrl(getReturnUrl() || window.location.pathname); if (url) link.setAttribute('href', url); } function openPanel() { root.classList.add('floating-contact--open'); if (tab) tab.setAttribute('aria-expanded', 'true'); } function closePanel() { root.classList.remove('floating-contact--open'); if (tab) tab.setAttribute('aria-expanded', 'false'); } function restorePanelToRoot() { if (!panel || !root || !panelPlaceholder.parentNode) return; root.insertBefore(panel, panelPlaceholder.nextSibling); } function initPanelFields() { if (!window.jQuery || !panel) return; window.jQuery(panel).find('.input-wrapper input, .input-wrapper textarea').trigger('inputstateEmpty'); } function focusFirstField() { var nameInput = document.getElementById('FloatingContactFormName'); if (!nameInput) return; window.setTimeout(function () { nameInput.focus(); }, 50); } function cleanupQuickbuyMedia() { if (!window.jQuery) return; var $ = window.jQuery; try { if (window.theme && window.theme.ProductMedia) { window.theme.ProductMedia.destroy($('.quickbuy__media-container')); } } catch (e) {} try { $('.quickbuy .slick-initialized').slick('unslick').off('afterChange'); } catch (e) {} $('.quickbuy-form').off('variantChange variantPriceChange variantImageChange'); } function bindColorboxCleanup() { if (!window.jQuery) return; window.jQuery(document).off('cbox_cleanup.matchNeeds').on('cbox_cleanup.matchNeeds', function () { restorePanelToRoot(); root.classList.remove('floating-contact--colorbox-mode'); window.jQuery(document).off('cbox_cleanup.matchNeeds'); }); } function showMatchNeedsInColorbox() { if (!panel) return; restorePanelToRoot(); var $loaded = window.jQuery && window.jQuery('#cboxLoadedContent'); if (!$loaded || !$loaded.length) { openPanel(); focusFirstField(); return; } cleanupQuickbuyMedia(); bindColorboxCleanup(); $loaded.empty(); var $host = window.jQuery('<div class="match-needs-colorbox" id="match-needs-colorbox-host"></div>'); $host.append(panel); $loaded.append($host); root.classList.add('floating-contact--colorbox-mode'); window.jQuery.colorbox.resize(); initPanelFields(); focusFirstField(); } function hideMatchNeedsColorbox() { if (!root.classList.contains('floating-contact--colorbox-mode')) return; if (window.jQuery && window.jQuery.colorbox) { window.jQuery.colorbox.close(); return; } restorePanelToRoot(); root.classList.remove('floating-contact--colorbox-mode'); } function clearFieldError(field) { field.classList.remove('is-invalid'); var error = field.querySelector('[data-error]'); if (error) error.hidden = true; } function showFieldError(field, message) { field.classList.add('is-invalid'); var error = field.querySelector('[data-error]'); if (error) { if (message) error.textContent = message; error.hidden = false; } } function isValidEmail(value) { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value); } function syncPhoneCombined(field) { if (!field) return ''; var codeEl = field.querySelector('[data-phone-country-code]'); var localEl = field.querySelector('[data-phone-local]'); var combinedEl = field.querySelector('[data-phone-combined]'); var code = codeEl ? String(codeEl.value || '').trim() : ''; var local = localEl ? String(localEl.value || '').trim().replace(/^[\s+]+/, '') : ''; var combined = code && local ? (code + ' ' + local) : ''; if (combinedEl) combinedEl.value = combined; return combined; } function validationMessages() { return { required: (root && root.getAttribute('data-msg-required')) || 'Please fill in this field.', email: (root && root.getAttribute('data-msg-email')) || 'Please enter a valid email.', countryCode: (root && root.getAttribute('data-msg-country-code')) || 'Please select a country code.' }; } function validateForm(form) { if (!form) return false; var valid = true; var msgs = validationMessages(); form.querySelectorAll('[data-field]').forEach(function (field) { clearFieldError(field); if (field.hasAttribute('data-phone-field')) { var codeEl = field.querySelector('[data-phone-country-code]'); var localEl = field.querySelector('[data-phone-local]'); var code = codeEl ? String(codeEl.value || '').trim() : ''; var local = localEl ? String(localEl.value || '').trim() : ''; if (!code) { showFieldError(field, msgs.countryCode); valid = false; return; } if (!local) { showFieldError(field, msgs.required); valid = false; return; } syncPhoneCombined(field); return; } var input = field.querySelector('input:not([type="hidden"]):not([type="submit"]), textarea'); if (!input) return; var value = String(input.value || '').trim(); var optional = field.hasAttribute('data-optional'); if (!value) { if (optional) return; showFieldError(field, msgs.required); valid = false; return; } if (input.type === 'email' && !isValidEmail(value)) { showFieldError(field, msgs.email); valid = false; } }); return valid; } function stripBodyPrefixes(body) { var text = String(body || ''); text = text.replace(/^WhatsApp:\s*[^\n]*\n\n/, ''); text = text.replace(/\n\nDownloaded file:\s*[^\n]*\nDownload URL:\s*[^\n]*\s*$/i, ''); text = text.replace(/\n\nDownloaded file:\s*[^\n]*\s*$/i, ''); return text.trim(); } function readFormData() { try { var raw = localStorage.getItem(FORM_DATA_KEY); if (!raw) return null; var data = JSON.parse(raw); if (!data || !data.email || !data.name || !data.body) return null; return data; } catch (e) { return null; } } function saveFormData(form) { if (!form) return; form.querySelectorAll('[data-phone-field]').forEach(function (field) { syncPhoneCombined(field); }); var nameInput = form.querySelector('[name="contact[name]"]'); var emailInput = form.querySelector('[name="contact[email]"]'); var phoneCombined = form.querySelector('[data-phone-combined]'); var phoneCodeEl = form.querySelector('[data-phone-country-code]'); var phoneLocalEl = form.querySelector('[data-phone-local]'); var whatsappInput = form.querySelector('[name="contact[whatsapp]"]'); var companyInput = form.querySelector('[name="contact[company]"]'); var bodyInput = form.querySelector('[name="contact[body]"]'); var data = { name: nameInput ? String(nameInput.value || '').trim() : '', email: emailInput ? String(emailInput.value || '').trim() : '', phone: phoneCombined ? String(phoneCombined.value || '').trim() : '', phoneCode: phoneCodeEl ? String(phoneCodeEl.value || '').trim() : '', phoneLocal: phoneLocalEl ? String(phoneLocalEl.value || '').trim() : '', whatsapp: whatsappInput ? String(whatsappInput.value || '').trim() : '', company: companyInput ? String(companyInput.value || '').trim() : '', body: stripBodyPrefixes(bodyInput ? bodyInput.value : '') }; if (!data.name || !data.email || !data.body) return; try { localStorage.setItem(FORM_DATA_KEY, JSON.stringify(data)); } catch (e) {} } function applyPhoneToForm(form, data) { if (!form || !data) return; var phoneCodeEl = form.querySelector('[data-phone-country-code]'); var phoneLocalEl = form.querySelector('[data-phone-local]'); var phoneCombined = form.querySelector('[data-phone-combined]'); var code = data.phoneCode || ''; var local = data.phoneLocal || ''; if ((!code || !local) && data.phone) { var match = String(data.phone).match(/^(\+\d+)\s+(.+)$/); if (match) { code = match[1]; local = match[2]; } } if (phoneCodeEl && code) phoneCodeEl.value = code; if (phoneLocalEl && local) phoneLocalEl.value = local; if (phoneCombined) { phoneCombined.value = (code && local) ? (code + ' ' + local) : (data.phone || ''); } } function restoreFormData(form) { var data = readFormData(); if (!form || !data) return false; var nameInput = form.querySelector('[name="contact[name]"]'); var emailInput = form.querySelector('[name="contact[email]"]'); var whatsappInput = form.querySelector('[name="contact[whatsapp]"]'); var companyInput = form.querySelector('[name="contact[company]"]'); var bodyInput = form.querySelector('[name="contact[body]"]'); if (nameInput) nameInput.value = data.name || ''; if (emailInput) emailInput.value = data.email || ''; if (whatsappInput) whatsappInput.value = data.whatsapp || ''; if (companyInput) companyInput.value = data.company || ''; if (bodyInput) bodyInput.value = data.body || ''; applyPhoneToForm(form, data); if (window.jQuery) { try { window.jQuery(form).find('.input-wrapper input, .input-wrapper textarea').trigger('inputstateEmpty'); } catch (e) {} } return true; } function resolvePendingDownload() { if (!pendingDownloadUrl) { var stored = readPendingDownload(); if (stored && stored.url) { pendingDownloadUrl = stored.url; pendingDownloadName = stored.name || ''; } } return { url: normalizeUrl(pendingDownloadUrl || ''), name: pendingDownloadName || '' }; } function prepareFormBeforeSend(form) { form.querySelectorAll('[data-phone-field]').forEach(function (field) { syncPhoneCombined(field); }); var whatsappInput = form.querySelector('[name="contact[whatsapp]"]'); var bodyInput = form.querySelector('[name="contact[body]"]'); var saved = readFormData(); var rawBody = saved && saved.body ? String(saved.body) : stripBodyPrefixes(bodyInput ? bodyInput.value : ''); var parts = []; var whatsappValue = whatsappInput ? String(whatsappInput.value || '').trim() : ''; if (!whatsappValue && saved && saved.whatsapp) whatsappValue = String(saved.whatsapp).trim(); if (whatsappValue) parts.push('WhatsApp: ' + whatsappValue); if (rawBody) parts.push(rawBody); var pending = resolvePendingDownload(); if (pending.url) { // Filename only — including a full URL often trips Shopify contact spam filters // and the submission never completes (spinner until timeout, no email). parts.push('Downloaded file: ' + (pending.name || pending.url)); } if (bodyInput) bodyInput.value = parts.join('\n\n'); // Origin page (e.g. product detail) — Check Stock Here returns here. var originUrl = getReturnUrl() || cleanReturnUrl(window.location.href) || window.location.pathname; saveReturnUrl(originUrl); // return_to with mn_sent=1: Shopify redirects here ONLY after email is accepted. ensureReturnToField(form, buildReturnToUrl(originUrl)); } function submitContactForm(form) { // Prefer a real submit control click so Shopify CAPTCHA sees a user gesture. var btn = form.querySelector('[type="submit"], .contact-form__submit'); if (btn) { form.setAttribute('data-bvs-allow-submit', '1'); btn.click(); return; } form.setAttribute('data-bvs-allow-submit', '1'); if (typeof form.requestSubmit === 'function') { form.requestSubmit(); return; } form.removeAttribute('data-bvs-allow-submit'); HTMLFormElement.prototype.submit.call(form); } function hasCompletedMatchNeeds() { try { if (localStorage.getItem(MATCH_NEEDS_COMPLETED_KEY) !== '1') return false; return !!readFormData(); } catch (e) { return false; } } function markMatchNeedsCompleted() { try { localStorage.setItem(MATCH_NEEDS_COMPLETED_KEY, '1'); } catch (e) {} } function trackMatchNeedsSend() { // GA4 custom event fired only after Shopify confirms the contact form was accepted. if (typeof gtag !== 'function') return; try { if (sessionStorage.getItem(SEND_TRACKED_KEY) === '1') return; sessionStorage.setItem(SEND_TRACKED_KEY, '1'); } catch (e) {} gtag('event', 'match_my_needs_send', { form_name: 'Match My Needs', form_id: 'floating-contact-form' }); } function autoResubmitForDownload(options) { options = options || {}; if (!floatingForm) return false; hideMatchNeedsColorbox(); showFormView({ skipReset: true, restoreSaved: true }); setPendingDownloadOptions(options); if (options.returnUrl) saveReturnUrl(options.returnUrl); else saveReturnUrl(resolveProductReturnUrl(options.trigger || null)); ensureReturnToField(floatingForm, getReturnUrl()); if (!restoreFormData(floatingForm) || !validateForm(floatingForm)) { try { localStorage.removeItem(MATCH_NEEDS_COMPLETED_KEY); } catch (e) {} openPanel(); focusFirstField(); return false; } // Same user gesture as Download click → native Send path (prepare + CAPTCHA). // Do NOT set data-bvs-allow-submit (that skips prepare / breaks CAPTCHA). openPanel(); setSendStatus(floatingForm, ''); var btn = floatingForm.querySelector('[type="submit"], .contact-form__submit'); if (btn) { btn.click(); return true; } return false; } function normalizeUrl(url) { if (!url) return ''; url = String(url).trim(); if (!url || url === '#' || url.indexOf('javascript:') === 0) return ''; // Use lcdbvs custom domain for file downloads when the source URL is Shopify CDN. // (Spec documents / company profile PDF are stored on Shopify CDN but we want the browser URL to show lcdbvs.) url = url .replace(/^https?:\/\/cdn\.shopify\.com/i, 'https://www.lcdbvs.com') .replace(/^\/\/cdn\.shopify\.com/i, 'https://www.lcdbvs.com'); return url; } function triggerPendingDownload(url, name) { var downloadUrl = normalizeUrl(url || pendingDownloadUrl); var downloadName = name || pendingDownloadName; if (!downloadUrl) return false; var openedWindow = null; try { openedWindow = window.open(downloadUrl, '_blank'); if (openedWindow) { try { openedWindow.opener = null; } catch (e) {} } } catch (e) { openedWindow = null; } if (!openedWindow || openedWindow.closed) { var link = document.createElement('a'); link.href = downloadUrl; link.target = '_blank'; link.rel = 'noopener'; if (downloadName) link.download = downloadName; document.body.appendChild(link); link.click(); document.body.removeChild(link); } pendingDownloadUrl = null; pendingDownloadName = null; return true; } function savePendingDownload(url, name, opened) { var downloadUrl = normalizeUrl(url || pendingDownloadUrl); if (!downloadUrl) return; try { sessionStorage.setItem(PENDING_DOWNLOAD_KEY, JSON.stringify({ url: downloadUrl, name: name || pendingDownloadName || '', opened: !!opened })); } catch (e) {} } function readPendingDownload() { try { var raw = sessionStorage.getItem(PENDING_DOWNLOAD_KEY); if (!raw) return null; return JSON.parse(raw); } catch (e) { return null; } } function clearPendingDownload() { try { sessionStorage.removeItem(PENDING_DOWNLOAD_KEY); } catch (e) {} } function showDownloadFallback(container, data) { if (!container || !data || !data.url) return; var fallback = container.querySelector('[data-pending-download-fallback]'); if (!fallback) return; var anchor = fallback.querySelector('a'); if (!anchor) return; anchor.href = data.url; fallback.hidden = false; anchor.addEventListener('click', function () { clearPendingDownload(); }, { once: true }); } function setPendingDownloadOptions(options) { options = options || {}; pendingDownloadUrl = normalizeUrl(options.downloadUrl || ''); pendingDownloadName = options.downloadName || null; if (pendingDownloadUrl) { savePendingDownload(pendingDownloadUrl, pendingDownloadName); } else { clearPendingDownload(); } } function consumePendingDownloadAfterSuccess(form) { // Only show success when Shopify accepted the form and redirected to return_to (?mn_sent=1). // Pre-submit session flags caused "success UI without email" — do not use them here. try { sessionStorage.removeItem(SUCCESS_KEY); } catch (e) {} if (!isSuccessfulContactReturn()) { try { sessionStorage.removeItem(SENDING_KEY); } catch (e) {} return; } saveReturnUrl(cleanReturnUrl(window.location.href)); showSuccessView(form); trackMatchNeedsSend(); clearSuccessQueryParam(); var data = readPendingDownload(); if (data && data.url) { showDownloadFallback(panel || form, data); if (!data.opened) { triggerPendingDownload(data.url, data.name || ''); } clearPendingDownload(); } } function attachFormHandlers(form) { if (!form || form.dataset.validationBound === 'true') return; form.dataset.validationBound = 'true'; form.setAttribute('novalidate', 'novalidate'); form.querySelectorAll('input, textarea, select').forEach(function (input) { input.removeAttribute('readonly'); input.removeAttribute('disabled'); input.addEventListener('input', function () { var field = input.closest('[data-field]'); if (field) { clearFieldError(field); if (field.hasAttribute('data-phone-field')) syncPhoneCombined(field); } }); input.addEventListener('change', function () { var field = input.closest('[data-field]'); if (field) { clearFieldError(field); if (field.hasAttribute('data-phone-field')) syncPhoneCombined(field); } }); input.addEventListener('blur', function () { var field = input.closest('[data-field]'); if (!field || field.hasAttribute('data-optional')) return; var msgs = validationMessages(); if (field.hasAttribute('data-phone-field')) { var codeEl = field.querySelector('[data-phone-country-code]'); var localEl = field.querySelector('[data-phone-local]'); var code = codeEl ? String(codeEl.value || '').trim() : ''; var local = localEl ? String(localEl.value || '').trim() : ''; if (!code && local) { showFieldError(field, msgs.countryCode); } else if (code && local) { syncPhoneCombined(field); } return; } var value = String(input.value || '').trim(); if (!value) return; if (input.type === 'email' && !isValidEmail(value)) { showFieldError(field, msgs.email); } }); }); form.addEventListener('submit', function (evt) { // Second pass only used if something re-triggers submit with the allow flag. if (form.getAttribute('data-bvs-allow-submit') === '1') { form.removeAttribute('data-bvs-allow-submit'); showSendingLoading(form); return; } if (!validateForm(form)) { evt.preventDefault(); hideSendingLoading(form); var firstInvalid = form.querySelector('.is-invalid select, .is-invalid input, .is-invalid textarea'); if (firstInvalid) firstInvalid.focus(); return false; } // Valid submit: prepare fields in this same event turn, then let the browser // continue. Do NOT preventDefault + requestSubmit — that breaks Shopify CAPTCHA // (endless spinner → "Sending is taking too long", no email). saveFormData(form); prepareFormBeforeSend(form); markMatchNeedsCompleted(); if (!pendingDownloadUrl) { var stored = readPendingDownload(); if (stored && stored.url) { pendingDownloadUrl = stored.url; pendingDownloadName = stored.name || ''; } } if (pendingDownloadUrl) { savePendingDownload(pendingDownloadUrl, pendingDownloadName || '', false); } else { clearPendingDownload(); } showSendingLoading(form); // Native submit proceeds; CAPTCHA can attach its token on this event. return true; }); } window.openFloatingContact = function (options) { options = options || {}; hideMatchNeedsColorbox(); showFormView({ restoreSaved: hasCompletedMatchNeeds() }); setPendingDownloadOptions(options); if (options.returnUrl) saveReturnUrl(options.returnUrl); else saveReturnUrl(resolveProductReturnUrl(options.trigger || null)); ensureReturnToField(floatingForm, getReturnUrl()); openPanel(); focusFirstField(); }; window.openMatchNeedsModal = function (options) { options = options || {}; showFormView({ restoreSaved: hasCompletedMatchNeeds() }); setPendingDownloadOptions(options); if (options.returnUrl) saveReturnUrl(options.returnUrl); else saveReturnUrl(resolveProductReturnUrl(options.trigger || null)); ensureReturnToField(floatingForm, getReturnUrl()); showMatchNeedsInColorbox(); }; if (closeBtn) { closeBtn.addEventListener('click', function () { if (root.classList.contains('floating-contact--colorbox-mode')) { hideMatchNeedsColorbox(); return; } closePanel(); }); } if (tab) { tab.addEventListener('click', function () { hideMatchNeedsColorbox(); pendingDownloadUrl = null; pendingDownloadName = null; clearPendingDownload(); showFormView({ restoreSaved: !!readFormData() }); saveReturnUrl(resolveProductReturnUrl(null)); ensureReturnToField(floatingForm, getReturnUrl()); openPanel(); focusFirstField(); }); } attachFormHandlers(floatingForm); document.addEventListener('click', function (evt) { var toggle = evt.target.closest('[data-spec-download-toggle]'); if (toggle) { evt.preventDefault(); evt.stopPropagation(); var dropdown = toggle.closest('[data-spec-download-dropdown]'); if (!dropdown) return; var menu = dropdown.querySelector('[data-spec-download-menu]'); var willOpen = !dropdown.classList.contains('is-open'); document.querySelectorAll('[data-spec-download-dropdown].is-open').forEach(function (openDropdown) { openDropdown.classList.remove('is-open'); var openToggle = openDropdown.querySelector('[data-spec-download-toggle]'); var openMenu = openDropdown.querySelector('[data-spec-download-menu]'); if (openToggle) openToggle.setAttribute('aria-expanded', 'false'); if (openMenu) openMenu.hidden = true; }); if (willOpen) { dropdown.classList.add('is-open'); toggle.setAttribute('aria-expanded', 'true'); if (menu) menu.hidden = false; } return; } if (!evt.target.closest('[data-spec-download-dropdown]')) { document.querySelectorAll('[data-spec-download-dropdown].is-open').forEach(function (openDropdown) { openDropdown.classList.remove('is-open'); var openToggle = openDropdown.querySelector('[data-spec-download-toggle]'); var openMenu = openDropdown.querySelector('[data-spec-download-menu]'); if (openToggle) openToggle.setAttribute('aria-expanded', 'false'); if (openMenu) openMenu.hidden = true; }); } var trigger = evt.target.closest('[data-open-match-needs]'); if (!trigger) return; evt.preventDefault(); evt.stopPropagation(); var downloadUrl = normalizeUrl(trigger.getAttribute('data-download-url') || ''); var downloadName = trigger.getAttribute('data-download-name') || ''; var specDropdown = trigger.closest('[data-spec-download-dropdown]'); if (specDropdown) { specDropdown.classList.remove('is-open'); var specToggle = specDropdown.querySelector('[data-spec-download-toggle]'); var specMenu = specDropdown.querySelector('[data-spec-download-menu]'); if (specToggle) specToggle.setAttribute('aria-expanded', 'false'); if (specMenu) specMenu.hidden = true; } if (downloadUrl && hasCompletedMatchNeeds()) { document.querySelectorAll('.product-specification-download__hint').forEach(function (hint) { hint.hidden = true; }); autoResubmitForDownload({ downloadUrl: downloadUrl, downloadName: downloadName, trigger: trigger, returnUrl: resolveProductReturnUrl(trigger) }); return; } document.querySelectorAll('.product-specification-download__hint').forEach(function (hint) { hint.hidden = true; }); var item = trigger.closest('.product-specification-download, .P-GETquotation-wrap, .nav-match-needs-item'); var hint = item && item.querySelector('.product-specification-download__hint'); if (hint) hint.hidden = false; var navDropdown = trigger.closest('.site-nav__item--has-dropdown'); if (navDropdown) navDropdown.classList.add('open'); var contactOptions = { downloadUrl: downloadUrl, downloadName: downloadName, trigger: trigger, returnUrl: resolveProductReturnUrl(trigger) }; if (trigger.closest('#colorbox, .quickbuy')) { window.openMatchNeedsModal(contactOptions); } else { window.openFloatingContact(contactOptions); } }); // Remember current page as default return target (product detail / listing / etc.). saveReturnUrl(window.location.href); wireCheckStockLink(panel); // Shopify redirects here with ?mn_sent=1 only after the contact email is accepted. consumePendingDownloadAfterSuccess(floatingForm); // Response already returned (success or error) — clear leftover sending UI if still visible. if (!getSuccessView() || getSuccessView().hidden) { hideSendingLoading(floatingForm); } window.addEventListener('pageshow', function () { if (getSuccessView() && !getSuccessView().hidden) return; hideSendingLoading(floatingForm); }); })(); </script> <a href="#" class="focus-tint" aria-hidden="true" aria-label="Dichtbij"></a> <script src="//www.lcdbvs.com/cdn/shop/t/7/assets/vendor.js?v=41817386187007524081783746709" defer="defer"></script> <script src="//www.lcdbvs.com/cdn/shop/t/7/assets/back-to-top.js?v=49947101936429319411783763857" defer="defer"></script> <script src="//www.lcdbvs.com/cdn/shop/t/7/assets/theme.js?v=99459919975624509881788579693" defer="defer"></script> <script> (function () { var DEFAULT_PROFILE_URL = "\/nl\/pages\/bedrijfsprofiel"; function normalizeTerm(term) { return String(term || '').replace(/\*/g, ' ').replace(/\s+/g, ' ').trim().toLowerCase(); } function isCompanyProfileSearch(term) { var t = normalizeTerm(term); return t === 'profile' || t === 'company profile' || t === 'download company profile'; } function resolveCompanyProfileUrl() { return DEFAULT_PROFILE_URL; } function redirectToCompanyProfile() { var url = resolveCompanyProfileUrl(); if (!url) return false; window.location.assign(url); return true; } window.bvsSearchProfileRedirect = { isMatch: isCompanyProfileSearch, resolveUrl: resolveCompanyProfileUrl, redirect: redirectToCompanyProfile }; document.addEventListener('submit', function (evt) { var form = evt.target; if (!form || form.nodeName !== 'FORM') return; if (!form.classList.contains('search-form') && !form.classList.contains('search-page-form') && form.getAttribute('role') !== 'search') { return; } var input = form.querySelector('input[name="q"]'); if (!input || !isCompanyProfileSearch(input.value)) return; evt.preventDefault(); redirectToCompanyProfile(); }, true); })(); </script> <script> (function () { function isWhatsAppLink(link) { if (!link || !link.href) return false; var href = link.href; return href.indexOf('wa.me/') !== -1 || href.indexOf('api.whatsapp.com') !== -1 || href.indexOf('whatsapp.com/send') !== -1 || href.indexOf('web.whatsapp.com') !== -1; } function trackWhatsAppClick(link) { if (typeof gtag !== 'function') return; var text = (link.getAttribute('aria-label') || link.textContent || '') .replace(/\s+/g, ' ') .trim() .slice(0, 100); gtag('event', 'whatsapp_click', { wa_location: link.getAttribute('data-wa-location') || 'unknown', link_url: link.href, link_text: text }); } // capture: true so the event is recorded before the new tab opens / navigation. document.addEventListener('click', function (evt) { var target = evt.target; if (!target || typeof target.closest !== 'function') return; var link = target.closest('a[href]'); if (!isWhatsAppLink(link)) return; trackWhatsAppClick(link); }, true); })(); </script> <script> (function () { function downgradeLanguageHeadings() { var headings = document.querySelectorAll('h1,h2,h3,h4,h5,h6'); for (var i = 0; i < headings.length; i++) { var el = headings[i]; if (el.textContent.trim().toLowerCase() === 'language') { var span = document.createElement('span'); span.className = el.className; span.setAttribute('aria-label', 'Language'); span.innerHTML = el.innerHTML; if (el.parentNode) el.parentNode.replaceChild(span, el); } } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', downgradeLanguageHeadings); window.addEventListener('load', function () { setTimeout(downgradeLanguageHeadings, 300); }); } else { downgradeLanguageHeadings(); } })(); </script><script> (function () { function loadScript(src, attrs) { var s = document.createElement('script'); s.src = src; s.async = true; if (attrs) { Object.keys(attrs).forEach(function (key) { s.setAttribute(key, attrs[key]); }); } document.head.appendChild(s); return s; } function initAnalytics() { loadScript('https://www.googletagmanager.com/gtag/js?id=G-ZXP1GWJW3Y'); gtag('js', new Date()); gtag('config', 'G-ZXP1GWJW3Y'); gtag('config', 'AW-10974733752'); (function(h,o,t,j,a,r){ h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)}; h._hjSettings={hjid:3625660,hjsv:6}; a=o.getElementsByTagName('head')[0]; r=o.createElement('script');r.async=1; r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv; a.appendChild(r); })(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv='); } function scheduleAnalytics() { if ('requestIdleCallback' in window) { requestIdleCallback(initAnalytics, { timeout: 4000 }); } else { setTimeout(initAnalytics, 2500); } } if (document.readyState === 'complete') { scheduleAnalytics(); } else { window.addEventListener('load', scheduleAnalytics); } })(); </script> </body> </html> <style> @media only screen and (max-width: 992px) { .transcy-locale-name{ color: black; } } </style>