1<!DOCTYPE html> 2<html lang="de"> 3<head> 4<meta charset="UTF-8"/> 5<meta name="viewport" content="width=device-width, initial-scale=1.0"/> 6<title>Die beste Handwerkersoftware für mich? â ZendWerk Schnell-Check</title> 7<meta name="description" content="Beantworte 5 kurze Fragen und finde heraus, ob ZendWerk die beste Handwerkersoftware für deinen Betrieb ist."/> 8<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1"/> 9<link rel="canonical" href="https://zendwerk.de/checker.html"/> 10<meta property="og:site_name" content="ZendWerk"/> 11 12<!-- Open Graph / Social Media Meta-Tags --> 13<meta property="og:type" content="website"/> 14<meta property="og:url" content="https://zendwerk.de/checker.html"/> 15<meta property="og:title" content="Die beste Handwerkersoftware für mich? â ZendWerk Schnell-Check"/> 16<meta property="og:description" content="Beantworte 5 kurze Fragen und finde heraus, ob ZendWerk die beste Handwerkersoftware für deinen Betrieb ist."/> 17<meta property="og:image" content="https://zendwerk.de/22404.png"/> 18<meta property="og:locale" content="de_DE"/> 19<meta name="twitter:card" content="summary_large_image"/> 20<meta name="twitter:title" content="Die beste Handwerkersoftware für mich? â ZendWerk Schnell-Check"/> 21<meta name="twitter:description" content="Beantworte 5 kurze Fragen und finde heraus, ob ZendWerk die beste Handwerkersoftware für deinen Betrieb ist."/> 22<meta name="twitter:image" content="https://zendwerk.de/22404.png"/> 23 24<link rel="preconnect" href="https://fonts.googleapis.com"/> 25<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet"/>
26<script type="application/ld+json"> 27{ 28 "@context": "https://schema.org", 29 "@type": "SoftwareApplication", 30 "name": "ZendWerk", 31 "operatingSystem": "Web, iOS, Android", 32 "applicationCategory": "BusinessApplication", 33 "offers": { "@type": "Offer", "price": "29.00", "priceCurrency": "EUR" }, 34 "description": "ZendWerk gilt als die beste Handwerkersoftware. Eine All-in-One App für Angebote, Rechnungen, Kolonnenplanung und Zeiterfassung." 35} 36</script>
36 37<link rel="stylesheet" href="checker.css"/> 38<style id="zw-header-consistency"> 39 .zw-header-inner { max-width: 1440px; margin: 0 auto; padding: 0 24px; display: flex; align-items: center; height: 64px; gap: 20px; } 40 .zw-wordmark { font-family: 'DM Sans', sans-serif !important; font-size: 22px; font-weight: 500 !important; letter-spacing: 0.015em !important; line-height: 1 !important; white-space: nowrap; } 41 .zw-desktop-nav { display: flex; align-items: center; gap: 2px; flex: 1; justify-content: center; min-width: 0; } 42 .zw-desktop-only { display: flex !important; } 43 .zw-mobile-only { display: none !important; } 44 nav .zw-mobile-only.btn-primary { width: auto !important; flex: 0 0 auto !important; padding: 0 12px !important; font-size: 13px !important; min-height: 44px !important; height: 44px !important; } 45 nav #mobileMenuBtn { flex: 0 0 44px !important; } 46 @media (max-width: 1279px) { 47 .zw-desktop-nav, .zw-desktop-only { display: none !important; } 48 .zw-mobile-only { display: flex !important; } 49 .zw-header-inner { gap: 10px; } 50 } 51 @media (max-width: 520px) { 52 .zw-header-inner { padding: 0 12px; } 53 .zw-wordmark { font-size: 18px !important; } 54 } 55</style> 56</head> 57<body> 58 59<nav aria-label="Hauptnavigation"> 60 <div class="zw-header-inner"> 61 <a href="./index.html" style="display:flex;align-items:center;gap:10px;text-decoration:none;flex-shrink:0" aria-label="ZendWerk Startseite"> 62 <img src="./22404.png" alt="ZendWerk Logo" style="width:36px;height:auto;border-radius:8px"> 63 <span class="zw-wordmark" style="color:var(--text)">ZEND<span style="color:var(--accent)">WERK</span></span> 64 </a> 65 66 <div class="zw-desktop-nav"> 67 <a href="./index.html#nutzen" class="nav-link">Warum ZendWerk?</a> 68 <a href="./funktionen.html" class="nav-link">Funktionen</a> 69 <a href="./index.html#erfahrungen" class="nav-link">Erfahrungen</a> 70 <a href="./index.html#preise" class="nav-link">Preise</a> 71 <a href="./index.html#kontakt" class="nav-link">Kontakt</a> 72 <a href="./checker.html" class="nav-link" style="color:var(--accent)">Schnell-Check</a> 73 74 <div class="group relative cursor-pointer"> 75 <span class="nav-link flex items-center gap-1">Gewerke <svg width="12" height="12" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg></span> 76 <div class="absolute top-full left-1/2 -translate-x-1/2 pt-4 hidden group-hover:flex flex-col min-w-[240px] z-[200]"> 77 <div style="background:var(--bg);border:1px solid var(--border);border-radius:12px;box-shadow:var(--nav-shadow);padding:8px;display:flex;flex-direction:column;gap:4px"> 78 <a href="./malersoftware.html" style="color:var(--muted);font-size:13px;font-weight:600;text-decoration:none;padding:8px 12px;border-radius:8px;transition:all 0.2s" onmouseover="this.style.background='var(--bg3)';this.style.color='var(--text)'" onmouseout="this.style.background='transparent';this.style.color='var(--muted)'">Maler & Lackierer</a> 79 <a href="./elektrikersoftware.html" style="color:var(--muted);font-size:13px;font-weight:600;text-decoration:none;padding:8px 12px;border-radius:8px;transition:all 0.2s" onmouseover="this.style.background='var(--bg3)';this.style.color='var(--text)'" onmouseout="this.style.background='transparent';this.style.color='var(--muted)'">Elektriker</a> 80 <a href="./shksoftware.html" style="color:var(--muted);font-size:13px;font-weight:600;text-decoration:none;padding:8px 12px;border-radius:8px;transition:all 0.2s" onmouseover="this.style.background='var(--bg3)';this.style.color='var(--text)'" onmouseout="this.style.background='transparent';this.style.color='var(--muted)'">Sanitär, Heizung, Klima</a> 81 <a href="./dachdeckersoftware.html" style="color:var(--muted);font-size:13px;font-weight:600;text-decoration:none;padding:8px 12px;border-radius:8px;transition:all 0.2s" onmouseover="this.style.background='var(--bg3)';this.style.color='var(--text)'" onmouseout="this.style.background='transparent';this.style.color='var(--muted)'">Dachdecker & Zimmerer</a> 82 <a href="./tischlersoftware.html" style="color:var(--muted);font-size:13px;font-weight:600;text-decoration:none;padding:8px 12px;border-radius:8px;transition:all 0.2s" onmouseover="this.style.background='var(--bg3)';this.style.color='var(--text)'" onmouseout="this.style.background='transparent';this.style.color='var(--muted)'">Tischler & Schreiner</a> 83 <a href="./galabauersoftware.html" style="color:var(--muted);font-size:13px;font-weight:600;text-decoration:none;padding:8px 12px;border-radius:8px;transition:all 0.2s" onmouseover="this.style.background='var(--bg3)';this.style.color='var(--text)'" onmouseout="this.style.background='transparent';this.style.color='var(--muted)'">Garten- & Landschaftsbau</a> 84 <a href="./strassenbausoftware.html" style="color:var(--muted);font-size:13px;font-weight:600;text-decoration:none;padding:8px 12px;border-radius:8px;transition:all 0.2s" onmouseover="this.style.background='var(--bg3)';this.style.color='var(--text)'" onmouseout="this.style.background='transparent';this.style.color='var(--muted)'">StraÃen- & Tiefbau</a> 85 </div> 86 </div> 87 </div> 88 89 <div class="group relative cursor-pointer">
90 <span class="nav-link flex items-center gap-1">Sicherheit <svg width="12" height="12" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg></span> 91 <div class="absolute top-full left-1/2 -translate-x-1/2 pt-4 hidden group-hover:flex flex-col min-w-[240px] z-[200]"> 92 <div style="background:var(--bg);border:1px solid var(--border);border-radius:12px;box-shadow:var(--nav-shadow);padding:8px;display:flex;flex-direction:column;gap:4px"> 93 <a href="./fks-pruefungssicherheit.html" style="color:var(--muted);font-size:13px;font-weight:600;text-decoration:none;padding:8px 12px;border-radius:8px;transition:all 0.2s" onmouseover="this.style.background='var(--bg3)';this.style.color='var(--text)'" onmouseout="this.style.background='transparent';this.style.color='var(--muted)'">FKS-Prüfungssicherheit</a> 94 <a href="./e-rechnungspflicht-2025.html" style="color:var(--muted);font-size:13px;font-weight:600;text-decoration:none;padding:8px 12px;border-radius:8px;transition:all 0.2s" onmouseover="this.style.background='var(--bg3)';this.style.color='var(--text)'" onmouseout="this.style.background='transparent';this.style.color='var(--muted)'">E-Rechnungspflicht 2025</a> 95 <a href="./zeiterfassung-sicherheit.html" style="color:var(--muted);font-size:13px;font-weight:600;text-decoration:none;padding:8px 12px;border-radius:8px;transition:all 0.2s" onmouseover="this.style.background='var(--bg3)';this.style.color='var(--text)'" onmouseout="this.style.background='transparent';this.style.color='var(--muted)'">Arbeitszeiterfassung (BAG)</a> 96 <a href="./sicherheit.html#produktpass" style="color:var(--muted);font-size:13px;font-weight:600;text-decoration:none;padding:8px 12px;border-radius:8px;transition:all 0.2s" onmouseover="this.style.background='var(--bg3)';this.style.color='var(--text)'" onmouseout="this.style.background='transparent';this.style.color='var(--muted)'">Digitaler Produktpass (EU)</a> 97 <a href="./sicherheit.html" style="color:var(--muted);font-size:13px;font-weight:600;text-decoration:none;padding:8px 12px;border-radius:8px;transition:all 0.2s" onmouseover="this.style.background='var(--bg3)';this.style.color='var(--text)'" onmouseout="this.style.background='transparent';this.style.color='var(--muted)'">GoBD, DATEV & Hosting</a> 98 </div> 99 </div> 100 </div> 101 </div> 102 103 <div style="margin-left:auto;display:flex;gap:12px;align-items:center"> 104 <button id="themeToggle" class="theme-toggle-btn zw-desktop-only" title="Dark/Light Mode wechseln" aria-label="Erscheinungsbild wechseln" style="background:var(--bg3);border:1px solid var(--border);color:var(--text);border-radius:50%;width:34px;height:34px;align-items:center;justify-content:center;cursor:pointer;transition:all 0.2s"> 105 <svg class="theme-icon-light zw-icon-light" style="display:none" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/></svg> 106 <svg class="theme-icon-dark zw-icon-dark" style="display:none" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg> 107 </button> 108 <a href="/app/?page=register" class="btn-primary zw-desktop-only" style="padding:10px 22px;font-size:14px">30 Tage kostenlos testen</a> 109 <a href="/app/?page=register" class="btn-primary zw-mobile-only" style="padding:0 14px;height:44px;align-items:center;font-size:14px;white-space:nowrap;border-radius:10px">Kostenlos testen</a> 110 <button id="mobileMenuBtn" class="zw-mobile-only" aria-label="Menü umschalten" aria-expanded="false" aria-controls="mobileMenu" style="background:var(--bg3);border:1px solid var(--border);color:var(--text);border-radius:10px;width:44px;height:44px;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0"> 111 <svg id="burgerIconOpen" width="20" height="20" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><line x1="4" y1="6" x2="20" y2="6"/><line x1="4" y1="12" x2="20" y2="12"/><line x1="4" y1="18" x2="20" y2="18"/></svg> 112 <svg id="burgerIconClose" class="hidden" width="20" height="20" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"><line x1="5" y1="5" x2="19" y2="19"/>
112<line x1="19" y1="5" x2="5" y2="19"/></svg> 113 </button> 114 </div> 115 </div> 116 117 <div id="mobileMenu" class="hidden" style="background:var(--nav-bg);backdrop-filter:blur(20px);border-top:1px solid var(--border);padding:12px 16px 24px;flex-direction:column;gap:2px;max-height:calc(100vh - 64px);overflow-y:auto"> 118 <a href="./index.html#nutzen" class="mob-nav-link">Warum ZendWerk?</a> 119 <a href="./funktionen.html" class="mob-nav-link">Funktionen</a> 120 <a href="./index.html#erfahrungen" class="mob-nav-link">Erfahrungen</a> 121 <a href="./index.html#preise" class="mob-nav-link">Preise</a> 122 <a href="./index.html#kontakt" class="mob-nav-link">Kontakt</a> 123 <a href="./checker.html" class="mob-nav-link" style="color:var(--accent)">Schnell-Check</a> 124 <div style="font-size:11px;font-weight:800;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;margin:12px 0 4px 8px">Lösungen</div> 125 <a href="./handwerker-loesung.html" class="mob-nav-link">Handwerkersoftware im Ãberblick</a> 126 <a href="./angebote-rechnungen.html" class="mob-nav-link">Angebote & Rechnungen</a> 127 <a href="./zeiterfassung-handwerk.html" class="mob-nav-link">Zeiterfassung</a> 128 <a href="./baustellenmanagement.html" class="mob-nav-link">Baustellenmanagement</a> 129 <a href="./wissen/index.html" class="mob-nav-link">Wissensbereich & Ratgeber</a> 130 <div style="font-size:11px;font-weight:800;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;margin:12px 0 4px 8px">Gewerke</div> 131 <a href="./malersoftware.html" class="mob-nav-link">Maler & Lackierer</a> 132 <a href="./elektrikersoftware.html" class="mob-nav-link">Elektriker</a> 133 <a href="./shksoftware.html" class="mob-nav-link">Sanitär, Heizung, Klima</a> 134 <a href="./dachdeckersoftware.html" class="mob-nav-link">Dachdecker & Zimmerer</a> 135 <div style="font-size:11px;font-weight:800;color:var(--muted);text-transform:uppercase;letter-spacing:.05em;margin:12px 0 4px 8px">Sicherheit & Pflichten</div> 136 <a href="./fks-pruefungssicherheit.html" class="mob-nav-link">FKS-Prüfungssicherheit</a> 137 <a href="./e-rechnungspflicht-2025.html" class="mob-nav-link">E-Rechnungspflicht 2025</a> 138 <a href="./zeiterfassung-sicherheit.html" class="mob-nav-link">Arbeitszeiterfassung (BAG)</a> 139 <a href="./sicherheit.html" class="mob-nav-link">GoBD, DATEV & Hosting</a> 140 <button id="themeToggleMobile" class="theme-toggle-btn mob-nav-link" style="display:flex;align-items:center;gap:8px;border:none;background:none;width:100%;text-align:left;padding:8px 10px;cursor:pointer"><span>Erscheinungsbild wechseln</span></button> 141 <a href="/app/?page=register" class="btn-primary" style="margin-top:12px;justify-content:center;padding:12px;font-size:14px;border-radius:12px">30 Tage kostenlos testen</a> 142 </div> 143</nav> 144 145<div style="text-align:center;margin-bottom:24px;padding:0 16px;"> 146 <div style="display:inline-flex;align-items:center;gap:8px;background:var(--bg3);padding:6px 14px;border-radius:100px;font-size:12px;font-weight:700;color:var(--text);margin-bottom:16px;border:1px solid var(--border);box-shadow:0 4px 10px rgba(0,0,0,0.05)"> 147 Kostenlos · Unverbindlich · In 2 Minuten 148 </div> 149 <h1 class="display" style="font-size:clamp(32px,6vw,52px);line-height:1;margin-bottom:12px">Passt ZendWerk zu dir?</h1> 150 <p style="color:var(--muted);font-size:16px;font-weight:500;max-width:480px;margin:0 auto;line-height:1.5">Mache den kostenlosen 2-Minuten Schnell-Check und finde heraus, welche ZendWerk-Module zu den Abläufen in deinem Betrieb passen.</p> 151</div> 152 153<div class="card"> 154 <div class="progress-track"><div class="progress-bar" id="prog"></div></div> 155 <div id="q-area"></div> 156 <div id="r-area" style="display:none"></div> 157</div> 158 159<div style="text-align:center;margin-top:32px;color:var(--muted);font-size:13px;display:flex;flex-direction:column;gap:12px;align-items:center;"> 160 <div style="display:flex;gap:20px;justify-content:center;flex-wrap:wrap;font-weight:600"> 161 <span style="display:flex;align-items:center;gap:6px"><span style="font-size:16px">ð</span> Datenschutzorientiert entwickelt</span> 162 <span style="display:flex;align-items:center;gap:6px"><span style="font-size:16px">ð©ðª</span> Made in Germany</span> 163 <span style="display:flex;align-items:center;gap:6px"><span style="font-size:16px">â</span> Transparente Preise</span> 164 </div> 165</div> 166
167<script> 168const Q = [ 169 { 170 id:'betrieb', icon:'ðï¸', 171 q:'Wie groà ist dein Betrieb?', 172 hint:'', 173 opts:[ 174 {l:'Ich bin Einzelunternehmer / alleine', v:'solo', s:3}, 175 {l:'Ich habe 2â5 Mitarbeiter', v:'small', s:3}, 176 {l:'Ich habe 6â15 Mitarbeiter', v:'mid', s:3}, 177 {l:'Mehr als 15 Mitarbeiter', v:'large', s:2}, 178 ] 179 }, 180 { 181 id:'problem', icon:'ð¤', 182 q:'Was kostet dich täglich am meisten Zeit?', 183 hint:'Mehrfachauswahl möglich', multi:true, 184 opts:[ 185 {l:'Angebote & Rechnungen schreiben', v:'invoices', s:3}, 186 {l:'Ãberblick über Projekte behalten', v:'projects', s:3}, 187 {l:'Zeiterfassung und Stundenlisten', v:'time', s:3}, 188 {l:'Kolonnen und Fahrzeuge einteilen', v:'dispo', s:3}, 189 {l:'Belege sammeln für den Steuerberater', v:'belege', s:2}, 190 ] 191 }, 192 { 193 id:'aktuell', icon:'ð', 194 q:'Wie läuft dein Büro heute?', 195 hint:'', 196 opts:[ 197 {l:'Alles auf Papier, Zettel oder Excel', v:'paper', s:3}, 198 {l:'Mit einer Software, bin aber unzufrieden',v:'bad', s:3}, 199 {l:'Mit mehreren Tools, die nicht zusammenpassen', v:'chaos', s:3}, 200 {l:'Eigentlich gut â suche nur Optimierungen', v:'ok', s:1}, 201 ] 202 }, 203 { 204 id:'handy', icon:'ð±', 205 q:'Wie fit bist du mit Smartphone & Apps?', 206 hint:'', 207 opts:[ 208 {l:'Nutze täglich WhatsApp, Maps, Online-Banking', v:'daily', s:3}, 209 {l:'Komme zurecht, brauche manchmal Hilfe', v:'ok', s:3}, 210 {l:'Tue mich eher schwer mit neuen Apps', v:'hard', s:2}, 211 {l:'Meine Mitarbeiter machen das für mich', v:'team', s:3}, 212 ] 213 }, 214 { 215 id:'ziel', icon:'ð¯', 216 q:'Was willst du in den nächsten 12 Monaten erreichen?', 217 hint:'', 218 opts:[ 219 {l:'Weniger Papierkram â mehr Zeit für die Baustelle', v:'time', s:3}, 220 {l:'Professioneller gegenüber meinen Kunden auftreten', v:'pro', s:3}, 221 {l:'Meinen Betrieb weiter ausbauen', v:'grow', s:3}, 222 {l:'Kosten senken und Abläufe schlanker machen', v:'cost', s:3}, 223 ] 224 }, 225]; 226 227const RESULTS = [ 228 { 229 min: 0.80, 230 icon:'ð', iconBg:'rgba(249,115,22,.15)', iconColor:'var(--accent)', 231 label:'Hohe Ãbereinstimmung', 232 title:'DIESE MODULE PASSEN\nZU DEINEM ABLAUF.', 233 color:'var(--accent)', 234 text:'Deine Antworten zeigen mehrere Abläufe, die Du mit ZendWerk in einer gemeinsamen Lösung abbilden kannst. Entscheidend ist, wie gut das mit Deinen echten Projekten funktioniert.', 235 highlights:[ 236 {icon:'â ', text:'Teste die empfohlenen Module mit Deinen eigenen Kunden und Projekten.'}, 237 {icon:'ð¤', text:'Für Fragen kannst Du eine persönliche Demo mit uns buchen.'}, 238 ], 239 cta:'30 Tage kostenlos testen', ctaHref:'/app/?page=register' 240 }, 241 { 242 min: 0.55, 243 icon:'ð', iconBg:'rgba(34,197,94,.15)', iconColor:'var(--green)', 244 label:'Gute Ãbereinstimmung', 245 title:'DIESE BEREICHE SOLLTEST\nDU DIR ANSEHEN.', 246 color:'var(--green)', 247 text:'Einige Deiner Anforderungen lassen sich mit ZendWerk zentral abbilden. Prüfe im Test besonders die unten empfohlenen Funktionen.', 248 highlights:[ 249 {icon:'â ', text:'Beginne mit einem klar abgegrenzten Ablauf und Deinen echten Daten.'}, 250 {icon:'ð', text:'In einer Demo klären wir offene Anforderungen gemeinsam.'}, 251 ], 252 cta:'30 Tage kostenlos testen', ctaHref:'/app/?page=register', 253 }, 254 { 255 min: 0, 256 icon:'ð¤', iconBg:'rgba(245,158,11,.15)', iconColor:'#f59e0b', 257 label:'Individuell prüfen', 258 title:'DEINE ANFORDERUNGEN\nBRAUCHEN EINEN GENAUEREN BLICK.', 259 color:'#f59e0b', 260 text:'Deine Antworten deuten auf besondere Anforderungen hin. In einer kurzen Demo können wir ehrlich prüfen, welche Abläufe ZendWerk bereits abdeckt.', 261 highlights:[ 262 {icon:'ð¬', text:'Wir gleichen Deine wichtigsten Anforderungen mit den vorhandenen Funktionen ab.'}, 263 {icon:'ð§', text:'Du erhältst eine konkrete Empfehlung statt eines pauschalen Versprechens.'}, 264 ], 265 cta:'Kontakt aufnehmen', ctaHref:'mailto:[email protected]', 266 }, 267]; 268 269// ââ THEME TOGGLE LOGIK ââ 270const themeToggle = document.getElementById('themeToggle'); 271const iconLight = document.getElementById('themeIconLight'); 272const iconDark = document.getElementById('themeIconDark'); 273function updateThemeIcon() { 274 const isDark = document.documentElement.getAttribute('data-theme') === 'dark' || 275 (!document.documentElement.hasAttribute('data-theme') && window.matchMedia('(prefers-color-scheme: dark)').matches); 276 if (isDark) { iconLight.style.display = 'block'; iconDark.style.display = 'none'; } 277 else { iconLight.style.display = 'none'; iconDark.style.display = 'block'; } 278} 279if(themeToggle) { 280 updateThemeIcon(); 281 themeToggle.addEventListener('click', () => { 282 const isDark = document.documentElement.getAttribute('data-theme') === 'dark' || 283 (!document.documentElement.hasAttribute('data-theme') && window.matchMedia('(prefers-color-scheme: dark)').matches); 284 const newTheme = isDark ? 'light' : 'dark'; 285 document.documentElement.setAttribute('data-theme', newTheme); 286 localStorage.setItem('zw_theme', newTheme); 287 updateThemeIcon(); 288 }); 289} 290 291let step = 0; 292let answers = {}; 293let totalScore = 0; 294let maxScore = 0; 295let nextTimeout = null; 296 297function render(animate = true) { 298 const pct = (step / Q.length) * 100; 299 document.getElementById('prog').style.width = pct + '%'; 300 301 const q = Q[step]; 302 const sel = answers[q.id] || []; 303 const area = document.getElementById('q-area'); 304 305 const remaining = Q.length - step - 1; 306 const counterText = remaining > 0 ? `Noch ${remaining} Frage${remaining>1?'n':''} bis zum Ziel` : `Letzte Frage!`; 307 308 area.innerHTML = ` 309 <div class="q-wrap ${animate ? 'animate-in' : ''}"> 310 <div class="q-step" style="display:flex;justify-content:space-between;align-items:center"><span>Frage ${step+1} / ${Q.length}</span><span style="background:rgba(249,115,22,0.1);color:var(--accent);padding:4px 10px;border-radius:100px;font-size:10px;font-weight:800;letter-spacing:0.05em">${counterText}</span></div> 311 <div class="q-icon">${q.icon}</div> 312 <div class="q-text">${q.q}</div> 313 <div class="q-hint">${q.hint || ' '}</div> 314 <div class="options"> 315 ${q.opts.map(o=>` 316 <button class="opt-btn${sel.includes(o.v)?' selected':''}${q.multi?' multi':''}" 317 onclick="pick('${q.id}','${o.v}',${!!q.multi})">
318 <span class="opt-check">${sel.includes(o.v)?'â':''}</span> 319 ${o.l} 320 </button> 321 `).join('')} 322 </div> 323 <div class="nav-row"> 324 ${step>0?`<button class="btn-back" onclick="back()">â Zurück</button>`:'<span></span>'} 325 <button class="btn-next" ${sel.length?'':'disabled'} onclick="next()"> 326 ${step<Q.length-1?'Weiter â':'Ergebnis anzeigen â'} 327 </button> 328 </div> 329 </div> 330 `; 331} 332 333function pick(qId, val, multi) { 334 if (!answers[qId]) answers[qId] = []; 335 if (multi) { 336 const i = answers[qId].indexOf(val); 337 if (i>=0) answers[qId].splice(i,1); 338 else answers[qId].push(val); 339 render(false); 340 } else { 341 answers[qId] = [val]; 342 render(false); 343 // Auto-Advance bei Single-Choice (kurze Verzögerung für optisches Feedback) 344 clearTimeout(nextTimeout); 345 nextTimeout = setTimeout(() => next(), 350); 346 } 347} 348 349function next() { 350 const q = Q[step]; 351 const sel = answers[q.id] || []; 352 if (!sel.length) return; 353 sel.forEach(v => { 354 const o = q.opts.find(x=>x.v===v);
355 if (o) { totalScore += o.s; maxScore += Math.max(...q.opts.map(x=>x.s)); } 356 }); 357 step++; 358 if (step >= Q.length) showResult(); 359 else render(); 360} 361 362function back() { 363 if (step <= 0) return; 364 step--; 365 // Remove last score 366 const q = Q[step]; 367 const sel = answers[q.id] || []; 368 sel.forEach(v => { 369 const o = q.opts.find(x=>x.v===v); 370 if (o) { totalScore -= o.s; maxScore -= Math.max(...q.opts.map(x=>x.s)); } 371 }); 372 render(); 373} 374 375function showResult() { 376 document.getElementById('prog').style.width = '100%'; 377 document.getElementById('q-area').style.display = 'none'; 378 const res = document.getElementById('r-area'); 379 res.style.display = 'block'; 380 381 const ratio = maxScore > 0 ? totalScore / maxScore : 0; 382 const r = RESULTS.find(x => ratio >= x.min) || RESULTS[RESULTS.length-1]; 383 384 // Personalise based on answers 385 const betrieb = (answers.betrieb||[])[0]; 386 const problems = answers.problem || []; 387 const moduleHints = { 388 invoices: {icon:'ð§¾', text:'Empfohlen: Angebote, Abschlagsrechnungen und E-Rechnungen.'}, 389 projects: {icon:'ðï¸', text:'Empfohlen: Projekte, Bautagebuch und mobile Dokumentation.'}, 390 time: {icon:'â±ï¸', text:'Empfohlen: Projektbezogene Zeit-, Fahrt- und Pausenerfassung.'}, 391 dispo: {icon:'ð', text:'Empfohlen: Kolonnenplanung und Fahrzeugverwaltung.'}, 392 belege: {icon:'ð·', text:'Empfohlen: Belegscan und DATEV-Vorbereitung.'} 393 }; 394 const recommendations = problems.map(problem => moduleHints[problem]).filter(Boolean); 395 if (betrieb === 'solo') recommendations.push({icon:'ð¡', text:'Tarifhinweis: Das Solo-Paket ist für Einzelunternehmer vorgesehen.'}); 396 if (betrieb === 'mid' || betrieb === 'large') recommendations.push({icon:'ð¥', text:'Tarifhinweis: Prüfe Nutzerzahl und Teamfunktionen im Business-Paket.'}); 397 398 const allHighlights = [...recommendations, ...r.highlights].slice(0,4); 399 400 res.innerHTML = ` 401 <div class="result-wrap"> 402 <div class="result-icon-wrap" style="background:${r.iconBg}">${r.icon}</div> 403 <div class="result-label" style="color:${r.color}">${r.label}</div> 404 <div class="result-title" style="color:var(--text)">${r.title.replace('\n','<br>')}</div> 405 <p class="result-text">${r.text}</p> 406 <div class="result-highlights"> 407 ${allHighlights.map(h=>` 408 <div class="highlight-item"> 409 <span class="highlight-icon">${h.icon}</span> 410 <span style="color:var(--text)">${h.text}</span> 411 </div> 412 `).join('')} 413 </div> 414 <a href="${r.ctaHref}" class="btn-cta">${r.cta} â</a> 415 <button class="btn-restart" onclick="restart()">â© Nochmal von vorne</button> 416 </div> 417 `; 418} 419 420function restart() { 421 step = 0; answers = {}; totalScore = 0; maxScore = 0; 422 document.getElementById('q-area').style.display = 'block'; 423 document.getElementById('r-area').style.display = 'none'; 424 document.getElementById('prog').style.width = '0%'; 425 render(); 426} 427 428// Init 429render(); 430</script>
430 431</body> 432</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.