1// Lit-X â App Logic 2// Translations are loaded from js/i18n/*.js and assembled here 3const T = { 4 en: window.T_EN, 5 de: window.T_DE, 6 es: window.T_ES, 7 fr: window.T_FR, 8 ko: window.T_KO 9}; 10 11// EmailJS configuration â replace with your actual IDs after creating an account at emailjs.com 12window.EMAILJS_SERVICE_ID = 'service_vy71pz9'; 13window.EMAILJS_TEMPLATE_CONTACT = 'template_zb0yq39'; 14window.EMAILJS_TEMPLATE_LEAD = 'template_zb0yq39'; 15window.EMAILJS_PUBLIC_KEY = 'DHU2OESj-m5LOYOln'; 16 17// ============================================= 18// RENDERING ENGINE 19// ============================================= 20function detectLang() { 21 const valid = ['EN','DE','ES','FR','KO']; 22 const urlParams = new URLSearchParams(window.location.search); 23 const urlLang = (urlParams.get('lang') || '').toUpperCase(); 24 if (valid.includes(urlLang)) return urlLang; 25 const stored = localStorage.getItem('litx-lang'); 26 if (stored && valid.includes(stored)) return stored; 27 const nav = (navigator.language || navigator.userLanguage || 'en').toLowerCase(); 28 if (nav.startsWith('de')) return 'DE'; 29 if (nav.startsWith('es')) return 'ES'; 30 if (nav.startsWith('fr')) return 'FR'; 31 if (nav.startsWith('ko')) return 'KO'; 32 return 'EN'; 33} 34let currentLang = detectLang().toLowerCase(); 35const langFlags = {en:'ð¬ð§',de:'ð©ðª',es:'ðªð¸',fr:'ð«ð·',ko:'ð°ð·'}; 36const langNames = {en:'EN',de:'DE',es:'ES',fr:'FR',ko:'KO'}; 37 38function t(key) { const lang = T[currentLang] || T.en; return lang[key] || T.en[key] || key; } 39 40function toggleLangDropdown() { 41 var dd = document.getElementById('langDropdown'); 42 var isOpen = dd.classList.toggle('open'); 43 var btn = dd.previousElementSibling; 44 if (btn) btn.setAttribute('aria-expanded', isOpen); 45} 46document.addEventListener('click', e => { 47 if (!e.target.closest('.lang-switcher')) { 48 var dd = document.getElementById('langDropdown'); 49 dd.classList.remove('open'); 50 var btn = dd.previousElementSibling; 51 if (btn) btn.setAttribute('aria-expanded', 'false'); 52 } 53}); 54 55function setLang(lang) { 56 currentLang = lang; 57 localStorage.setItem('litx-lang', lang.toUpperCase()); 58 document.getElementById('currentLang').textContent = langNames[lang]; 59 document.documentElement.lang = lang; 60 document.querySelectorAll('.lang-option').forEach(el => el.classList.remove('active')); 61 document.querySelector(`.lang-option[onclick="setLang('${lang}')"]`).classList.add('active'); 62 document.getElementById('langDropdown').classList.remove('open'); 63 // Update all data-i18n elements 64 document.querySelectorAll('[data-i18n]').forEach(el => { 65 const key = el.getAttribute('data-i18n'); 66 const val = t(key); 67 if (val) el.innerHTML = val; 68 }); 69 document.querySelectorAll('[data-i18n-placeholder]').forEach(el => { 70 const key = el.getAttribute('data-i18n-placeholder'); 71 const val = t(key); 72 if (val && val !== key) el.placeholder = val; 73 }); 74 // Re-render dynamic sections 75 renderAll(); 76} 77 78function renderAll() { 79 renderDAGrid(); 80 renderPlatform(); 81 renderHeroMockup(); 82 renderProblemLanes(); 83 renderUseCases(); 84 renderTestimonials(); 85 renderGroups(); 86 renderFlexUC(); 87 renderPondus(); 88 renderPricing(); 89 renderMetrics(); 90 renderOnboarding(); 91 renderSecurity(); 92 renderFAQ(); 93} 94 95function renderGroups() { 96 const cards = t('grp.cards'); 97 if (!cards) return; 98 document.getElementById('grpGrid').innerHTML = cards.map(c => ` 99 <div class="flex-card reveal visible"><div class="fc-icon">${c.icon}</div> 100 <h4>${c.title}</h4><p>${c.desc}</p></div>`).join(''); 101} 102 103function renderFlexUC() { 104 const cards = t('fuc.cards'); 105 if (!cards) return; 106 document.getElementById('fucGrid').innerHTML = cards.map(c => ` 107 <div class="flex-card reveal visible"><div class="fc-icon">${c.icon}</div> 108 <h4>${c.title}</h4><p>${c.desc}</p></div>`).join(''); 109} 110 111function renderPondus() { 112 const w = t('pon.what'); 113 const how = t('pon.how'); 114 const cta = t('pon.cta') || 'Apply for Integration Partnership â'; 115 const cta2 = t('pon.cta2') || 'Request an ERP Integration â'; 116 if (!w || !how) return; 117 document.getElementById('ponGrid').innerHTML = ` 118 <div class="pondus-what"> 119 <h4>${w.title}</h4> 120 <p>${w.desc}</p> 121 </div> 122 <div class="pondus-how">${how.map(h=>` 123 <div class="pondus-how-item"><div class="phi-icon">${h.icon}</div> 124 <div><h5>${h.title}</h5><p>${h.desc}</p></div></div>`).join('')} 125 </div>`; 126} 127 128function renderDAGrid() { 129 const cards = t('da.cards'); 130 const stats = t('da.stats'); 131 const tracking = t('da.tracking'); 132 let statsItems = ''; 133 if (stats) { 134 statsItems = stats.map(s=>`<div><div class="data-stat-n">${s.n}</div><div class="data-stat-l">${s.l}</div></div>`).join(''); 135 } 136 let trackingItem = ''; 137 if (tracking && tracking.icons) { 138 trackingItem = `<div><div class="da-tracking-icons">${tracking.icons.join('')}</div><div class="data-stat-l">${tracking.label}</div></div>`; 139 } 140 document.getElementById('daStats').innerHTML = `<div class="data-stats">${statsItems}${trackingItem}</div>`; 141 document.getElementById('daGrid').innerHTML = cards.map(c => ` 142 <div class="da-card reveal visible"><div class="da-icon">${c.icon}</div> 143 <h3>${c.title}</h3><p>${c.desc}</p> 144 <div class="da-stat">${c.stat} <span class="da-stat-l">${c.statL}</span></div></div>`).join(''); 145} 146 147function renderHeroMockup() { 148 const m = t('pf.mockup'); 149 document.getElementById('heroMockup').innerHTML = ` 150 <div class="mockup"><div class="mockup-bar"><div class="mdot md1"></div><div class="mdot md2"></div><div class="mdot md3"></div><div class="mockup-url">app.lit-x.com</div></div> 151 <div class="mockup-body"><div class="m-side"> 152 <div class="m-side-logo"><img src="img/lit-x-logo-small.jpg" style="width:18px;height:18px;object-fit:contain;border-radius:2px"><span>Lit-X</span></div> 153 <div class="m-nav act"><span class="dot"></span>${m.nav[0]}</div> 154 <div class="m-nav" style="margin-top:4px">${m.nav[1]}</div> 155 <div class="m-sub">${m.nav[2]}</div><div class="m-sub">${m.nav[3]}</div> 156 <div class="m-nav" style="color:var(--orange-light)">${m.nav[4]}</div> 157 <div class="m-sub act">${m.nav[5]}</div><div class="m-sub">${m.nav[6]}</div><div class="m-sub">${m.nav[7]}</div><div class="m-sub">${m.nav[8]}</div> 158 <div class="m-nav">${m.nav[9]}</div> 159 <div class="m-sub">${m.nav[10]}</div><div class="m-sub">${m.nav[11]}</div> 160 </div><div class="m-main"><div class="m-header">${m.header}</div><div class="m-cards"> 161 ${m.cards.map((c,i) => `<div class="m-card"><div class="m-card-t">${c.t}</div><div class="m-card-d">${c.d}</div> 162 <div class="m-card-bar"><div class="m-card-fill" style="width:${[75,85,25,60][i]}%;background:${['var(--blue)','var(--orange)','var(--g4)','#8B5CF6'][i]}"></div></div> 163 <div class="m-stat"><span class="m-stat-n">${c.n}</span><span class="m-stat-l">${c.l}</span></div></div>`).join('')} 164 </div></div></div></div>`; 165} 166 167function renderPlatform() { 168 const feats = t('pf.feats'); 169 const daCards = t('da.cards'); 170 const pondusCard = daCards && daCards.find(c => c.isPondus); 171 const pondusImg = (pondusCard && pondusCard.icon && pondusCard.icon.includes('<img')) ? pondusCard.icon : 'ð'; 172 document.getElementById('platformText').innerHTML = ` 173 <div class="s-eye">${t('pf.eye')}</div><h2 class="s-title">${t('pf.title')}</h2><p class="s-sub">${t('pf.sub')}</p> 174 <div class="pf-features">${feats.map(f => `<div class="pf-feat"><div class="pf-icon">${f.icon}</div><div><h4>${f.t}</h4><p>${f.d}</p></div></div>`).join('')}</div> 175`; 176// Platform screenshots ââ¬â two side-by-side mockups 177 const m = t('pf.mockup'); 178 const sidebarHtml = (activeSection, activeItem) => { 179 const navItems = m.nav; 180 let html = ''; 181 let sectionIdx = 0; 182 for (let i = 0; i < navItems.length; i++) { 183 const n = navItems[i]; 184 if (n.includes('\u25BE')) { 185 const isActive = sectionIdx === activeSection; 186 const sectionName = n.replace(' \u25BE',''); 187 const icons = ['\uD83D\uDCDA','\uD83D\uDCE3','\uD83D\uDCCA']; 188 html += '<div class=\"m-nav'+(isActive?' act':'')+'\" style=\"margin-top:'+(sectionIdx>0?'4':'0')+'px\"><span class=\"dot\" style=\"background:'+(isActive?'#28C840':'transparent')+'\"></span>'+icons[sectionIdx]+' '+sectionName+'</div>'; 189 sectionIdx++; 190 } else if (i === 0) { 191 html += '<div class=\"m-nav'+(activeSection===-1?' act':'')+'\" ><span class=\"dot\" style=\"background:'+(activeSection===-1?'#28C840':'transparent')+'\"></span>\uD83C\uDFE0 '+n+'</div>'; 192 } else { 193 const isSubActive = i === activeItem; 194 html += '<div class=\"m-sub'+(isSubActive?' act':'')+'\" >'+n+'</div>'; 195 } 196 } 197 return html; 198 }; 199 const uc4 = t('uc4'); 200 document.getElementById('platformMockup').innerHTML = '<div class=\"pf-screenshots\">' + 201 '<div>' + 202 '<div class=\"mockup\"><div class=\"mockup-bar\"><div class=\"mdot md1\"></div><div class=\"mdot md2\"></div><div class=\"mdot md3\"></div><div class=\"mockup-url\">app.lit-x.com</div></div>' + 203 '<div class=\"mockup-body\"><div class=\"m-side\">' + 204 '<div class=\"m-side-logo\"><span>Lit-X</span></div>' + 205 sidebarHtml(-1, -1) + 206 '</div><div class=\"m-main\"><div class=\"m-header\">'+m.header+'</div><div class=\"m-cards\">' + 207 m.cards.map((c,i) => '<div class=\"m-card\"><div class=\"m-card-t\">'+c.t+'</div><div class=\"m-card-d\">'+c.d+'</div>' + 208 '<div class=\"m-card-bar\"><div class=\"m-card-fill\" style=\"width:'+[75,85,25,60][i]+'%;background:'+['var(--blue)','var(--orange)','var(--g4)','#8B5CF6'][i]+'\"></div></div>' + 209 '<div class=\"m-stat\"><span class=\"m-stat-n\">'+c.n+'</span><span class=\"m-stat-l\">'+c.l+'</span></div></div>').join('') + 210 '</div></div></div></div>' + 211 '<div class=\"pf-ss-label\">Dashboard Home</div>' + 212 '</div>' + 213 '<div>' + 214 '<div class=\"mockup\"><div class=\"mockup-bar\"><div class=\"mdot md1\"></div><div class=\"mdot md2\"></div><div class=\"mdot md3\"></div><div class=\"mockup-url\">app.lit-x.com</div></div>' + 215 '<div class=\"mockup-body\"><div class=\"m-side\">' + 216 '<div class=\"m-side-logo\"><span>Lit-X</span></div>' + 217 sidebarHtml(0, 2) + 218 '</div><div class=\"m-main\">' + 219 '<div style=\"font-size:.5rem;color:var(--g4);margin-bottom:4px\">'+m.nav[1].replace(' \u25BE','') + ' / ' + m.nav[2]+'</div>' + 220 '<div style=\"font-size:.7rem;font-weight:700;color:var(--g9);margin-bottom:8px\">'+uc4.ss.title+'</div>' + 221 '<div style=\"display:grid;grid-template-columns:1fr 1fr 1fr;gap:4px;margin-bottom:8px\">' + 222 '<div style=\"background:white;border-radius:5px;padding:6px;border:1px solid var(--g2)\"><div style=\"font-size:.42rem;color:var(--g4)\">Active Baskets</div><div style=\"font-size:.75rem;font-weight:700;color:var(--blue)\">5</div></div>' + 223 '<div style=\"background:white;border-radius:5px;padding:6px;border:1px solid var(--g2)\"><div style=\"font-size:.42rem;color:var(--g4)\">Titles Found</div><div style=\"font-size:.75rem;font-weight:700;color:var(--orange)\">142</div></div>' + 224 '<div style=\"background:white;border-radius:5px;padding:6px;border:1px solid var(--g2)\"><div style=\"font-size:.42rem;color:var(--g4)\">Acquired</div><div style=\"font-size:.75rem;font-weight:700;color:#059669\">6</div></div>' + 225 '</div>' + 226 '<div style=\"background:white;border-radius:5px;padding:8px;border:1px solid var(--g2)\">' + 227 '<div style=\"display:flex;align-items:center;gap:4px;margin-bottom:6px\">' + 228 '<span style=\"font-size:.9rem\">\uD83D\uDDA4</span>' + 229 '<div><div style=\"font-size:.55rem;font-weight:700;color:var(--g9)\">Little Stranger</div><div style=\"font-size:.42rem;color:var(--g4)\">Leigh Rivers \u00B7 Dark Romance</div></div>' + 230 '<span style=\"margin-left:auto;font-size:.4rem;background:var(--orange);color:white;padding:1px 4px;border-radius:2px;font-weight:700\">HOT</span>' + 231 '</div>' + 232 '<div style=\"display:grid;grid-template-columns:repeat(4,1fr);gap:3px\">' + 233 '<div style=\"text-align:center\"><div style=\"font-size:.38rem;color:var(--g4)\">
233Score</div><div style=\"font-size:.52rem;font-weight:700;color:var(--blue)\">51</div></div>' + 234 '<div style=\"text-align:center\"><div style=\"font-size:.38rem;color:var(--g4)\">Momentum</div><div style=\"font-size:.52rem;font-weight:700;color:var(--orange)\">46 \u25B2</div></div>' + 235 '<div style=\"text-align:center\"><div style=\"font-size:.38rem;color:var(--g4)\">Ratings</div><div style=\"font-size:.52rem;font-weight:700;color:var(--g8)\">31.3K</div></div>' + 236 '<div style=\"text-align:center\"><div style=\"font-size:.38rem;color:var(--g4)\">Social</div><div style=\"font-size:.52rem;font-weight:700;color:#8B5CF6\">342</div></div>' + 237 '</div>' + 238 '<div style=\"margin-top:4px;display:flex;gap:3px\">' + 239 '<span style=\"font-size:.35rem;background:var(--blue-50);color:var(--blue);padding:1px 4px;border-radius:2px\">Enemies to Lovers</span>' + 240 '<span style=\"font-size:.35rem;background:var(--orange-100);color:var(--orange);padding:1px 4px;border-radius:2px\">Gothic</span>' + 241 '<span style=\"font-size:.35rem;background:#E0E7FF;color:#4338CA;padding:1px 4px;border-radius:2px\">\uD83C\uDDE9\uD83C\uDDEA Available</span>' + 242 '</div>' + 243 '</div>' + 244 '<div style=\"background:white;border-radius:5px;padding:8px;border:1px solid var(--g2);margin-top:4px\">' + 245 '<div style=\"display:flex;align-items:center;gap:4px;margin-bottom:4px\">' + 246 '<span style=\"font-size:.9rem\">\uD83D\uDC09</span>' + 247 '<div><div style=\"font-size:.55rem;font-weight:700;color:var(--g9)\">Fourth Wing: Onyx Storm</div><div style=\"font-size:.42rem;color:var(--g4)\">Rebecca Yarros \u00B7 Romantasy</div></div>' + 248 '</div>' + 249 '<div style=\"display:grid;grid-template-columns:repeat(4,1fr);gap:3px\">' + 250 '<div style=\"text-align:center\"><div style=\"font-size:.38rem;color:var(--g4)\">
250Score</div><div style=\"font-size:.52rem;font-weight:700;color:var(--blue)\">52</div></div>' + 251 '<div style=\"text-align:center\"><div style=\"font-size:.38rem;color:var(--g4)\">Momentum</div><div style=\"font-size:.52rem;font-weight:700;color:var(--orange)\">45 \u25B2</div></div>' + 252 '<div style=\"text-align:center\"><div style=\"font-size:.38rem;color:var(--g4)\">Ratings</div><div style=\"font-size:.52rem;font-weight:700;color:var(--g8)\">334K</div></div>' + 253 '<div style=\"text-align:center\"><div style=\"font-size:.38rem;color:var(--g4)\">Social</div><div style=\"font-size:.52rem;font-weight:700;color:#8B5CF6\">1.25K</div></div>' + 254 '</div>' + 255 '</div>' + 256 '</div></div></div>' + 257 '<div class=\"pf-ss-label\">Title Scout \u2014 Editorial</div>' + 258 '</div>' + 259 '</div>'; 260} 261 262// ============================================= 263// SCREENSHOT CAROUSEL â Screen 2 & 3 data 264// ============================================= 265const UC_SCREENS = { 266 uc1:{ 267 tabs:{en:["Create Post","Performance","Content Ideas"],de:["Post erstellen","Performance","Content-Ideen"]}, 268 ss2:{en:{title:"Post Performance Analytics", 269 stats:[{n:"12.4K",l:"Avg. Reach",c:"+34%",up:true},{n:"8.2%",l:"Engagement Rate",c:"+1.8pp",up:true},{n:"47",l:"Posts This Month",c:"",up:false},{n:"3.1Ã",l:"vs. Industry",c:"outperforming",up:true}], 270 rows:[{a:"Fourth Wing â Social",b:"48.2K",c:"11.4%",d:"ð¥ Viral"},{a:"Love Hypothesis â Social Reel",b:"18.7K",c:"7.8%",d:"â Strong"},{a:"Wild Love â Social Story",b:"9.1K",c:"5.2%",d:"â Good"}], 271 head:["Post","Reach","Eng. Rate","Status"], 272 ai:"⨠Posts on major social media platforms drive 3.2à higher reach for Romantasy titles. Recommend increasing social media frequency to 4Ã/week." 273 },de:{title:"Post-Performance-Analyse", 274 stats:[{n:"12,4K",l:"à Reichweite",c:"+34%",up:true},{n:"8,2%",l:"Engagement-Rate",c:"+1,8pp",up:true},{n:"47",l:"Posts diesen Monat",c:"",up:false},{n:"3,1Ã",l:"vs. Branche",c:"übertrifft",up:true}], 275 rows:[{a:"Fourth Wing â Social",b:"48,2K",c:"11,4%",d:"ð¥ Viral"},{a:"Love Hypothesis â Social Reel",b:"18,7K",c:"7,8%",d:"â Stark"},{a:"Wild Love â Social Story",b:"9,1K",c:"5,2%",d:"â Gut"}], 276 head:["Post","Reichweite","Eng.-Rate","Status"], 277 ai:"⨠Posts auf allen groÃen Social-Media-Plattformen erzielen 3,2à höhere Reichweite für Romantasy-Titel. Empfehlung: Social-Media-Frequenz auf 4Ã/Woche erhöhen." 278 }}, 279 ss3:{en:{title:"Content Ideas â This Week", 280 stats:[{n:"14",l:"Ideas Generated",c:"for your portfolio",up:false},{n:"3",l:"Trending Hooks",c:"high confidence",up:true},{n:"Tue 6pm",l:"Best Post Time",c:"for your audience",up:false},{n:"Romantasy",l:"Hot Genre",c:"â 24% this week",up:true}], 281 rows:[{a:"ð¥ \"POV: When the villain is the love interest\"",b:"Social",c:"Fourth Wing",d:"92% match"},{a:"ð \"5 books that broke me in 2026\"",b:"Social Reel",c:"Multi-title",d:"88% match"},{a:"ð \"Dragon romances ranked by spice level\"",b:"Social",c:"Fourth Wing +3",d:"95% match"},{a:"ð \"Books with emotional damage\"",b:"Social Carousel",c:"Backlist",d:"84% match"}], 282 head:["Content Idea","Platform","Titles","Fit"], 283 ai:"⨠'Villain love interest' content surged 340% on major social media platforms this week. Posting a Fourth Wing hook using this trend within 48h maximizes viral potential." 284 },de:{title:"Content-Ideen â Diese Woche", 285 stats:[{n:"14",l:"Ideen generiert",c:"für Ihr Portfolio",up:false},{n:"3",l:"Trending Hooks",c:"hohe Konfidenz",up:true},{n:"Di 18 Uhr",l:"Beste Postzeit",c:"für Ihre Zielgruppe",up:false},{n:"Romantasy",l:"HeiÃes Genre",c:"â 24% diese Woche",up:true}], 286 rows:[{a:"ð¥ \"POV: Wenn der Bösewicht das Love Interest ist\"",b:"Social",c:"Fourth Wing",d:"92% Match"},{a:"ð \"5 Bücher die mich 2026 zerstört haben\"",b:"Social Reel",c:"Multi-Titel",d:"88% Match"},{a:"ð \"Drachen-Romanzen nach Spice Level\"",b:"Social",c:"Fourth Wing +3",d:"95% Match"},{a:"ð \"Bücher mit emotionalem Schaden\"",b:"Social Carousel",c:"Backlist",d:"84% Match"}], 287 head:["Content-Idee","Plattform","Titel","Fit"], 288 ai:"⨠âVillain Love Interest'-Content stieg diese Woche auf allen groÃen Social-Media-Plattformen um 340%. Ein Fourth-Wing-Hook zu diesem Trend innerhalb von 48h maximiert das Viral-Potenzial." 289 }} 290 }, 291 uc2:{ 292 tabs:{en:["Search & Match","Outreach Pipeline","Contract Manager"],de:["Suche & Match","Outreach-Pipeline","Vertragsmanager"]}, 293 ss2:{en:{title:"Outreach Pipeline", 294 stats:[{n:"24",l:"Contacted",c:"this quarter",up:false},{n:"18",l:"Replied",c:"75% rate",up:true},{n:"9",l:"Contracted",c:"38% close",up:true},{n:"â¬4.2K",l:"Avg. Deal Value",c:"+22%",up:true}], 295 rows:[{a:"@romantasyqueen · Social",b:"96%",c:"Contract signed",d:"â Active"},{a:"@bookish.emily · Social",b:"91%",c:"Negotiating",d:"ð¡ Pending"},{a:"@readwithsarah · Social",b:"88%",c:"Proposal sent",d:"ð© Sent"}], 296 head:["Influencer","Match","Stage","Status"], 297 ai:"⨠Influencers with 50Kâ150K followers convert 2.4à better for backlist titles. Consider shifting budget from mega-influencers." 298 },de:{title:"Outreach-Pipeline", 299 stats:[{n:"24",l:"Kontaktiert",c:"dieses Quartal",up:false},{n:"18",l:"Geantwortet",c:"75% Rate",up:true},{n:"9",l:"Verträge",c:"38% Close",up:true},{n:"â¬4,2K",l:"à Deal-Wert",c:"+22%",up:true}], 300 rows:[{a:"@romantasyqueen · Social",b:"96%",c:"Vertrag unterzeichnet",d:"â Aktiv"},{a:"@bookish.emily · Social",b:"91%",c:"Verhandlung",d:"ð¡ Offen"},{a:"@readwithsarah · Social",b:"88%",c:"Angebot gesendet",d:"ð© Gesendet"}], 301 head:["Influencer","Match","Phase","Status"],
302 ai:"⨠Influencer mit 50Kâ150K Followern konvertieren 2,4à besser bei Backlist-Titeln. Budget-Shift von Mega-Influencern empfohlen." 303 }}, 304 ss3:{en:{title:"Active Contracts â Q1 2026", 305 stats:[{n:"9",l:"Active Contracts",c:"this quarter",up:false},{n:"â¬37.8K",l:"Total Committed",c:"on budget",up:false},{n:"23/31",l:"Deliverables Done",c:"74% complete",up:true},{n:"4.8M",l:"Total Reach",c:"across all",up:true}], 306 rows:[{a:"@romantasyqueen",b:"3 Social posts + 1 Social",c:"â¬6,200",d:"â 4/4 done"},{a:"@bookish.emily",b:"2 Social Reels + Story",c:"â¬3,800",d:"ð¡ 2/3 done"},{a:"@readwithsarah",b:"1 Social review + Short",c:"â¬5,400",d:"ð¡ 1/2 done"},{a:"@darkromancereads",b:"4 Social posts",c:"â¬4,000",d:"ð Upcoming"}], 307 head:["Influencer","Deliverables","Value","Progress"], 308 ai:"⨠@romantasyqueen delivered 2.1à expected reach across all posts. Recommend extending partnership for Q2 with expanded content format." 309 },de:{title:"Aktive Verträge â Q1 2026", 310 stats:[{n:"9",l:"Aktive Verträge",c:"dieses Quartal",up:false},{n:"â¬37,8K",l:"Gesamtvolumen",c:"im Budget",up:false},{n:"23/31",l:"Leistungen erbracht",c:"74% komplett",up:true},{n:"4,8 Mio.",l:"Gesamtreichweite",c:"über alle",up:true}], 311 rows:[{a:"@romantasyqueen",b:"3 Social-Posts + 1 Social",c:"â¬6.200",d:"â 4/4 erledigt"},{a:"@bookish.emily",b:"2 Social Reels + Story",c:"â¬3.800",d:"ð¡ 2/3 erledigt"},{a:"@readwithsarah",b:"1 Social Review + Short",c:"â¬5.400",d:"ð¡ 1/2 erledigt"},{a:"@darkromancereads",b:"4 Social-Posts",c:"â¬4.000",d:"ð Kommend"}], 312 head:["Influencer","Leistungen","Wert","Fortschritt"], 313 ai:"⨠@romantasyqueen lieferte 2,1à erwartete Reichweite über alle Posts. Empfehlung: Partnerschaft für Q2 mit erweitertem Content-Format verlängern." 314 }} 315 }, 316 uc3:{ 317 tabs:{en:["Live Campaigns","ROI Summary","Channel Breakdown"],de:["Live-Kampagnen","ROI-Ãbersicht","Kanal-Aufschlüsselung"]}, 318 ss2:{en:{title:"Campaign ROI Summary â Q1 2026", 319 stats:[{n:"â¬18.4K",l:"Total Spend",c:"on budget",up:false},{n:"â¬127K",l:"Attributed Revenue",c:"6.9à ROAS",up:true},{n:"2.1M",l:"Total Reach",c:"+58% YoY",up:true},{n:"â¬0.18",l:"Cost per Engagement",c:"-41%",up:true}], 320 rows:[{a:"Fourth Wing Launch",b:"â¬8,200",c:"â¬72K rev.",d:"8.8à ROAS"},{a:"Romance Backlist Push",b:"â¬5,400",c:"â¬34K rev.",d:"6.3à ROAS"},{a:"Spring New Releases",b:"â¬4,800",c:"â¬21K rev.",d:"4.4à ROAS"}], 321 head:["Campaign","Spend","Revenue","ROAS"], 322 ai:"⨠Influencer-driven campaigns outperform paid ads by 2.1à on ROAS. Recommend allocating 60% of Q2 budget to influencer partnerships." 323 },de:{title:"Kampagnen-ROI-Ãbersicht â Q1 2026", 324 stats:[{n:"â¬18,4K",l:"Gesamtausgaben",c:"im Budget",up:false},{n:"â¬127K",l:"Zugeordneter Umsatz",c:"6,9à ROAS",up:true},{n:"2,1 Mio.",l:"Gesamtreichweite",c:"+58% YoY",up:true},{n:"â¬0,18",l:"Kosten/Engagement",c:"-41%",up:true}], 325 rows:[{a:"Fourth Wing Launch",b:"â¬8.200",c:"â¬72K Umsatz",d:"8,8à ROAS"},{a:"Romance Backlist Push",b:"â¬5.400",c:"â¬34K Umsatz",d:"6,3à ROAS"},{a:"Frühjahrs-Neuheiten",b:"â¬4.800",c:"â¬21K Umsatz",d:"4,4à ROAS"}], 326 head:["Kampagne","Ausgaben","Umsatz","ROAS"], 327 ai:"⨠Influencer-Kampagnen übertreffen Paid Ads um 2,1à beim ROAS. Empfehlung: 60% des Q2-Budgets für Influencer-Partnerschaften." 328 }}, 329 ss3:{en:{title:"Channel Performance Breakdown", 330 stats:[{n:"Social Platform",l:"Best Reach",c:"1.2M total",up:true},{n:"Social Platform",l:"Best Engagement",c:"9.4% rate",up:true},{n:"Social Platform",l:"Best Conversion",c:"â¬3.20 CPA",up:true},{n:"Pinterest",l:"Best Longevity",c:"6mo+ shelf life",up:true}], 331 rows:[{a:"Social Platform",b:"1.2M reach",c:"7.8% eng.",d:"â¬0.08/eng."},{a:"Social Platform",b:"640K reach",c:"9.4% eng.",d:"â¬0.14/eng."},{a:"Social Platform",b:"180K reach",c:"4.2% eng.",d:"â¬0.31/eng."},{a:"Pinterest",b:"94K reach",c:"3.1% eng.",d:"â¬0.22/eng."}], 332 head:["Channel","Reach","Engagement","Cost/Eng."], 333 ai:"⨠All major social media platforms dominate on reach-per-â¬, with top platforms driving 1.4à higher engagement quality (saves & shares). Recommend a 50/30/15/5 split for Romantasy titles." 334 },de:{title:"Kanal-Performance-Aufschlüsselung", 335 stats:[{n:"Social Platform",l:"Beste Reichweite",c:"1,2 Mio. gesamt",up:true},{n:"Social Platform",l:"Bestes Engagement",c:"9,4% Rate",up:true},{n:"Social Platform",l:"Beste Conversion",c:"â¬3,20 CPA",up:true},{n:"Pinterest",l:"Beste Langlebigkeit",c:"6+ Mon. Haltbarkeit",up:true}], 336 rows:[{a:"Social Platform",b:"1,2 Mio. Reichweite",c:"7,8% Eng.",d:"â¬0,08/Eng."},{a:"Social Platform",b:"640K Reichweite",c:"9,4% Eng.",d:"â¬0,14/Eng."},{a:"Social Platform",b:"180K Reichweite",c:"4,2% Eng.",d:"â¬0,31/Eng."},{a:"Pinterest",b:"94K Reichweite",c:"3,1% Eng.",d:"â¬0,22/Eng."}], 337 head:["Kanal","Reichweite","Engagement","Kosten/Eng."], 338 ai:"⨠Alle groÃen Social-Media-Plattformen dominieren bei Reichweite/â¬, Top-Plattformen liefern 1,4à höhere Engagement-Qualität (Saves & Shares). Empfehlung: 50/30/15/5-Split für Romantasy." 339 }} 340 }, 341 uc4:{ 342 tabs:{en:["Scout Results","Title Deep Dive","Trend Radar"],de:["Scout-Ergebnisse","Titel-Detailansicht","Trend-Radar"]}, 343 ss2:{en:{title:"Title Deep Dive â Fourth Wing", 344 stats:[{n:"4.52",l:"Avg. Rating",c:"â 0.3 in 6mo",up:true},{n:"284K",l:"rating platforms Reviews",c:"+42K new",up:true},{n:"92",l:"Social Buzz Score",c:"Top 1%",up:true},{n:"6",l:"Markets Available",c:"rights open",up:false}], 345 rows:[{a:"ð©ðª Germany",b:"Rights available",c:"High demand",d:"ð¢ Priority"},{a:"ð°ð· Korea",b:"Rights available",c:"Trending on book community KR",d:"ð¢ Priority"},{a:"ð¯ðµ Japan",b:"Under negotiation",c:"Publisher interest",d:"ð¡ Active"},{a:"ð«ð· France",b:"Sold â Hachette",c:"â",d:"â« Closed"}], 346 head:["Market","Status","Signal","Priority"], 347 ai:"⨠Fourth Wing's social buzz score increased 340% in Korea over 8 weeks. Korean rights acquisition has highest ROI potential right now." 348 },de:{title:"Titel-Detailansicht â Fourth Wing", 349 stats:[{n:"4,52",l:"à Bewertung",c:"â 0,3 in 6 Mon.",up:true},{n:"284K",l:"Bewertungsplattformen-Rezensionen",c:"+42K neu",up:true},{n:"92",l:"Social Buzz Score",c:"Top 1%",up:true},{n:"6",l:"Märkte verfügbar",c:"Rechte offen",up:false}], 350 rows:[{a:"ð©ðª Deutschland",b:"Rechte verfügbar",c:"Hohe Nachfrage",d:"ð¢ Priorität"},{a:"ð°ð· Korea",b:"Rechte verfügbar",c:"Trend in Buch-Community KR",d:"ð¢ Priorität"},{a:"ð¯ðµ Japan",b:"In Verhandlung",c:"Verlagsinteresse",d:"ð¡ Aktiv"},{a:"ð«ð· Frankreich",b:"Verkauft â Hachette",c:"â",d:"â« Abgeschlossen"}], 351 head:["Markt","Status","Signal","Priorität"],
352 ai:"⨠Fourth Wings Social-Buzz-Score stieg in Korea über 8 Wochen um 340%. Koreanischer Rechteerwerb hat aktuell das höchste ROI-Potenzial." 353 }}, 354 ss3:{en:{title:"Trend Radar â Romantasy Genre, Last 12 Weeks", 355 stats:[{n:"+180%",l:"Genre Buzz Growth",c:"vs. prev. quarter",up:true},{n:"4",l:"Breakout Titles",c:"detected early",up:true},{n:"6 weeks",l:"Avg. Lead Time",c:"before bestseller list",up:true},{n:"Korea",l:"Fastest Growing Market",c:"+340% buzz",up:true}], 356 rows:[{a:"Fourth Wing â R. Yarros",b:"Week 1: 12 â Week 12: 92",c:"âââ Breakout",d:"ð´ Act now"},{a:"Powerless â L. Roberts",b:"Week 1: 4 â Week 12: 67",c:"ââ Rising fast",d:"ð¡ Watch"},{a:"Throne of Glass â S.J. Maas",b:"Week 1: 78 â Week 12: 81",c:"â Stable classic",d:"⪠Steady"},{a:"Lightlark â A. Aster",b:"Week 1: 41 â Week 12: 28",c:"â Declining",d:"â« Pass"}], 357 head:["Title","Buzz Score Trajectory","Trend","Action"], 358 ai:"⨠Lit-X detected Fourth Wing's breakout trajectory 6 weeks before it hit the NYT bestseller list. Early social signals from book communities on major social media platforms were the first indicators." 359 },de:{title:"Trend-Radar â Romantasy-Genre, Letzte 12 Wochen", 360 stats:[{n:"+180%",l:"Genre-Buzz-Wachstum",c:"vs. Vorquartal",up:true},{n:"4",l:"Breakout-Titel",c:"früh erkannt",up:true},{n:"6 Wochen",l:"à Vorlaufzeit",c:"vor Bestsellerliste",up:true},{n:"Korea",l:"Schnellst wachsender Markt",c:"+340% Buzz",up:true}], 361 rows:[{a:"Fourth Wing â R. Yarros",b:"Woche 1: 12 â Woche 12: 92",c:"âââ Breakout",d:"ð´ Jetzt handeln"},{a:"Powerless â L. Roberts",b:"Woche 1: 4 â Woche 12: 67",c:"ââ Steigt schnell",d:"ð¡ Beobachten"},{a:"Throne of Glass â S.J. Maas",b:"Woche 1: 78 â Woche 12: 81",c:"â Stabiler Klassiker",d:"⪠Stabil"},{a:"Lightlark â A. Aster",b:"Woche 1: 41 â Woche 12: 28",c:"â Rückläufig",d:"â« Ãbersp."}], 362 head:["Titel","Buzz-Score-Verlauf","Trend","Aktion"], 363 ai:"⨠Lit-X erkannte Fourth Wings Breakout-Trajektorie 6 Wochen vor der NYT-Bestsellerliste. Frühe Social-Signale von Buch-Communities auf allen groÃen Social-Media-Plattformen waren die ersten Indikatoren." 364 }} 365 }, 366 uc5:{ 367 tabs:{en:["Campaign Manager","Ad Performance","A/B Creative Lab"],de:["Kampagnen-Manager","Ad-Performance","A/B-Creative-Lab"]}, 368 ss2:{en:{title:"Ad Performance â Last 30 Days", 369 stats:[{n:"â¬0.14",l:"Avg. CPC",c:"-47% vs. manual",up:true},{n:"4.8%",l:"Click-Through Rate",c:"+2.1pp",up:true},{n:"847",l:"Conversions",c:"book purchases",up:false},{n:"â¬5.40",l:"Cost per Conversion",c:"-38%",up:true}], 370 rows:[{a:"Fourth Wing · Social",b:"4.2% CTR",c:"â¬0.12 CPC",d:"ð¥ Top"},{a:"Romance Bundle · Meta",b:"3.8% CTR",c:"â¬0.16 CPC",d:"â Strong"},{a:"New Release · Pinterest",b:"2.9% CTR",c:"â¬0.19 CPC",d:"â Good"}], 371 head:["Ad Set","CTR","CPC","Rating"], 372 ai:"⨠Optimized creatives outperform manual by 47% on CPC. Social platform Spark Ads with authentic bookfluencer content drive the best results for Romantasy." 373 },de:{title:"Ad-Performance â Letzte 30 Tage", 374 stats:[{n:"â¬0,14",l:"à CPC",c:"-47% vs. manuell",up:true},{n:"4,8%",l:"Klickrate",c:"+2,1pp",up:true},{n:"847",l:"Conversions",c:"Buchkäufe",up:false},{n:"â¬5,40",l:"Kosten/Conversion",c:"-38%",up:true}], 375 rows:[{a:"Fourth Wing · Social",b:"4,2% CTR",c:"â¬0,12 CPC",d:"ð¥ Top"},{a:"Romance Bundle · Meta",b:"3,8% CTR",c:"â¬0,16 CPC",d:"â Stark"},{a:"Neue Veröffentlichung · Pinterest",b:"2,9% CTR",c:"â¬0,19 CPC",d:"â Gut"}], 376 head:["Ad Set","CTR","CPC","Bewertung"], 377 ai:"⨠Optimierte Creatives übertreffen manuelle um 47% beim CPC. Social-Platform-Spark-Ads mit authentischem Bookfluencer-Content liefern die besten Ergebnisse." 378 }}, 379 ss3:{en:{title:"A/B Creative Lab â Fourth Wing Social", 380 stats:[{n:"3",l:"Variants Running",c:"1 winner detected",up:true},{n:"72h",l:"Test Duration",c:"auto-optimizes",up:false},{n:"Variant B",l:"Current Winner",c:"68% confidence",up:true},{n:"+41%",l:"CTR Lift",c:"B vs. control",up:true}], 381 rows:[{a:"A: Product shot + text overlay",b:"2.4% CTR",c:"â¬0.19 CPC",d:"â Losing"},{a:"B: Bookfluencer UGC clip",b:"4.1% CTR",c:"â¬0.11 CPC",d:"ð Winner"},{a:"C: Quote card + ambient audio",b:"3.2% CTR",c:"â¬0.15 CPC",d:"ð¡ Running"}], 382 head:["Creative Variant","CTR","CPC","Status"], 383 ai:"⨠User-generated bookfluencer content outperforms polished product shots by 41% on CTR. Auto-allocated 70% of budget to Variant B after 48h." 384 },de:{title:"A/B-Creative-Lab â Fourth Wing Social", 385 stats:[{n:"3",l:"Varianten aktiv",c:"1 Gewinner erkannt",up:true},{n:"72h",l:"Testdauer",c:"Auto-Optimierung",up:false},{n:"Variante B",l:"Aktueller Gewinner",c:"68% Konfidenz",up:true},{n:"+41%",l:"CTR-Steigerung",c:"B vs. Kontrolle",up:true}], 386 rows:[{a:"A: Produktbild + Text-Overlay",b:"2,4% CTR",c:"â¬0,19 CPC",d:"â Verliert"},{a:"B: Bookfluencer UGC-Clip",b:"4,1% CTR",c:"â¬0,11 CPC",d:"ð Gewinner"},{a:"C: Zitat-Karte + Ambient Audio",b:"3,2% CTR",c:"â¬0,15 CPC",d:"ð¡ Läuft"}], 387 head:["Creative-Variante","CTR","CPC","Status"], 388 ai:"⨠Nutzergenerierter Bookfluencer-Content übertrifft polierte Produktbilder um 41% bei der CTR. Automatisch 70% des Budgets nach 48h auf Variante B allokiert." 389 }} 390 }, 391 uc6:{ 392 tabs:{en:["Campaign Dashboard","Keyword Intelligence","Budget Optimizer"],de:["Kampagnen-Dashboard","Keyword-Intelligenz","Budget-Optimierer"]}, 393 ss2:{en:{title:"Keyword Intelligence â Romantasy", 394 stats:[{n:"1,247",l:"Keywords Tracked",c:"for this genre",up:false},{n:"34",l:"High-Opportunity",c:"low competition",up:true},{n:"â¬0.08",l:"Avg. Suggested Bid",c:"below market",up:true},{n:"12.4K",l:"Monthly Volume",c:"top keywords",up:false}], 395 rows:[{a:"enemies to lovers fantasy",b:"8,100/mo",c:"â¬0.06",d:"ââ Trending"},{a:"dragon romance book",b:"4,200/mo",c:"â¬0.09",d:"â Growing"},{a:"romantasy new releases 2026",b:"2,800/mo",c:"â¬0.04",d:"ââ Trending"},{a:"books like fourth wing",b:"6,400/mo",c:"â¬0.12",d:"â Stable"}], 396 head:["Keyword","Volume","Bid","Trend"], 397 ai:"⨠'Enemies to lovers fantasy' search volume up 180% â social trend data detected this 6 weeks before online shop search volume rose. Early bidding saves ~40% on CPC." 398 },de:{title:"Keyword-Intelligenz â Romantasy", 399 stats:[{n:"1.247",l:"Keywords getrackt",c:"für dieses Genre",up:false},{n:"34",l:"Hohe Chance",c:"geringe Konkurrenz",up:true},{n:"â¬0,08",l:"à Gebotsvorschlag",c:"unter Markt",up:true},{n:"12,4K",l:"Monatliches Volumen",c:"Top-Keywords",up:false}], 400 rows:[{a:"enemies to lovers fantasy",b:"8.100/Mo.",c:"â¬0,06",d:"ââ Trend"},{a:"dragon romance book",b:"4.200/Mo.",c:"â¬0,09",d:"â Wachsend"},{a:"romantasy new releases 2026",b:"2.800/Mo.",c:"â¬0,04",d:"ââ Trend"},{a:"books like fourth wing",b:"6.400/Mo.",c:"â¬0,12",d:"â Stabil"}], 401 head:["Keyword","Volumen","Gebot","Trend"], 402 ai:"⨠'Enemies to lovers fantasy' Suchvolumen +180% â Social-Trend-Daten erkannten dies 6 Wochen vor dem Online-Shop-Suchvolumen-Anstieg. Frühes Bieten spart ~40% CPC." 403 }}, 404 ss3:{en:{title:"AI Budget Optimizer â March 2026", 405 stats:[{n:"â¬8,400",l:"Monthly Budget",c:"allocated by AI",up:false},{n:"14.2%",l:"Blended ACoS",c:"target: 18%",up:true},{n:"+23%",l:"Sales Lift",c:"vs. manual allocation",up:true},{n:"3",l:"Campaigns Paused",c:"below threshold",up:false}], 406 rows:[{a:"Fourth Wing SP",b:"â¬3,200 â â¬4,100",c:"+â¬900 (â28%)",d:"ð¢ ACoS 11.8%"},{a:"Romance Backlist SP",b:"â¬2,400 â â¬2,800",c:"+â¬400 (â17%)",d:"ð¢ ACoS 15.4%"},{a:"New Release SB",b:"â¬1,800 â â¬1,500",c:"-â¬300 (â17%)",d:"ð¡ ACoS 19.2%"},{a:"Genre Browse SB",b:"â¬1,000 â â¬0",c:"Paused",d:"ð´ ACoS 34.1%"}], 407 head:["Campaign","Budget Realloc.","Change","Result"], 408 ai:"⨠AI reallocated â¬900 from underperforming genre browse to Fourth Wing SP â driving 23% more sales at lower blended ACoS. 3 c
408ampaigns auto-paused for exceeding target ACoS." 409 },de:{title:"KI-Budget-Optimierer â März 2026", 410 stats:[{n:"â¬8.400",l:"Monatsbudget",c:"KI-allokiert",up:false},{n:"14,2%",l:"Gemischter ACoS",c:"Ziel: 18%",up:true},{n:"+23%",l:"Umsatzsteigerung",c:"vs. manuelle Allokation",up:true},{n:"3",l:"Kampagnen pausiert",c:"unter Schwellenwert",up:false}], 411 rows:[{a:"Fourth Wing SP",b:"â¬3.200 â â¬4.100",c:"+â¬900 (â28%)",d:"ð¢ ACoS 11,8%"},{a:"Romance Backlist SP",b:"â¬2.400 â â¬2.800",c:"+â¬400 (â17%)",d:"ð¢ ACoS 15,4%"},{a:"New Release SB",b:"â¬1.800 â â¬1.500",c:"-â¬300 (â17%)",d:"ð¡ ACoS 19,2%"},{a:"Genre Browse SB",b:"â¬1.000 â â¬0",c:"Pausiert",d:"ð´ ACoS 34,1%"}], 412 head:["Kampagne","Budget-Reallok.","Ãnderung","Ergebnis"], 413 ai:"⨠KI verlagerte â¬900 von Genre-Browse zu Fourth Wing SP â 23% mehr Umsatz bei niedrigerem ACoS. 3 Kampagnen automatisch pausiert wegen Ãberschreitung des Ziel-ACoS." 414 }} 415 }, 416 uc7:{ 417 tabs:{en:["Portfolio Audit","Before / After","Competitor Benchmark"],de:["Portfolio-Audit","Vorher / Nachher","Wettbewerbs-Benchmark"]}, 418 ss2:{en:{title:"Optimization Results â The Love Hypothesis", 419 stats:[{n:"71 â 94",l:"Listing Score",c:"+23 points",up:true},{n:"+340%",l:"Impressions",c:"in 14 days",up:true},{n:"+82%",l:"Click-Through",c:"vs. before",up:true},{n:"#3 â #1",l:"Category Rank",c:"Romance",up:true}], 420 rows:[{a:"Title",b:"The Love Hypothesis: A Novel",c:"The Love Hypothesis â An Enemies-to-Lovers Romance Novel",d:"+18%"},{a:"Description",b:"162 words, no keywords",c:"387 words, 12 keywords, benefit-led",d:"+44%"},{a:"Backend Keywords",b:"3 of 7 slots used",c:"7/7 slots, long-tail optimized",d:"+31%"}], 421 head:["Element","Before","After","Impact"], 422 ai:"⨠Optimized listings see +210% average impression lift within 14 days. Backend keyword optimization alone drove 31% of the improvement for this title." 423 },de:{title:"Optimierungsergebnisse â The Love Hypothesis", 424 stats:[{n:"71 â 94",l:"Listing-Score",c:"+23 Punkte",up:true},{n:"+340%",l:"Impressionen",c:"in 14 Tagen",up:true},{n:"+82%",l:"Klickrate",c:"vs. vorher",up:true},{n:"#3 â #1",l:"Kategorie-Rang",c:"Romance",up:true}], 425 rows:[{a:"Titel",b:"The Love Hypothesis: A Novel",c:"The Love Hypothesis â Ein Enemies-to-Lovers-Roman",d:"+18%"},{a:"Beschreibung",b:"162 Wörter, keine Keywords",c:"387 Wörter, 12 Keywords, nutzenorientiert",d:"+44%"},{a:"Backend-Keywords",b:"3 von 7 Slots genutzt",c:"7/7 Slots, Long-Tail-optimiert",d:"+31%"}], 426 head:["Element","Vorher","Nachher","Wirkung"], 427 ai:"⨠Optimierte Listings zeigen +210% durchschnittlichen Impressions-Anstieg innerhalb von 14 Tagen. Backend-Keyword-Optimierung allein trieb 31% der Verbesserung." 428 }}, 429 ss3:{en:{title:"Competitor Benchmark â Romance Category", 430 stats:[{n:"94/100",l:"Your Avg. Score",c:"Top 5% in genre",up:true},{n:"72/100",l:"Genre Average",c:"across 2,400 titles",up:false},{n:"+31%",l:"Your CTR Advantage",c:"vs. genre median",up:true},{n:"3/50",l:"Your Portfolio Rank",c:"in Romance",up:true}], 431 rows:[{a:"#1 · Twisted Love â Ana Huang",b:"97/100",c:"Perfect metadata",d:"â Benchmark"},{a:"#2 · It Ends with Us â C. Hoover",b:"95/100",c:"Strong backend KW",d:"â Benchmark"},{a:"#3 · The Love Hypothesis â You",b:"94/100",c:"Optimized by Lit-X",d:"ð Your title"},{a:"Genre Avg. (2,400 titles)",b:"72/100",c:"â",d:"ð Baseline"}], 432 head:["Rank · Title","Score","Strength","Note"], 433 ai:"⨠Your portfolio outperforms 95% of Romance listings. Top gap: A+ Content (images) â adding lifestyle images could push The Love Hypothesis to #1 in the category." 434 },de:{title:"Wettbewerbs-Benchmark â Romance-Kategorie", 435 stats:[{n:"94/100",l:"Ihr à Score",c:"Top 5% im Genre",up:true},{n:"72/100",l:"Genre-Durchschnitt",c:"über 2.400 Titel",up:false},{n:"+31%",l:"Ihr CTR-Vorteil",c:"vs. Genre-Median",up:true},{n:"3/50",l:"Ihr Portfolio-Rang",c:"in Romance",up:true}], 436 rows:[{a:"#1 · Twisted Love â Ana Huang",b:"97/100",c:"Perfekte Metadaten",d:"â Benchmark"},{a:"#2 · It Ends with Us â C. Hoover",b:"95/100",c:"Starke Backend-KW",d:"â Benchmark"},{a:"#3 · The Love Hypothesis â Sie",b:"94/100",c:"Optimiert von Lit-X",d:"ð Ihr Titel"},{a:"Genre-à (2.400 Titel)",b:"72/100",c:"â",d:"ð Baseline"}], 437 head:["Rang · Titel","Score","Stärke","Hinweis"], 438 ai:"⨠Ihr Portfolio übertrifft 95% der Romance-Listings. Top-Lücke: A+ Content (Bilder) â Lifestyle-Bilder könnten The Love Hypothesis auf #1 in der Kategorie bringen." 439 }} 440 }, 441 uc8:{tabs:{en:["Author Profile","Bibliography","Rights Check"],de:["Autorenprofil","Bibliografie","Rechte-Check"]}, 442 ss2:{en:{title:"Author Profile â Rebecca Yarros",stats:[{n:"47",l:"Titles Published",c:"",up:false},{n:"4.3",l:"Avg Rating",c:"",up:false},{n:"892K",l:"Social Reach",c:"",up:false},{n:"High",l:"Acquisition Fit",c:true}],rows:[{a:"Fourth Wing",b:"4.52",c:"284K ratings",d:"ð¥ Bestseller"},{a:"Iron Flame",b:"4.41",c:"198K ratings",d:"â Strong"}
442,{a:"Onyx Storm",b:"4.38",c:"42K ratings",d:"ð New"}],head:["Title","Rating","Reviews","Status"],ai:"⨠Author shows consistent bestseller performance. Social reach up 340% in 6 months. Recommend acquisition."},de:{title:"Autorenprofil â Rebecca Yarros",stats:[{n:"47",l:"Veröffentl.",c:"",up:false},{n:"4,3",l:"à Bewertung",c:"",up:false},{n:"892K",l:"Social Reach",c:"",up:false},{n:"Hoch",l:"Akquise-Fit",c:true}],rows:[{a:"Fourth Wing",b:"4,52",c:"284K Bewertungen",d:"ð¥ Bestseller"},{a:"Iron Flame",b:"4,41",c:"198K Bewertungen",d:"â Stark"},{a:"Onyx Storm",b:"4,38",c:"42K Bewertungen",d:"ð Neu"}],head:["Titel","Bewertung","Rezensionen","Status"],ai:"⨠Autor zeigt konsistente Bestseller-Performance. Social Reach +340% in 6 Monaten. Akquise empfohlen."}}, 443 ss3:{en:{title:"Rights Availability",stats:[{n:"6",l:"Markets Open",c:"",up:false},{n:"2",l:"In Negotiation",c:"",up:false},{n:"4",l:"Sold",c:"",up:false},{n:"DE, KR",l:"Priority",c:true}],rows:[{a:"ð©ðª Germany",b:"Available",c:"High demand",d:"ð¢"},{a:"ð°ð· Korea",b:"Available",c:"Trending",d:"ð¢"},{a:"ð¯ðµ Japan",b:"Negotiating",c:"Interest",d:"ð¡"},{a:"ð«ð· France",b:"Sold",c:"Hachette",d:"â«"}],head:["Market","Status","Signal",""],ai:"⨠German and Korean rights have highest ROI potential. Recommend outreach within 2 weeks."},de:{title:"Rechte-Verfügbarkeit",stats:[{n:"6",l:"Märkte offen",c:"",up:false},{n:"2",l:"In Verhandlung",c:"",up:false},{n:"4",l:"Verkauft",c:"",up:false},{n:"DE, KR",l:"Priorität",c:true}],rows:[{a:"ð©ðª Deutschland",b:"Verfügbar",c:"Hohe Nachfrage",d:"ð¢"},{a:"ð°ð· Korea",b:"Verfügbar",c:"Trend",d:"ð¢"},{a:"ð¯ðµ Japan",b:"Verhandlung",c:"Interesse",d:"ð¡"},{a:"ð«ð· Frankreich",b:"Verkauft",c:"Hachette",d:"â«"}],head:["Markt","Status","Signal",""],ai:"⨠Deutsche und koreanische Rechte haben höchstes ROI-Potenzial. Outreach innerhalb 2 Wochen empfohlen."}} 444 }, 445 uc9:{tabs:{en:["Portfolio View","Seasonal Plan","Gap Analysis"],de:["Portfolio-Ansicht","Saisonplan","Lückenanalyse"]}, 446 ss2:{en:{title:"Seasonal Planning â Q1âQ4 2026",stats:[{n:"84",l:"Titles/Year",c:"",up:false},{n:"12",l:"Genres Active",c:"",up:false},{n:"3",l:"Gaps Found",c:"",up:false},{n:"+18%",l:"Growth Opp.",c:true}],rows:[{a:"Q1 Romance",b:"18 titles",c:"On track",d:"â "},{a:"Q2 Fantasy",b:"12 titles",c:"Gap: Dark",d:"ð¡"},{a:"Q3 Thriller",b:"8 titles",c:"Below target",d:"ð´"},{a:"Q4 Holiday",b:"14 titles",c:"Peak slot",d:"â "}],head:["Season","Planned","Status",""],ai:"⨠Dark Fantasy gap in Q2 â market demand up 24%. Recommend 2â3 acquisitions."},de:{title:"Saisonplanung â Q1âQ4 2026",stats:[{n:"84",l:"Titel/Jahr",c:"",up:false},{n:"12",l:"Genres aktiv",c:"",up:false},{n:"3",l:"Lücken",c:"",up:false},{n:"+18%",l:"Wachstumspot.",c:true}],rows:[{a:"Q1 Romance",b:"18 Titel",c:"Im Plan",d:"â "},{a:"Q2 Fantasy",b:"12 Titel",c:"Lücke: Dark",d:"ð¡"},{a:"Q3 Thriller",b:"8 Titel",c:"Unter Ziel",d:"ð´"},{a:"Q4 Holiday",b:"14 Titel",c:"Peak-Slot",d:"â "}],head:["Saison","Geplant","Status",""],ai:"⨠Dark-Fantasy-Lücke in Q2 â Marktnachfrage +24%. 2â3 Akquisitionen empfohlen."}}, 447 ss3:{en:{title:"Portfolio Gap Analysis",stats:[{n:"Romantasy",l:"+34% demand",c:"vs. portfolio",up:true},{n:"Dark Romance",l:"Gap",c:"0 titles",up:false},{n:"Cozy Mystery",l:"Oversupply",c:"-12%",up:false},{n:"3",l:"Acquire",c:"recommended",up:true}],rows:[{a:"Romantasy",b:"+34%",c:"Underweight",d:"ð¢ Acquire"},{a:"Dark Romance",b:"Gap",c:"0 titles",d:"ð¢ Acquire"},{a:"Cozy Mystery",b:"-12%",c:"Overweight",d:"â« Hold"},{a:"Thriller",b:"-5%",c:"Balanced",d:"â "}],head:["Genre","Gap","Signal","Action"],ai:"⨠Romantasy and Dark Romance show largest portfolio gaps. 3 acquisitions recommended for Q2."},de:{title:"Portfolio-Lückenanalyse",stats:[{n:"Romantasy",l:"+34% Nachfrage",c:"vs. Portfolio",up:true},{n:"Dark Romance",l:"Lücke",c:"0 Titel",up:false},{n:"Cozy Mystery",l:"Ãberangebot",c:"-12%",up:false},{n:"3",l:"Akquirieren",c:"empfohlen",up:true}],rows:[{a:"Romantasy",b:"+34%",c:"Untergewichtet",d:"ð¢ Akquirieren"},{a:"Dark Romance",b:"Lücke",c:"0 Titel",d:"ð¢ Akquirieren"},{a:"Cozy Mystery",b:"-12%",c:"Ãbergewichtet",d:"â« Halten"},{a:"Thriller",b:"-5%",c:"Ausgewogen",d:"â "}],head:["Genre","Lücke","Signal","Aktion"],ai:"⨠Romantasy und Dark Romance zeigen gröÃte Portfolio-Lücken. 3 Akquisitionen für Q2 empfohlen."}} 448 }, 449 uc10:{tabs:{en:["Score Card","Dimensions","Comp Titles"],de:["Score-Karte","Dimensionen","Vergleichstitel"]}, 450 ss2:{en:{title:"Dimension Ratings â Little Stranger",stats:[{n:"82",l:"Overall",c:"",up:false},{n:"A",l:"Prose",c:"",up:false},{n:"B+",l:"Plot",c:"",up:false},{n:"High",l:"Market Fit",c:true}],rows:[{a:"Prose Quality",b:"A",c:"92",d:"â "},{a:"Plot Structure",b:"B+",c:"85",d:"â "},{a:"Characters",b:"A-",c:"88",d:"â "},{a:"Marketability",b:"B",c:"78",d:"ð¡"}],head:["Dimension","Grade","Score",""],ai:"⨠Prose and characters strongest. Marketability could improve with comp alignment."},de:{title:"Dimensions-Bewertungen â Little Stranger",stats:[{n:"82",l:"Gesamt",c:"",up:false},{n:"A",l:"Prosa",c:"",up:false},{n:"B+",l:"Plot",c:"",up:false},{n:"Hoch",l:"Markt-Fit",c:true}],rows:[{a:"Prosaqualität",b:"A",c:"92",d:"â "},{a:"Plotstruktur",b:"B+",c:"85",d:"â "},{a:"Figuren",b:"A-",c:"88",d:"â "},{a:"Marktfähigkeit",b:"B",c:"78",d:"ð¡"}],head:["Dimension","Note","Score",""],ai:"⨠Prosa und Figuren stärkste Bereiche. Marktfähigkeit könnte mit Comp-Alignment verbessert werden."}}, 451 ss3:{en:{title:"Comp Title Matching",stats:[{n:"3",l:"Matches",c:"found",up:false},{n:"96%",l:"Fourth Wing",c:"fit",up:true},{n:"89%",l:"Love Hypothesis",c:"fit",up:true},{n:"High",l:"Acquisition",c:true}],rows:[{a:"Fourth Wing",b:"96%",c:"Romantasy, dragons",d:"â "}
451,{a:"The Love Hypothesis",b:"89%",c:"Academic romance",d:"â "},{a:"Powerless",b:"84%",c:"Fantasy romance",d:"â "}],head:["Comp Title","Match","Genre",""],ai:"⨠Fourth Wing strongest comp. All three support acquisition recommendation."},de:{title:"Vergleichstitel-Matching",stats:[{n:"3",l:"Matches",c:"gefunden",up:false},{n:"96%",l:"Fourth Wing",c:"Fit",up:true},{n:"89%",l:"Love Hypothesis",c:"Fit",up:true},{n:"Hoch",l:"Akquise",c:true}],rows:[{a:"Fourth Wing",b:"96%",c:"Romantasy, Drachen",d:"â "},{a:"The Love Hypothesis",b:"89%",c:"Academic Romance",d:"â "},{a:"Powerless",b:"84%",c:"Fantasy Romance",d:"â "}],head:["Vergleichstitel","Match","Genre",""],ai:"⨠Fourth Wing stärkster Comp. Alle drei unterstützen Akquisitionsempfehlung."}} 452 }, 453 uc11:{tabs:{en:["Dashboard","Sales Trends","Social Buzz"],de:["Dashboard","Verkaufstrends","Social Buzz"]}, 454 ss2:{en:{title:"Title Performance â Fourth Wing",stats:[{n:"12.4K",l:"Units/Month",c:"",up:false},{n:"4.6",l:"Avg Rating",c:"",up:false},{n:"2.1M",l:"Social Views",c:"",up:false},{n:"+34%",l:"MoM Growth",c:true}],rows:[{a:"Jan 2026",b:"11.2K",c:"4.52",d:"â"},{a:"Feb 2026",b:"12.4K",c:"4.56",d:"â"},{a:"Mar 2026",b:"13.1K",c:"4.58",d:"â"}],head:["Month","Units","Rating","Trend"],ai:"⨠Steady growth. Social buzz up 42% â consider increasing ad spend."},de:{title:"Titel-Performance â Fourth Wing",stats:[{n:"12,4K",l:"Stück/Monat",c:"",up:false},{n:"4,6",l:"à Bewertung",c:"",up:false},{n:"2,1 Mio.",l:"Social Views",c:"",up:false},{n:"+34%",l:"MoM",c:true}],rows:[{a:"Jan 2026",b:"11,2K",c:"4,52",d:"â"},{a:"Feb 2026",b:"12,4K",c:"4,56",d:"â"},{a:"Mär 2026",b:"13,1K",c:"4,58",d:"â"}],head:["Monat","Stück","Bewertung","Trend"],ai:"⨠Stetiges Wachstum. Social Buzz +42% â Ad-Spend-Erhöhung erwägen."}}, 455 ss3:{en:{title:"Social Buzz & Reviews",stats:[{n:"2.1M",l:"Social Views",c:"this month",up:true},{n:"4.6",l:"Avg Rating",c:"5 platforms",up:false},{n:"+42%",l:"Buzz Growth",c:"vs. last month",up:true},{n:"92",l:"Buzz Score",c:"Top 1%",up:true}],rows:[{a:"Social",b:"1.2M",c:"7.8% eng.",d:"ð¥"},{a:"Social Reels",b:"640K",c:"9.4% eng.",d:"ð¥"},{a:"Pinterest",b:"180K",c:"3.1% eng.",d:"â "}],head:["Platform","Reach","Engagement",""],ai:"⨠Social platforms driving most buzz. Reels outperform static posts 2.1Ã."},de:{title:"Social Buzz & Bewertungen",stats:[{n:"2,1 Mio.",l:"Social Views",c:"diesen Monat",up:true},{n:"4,6",l:"à Bewertung",c:"5 Plattformen",up:false},{n:"+42%",l:"Buzz-Wachstum",c:"vs. Vormonat",up:true},{n:"92",l:"Buzz-Score",c:"Top 1%",up:true}],rows:[{a:"Social",b:"1,2 Mio.",c:"7,8% Eng.",d:"ð¥"},{a:"Social Reels",b:"640K",c:"9,4% Eng.",d:"ð¥"},{a:"Pinterest",b:"180K",c:"3,1% Eng.",d:"â "}],head:["Plattform","Reichweite","Engagement",""],ai:"⨠Social-Plattformen treiben meisten Buzz. Reels übertreffen statische Posts 2,1Ã."}} 456 }, 457 uc12:{tabs:{en:["Competitors","Title Compare","Alerts"],de:["Konkurrenten","Titel-Vergleich","Alerts"]}, 458 ss2:{en:{title:"Competitor Title Comparison",stats:[{n:"8",l:"Competitors",c:"tracked",up:false},{n:"246",l:"Titles",c:"this quarter",up:false},{n:"3",l:"Alerts/Week",c:"",up:false},{n:"22%",l:"Your Share",c:true}],rows:[{a:"Publisher A",b:"42 titles",c:"Romance",d:"+12%"},{a:"Publisher B",b:"38 titles",c:"Fantasy",d:"+8%"},{a:"Publisher C",b:"31 titles",c:"Thriller",d:"-3%"},{a:"You",b:"28 titles",c:"Mixed",d:"22%"}],head:["Publisher","Output","Focus","Change"],ai:"⨠Publisher A gaining in Romance. Consider 2â3 counter-acquisitions."},de:{title:"Konkurrenz-Titel-Vergleich",stats:[{n:"8",l:"Konkurrenten",c:"getrackt",up:false},{n:"246",l:"Titel",c:"dieses Quartal",up:false},{n:"3",l:"Alerts/Woche",c:"",up:false},{n:"22%",l:"Ihr Anteil",c:true}],rows:[{a:"Verlag A",b:"42 Titel",c:"Romance",d:"+12%"},{a:"Verlag B",b:"38 Titel",c:"Fantasy",d:"+8%"},{a:"Verlag C",b:"31 Titel",c:"Thriller",d:"-3%"},{a:"Sie",b:"28 Titel",c:"Gemischt",d:"22%"}],head:["Verlag","Output","Fokus","Ãnderung"],ai:"⨠Verlag A gewinnt in Romance. 2â3 Gegenakquisitionen erwägen."}}, 459 ss3:{en:{title:"Author Movement Alerts",stats:[{n:"3",l:"This Week",c:"",up:false},{n:"2",l:"High Priority",c:"",up:false},{n:"1",l:"Signed",c:"to competitor",up:false},{n:"Act",l:"Now",c:true}],rows:[{a:"Author X â Publisher B",b:"Romance",c:"ð¡ Watch",d:"Negotiating"},{a:"Author Y â Publisher A",b:"Fantasy",c:"ð´ Act",d:"Offer sent"},{a:"Author Z â You",b:"Thriller",c:"ð¢ Won",d:"Signed"}],head:["Movement","Genre","Priority","Status"],ai:"⨠Author Y considering Publisher A. Recommend counter-offer within 48h."},de:{title:"Autorenbewegungs-Alerts",stats:[{n:"3",l:"Diese Woche",c:"",up:false},{n:"2",l:"Hohe Priorität",c:"",up:false}
459,{n:"1",l:"Unterzeichnet",c:"an Konkurrent",up:false},{n:"Handeln",l:"Jetzt",c:true}],rows:[{a:"Autor X â Verlag B",b:"Romance",c:"ð¡ Beobachten",d:"Verhandlung"},{a:"Autor Y â Verlag A",b:"Fantasy",c:"ð´ Handeln",d:"Angebot gesendet"},{a:"Autor Z â Sie",b:"Thriller",c:"ð¢ Gewonnen",d:"Unterzeichnet"}],head:["Bewegung","Genre","Priorität","Status"],ai:"⨠Autor Y erwägt Verlag A. Gegenangebot innerhalb 48h empfohlen."}} 460 }, 461 uc13:{tabs:{en:["Activity Feed","Partnerships","Ad Spend"],de:["Aktivitäts-Feed","Partnerschaften","Ad-Spend"]}, 462 ss2:{en:{title:"Competitor Marketing Activity",stats:[{n:"5",l:"Competitors",c:"tracked",up:false},{n:"1.2K",l:"Posts/Week",c:"",up:false},{n:"18%",l:"Share of Voice",c:"",up:false},{n:"â¬42K",l:"Est. Ad Spend",c:true}],rows:[{a:"Competitor X",b:"340 posts",c:"12 bookfluencers",d:"â¬14K"},{a:"Competitor Y",b:"280 posts",c:"8 bookfluencers",d:"â¬11K"},{a:"Competitor Z",b:"220 posts",c:"6 bookfluencers",d:"â¬9K"},{a:"You",b:"180 posts",c:"5 bookfluencers",d:"â¬8K"}],head:["Competitor","Posts","Influencers","Est. Spend"],ai:"⨠Competitor X increased bookfluencer count 40%. Consider expanding your roster."},de:{title:"Konkurrenz-Marketing-Aktivität",stats:[{n:"5",l:"Konkurrenten",c:"getrackt",up:false},{n:"1,2K",l:"Posts/Woche",c:"",up:false},{n:"18%",l:"Share of Voice",c:"",up:false},{n:"â¬42K",l:"Geschätzt",c:true}],rows:[{a:"Konkurrent X",b:"340 Posts",c:"12 Bookfluencer",d:"â¬14K"},{a:"Konkurrent Y",b:"280 Posts",c:"8 Bookfluencer",d:"â¬11K"},{a:"Konkurrent Z",b:"220 Posts",c:"6 Bookfluencer",d:"â¬9K"},{a:"Sie",b:"180 Posts",c:"5 Bookfluencer",d:"â¬8K"}],head:["Konkurrent","Posts","Influencer","Geschätzt"],ai:"⨠Konkurrent X erhöhte Bookfluencer-Anzahl um 40%. Erweiterung Ihres Rosters erwägen."}}, 463 ss3:{en:{title:"Bookfluencer Partnership Intel",stats:[{n:"12",l:"Competitor X",c:"partners",up:false},{n:"8",l:"Competitor Y",c:"partners",up:false},{n:"5",l:"You",c:"partners",up:false},{n:"+3",l:"Gap",c:true}],rows:[{a:"@romantasyqueen",b:"Competitor X",c:"3 posts",d:"â¬6K"},{a:"@bookish.emily",b:"You",c:"2 posts",d:"â¬3.8K"},{a:"@darkromancereads",b:"Competitor Y",c:"4 posts",d:"â¬5K"}],head:["Influencer","Publisher","Deliverables","Value"],ai:"⨠@romantasyqueen working with Competitor X. Consider outreach for next campaign."},de:{title:"Bookfluencer-Partnerschafts-Intel",stats:[{n:"12",l:"Konkurrent X",c:"Partner",up:false},{n:"8",l:"Konkurrent Y",c:"Partner",up:false},{n:"5",l:"Sie",c:"Partner",up:false},{n:"+3",l:"Lücke",c:true}],rows:[{a:"@romantasyqueen",b:"Konkurrent X",c:"3 Posts",d:"â¬6K"},{a:"@bookish.emily",b:"Sie",c:"2 Posts",d:"â¬3,8K"},{a:"@darkromancereads",b:"Konkurrent Y",c:"4 Posts",d:"â¬5K"}],head:["Influencer","Verlag","Leistungen","Wert"],ai:"⨠@romantasyqueen arbeitet mit Konkurrent X. Outreach für nächste Kampagne erwägen."}} 464 } 465}; 466
467function renderScreen2(data) { 468 return `<div class="app-ss-body"><div style="margin-bottom:10px"><div class="ss-title" style="font-size:.62rem;margin-bottom:8px">${data.title}</div> 469 <div style="display:grid;grid-template-columns:repeat(4,1fr);gap:6px;margin-bottom:10px">${data.stats.map(s=>`<div class="ss-stat"><div class="ss-stat-l">${s.l}</div><div class="ss-stat-v" style="font-size:.72rem">${s.n}</div>${s.c?`<div class="ss-stat-c ${s.up?'up':''}" style="font-size:.42rem">${s.c}</div>`:''}</div>`).join('')}</div> 470 <div style="background:white;border-radius:7px;border:1px solid var(--g2);overflow:hidden"> 471 <div class="ss-row ss-head" style="grid-template-columns:${data.rows[0]&&data.rows[0].d!==undefined?'1.8fr 1.2fr 1.2fr .8fr':'1.5fr 1fr 1fr'}">${data.head.map(h=>`<span>${h}</span>`).join('')}</div> 472 ${data.rows.map(r=>`<div class="ss-row" style="grid-template-columns:${r.d!==undefined?'1.8fr 1.2fr 1.2fr .8fr':'1.5fr 1fr 1fr'}"><span style="font-weight:600">${r.a}</span><span>${r.b}</span><span>${r.c}</span>${r.d!==undefined?`<span>${r.d}</span>`:''}</div>`).join('')} 473 </div> 474 <div style="margin-top:8px;background:var(--blue-50);border:1px solid var(--blue-200);border-radius:6px;padding:7px 10px;font-size:.48rem;color:var(--blue);line-height:1.5">${data.ai}</div> 475 </div></div>`; 476} 477 478function ssHeaderHtml(ucTitle) { 479 const d = new Date(); 480 const loc = {en:'en-GB',de:'de-DE',es:'es-ES',fr:'fr-FR',ko:'ko-KR'}[currentLang]||'en-GB'; 481 const datePre = {en:'Data Status:',de:'Datenstand:',es:'Estado de datos:',fr:'Ãtat des données :',ko:'ë°ì´í° ìí:'}[currentLang]||'Data Status:'; 482 const dateStr = datePre + ' ' + d.toLocaleDateString(loc,{day:'numeric',month:'long',year:'numeric'}); 483 const userName = {en:'Lara Schmidt · Senior Editor',de:'Lara Schmidt · Senior-Lektorin',es:'Lara Schmidt · Editora Senior',fr:'Lara Schmidt · Ãditrice Senior',ko:'Lara Schmidt · ìëì´ ìëí°'}[currentLang]||'Lara Schmidt · Senior Editor'; 484 return `<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;padding-bottom:8px;border-bottom:1px solid var(--g1)"> 485 <div><div style="font-size:.7rem;font-weight:700;color:var(--g9)">${ucTitle}</div><div style="font-size:.42rem;color:var(--g4)">${dateStr}</div></div> 486 <div style="display:flex;align-items:center;gap:5px"><div style="width:18px;height:18px;border-radius:50%;background:linear-gradient(135deg,var(--blue),#1D4ED8);display:flex;align-items:center;justify-content:center;font-size:.38rem;color:white;font-weight:700">LS</div><div style="font-size:.42rem;color:var(--g5)">${userName}</div></div></div>`; 487} 488 489function renderManuscriptScreenshot(ss, ucTitle) { 490 const hdr = ucTitle ? ssHeaderHtml(ucTitle) : ''; 491 const dims = (ss.dimensions || []).map(d=>`<div style="display:flex;align-items:center;justify-content:space-between;padding:6px 10px;border-bottom:1px solid var(--g1);font-size:.52rem"><span style="color:var(--g7)">${d.l}</span><span style="font-weight:700;color:var(--blue)">${d.s}</span><span style="color:var(--g5)">${d.v}/100</span></div>`).join(''); 492 const comps = (ss.compTitles || []).map(c=>`<span style="font-size:.48rem;background:var(--blue-50);color:var(--blue);padding:2px 6px;border-radius:3px;margin-right:3px">${c}</span>`).join(''); 493 return `<div class="app-ss"><div class="app-ss-bar"><div class="mdot md1"></div><div class="mdot md2"></div><div class="mdot md3"></div></div> 494 <div class="app-ss-body">${hdr} 495 <div style="display:flex;align-items:center;gap:8px;margin-bottom:10px"><span style="font-size:1.4rem">ð</span><span class="ss-ai" style="font-size:.52rem">⨠Manuscript Evaluation</span></div> 496 <div style="display:flex;align-items:center;gap:12px;margin-bottom:10px"><div style="background:var(--blue);color:white;width:48px;height:48px;border-radius:8px;display:flex;align-items:center;justify-content:center;font-size:1.2rem;font-weight:700">${ss.overall||82}</div><div><div style="font-size:.6rem;font-weight:700;color:var(--g9)">${ss.title||'Manuscript Evaluation'}</div><div style="font-size:.45rem;color:var(--g4)">Overall Score · Dimension Ratings</div></div></div> 497 <div style="background:white;border-radius:7px;border:1px solid var(--g2);overflow:hidden;margin-bottom:8px">${dims}</div> 498 <div style="font-size:.48rem;color:var(--g5);margin-bottom:4px">Comp Titles</div><div>${comps}</div> 499 </div></div>`; 500} 501 502function renderGenericScreenshot(ss, ucTitle) { 503 const hdr = ucTitle ? ssHeaderHtml(ucTitle) : ''; 504 const metricsHtml = ss.metrics.map(m=>`<div class="ss-stat"><div class="ss-stat-l">${m.l}</div><div class="ss-stat-v" style="font-size:.72rem;${m.c?'color:var(--blue)':''}">${m.n}</div></div>`).join(''); 505 506 let detailHtml = ''; 507 if (ss.chart) { 508 detailHtml = `<div style="background:white;border-radius:7px;border:1px solid var(--g2);padding:10px"> 509 <div style="font-size:.5rem;color:var(--g4);margin-bottom:6px;font-weight:600">${ss.chart.label||'Trend'}</div> 510 <div style="display:flex;align-items:flex-end;
510gap:3px;height:40px">${(ss.chart.bars||[]).map(b=>`<div style="flex:1;background:${b.h?'var(--blue)':'var(--blue-100)'};border-radius:2px 2px 0 0;height:${b.v}%"></div>`).join('')}</div> 511 ${ss.chart.labels?`<div style="display:flex;gap:3px;margin-top:3px">${ss.chart.labels.map(l=>`<div style="flex:1;font-size:.36rem;color:var(--g4);text-align:center">${l}</div>`).join('')}</div>`:''} 512 </div>`; 513 } else if (ss.table) { 514 detailHtml = `<div style="background:white;border-radius:7px;border:1px solid var(--g2);overflow:hidden"> 515 <div style="display:grid;grid-template-columns:${ss.table.cols.map(()=>'1fr').join(' ')};gap:0;background:var(--g1);font-size:.44rem;font-weight:600;color:var(--g5)">${ss.table.cols.map(c=>`<div style="padding:5px 8px">${c}</div>`).join('')}</div> 516 ${ss.table.data.map((row,i)=>`<div style="display:grid;grid-template-columns:${ss.table.cols.map(()=>'1fr').join(' ')};gap:0;border-top:1px solid var(--g1);font-size:.44rem;color:var(--g7)">${row.map(cell=>`<div style="padding:5px 8px">${cell}</div>`).join('')}</div>`).join('')} 517 </div>`; 518 } else if (ss.rows) { 519 detailHtml = `<div style="display:grid;grid-template-columns:1fr 1fr;gap:4px">${ss.rows.map(r=>{ 520 const parts = r.split(':'); 521 if (parts.length >= 2) return '<div style="background:white;border-radius:6px;border:1px solid var(--g2);padding:6px 8px"><div style="font-size:.4rem;color:var(--g4)">' + parts[0].trim() + '</div><div style="font-size:.56rem;font-weight:600;color:var(--g9)">' + parts.slice(1).join(':').trim() + '</div></div>'; 522 return '<div style="background:white;border-radius:6px;border:1px solid var(--g2);padding:6px 8px;font-size:.48rem;color:var(--g7)">' + r + '</div>'; 523 }).join('')}</div>`; 524 } 525 526 return `<div class="app-ss"><div class="app-ss-bar"><div class="mdot md1"></div><div class="mdot md2"></div><div class="mdot md3"></div></div> 527 <div class="app-ss-body">${hdr} 528 <div style="display:flex;align-items:center;gap:8px;margin-bottom:10px"><span style="font-size:1.4rem">${ss.icon}</span><span class="ss-ai" style="font-size:.52rem">⨠AI-Powered Analysis</span></div> 529 <div style="display:grid;grid-template-columns:repeat(4,1fr);gap:6px;margin-bottom:10px">${metricsHtml}</div> 530 ${detailHtml} 531 </div></div>`; 532} 533 534function renderPostScreenshot(ss, ucTitle) { 535 const hdr = ucTitle ? ssHeaderHtml(ucTitle) : ''; 536 const platformBtns = (ss.platforms || ['Instagram','TikTok','Social']).map(p=>`<span style="font-size:.48rem;background:${p===ss.platform?'var(--g9);color:white':'var(--g1);color:var(--g5)'};padding:2px 6px;border-radius:3px">${p}</span>`).join(''); 537 return `<div class="app-ss"><div class="app-ss-bar"><div class="mdot md1"></div><div class="mdot md2"></div><div class="mdot md3"></div></div> 538 <div class="app-ss-body">${hdr} 539 <div class="ss-ai" style="font-size:.52rem;margin-bottom:8px">⨠Post Draft Preview</div> 540 <div style="display:flex;gap:3px;flex-wrap:wrap;margin-bottom:8px">${platformBtns}</div> 541 <div class="ss-card" style="margin-bottom:8px"><div style="font-size:.5rem;color:var(--g6);line-height:1.5">${ss.caption||''}</div></div> 542 <div style="display:flex;gap:2px;flex-wrap:wrap;margin-bottom:6px">${(ss.hashtags||[]).map(h=>`<span style="font-size:.42rem;background:var(--blue-50);color:var(--blue);padding:2px 5px;border-radius:3px">${h}</span>`).join('')}</div> 543 <div style="display:flex;justify-content:space-between;font-size:.48rem;color:var(--g5)"><span>ð ${ss.scheduled||'â'}</span><span>ð ${ss.engagement||'â'}</span></div> 544 </div></div>`; 545} 546 547function renderProfileScreenshot(ss, ucTitle) { 548 const hdr = ucTitle ? ssHeaderHtml(ucTitle) : ''; 549 return `<div class="app-ss"><div class="app-ss-bar"><div class="mdot md1"></div><div class="mdot md2"></div><div class="mdot md3"></div></div> 550 <div class="app-ss-body">${hdr} 551 <div class="ss-ai" style="font-size:.52rem;margin-bottom:8px">⨠Bookfluencer Profile</div> 552 <div style="display:flex;align-items:center;gap:10px;margin-bottom:10px;padding:8px;background:white;border-radius:7px;border:1px solid var(--g2)"> 553 <div style="width:40px;height:40px;border-radius:50%;background:linear-gradient(135deg,#F9A8D4,#F472B6);display:flex;align-items:center;justify-content:center;font-size:.7rem;color:white;font-weight:700">${(ss.name||'@').substring(1,3).toUpperCase()}</div> 554 <div><div style="font-weight:600;font-size:.6rem">${ss.name||'@'}</div><div style="font-size:.45rem;color:var(--g4)">${ss.platform||'Social'}</div></div> 555 </div> 556 <div style="display:grid;grid-template-columns:repeat(2,1fr);gap:6px;font-size:.5rem"> 557 <div class="ss-stat"><div class="ss-stat-l">Followers</div><div class="ss-stat-v">${ss.followers||'â'}</div></div> 558 <div class="ss-stat"><div class="ss-stat-l">Engagement</div><div class="ss-stat-v">${ss.engagement||'â'}</div></div> 559 <div class="ss-stat"><div class="ss-stat-l">Genre Match</div><div class="ss-stat-v" style="color:var(--blue)">${ss.genreMatch||'â'}%</div></div> 560 <div class="ss-stat"><div class="ss-stat-l">Cost/Post</div><div class="ss-stat-v">${ss.costPerPost||'â'}</div></div> 561 <div class="ss-stat"><div class="ss-stat-l">Response Rate</div><div class="ss-stat-v">${ss.responseRate||'â'}</div></div> 562 </div> 563 </div></div>`; 564} 565 566function renderCampaignScreenshot(ss, ucTitle) { 567 const hdr = ucTitle ? ssHeaderHtml(ucTitle) : ''; 568 if (ss.products) { 569 const scoreColor = acos => { const n = parseFloat(acos); return n < 16 ? '#059669' : n < 20 ? '#D97706' : '#DC2626'; }; 570 const statusBg = s => s === 'Active' ? '#D1FAE5' : s === 'Draft' ? '#FEF3C7' : '#FEE2E2'; 571 const statusColor = s => s === 'Active' ? '#065F46' : s === 'Draft' ? '#92400E' : '#991B1B'; 572 return `<div class="app-ss"><div class="app-ss-bar"><div class="mdot md1"></div><div class="mdot md2"></div><div class="mdot md3"></div></div> 573 <div class="app-ss-body">${hdr}<div class="ss-ai" style="font-size:.52rem;margin-bottom:8px">⨠Product Ad Overview</div> 574 <div style="background:white;border-radius:7px;border:1px solid var(--g2);overflow:hidden"> 575 <div class="ss-row ss-head" style="grid-template-columns:2fr 1fr 1fr 1fr 1fr 1fr 1fr"><span>Title</span><span>ACoS</span><span>Impr.</span><span>Clicks</span><span>Spend</span><span>Sales</span><span>Status</span></div> 576 ${ss.products.map(p=>`<div class="ss-row" style="grid-template-columns:2fr 1fr 1fr 1fr 1fr 1fr 1fr"><span style="font-weight:600">${p.title}</span><span style="font-weight:600;color:${scoreColor(p.acos)}">${p.acos}</span><span>${p.imp||'â'}</span><span>${p.clicks||'â'}</span><span>${p.spend||'â'}</span><span style="font-weight:600;color:#059669">${p.sales||'â'}</span><span><span style="font-size:.42rem;
576background:${statusBg(p.status)};color:${statusColor(p.status)};padding:1px 5px;border-radius:100px;font-weight:600">${p.status}</span></span></div>`).join('')} 577 </div></div></div>`; 578 } 579 return renderPaidSocialScreenshot(ss, ucTitle); 580} 581 582function renderAuditScreenshot(ss, ucTitle) { 583 return renderListingOptimizerScreenshot(ss, ucTitle); 584} 585 586function renderPreviewScreenshot(ss, ucTitle) { 587 const hdr = ucTitle ? ssHeaderHtml(ucTitle) : ''; 588 const data = ss; 589 const statsHtml = `<div style="display:grid;grid-template-columns:repeat(4,1fr);gap:6px;margin-bottom:10px">${data.stats.map(s=>`<div class="ss-stat"><div class="ss-stat-l">${s.l}</div><div class="ss-stat-v" style="font-size:.72rem">${s.n}</div>${s.c?`<div class="ss-stat-c ${s.up?'up':''}" style="font-size:.42rem">${s.c}</div>`:''}</div>`).join('')}</div>`; 590 const rowsHtml = `<div style="background:white;border-radius:7px;border:1px solid var(--g2);overflow:hidden"><div class="ss-row ss-head" style="grid-template-columns:${data.rows[0]&&data.rows[0].d!==undefined?'1.8fr 1.2fr 1.2fr .8fr':'1.5fr 1fr 1fr'}">${data.head.map(h=>`<span>${h}</span>`).join('')}</div>${data.rows.map(r=>`<div class="ss-row" style="grid-template-columns:${r.d!==undefined?'1.8fr 1.2fr 1.2fr .8fr':'1.5fr 1fr 1fr'}"><span style="font-weight:600">${r.a}</span><span>${r.b}</span><span>${r.c}</span>${r.d!==undefined?`<span>${r.d}</span>`:''}</div>`).join('')}</div></div>`; 591 const aiHtml = `<div style="margin-top:8px;background:var(--blue-50);border:1px solid var(--blue-200);border-radius:6px;padding:7px 10px;font-size:.48rem;color:var(--blue);line-height:1.5">${data.ai}</div>`; 592 return `<div class="app-ss"><div class="app-ss-bar"><div class="mdot md1"></div><div class="mdot md2"></div><div class="mdot md3"></div></div><div class="app-ss-body">${hdr}<div style="margin-bottom:10px"><div class="ss-title" style="font-size:.62rem;margin-bottom:8px">${data.title}</div>${statsHtml}${rowsHtml}${aiHtml}</div></div></div>`; 593} 594 595var LANE_MAP = { 596 'use-cases/title-scouting.html': {prefix:'lane.ts', uc:'uc4'}, 597 'use-cases/bookfluencer.html': {prefix:'lane.bf', uc:'uc2'}, 598 'use-cases/amazon-ads.html': {prefix:'lane.aa', uc:'uc6'}, 599 'use-cases/geo-book-pages.html': {prefix:'lane.geo', uc:'uc14'} 600}; 601 602function renderProblemLanes() { 603 const cards = t('prob.cards'); 604 if (!cards || !Array.isArray(cards)) return; 605 document.getElementById('problemLanes').innerHTML = `<div class="prob-grid">${cards.filter(c => c.link !== 'contact').map(c => { 606 const isLane = LANE_MAP[c.link]; 607 var href = 'javascript:void(0)'; 608 var onclick = ''; 609 if (isLane) { onclick = ' onclick="openLanePopup(\'' + c.link + '\')"'; } 610 else { href = c.link; } 611 const umami = ` data-umami-event="cta-prob-${c.dept.toLowerCase()}"`; 612 return `<div class="prob-card"> 613 <div class="prob-icon">${c.icon}</div> 614 <div class="prob-dept">${c.dept}</div> 615 <h3 class="prob-card-title">${c.title}</h3> 616 <p class="prob-card-problem">${c.problem}</p> 617 <a href="${href}"${onclick}${umami} class="prob-cta">${c.cta}</a> 618 </div>`; 619 }).join('')}</div>`; 620} 621 622function openLanePopup(laneKey) { 623 var lane = LANE_MAP[laneKey]; 624 if (!lane) return; 625 var p = lane.prefix; 626 var uc = t(lane.uc); 627 var overlay = document.createElement('div'); 628 overlay.className = 'lane-overlay'; 629 overlay.onclick = function(e) { if (e.target === overlay) { document.body.removeChild(overlay); document.body.style.overflow = ''; } }; 630 document.body.style.overflow = 'hidden'; 631 632 var screenshot = ''; 633 if (uc && uc.ss) { 634 screenshot = '<div class="lane-screenshot">' + getLaneScreenshot(lane.uc, uc) + '</div>'; 635 } 636 637 var html = '<div class="lane-popup">'; 638 html += '<button class="lane-popup-close" onclick="this.closest(\'.lane-overlay\').remove();document.body.style.overflow=\'\'">â</button>'; 639 640 // Problem hero 641 html += '<div class="lane-hero">'; 642 html += '<div class="lane-eyebrow">' + t(p+'.eyebrow') + '</div>'; 643 html += '<h2 class="lane-headline">' + t(p+'.heroHeadline') + '</h2>'; 644 html += '<p class="lane-body">' + t(p+'.heroBody') + '</p>'; 645 html += '</div>'; 646 647 // Cost of inaction 648 html += '<div class="lane-section lane-cost">'; 649 html += '<h3>' + t(p+'.costHeadline') + '</h3>'; 650 html += '<ul><li>' + t(p+'.cost1') + '</li><li>' + t(p+'.cost2') + '</li><li>' + t(p+'.cost3') + '</li></ul>'; 651 html += '</div>'; 652 653 // How we solve it + screenshot 654 html += '<div class="lane-section">'; 655 html += '<h3>' + t(p+'.solveHeadline') + '</h3>'; 656 html += '<div class="lane-solve-grid">'; 657 html += '<div class="lane-caps">'; 658 html += '<div class="lane-cap"><span class="ck">â</span>' + t(p+'.cap1') + '</div>'; 659 html += '<div class="lane-cap"><span class="ck">â</span>' + t(p+'.cap2') + '</div>'; 660 html += '<div class="lane-cap"><span class="ck">â</span>' + t(p+'.cap3') + '</div>'; 661 html += '</div>'; 662 html += screenshot; 663 html += '</div></div>'; 664 665 // Data proof 666 html += '<div class="lane-section lane-proof">'; 667 html += '<div class="lane-proof-grid">'; 668 html += '<div class="lane-proof-item">' + t(p+'.proof1') + '</div>'; 669 html += '<div class="lane-proof-item">' + t(p+'.proof2') + '</div>'; 670 html += '<div class="lane-proof-item">' + t(p+'.proof3') + '</div>'; 671 html += '</div></div>'; 672 673 html += '</div>'; 674 overlay.innerHTML = html; 675 document.body.appendChild(overlay); 676 if (window.umami) umami.track('lane-popup-open', { lane: laneKey }); 677} 678 679function getLaneScreenshot(key, uc) { 680 var ss = uc.ss; 681 if (!ss) return ''; 682 if (ss.type === 'scouting') return renderScoutScreenshot(ss, uc.title); 683 if (ss.type === 'profile') return renderProfileScreenshot(ss, uc.title); 684 if (ss.type === 'campaign') return renderCampaignScreenshot(ss, uc.title); 685 if (key === 'uc4') return renderScoutScreenshot(ss, uc.title); 686 if (key === 'uc2') return renderBFScreenshot(ss, uc.title); 687 if (key === 'uc6') return renderOnlineShopAdsScreenshot(ss, uc.title); 688 return ''; 689} 690 691function renderUseCases() { 692 const ucs = ['uc4','uc8','uc9','uc10','uc11','uc12','uc1','uc2','uc3','uc5','uc13','uc14','uc6','uc7']; 693 const deptMap = {uc1:'marketing',uc2:'marketing',uc3:'marketing',uc4:'lektorat',uc5:'marketing',uc6:'vertrieb',uc7:'vertrieb',uc8:'lektorat',uc9:'lektorat',uc10:'lektorat',uc11:'lektorat',uc12:'lektorat',uc13:'marketing',uc14:'marketing'}; 694 const deptKeys = ['all','lektorat','marketing','vertrieb']; 695 const deptLabels = t('uc.depts') || ['All','ð Editorial','ð£ Marketing','ð Sales']; 696 697 // Build screenshot for each UC (type-based routing, fallback to key-based for legacy) 698 function getScreenshot(key, uc) { 699 const ss = uc.ss; 700 if (!ss) return ''; 701 if (ss.type === 'post') return renderPostScreenshot(ss, uc.title); 702 if (ss.type === 'profile') return renderProfileScreenshot(ss, uc.title); 703 if (ss.type === 'campaign') return renderCampaignScreenshot(ss, uc.title); 704 if (ss.type === 'audit') return renderAuditScreenshot(ss, uc.title); 705 if (ss.type === 'tracker') return renderCTScreenshot(ss, uc.title); 706 if (ss.type === 'scouting') return renderScoutScreenshot(ss, uc.title); 707 if (ss.type === 'manuscript') return renderManuscriptScreenshot(ss, uc.title); 708 if (ss.type === 'generic') return renderGenericScreenshot(ss, uc.title); 709 // Legacy key-based fallback for DE/other langs with old ss structure 710 if (key === 'uc1') return renderSMPScreenshot(ss, uc.title); 711 if (key === 'uc2') return renderBFScreenshot(ss, uc.title); 712 if (key === 'uc3') return renderCTScreenshot(ss, uc.title); 713 if (key === 'uc4') return renderScoutScreenshot(ss, uc.title); 714 if (key === 'uc5') return renderPaidSocialScreenshot(ss, uc.title); 715 if (key === 'uc6') return renderOnlineShopAdsScreenshot(ss, uc.title); 716 if (key === 'uc7') return renderListingOptimizerScreenshot(ss, uc.title); 717 return ''; 718 } 719 720 // Department filter buttons 721 const deptHtml = `<div class="uc-dept-filters">${deptKeys.map((dk,di)=> 722 `<button class="uc-dept-btn${di===0?' act':''}" data-dept="${dk}" onclick="ucDeptFilter('${dk}')">${deptLabels[di]}</button>` 723 ).join('')}</div>`; 724 725 // UC nav buttons 726 const navHtml = `<div class="uc-nav">${ucs.map((key,i)=>{ 727 const uc = t(key); 728 const badge = uc.badge ? `<span class="uc-nav-badge">${uc.badge}</span>` : ''; 729 return `<button class="uc-nav-btn${i===0?' act':''}" data-uc="${key}" data-dept="${deptMap[key]}" onclick="ucSelect('${key}')">${uc.title}${badge}</button>`; 730 }).join('')}</div>`; 731 732 // UC panels (one per UC) 733 const panelsHtml = ucs.map((key,i)=>{ 734 const uc = t(key); 735 const screenshot = getScreenshot(key, uc); 736 const badgeHtml = uc.badge ? `<span style="display:inline-flex;align-items:center;gap:4px;background:#D1FAE5;color:#065F46;padding:3px 10px;border-radius:100px;font-size:.68rem;font-weight:700;margin-left:8px;vertical-align:middle">${uc.badge}</span>` : ''; 737 738 // Build 3-tab carousel
739 const screens = UC_SCREENS[key]; 740 const lang = (currentLang === 'de') ? 'de' : 'en'; 741 const tabs = screens ? (screens.tabs[lang] || screens.tabs.en) : null; 742 const ss2data = screens ? (screens.ss2[lang] || screens.ss2.en) : null; 743 const ss3data = screens && screens.ss3 ? (screens.ss3[lang] || screens.ss3.en) : null; 744 let screenshotHtml = ''; 745 if (tabs && ss2data) { 746 const mkSS = (d) => `<div class="app-ss"><div class="app-ss-bar"><div class="mdot md1"></div><div class="mdot md2"></div><div class="mdot md3"></div></div>${renderScreen2(d)}</div>`; 747 screenshotHtml = `<div class="ss-carousel"> 748 <div class="ss-tabs">${tabs.map((tb,ti)=>`<div class="ss-tab${ti===0?' act':''}" onclick="ssTab(this,${ti})">${tb}</div>`).join('')}</div> 749 <div class="ss-slide act">${screenshot}</div> 750 <div class="ss-slide">${mkSS(ss2data)}</div> 751 ${ss3data ? `<div class="ss-slide">${mkSS(ss3data)}</div>` : ''}</div>`; 752 } else { 753 screenshotHtml = screenshot; 754 } 755 756 return `<div class="uc-panel${i===0?' act':''}" data-uc="${key}"> 757 <div class="uc-info"><div class="uc-label">${uc.label}</div><h3>${uc.title}${badgeHtml}</h3> 758 <p class="uc-desc">${uc.desc}</p> 759 <div class="uc-data-insight"><p>${uc.data}</p></div> 760 <ul class="uc-bullets">${uc.bullets.map(b=>`<li><span class="ck">â</span>${b}</li>`).join('')}</ul></div> 761 <div>${screenshotHtml}</div></div>`; 762 }).join(''); 763 764 document.getElementById('useCasesContent').innerHTML = 765 `<div class="uc-explorer">${deptHtml}${navHtml}${panelsHtml}</div>`; 766} 767
768function renderSMPScreenshot(ss, ucTitle) { 769 const hdr = ucTitle ? ssHeaderHtml(ucTitle) : ''; 770 return `<div class="app-ss"><div class="app-ss-bar"><div class="mdot md1"></div><div class="mdot md2"></div><div class="mdot md3"></div></div> 771 <div class="app-ss-body">${hdr}<div style="display:flex;gap:10px"> 772 <div style="flex:1"><div style="display:flex;gap:3px;margin-bottom:8px">${[1,1,1,0,0].map((d,i)=>`<div style="flex:1;height:3px;border-radius:2px;background:${d?'var(--blue)':i===3?'var(--orange)':'var(--g3)'}"></div>`).join('')}</div> 773 <div class="ss-card"><div style="font-size:.52rem;font-weight:600;color:var(--g7);margin-bottom:4px">${ss.step}</div> 774 ${ss.books.map((b,i)=>`<div style="display:flex;align-items:center;gap:6px;padding:4px 6px;border-radius:5px;margin-bottom:3px;font-size:.55rem;${i===0?'background:var(--blue-50);border:1px solid var(--blue-200)':''}"><div style="width:24px;height:30px;border-radius:2px;display:flex;align-items:center;justify-content:center;font-size:.7rem;background:${['#FEE2E2','#DBEAFE','#D1FAE5'][i]}">${b.e}</div><div><div style="font-weight:600;color:var(--g8)">${b.t}</div><div style="font-size:.48rem;color:var(--g4)">${b.a}</div></div></div>`).join('')}</div> 775 <div class="ss-card"><div class="ss-ai">⨠${ss.preview.split('â')[0].trim()}</div> 776 <div style="font-size:.48rem;font-weight:600;color:var(--g4);text-transform:uppercase;letter-spacing:.5px;margin:4px 0 3px">${ss.preview}</div> 777 <div style="font-size:.5rem;color:var(--g6);line-height:1.5;white-space:pre-line">${ss.previewText}</div></div></div> 778 <div style="width:150px"><div class="ss-card"><div style="font-size:.52rem;font-weight:600;color:var(--g7);margin-bottom:4px">${ss.persona}</div> 779 ${ss.personas.map(p=>`<div style="display:flex;align-items:center;gap:5px;padding:4px 5px;border-radius:5px;font-size:.55rem;margin-bottom:2px;${p.sel?'background:var(--blue-50);border:1px solid var(--blue-200)':''}"><span style="font-size:.85rem">${p.e}</span><div><div style="font-weight:600;color:var(--g8)">${p.n}</div><div style="font-size:.45rem;color:var(--g4)">${p.r}</div></div></div>`).join('')}</div> 780 <div class="ss-card" style="margin-top:6px"><div style="font-size:.52rem;font-weight:600;color:var(--g7);margin-bottom:3px">${ss.platform}</div> 781 <div style="display:flex;gap:3px"><span style="font-size:.48rem;background:var(--g9);color:white;padding:2px 6px;border-radius:3px">Social</span><span style="font-size:.48rem;background:var(--g1);color:var(--g5);padding:2px 6px;border-radius:3px">IG</span><span style="font-size:.48rem;background:var(--g1);color:var(--g5);padding:2px 6px;border-radius:3px">YT</span></div></div></div> 782 </div></div></div>`; 783} 784 785function renderBFScreenshot(ss, ucTitle) { 786 const hdr = ucTitle ? ssHeaderHtml(ucTitle) : ''; 787 return `<div class="app-ss"><div class="app-ss-bar"><div class="mdot md1"></div><div class="mdot md2"></div><div class="mdot md3"></div></div> 788 <div class="app-ss-body">${hdr}<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:6px"><div class="ss-ai">⨠AI Match Score</div></div> 789 <div style="display:flex;gap:3px;flex-wrap:wrap;margin-bottom:8px">${ss.filters.map((f,i)=>`<span class="ss-filter${i===0?' act':''}">${f}</span>`).join('')}${ss.tags.map(t=>`<span class="ss-filter tag">${t} Ã</span>`).join('')}</div> 790 <div style="background:white;border-radius:7px;border:1px solid var(--g2);overflow:hidden"> 791 <div class="ss-row ss-head" style="grid-template-columns:2fr 1fr 1fr 1fr 1fr"><span>Influencer</span><span>Followers</span><span>Match</span><span>Avg Views</span><span>Status</span></div> 792 ${ss.rows.map(r=>`<div class="ss-row" style="grid-template-columns:2fr 1fr 1fr 1fr 1fr"><div style="display:flex;align-items:center;gap:5px"><div style="width:18px;height:18px;border-radius:50%;background:linear-gradient(135deg,${r.mh?'#F9A8D4,#F472B6':'#A78BFA,#7C3AED'});display:flex;align-items:center;justify-content:center;font-size:.35rem;color:white;font-weight:700">${r.n.substring(1,3).toUpperCase()}</div><div><div style="font-weight:600">${r.n}</div><div style="font-size:.42rem;color:var(--g4)">${r.p}</div></div></div><span>${r.f}</span><span>${r.mh?`<span class="match-high">${r.m}</span>`:`<span class="match-med">${r.m}</span>`}</span><span>${r.v}</span><span><span style="width:5px;height:5px;border-radius:50%;display:inline-block;margin-right:3px;background:${r.sc?'#28C840':'#F59E0B'}"></span>${r.s}</span></div>`).join('')} 793 </div></div></div>`; 794} 795 796function renderCTScreenshot(ss, ucTitle) { 797 const hdr = ucTitle ? ssHeaderHtml(ucTitle) : ''; 798 return `<div class="app-ss"><div class="app-ss-bar"><div class="mdot md1"></div><div class="mdot md2"></div><div class="mdot md3"></div></div> 799 <div class="app-ss-body">${hdr} 800 <div style="display:grid;grid-template-columns:repeat(4,1fr);gap:5px;margin-bottom:8px">${ss.stats.map(s=>`<div class="ss-stat"><div class="ss-stat-l">${s.l}</div><div class="ss-stat-v">${s.v}</div><div class="ss-stat-c ${s.up?'up':'down'}">${s.c}</div></div>`).join('')}</div> 801 <div style="background:white;border-radius:7px;padding:8px;border:1px solid var(--g2)"><div style="font-size:.5rem;font-weight:600;color:var(--g7);margin-bottom:6px">Reach over time</div> 802 <svg viewBox="0 0 400 65" style="width:100%;height:65px" preserveAspectRatio="none">
803 <line x1="0" y1="16" x2="400" y2="16" stroke="#E5E7EB" stroke-width=".5"/> 804 <line x1="0" y1="32" x2="400" y2="32" stroke="#E5E7EB" stroke-width=".5"/> 805 <line x1="0" y1="48" x2="400" y2="48" stroke="#E5E7EB" stroke-width=".5"/> 806 <polyline points="20,55 80,48 160,36 240,24 320,14 380,8" fill="none" stroke="#EC4899" stroke-width="2" stroke-linecap="round"/> 807 <polyline points="20,54 80,50 160,44 240,38 320,32 380,26" fill="none" stroke="#3B82F6" stroke-width="2" stroke-linecap="round"/> 808 <polyline points="20,56 80,54 160,48 240,42 320,38 380,34" fill="none" stroke="#8B5CF6" stroke-width="2" stroke-linecap="round"/> 809 <circle cx="380" cy="8" r="2.5" fill="#EC4899"/><circle cx="380" cy="26" r="2.5" fill="#3B82F6"/><circle cx="380" cy="34" r="2.5" fill="#8B5CF6"/> 810 </svg> 811 <div style="display:flex;gap:10px;margin-top:3px"> 812 <span style="font-size:.4rem;display:flex;align-items:center;gap:2px"><span style="width:6px;height:2px;background:#EC4899;display:inline-block"></span>Mia (3.2M)</span> 813 <span style="font-size:.4rem;display:flex;align-items:center;gap:2px"><span style="width:6px;height:2px;background:#3B82F6;display:inline-block"></span>Sarah (1.8M)</span> 814 <span style="font-size:.4rem;display:flex;align-items:center;gap:2px"><span style="width:6px;height:2px;background:#8B5CF6;display:inline-block"></span>Marcus (980K)</span> 815 </div></div></div></div>`; 816} 817
818function renderScoutScreenshot(ss, ucTitle) { 819 const hdr = ucTitle ? ssHeaderHtml(ucTitle) : ''; 820 return `<div class="app-ss"><div class="app-ss-bar"><div class="mdot md1"></div><div class="mdot md2"></div><div class="mdot md3"></div></div> 821 <div class="app-ss-body">${hdr}<div class="ss-card"> 822 <div style="display:flex;align-items:center;gap:5px;margin-bottom:8px;flex-wrap:wrap"> 823 <span style="font-size:.55rem;font-weight:600;color:var(--g7)">Search Baskets</span> 824 <span style="font-size:.45rem;background:var(--g1);padding:2px 6px;border-radius:3px;color:var(--g6)">USA â Dark Romance Ã</span> 825 <span style="font-size:.45rem;background:var(--g9);color:white;padding:2px 6px;border-radius:3px">Edit</span> 826 <span style="font-size:.45rem;background:var(--g9);color:white;padding:2px 6px;border-radius:3px">+ New</span> 827 </div> 828 <div style="border:1px solid var(--g2);border-radius:5px;overflow:hidden;margin-bottom:8px"> 829 <div style="display:grid;grid-template-columns:2fr 1fr 3fr;padding:4px 6px;background:var(--g05);border-bottom:1px solid var(--g2);font-size:.42rem;font-weight:600;color:var(--g5);text-transform:uppercase"> 830 <span>Basket</span><span>Status</span><span>Description</span> 831 </div> 832 ${ss.baskets.map(b=>`<div style="display:grid;grid-template-columns:2fr 1fr 3fr;padding:5px 6px;font-size:.48rem;color:var(--g7);border-bottom:1px solid var(--g1)"><span style="font-weight:600">${b.n}</span><span style="color:#059669">${b.s}</span><span>${b.d}</span></div>`).join('')} 833 </div> 834 <div style="border:1px solid var(--g2);border-radius:5px;padding:6px"> 835 <div style="font-size:.5rem;font-weight:600;color:var(--g7);margin-bottom:4px">${ss.filters.genre}</div> 836 <div style="display:flex;gap:2px;flex-wrap:wrap;margin-bottom:6px">${ss.filters.tags.map(t=>`<span style="font-size:.4rem;background:var(--blue-100);color:var(--blue);padding:2px 5px;border-radius:3px">${t}</span>`).join('')}</div> 837 <div style="font-size:.45rem;color:var(--g4)">${ss.filters.format}: ${ss.filters.formatText}</div> 838 </div> 839 </div></div></div>`; 840} 841 842function renderPaidSocialScreenshot(ss, ucTitle) { 843 const hdr = ucTitle ? ssHeaderHtml(ucTitle) : ''; 844 return `<div class="app-ss"><div class="app-ss-bar"><div class="mdot md1"></div><div class="mdot md2"></div><div class="mdot md3"></div></div> 845 <div class="app-ss-body">${hdr} 846 <div style="display:grid;grid-template-columns:repeat(4,1fr);gap:5px;margin-bottom:8px">${ss.stats.map(s=>`<div class="ss-stat"><div class="ss-stat-l">${s.l}</div><div class="ss-stat-v">${s.v}</div><div class="ss-stat-c ${s.up?'up':'down'}">${s.c}</div></div>`).join('')}</div> 847 <div style="background:white;border-radius:7px;border:1px solid var(--g2);overflow:hidden"> 848 <div class="ss-row ss-head" style="grid-template-columns:3fr 1fr 1fr 1fr 1fr 1fr"><span>Campaign</span><span>Platform</span><span>Budget</span><span>CPC</span><span>CTR</span><span>Impr.</span></div> 849 ${ss.campaigns.map(c=>`<div class="ss-row" style="grid-template-columns:3fr 1fr 1fr 1fr 1fr 1fr"><div><div style="font-weight:600">${c.n}</div></div><span><span style="font-size:.42rem;background:${c.p==='Social'?'#1a1a2e':c.p==='Meta'?'#1877F2':'var(--g6)'};color:white;padding:1px 4px;border-radius:2px">${c.p}</span></span><span>${c.b}</span><span>${c.cpc}</span><span>${c.ctr}</span><span>${c.imp}</span></div>`).join('')} 850 </div> 851 <div style="margin-top:6px;padding:6px 8px;background:var(--blue-50);border:1px solid var(--blue-200);border-radius:5px;font-size:.48rem;color:var(--blue)">⨠AI Suggestion: Increase Social budget by 20% â genre CTR is 2.1à above platform avg.</div> 852 </div></div>`; 853} 854 855function renderOnlineShopAdsScreenshot(ss, ucTitle) { 856 const hdr = ucTitle ? ssHeaderHtml(ucTitle) : ''; 857 return `<div class="app-ss"><div class="app-ss-bar"><div class="mdot md1"></div><div class="mdot md2"></div><div class="mdot md3"></div></div> 858 <div class="app-ss-body">${hdr}<div style="display:flex;align-items:center;justify-content:flex-end;margin-bottom:6px"><div class="ss-ai">⨠AI Keywords</div></div> 859 <div style="background:white;border-radius:7px;border:1px solid var(--g2);overflow:hidden;margin-bottom:8px"> 860 <div class="ss-row ss-head" style="grid-template-columns:3fr 1fr 1fr 1fr 1fr 1fr"><span>Campaign</span><span>Type</span><span>ACoS</span><span>Spend</span><span>Sales</span><span>Keys</span></div> 861 ${ss.campaigns.map(c=>`<div class="ss-row" style="grid-template-columns:3fr 1fr 1fr 1fr 1fr 1fr"><span style="font-weight:600">${c.n}</span><span><span style="font-size:.42rem;background:var(--orange-100);color:var(--orange);padding:1px 4px;border-radius:2px">${c.t}</span></span><span style="font-weight:600;color:${parseFloat(c.acos)<16?'#059669':parseFloat(c.acos)<20?'#D97706':'#DC2626'}">${c.acos}</span><span>${c.spend}</span><span style="font-weight:600;color:#059669">${c.sales}</span><span>${c.keys}</span></div>`).join('')} 862 </div> 863 <div style="font-size:.5rem;font-weight:600;color:var(--g7);margin-bottom:4px">AI-Discovered Keywords</div> 864 <div style="background:white;border-radius:7px;border:1px solid var(--g2);overflow:hidden"> 865 <div class="ss-row ss-head" style="grid-template-columns:3fr 1fr 1fr 1fr .5fr"><span>Keyword</span><span>Volume</span><span>Bid</span><span>ACoS</span><span>Trend</span></div> 866 ${ss.keywords.map(k=>`<div class="ss-row" style="grid-template-columns:3fr 1fr 1fr 1fr .5fr"><span style="font-weight:500">${k.k}</span><span>${k.vol}</span><span>${k.bid}</span><span>${k.acos}</span><span style="color:#059669;font-weight:700">${k.trend}</span></div>`).join('')} 867 </div></div></div>`; 868} 869 870function renderListingOptimizerScreenshot(ss, ucTitle) { 871 const hdr = ucTitle ? ssHeaderHtml(ucTitle) : ''; 872 const scoreColor = s => s >= 80 ? '#059669' : s >= 60 ? '#D97706' : '#DC2626'; 873 const statusBg = s => s === 'Optimized' || s === 'Optimiert' ? '#D1FAE5' : s === 'Critical' || s === 'Kritisch' ? '#FEE2E2' : '#FEF3C7'; 874 const statusColor = s => s === 'Optimized' || s === 'Optimiert' ? '#065F46' : s === 'Critical' || s === 'Kritisch' ? '#991B1B' : '#92400E'; 875 return `<div class="app-ss"><div class="app-ss-bar"><div class="mdot md1"></div><div class="mdot md2"></div><div class="mdot md3"></div></div> 876 <div class="app-ss-body">${hdr}<div style="display:flex;align-items:center;justify-content:flex-end;margin-bottom:6px"><div class="ss-ai">⨠AI Audit</div></div> 877 <div style="background:white;border-radius:7px;border:1px solid var(--g2);overflow:hidden;margin-bottom:8px"> 878 <div class="ss-row ss-head" style="grid-template-columns:2.5fr 1.5fr .8fr 1fr .5fr"><span>Title</span><span>Category</span><span>Score</span><span>Status</span><span>Issues</span></div> 879 ${ss.books.map(b=>`<div class="ss-row" style="grid-template-columns:2.5fr 1.5fr .8fr 1fr .5fr"><div><div style="font-weight:600">${b.t}</div><div style="font-size:.42rem;color:var(--g4)">${b.a}</div></div><span style="font-size:.42rem">${b.cat}</span><span style="font-weight:700;color:${scoreColor(b.score)}">${b.score}/100</span><span><span style="font-size:.42rem;
879background:${statusBg(b.status)};color:${statusColor(b.status)};padding:1px 5px;border-radius:100px;font-weight:600">${b.status}</span></span><span style="font-weight:600;color:${b.issues>0?'#DC2626':'#059669'}">${b.issues}</span></div>`).join('')} 880 </div> 881 <div class="ss-card"><div style="font-size:.55rem;font-weight:700;color:var(--g9);margin-bottom:6px">${ss.audit.title} <span style="font-weight:400;color:var(--g4)">â Score: <span style="color:${scoreColor(ss.audit.score)};font-weight:700">${ss.audit.score}/100</span></span></div> 882 ${ss.audit.items.map(item=>`<div style="margin-bottom:5px"><div style="display:flex;justify-content:space-between;font-size:.45rem;margin-bottom:2px"><span style="font-weight:600;color:var(--g7)">${item.l}</span><span style="color:${scoreColor(item.s)};font-weight:600">${item.s}/${item.max}</span></div><div style="height:4px;background:var(--g2);border-radius:2px;overflow:hidden"><div style="height:100%;width:${item.s}%;background:${scoreColor(item.s)};border-radius:2px"></div></div><div style="font-size:.4rem;color:var(--g4);margin-top:1px">${item.note}</div></div>`).join('')} 883 </div></div></div>`; 884} 885 886function renderPricing() { 887 const cards = t('pri.cards'); 888 const note = t('pri.note'); 889 const trust = t('pri.trust'); 890 if (!cards) return; 891 const el = document.getElementById('priGrid'); 892 if (!el) return; 893 el.innerHTML = cards.map(c => ` 894 <div class="pri-card reveal visible${c.featured?' featured':''}"> 895 ${c.featured?'<div class="pri-badge">'+(t('pri.recommended')||'Recommended')+'</div>':''} 896 <div class="pri-icon">${c.icon}</div> 897 <h4 style="font-size:1.08rem;font-weight:700;color:var(--g9);margin-bottom:4px">${c.title}</h4> 898 <div style="font-size:.76rem;color:var(--g4);margin-bottom:4px">${c.sub}</div> 899 <div class="pri-price"><span class="amount">${c.price}</span><span class="unit">${c.unit}</span></div> 900 <p style="font-size:.82rem;color:var(--g5);line-height:1.6;margin-bottom:16px">${c.desc}</p> 901 <ul class="pri-feats">${c.tags.map(tg=>`<li><span class="ck">â</span>${tg}</li>`).join('')}</ul></div>`).join('') + 902 (note ? `<div style="grid-column:1/-1;text-align:center;font-size:.76rem;color:var(--g4);margin-top:12px">${note}</div>` : '') + 903 (trust ? `<div class="pri-trust" style="grid-column:1/-1">${trust.map(ti=>`<div class="pri-trust-item"><span style="color:var(--blue)">â</span>${ti}</div>`).join('')}</div>` : ''); 904} 905
906function renderSecurity() { 907 const cards = t('sec.cards'); 908 if (!cards) return; 909 const el = document.getElementById('secGrid'); 910 if (!el) return; 911 el.innerHTML = cards.map(c => ` 912 <div class="flex-card reveal visible"><div class="fc-icon">${c.icon}</div> 913 <h4>${c.title}</h4><p>${c.desc}</p></div>`).join(''); 914} 915 916function renderOnboarding() { 917 const items = t('onb.items'); 918 if (!items) return; 919 const el = document.getElementById('onbGrid'); 920 if (!el) return; 921 el.innerHTML = items.map(c => ` 922 <div class="flex-card reveal visible"><div class="fc-icon">${c.icon}</div> 923 <h4>${c.title}</h4><p>${c.desc}</p></div>`).join(''); 924} 925 926function renderMetrics() { 927 const items = t('met.items'); 928 const hasFootnote = items.some(m=>m.s); 929 document.getElementById('metricsGrid').innerHTML = items.map(m=>` 930 <div class="metric reveal visible"><div class="metric-num">${m.n}<span class="acc">${m.a}</span></div> 931 <div class="metric-label">${m.l.replace('\n','<br>')}</div></div>`).join('') + 932 (hasFootnote ? `<div style="grid-column:1/-1;text-align:center;font-size:.72rem;color:rgba(255,255,255,.45);margin-top:-8px">${items.filter(m=>m.s).map(m=>m.s).join(' · ')}</div>` : ''); 933} 934 935function renderTestimonials() { 936 const items = t('test.items'); 937 document.getElementById('testGrid').innerHTML = items.map(ti=>` 938 <div class="test-card reveal visible"><div class="test-q">${ti.q}</div> 939 <div class="test-author"><div class="test-avatar"><img src="${ti.img}" alt="${ti.n}"></div><div> 940 <div class="test-name">${ti.n}</div><div class="test-role">${ti.r}</div> 941 ${ti.co ? `<div class="test-co"><img src="${ti.co}" alt="${ti.coName}"> <span style="font-size:.72rem;font-weight:600;color:var(--g5);vertical-align:middle">${ti.coName}</span></div>` : ''}</div></div></div>`).join(''); 942} 943 944function renderFAQ() { 945 const items = t('faq.items'); 946 document.getElementById('faqGrid').innerHTML = items.map((f,i)=>` 947 <div class="faq-item"> 948 <button class="faq-q" aria-expanded="false" aria-controls="faq-a-${i}" onclick="var item=this.parentElement;var open=item.classList.toggle('open');this.setAttribute('aria-expanded',open)">${f.q}<span class="faq-icon">+</span></button> 949 <div class="faq-a" id="faq-a-${i}" role="region" aria-labelledby="faq-q-${i}"><p>${f.a}</p></div></div>`).join(''); 950} 951 952// ============================================= 953// LEGAL CONTENT 954// NOTE: ES and KO legal texts should be added if those markets are actively targeted. 955// ============================================= 956const LEGAL = { 957en: { 958 imprint: { 959 title: "Imprint (Legal Notice)", 960 html: `<p class="legal-updated">Last updated: February 2026</p> 961<h3>Information according to § 5 TMG</h3> 962<p>Lit-X GmbH<br>Schlüterstr. 3, 20146 Hamburg, Germany</p> 963<h3>Represented by</h3> 964<p>Managing Directors: Lars Leipson, Sebastian Hermanns</p> 965<h3>Contact</h3> 966<p>Email: <a href="mailto:[email protected]">[email protected]</a><br>Phone: +49 (0) 157 86 80 06 08</p> 967<h3>Registration</h3> 968<p>Registered at: Amtsgericht Hamburg<br>Registration number: HRB 181435</p> 969<h3>VAT ID</h3> 970<p>VAT identification number according to § 27 a Umsatzsteuergesetz: DE362092719</p> 971<h3>Responsible for content according to § 55 Abs. 2 RStV</h3> 972<p>Lars Leipson, Sebastian Hermanns<br>Address as above</p> 973<h3>EU Dispute Resolution</h3> 974<p>The European Commission provides a platform for online dispute resolution (OS): <a href="https://ec.europa.eu/consumers/odr/" target="_blank" rel="noopener">https://ec.europa.eu/consumers/odr/</a>. We are not obligated or willing to participate in dispute resolution proceedings before a consumer arbitration board.</p> 975<h3>Liability for Content</h3> 976<p>As a service provider, we are responsible for our own content on these pages in accordance with § 7 Abs.1 TMG under general law. According to §§ 8 to 10 TMG, however, we are not obligated as a service provider to monitor transmitted or stored third-party information or to investigate circumstances that indicate illegal activity. Obligations to remove or block the use of information under general law remain unaffected. However, liability in this regard is only possible from the time of knowledge of a specific infringement. Upon becoming aware of corresponding infringements, we will remove this content immediately.</p> 977<h3>Liability for Links</h3> 978<p>Our website contains links to external third-party websites over whose content we have no influence. Therefore, we cannot accept any liability for this external
978content. The respective provider or operator of the pages is always responsible for the content of the linked pages. The linked pages were checked for possible legal violations at the time of linking. Illegal content was not recognizable at the time of linking. A permanent content control of the linked pages is not reasonable without concrete evidence of an infringement. Upon becoming aware of legal violations, we will remove such links immediately.</p> 979<h3>Copyright</h3> 980<p>The content and works on these pages created by the site operators are subject to German copyright law. The reproduction, editing, distribution, and any kind of use outside the limits of copyright law require the written consent of the respective author or creator. Downloads and copies of this site are only permitted for private, non-commercial use. Insofar as the content on this site was not created by the operator, the copyrights of third parties are respected. In particular, third-party content is identified as such. Should you nevertheless become aware of a copyright infringement, please notify us accordingly. Upon becoming aware of legal violations, we will remove such content immediately.</p>` 981 }, 982 privacy: { 983 title: "Data Protection Policy", 984 html: `<p class="legal-updated">Last updated: February 2026</p> 985<h3>1. Data Protection at a Glance</h3> 986<p>The following information provides a simple overview of what happens to your personal data when you visit this website. Personal data is any data that can personally identify you. Detailed information on the subject of data protection can be found in our data protection declaration listed below.</p> 987<h3>2. Data Controller</h3> 988<p>The data controller responsible for data processing on this website is:</p> 989<p>Lit-X GmbH<br>Managing Directors: Lars Leipson, Sebastian Hermanns<br>Schlüterstr. 3, 20146 Hamburg, Germany<br>Email: <a href="mailto:[email protected]">[email protected]</a><br>Phone: +49 (0) 157 86 80 06 08</p> 990<p>The data controller is the natural or legal person who, alone or jointly with others, decides on the purposes and means of processing personal data (e.g. names, email addresses, etc.).</p> 991<h3>3. Data Collection on This Website</h3> 992<p><strong>How do we collect your data?</strong> Your data is collected on the one hand by you communicating it to us (e.g. data entered in a contact form or sent via email). Other data is collected automatically or with your consent by our IT systems when you visit the website. This is primarily technical data (e.g. internet browser, operating system, or time of page access). This data is collected automatically as soon as you enter this website.</p> 993<p><strong>What do we use your data for?</strong> Part of the data is collected to ensure the error-free provision of the website. Other data may be used to analyze your user behavior.</p> 994<p><strong>What rights do you have regarding your data?</strong> You have the right at any time to receive information free of charge about the origin, recipient, and purpose of your stored personal data. You also have the right to request the correction or deletion of this data. If you have given consent to data processing, you can revoke this consent at any time for the future. In addition, you have the right to request the restriction of the processing of your personal data under certain circumstances. You also have the right to lodge a complaint with the competent supervisory authority.</p> 995<h3>4. Hosting</h3> 996<p>This website is hosted by an external service provider (hoster). The personal data collected on this website is stored on the hoster's servers. This may include IP addresses, contact requests, meta and communication data, contract data, contact details, names, website accesses, and other data generated via a website. The use of the hoster is for the purpose of fulfilling contracts with our potential and existing customers (Art. 6 para. 1 lit. b GDPR) and in the interest of a secure, fast, and efficient provision of our online offering by a professional provider (Art. 6 para. 1 lit. f GDPR).</p> 997<h3>5. Cookies</h3> 998<p>This website does not use cookies for analytics. We use Umami, a privacy-friendly, cookie-free analytics tool that c
998ollects anonymous usage statistics (pages visited, referrer, country, device type). No personal data is stored and no cookies are placed. Essential technical cookies may be set by our hosting provider for security purposes (e.g., DDoS protection). You can configure your browser to block cookies at any time.</p> 999<h3>6. Analytics</h3> 1000<p>We use Umami Analytics to understand how visitors use our website. Umami is a privacy-friendly, open-source analytics tool. It does not use cookies, does not collect personal data, and does not track users across websites. The data collected includes: pages visited, referrer URLs, browser type, operating system, device type, and country (derived from anonymized IP). All data is aggregated and cannot be used to identify individual visitors. This processing is based on our legitimate interest in understanding website usage (Art. 6 para. 1 lit. f GDPR).</p> 1001<h3>7. Contact</h3> 1002<p>If you contact us by email or contact form, your inquiry including all resulting personal data (name, inquiry) will be stored and processed by us for the purpose of handling your request. We do not pass on this data without your consent. The processing of this data takes place on the basis of Art. 6 para. 1 lit. b GDPR, if your request is related to the performance of a contract or is necessary for the implementation of pre-contractual measures. In all other cases, the processing is based on our legitimate interest in the effective handling of inquiries addressed to us (Art. 6 para. 1 lit. f GDPR) or on your consent (Art. 6 para. 1 lit. a GDPR) if this has been requested.</p> 1003<h3>8. Your Rights</h3> 1004<p>You have the following rights under GDPR:</p> 1005<ul> 1006<li>Right of access (Art. 15 GDPR)</li> 1007<li>Right to rectification (Art. 16 GDPR)</li> 1008<li>Right to erasure (Art. 17 GDPR)</li> 1009<li>Right to restriction of processing (Art. 18 GDPR)</li> 1010<li>Right to data portability (Art. 20 GDPR)</li> 1011<li>Right to object (Art. 21 GDPR)</li> 1012</ul> 1013<p>To exercise these rights, please contact us at <a href="mailto:[email protected]">[email protected]</a>.</p> 1014<h3>9. Right to Lodge a Complaint</h3> 1015<p>If you believe that the processing of your personal data violates data protection law, you have the right to lodge a complaint with a supervisory authority, in particular in the member state of your habitual residence, your place of work, or the place of the alleged infringement.</p>` 1016 }, 1017 terms: { 1018 title: "General Terms & Conditions", 1019 html: `<p class="legal-updated">Last updated: February 2026</p> 1020<h3>1. Scope</h3> 1021<p>These General Terms and Conditions (GTC) apply to all business relationships between Lit-X GmbH, Hamburg ("Lit-X", "we", "us") and our customers ("Customer", "you"). These GTC apply exclusively; deviating, conflicting, or supplementary general terms and conditions of the customer shall only become part of the contract if and to the extent that Lit-X has expressly agreed to their validity in writing.</p> 1022<h3>2. Services</h3> 1023<p>Lit-X provides AI-powered data solutions and consulting services for the book publishing and influencer marketing industries. The specific scope of services is defined in the individual contract or order confirmation. We reserve the right to make changes to the services that serve technical progress, provided the changes are reasonable for the customer.</p> 1024<h3>3. Contract Conclusion</h3> 1025<p>Our offers are non-binding. A contract is concluded when Lit-X confirms the order in writing (including by email) or begins to provide the service. The content of the contract is determined by the individual agreement and these GTC.</p> 1026<h3>4. Prices and Payment</h3> 1027<p>All prices are net prices plus the applicable statutory value-added tax. Unless otherwise agreed, invoices are due for payment within 14 days of the invoice date. In the event of default in payment, Lit-X is entitled to charge default interest at the statutory rate.</p> 1028<h3>5. Customer Obligations</h3> 1029<p>The customer shall provide Lit-X with all information and materials required for the provision of services in a timely and complete manner. The customer is responsible for the accuracy and completeness of the information provided. The customer shall designate a competent c
1029ontact person who is authorized to make decisions necessary for the provision of services.</p> 1030<h3>6. Intellectual Property</h3> 1031<p>All intellectual property rights to the services, tools, software, and content created by Lit-X remain with Lit-X unless expressly agreed otherwise in writing. The customer receives a non-exclusive, non-transferable right of use for the agreed purpose and duration. The customer may not modify, reverse-engineer, sublicense, or share Lit-X tools and data with third parties without written consent.</p> 1032<h3>7. Confidentiality</h3> 1033<p>Both parties undertake to treat all confidential information of the other party as strictly confidential and not to disclose it to third parties. This obligation survives the termination of the contract. Confidential information does not include information that was publicly available at the time of disclosure or becomes publicly available without breach of this agreement.</p> 1034<h3>8. Data Protection</h3> 1035<p>The parties undertake to comply with the applicable data protection regulations, in particular the GDPR and the BDSG. If necessary, the parties shall conclude a separate data processing agreement.</p> 1036<h3>9. Liability</h3> 1037<p>Lit-X is liable without limitation for damages resulting from intentional or grossly negligent breach of duty. For slight negligence, Lit-X is only liable in the event of a breach of material contractual obligations (cardinal obligations), and this is limited to the foreseeable, typically occurring damage. Liability for indirect damages, consequential damages, and lost profits is excluded in cases of slight negligence.</p> 1038<h3>10. Term and Termination</h3> 1039<p>Contracts for ongoing services can be terminated by either party with 3 months' notice to the end of the contract period, unless a different notice period has been agreed. The right to extraordinary termination for good cause remains unaffected. Upon termination, the customer shall return or delete all materials and data received from Lit-X.</p> 1040<h3>11. Final Provisions</h3> 1041<p>The law of the Federal Republic of Germany applies, excluding the UN Convention on Contracts for the International Sale of Goods (CISG). The exclusive place of jurisdiction for all disputes arising from or in connection with this contract is Hamburg, Germany, insofar as the customer is a merchant or has no general place of jurisdiction in Germany. Should individual provisions of these GTC be or become invalid, this shall not affect the validity of the remaining provisions.</p>` 1042 } 1043}, 1044de: { 1045 imprint: { 1046 title: "Impressum", 1047 html: `<p class="legal-updated">Stand: Februar 2026</p> 1048<h3>Angaben gemäà § 5 TMG</h3> 1049<p>Lit-X GmbH<br>Schlüterstr. 3, 20146 Hamburg, Deutschland</p> 1050<h3>Vertreten durch</h3> 1051<p>Geschäftsführer: Lars Leipson, Sebastian Hermanns</p> 1052<h3>Kontakt</h3> 1053<p>E-Mail: <a href="mailto:[email protected]">[email protected]</a><br>Telefon: +49 (0) 157 86 80 06 08</p> 1054<h3>Registereintrag</h3> 1055<p>Registergericht: Amtsgericht Hamburg<br>Registernummer: HRB 181435</p> 1056<h3>Umsatzsteuer-ID</h3> 1057<p>Umsatzsteuer-Identifikationsnummer gemäà § 27 a Umsatzsteuergesetz: DE362092719</p> 1058<h3>Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV</h3> 1059<p>Lars Leipson, Sebastian Hermanns<br>Anschrift wie oben</p> 1060<h3>EU-Streitschlichtung</h3> 1061<p>Die Europäische Kommission stellt eine Plattform zur Online-Streitbeilegung (OS) bereit: <a href="https://ec.europa.eu/consumers/odr/" target="_blank" rel="noopener">https://ec.europa.eu/consumers/odr/</a>. Wir sind nicht bereit oder verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.</p> 1062<h3>Haftung für Inhalte</h3> 1063<p>
1063Als Diensteanbieter sind wir gemäà § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen. Verpflichtungen zur Entfernung oder Sperrung der Nutzung von Informationen nach den allgemeinen Gesetzen bleiben hiervon unberührt. Eine diesbezügliche Haftung ist jedoch erst ab dem Zeitpunkt der Kenntnis einer konkreten Rechtsverletzung möglich. Bei Bekanntwerden von entsprechenden Rechtsverletzungen werden wir diese Inhalte umgehend entfernen.</p> 1064<h3>Haftung für Links</h3> 1065<p>Unser Angebot enthält Links zu externen Websites Dritter, auf deren Inhalte wir keinen Einfluss haben. Deshalb können wir für diese fremden Inhalte auch keine Gewähr übernehmen. Für die Inhalte der verlinkten Seiten ist stets der jeweilige Anbieter oder Betreiber der Seiten verantwortlich. Die verlinkten Seiten wurden zum Zeitpunkt der Verlinkung auf mögliche RechtsverstöÃe überprüft. Bei Bekanntwerden von Rechtsverletzungen werden wir derartige Links umgehend entfernen.</p> 1066<h3>Urheberrecht</h3> 1067<p>Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung auÃerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers. Soweit die Inhalte auf dieser Seite nicht vom Betreiber erstellt wurden, werden die Urheberrechte Dritter beachtet.</p>` 1068 }, 1069 privacy: { 1070 title: "Datenschutzerklärung", 1071 html: `<p class="legal-updated">Stand: Februar 2026</p> 1072<h3>1. Datenschutz auf einen Blick</h3> 1073<p>Die folgenden Hinweise geben einen einfachen Ãberblick darüber, was mit Ihren personenbezogenen Daten passiert, wenn Sie diese Website besuchen. Personenbezogene Daten sind alle Daten, mit denen Sie persönlich identifiziert werden können.</p> 1074<h3>2. Verantwortliche Stelle</h3> 1075<p>Die verantwortliche Stelle für die Datenverarbeitung auf dieser Website ist:</p> 1076<p>Lit-X GmbH<br>Geschäftsführer: Lars Leipson, Sebastian Hermanns<br>Schlüterstr. 3, 20146 Hamburg, Deutschland<br>E-Mail: <a href="mailto:[email protected]">[email protected]</a><br>Telefon: +49 (0) 157 86 80 06 08</p> 1077<p>Verantwortliche Stelle ist die natürliche oder juristische Person, die allein oder gemeinsam mit anderen über die Zwecke und Mittel der Verarbeitung von personenbezogenen Daten entscheidet.</p> 1078<h3>3. Datenerfassung auf dieser Website</h3> 1079<p><strong>Wie erfassen wir Ihre Daten?</strong> Ihre Daten werden zum einen dadurch erhoben, dass Sie uns diese mitteilen (z. B. über ein Kontaktformular oder per E-Mail). Andere Daten werden automatisch oder nach Ihrer Einwilligung beim Besuch der Website durch unsere IT-Systeme erfasst. Das sind vor allem technische Daten (z. B. Internetbrowser, Betriebssystem oder Uhrzeit des Seitenaufrufs).</p> 1080<p><strong>Wofür nutzen wir Ihre Daten?</strong> Ein Teil der Daten wird erhoben, um eine fehlerfreie Bereitstellung der Website zu gewährleisten. Andere Daten können zur Analyse Ihres Nutzerverhaltens verwendet werden.</p> 1081<p><strong>Welche Rechte haben Sie?</strong> Sie haben jederzeit das Recht, unentgeltlich Auskunft über Herkunft, Empfänger und Zweck Ihrer gespeicherten personenbezogenen Daten zu erhalten. Sie haben auÃerdem ein Recht auf Berichtigung oder Löschung dieser Daten.</p> 1082<h3>4. Hosting</h3> 1083<p>Diese Website wird bei einem externen Dienstleister gehostet. Die personenbezogenen Daten, die auf dieser Website erfasst werden, werden auf den Servern des Hosters gespeichert. Dies dient der Vertragserfüllung gegenüber unseren potenziellen und bestehenden Kunden (Art. 6 Abs. 1 lit. b DSGVO) und im Interesse einer sicheren, schnellen und effizienten Bereitstellung unseres Online-Angebots durch einen professionellen Anbieter (Art. 6 Abs. 1 lit. f DSGVO).</p> 1084<h3>5. Cookies</h3> 1085<p>Diese Website verwendet keine Cookies für Analysen. Wir nutzen Umami, ein datenschutzfreundliches, cookie-freies Analysetool, das anonyme Nutzungsstatistiken erfasst (besuchte Seiten, Referrer, Land, Gerätetyp). Es werden keine personenbezogenen Daten gespeichert und keine Cookies gesetzt. Technisch notwendige Cookies können von unserem Hosting-Anbieter zu Sicherheitszwecken (z. B. DDoS-Schutz) gesetzt werden. Sie können Ihren Browser jederzeit so einstellen, dass Cookies blockiert werden.</p> 1086<h3>6. Analyse</h3> 1087<p>
1087Wir nutzen Umami Analytics, um zu verstehen, wie Besucher unsere Website nutzen. Umami ist ein datenschutzfreundliches, Open-Source-Analysetool. Es verwendet keine Cookies, erfasst keine personenbezogenen Daten und verfolgt Nutzer nicht über Websites hinweg. Die erfassten Daten umfassen: besuchte Seiten, Referrer-URLs, Browsertyp, Betriebssystem, Gerätetyp und Land (abgeleitet aus anonymisierter IP). Alle Daten werden aggregiert und können nicht zur Identifizierung einzelner Besucher verwendet werden. Diese Verarbeitung erfolgt auf Grundlage unseres berechtigten Interesses am Verständnis der Website-Nutzung (Art. 6 Abs. 1 lit. f DSGVO).</p> 1088<h3>7. Kontaktaufnahme</h3> 1089<p>Wenn Sie uns per E-Mail oder Kontaktformular kontaktieren, wird Ihre Anfrage inklusive aller daraus hervorgehenden personenbezogenen Daten zum Zwecke der Bearbeitung Ihres Anliegens bei uns gespeichert und verarbeitet. Diese Daten geben wir nicht ohne Ihre Einwilligung weiter.</p> 1090<h3>8. Ihre Rechte</h3> 1091<p>Sie haben folgende Rechte nach der DSGVO: Auskunftsrecht (Art. 15), Recht auf Berichtigung (Art. 16), Recht auf Löschung (Art. 17), Recht auf Einschränkung der Verarbeitung (Art. 18), Recht auf Datenübertragbarkeit (Art. 20), Widerspruchsrecht (Art. 21). Zur Ausübung dieser Rechte kontaktieren Sie uns unter <a href="mailto:[email protected]">[email protected]</a>.</p> 1092<h3>9. Beschwerderecht</h3> 1093<p>Wenn Sie der Ansicht sind, dass die Verarbeitung Ihrer personenbezogenen Daten gegen das Datenschutzrecht verstöÃt, haben Sie das Recht, sich bei einer Aufsichtsbehörde zu beschweren.</p>` 1094 }, 1095 terms: { 1096 title: "Allgemeine Geschäftsbedingungen (AGB)", 1097 html: `<p class="legal-updated">Stand: Februar 2026</p> 1098<h3>1. Geltungsbereich</h3> 1099<p>Diese Allgemeinen Geschäftsbedingungen (AGB) gelten für alle Geschäftsbeziehungen zwischen der Lit-X GmbH, Hamburg (âLit-X", âwir") und unseren Kunden (âKunde", âSie"). Abweichende, entgegenstehende oder ergänzende AGB des Kunden werden nur dann Vertragsbestandteil, wenn Lit-X ihrer Geltung ausdrücklich schriftlich zugestimmt hat.</p> 1100<h3>2. Leistungen</h3> 1101<p>Lit-X erbringt KI-gestützte Datenlösungen und Beratungsdienstleistungen für die Buch- und Influencer-Marketing-Branche. Der konkrete Leistungsumfang ergibt sich aus dem jeweiligen Einzelvertrag oder der Auftragsbestätigung. Wir behalten uns das Recht vor, Ãnderungen vorzunehmen, die dem technischen Fortschritt dienen, sofern die Ãnderungen für den Kunden zumutbar sind.</p> 1102<h3>3. Vertragsschluss</h3> 1103<p>Unsere Angebote sind freibleibend. Ein Vertrag kommt zustande, wenn Lit-X die Bestellung schriftlich (auch per E-Mail) bestätigt oder mit der Leistungserbringung beginnt.</p> 1104<h3>4. Preise und Zahlung</h3> 1105<p>Alle Preise verstehen sich netto zuzüglich der jeweils geltenden gesetzlichen Umsatzsteuer. Sofern nicht anders vereinbart, sind Rechnungen innerhalb von 14 Tagen ab Rechnungsdatum zur Zahlung fällig. Bei Zahlungsverzug ist Lit-X berechtigt, Verzugszinsen in gesetzlicher Höhe zu berechnen.</p> 1106<h3>5. Mitwirkungspflichten des Kunden</h3> 1107<p>Der Kunde stellt Lit-X alle für die Leistungserbringung erforderlichen Informationen und Materialien rechtzeitig und vollständig zur Verfügung. Der Kunde ist für die Richtigkeit und Vollständigkeit der bereitgestellten Informationen verantwortlich.</p> 1108<h3>6. Geistiges Eigentum</h3> 1109<p>Alle geistigen Eigentumsrechte an den von Lit-X erstellten Leistungen, Tools, Software und Inhalten verbleiben bei Lit-X, sofern nicht ausdrücklich schriftlich anders vereinbart. Der Kunde erhält ein nicht-exklusives, nicht übertragbares Nutzungsrecht für den vereinbarten Zweck und Zeitraum.</p> 1110<h3>7. Vertraulichkeit</h3> 1111<p>Beide Parteien verpflichten sich, alle vertraulichen Informationen der anderen Partei streng vertraulich zu behandeln und nicht an Dritte weiterzugeben. Diese Verpflichtung besteht über die Beendigung des Vertrages hinaus fort.</p> 1112<h3>8. Datenschutz</h3> 1113<p>Die Parteien verpflichten sich, die geltenden Datenschutzvorschriften, insbesondere die DSGVO und das BDSG, einzuhalten. Bei Bedarf schlieÃen die Parteien einen gesonderten Auftragsverarbeitungsvertrag.</p> 1114<h3>
11149. Haftung</h3> 1115<p>Lit-X haftet unbeschränkt für Schäden aus vorsätzlicher oder grob fahrlässiger Pflichtverletzung. Bei leichter Fahrlässigkeit haftet Lit-X nur bei Verletzung wesentlicher Vertragspflichten (Kardinalpflichten) und dies begrenzt auf den vorhersehbaren, vertragstypischen Schaden.</p> 1116<h3>10. Laufzeit und Kündigung</h3> 1117<p>Verträge über laufende Leistungen können von beiden Parteien mit einer Frist von 3 Monaten zum Ende der Vertragslaufzeit gekündigt werden, sofern keine abweichende Kündigungsfrist vereinbart wurde. Das Recht zur auÃerordentlichen Kündigung aus wichtigem Grund bleibt unberührt.</p> 1118<h3>11. Schlussbestimmungen</h3> 1119<p>Es gilt das Recht der Bundesrepublik Deutschland unter Ausschluss des UN-Kaufrechts (CISG). AusschlieÃlicher Gerichtsstand ist Hamburg, sofern der Kunde Kaufmann ist oder keinen allgemeinen Gerichtsstand in Deutschland hat. Sollten einzelne Bestimmungen dieser AGB unwirksam sein oder werden, bleibt die Wirksamkeit der übrigen Bestimmungen unberührt.</p>` 1120 } 1121}, 1122es: { 1123 imprint: { 1124 title: "Aviso Legal", 1125 html: `<p class="legal-updated">Ãltima actualización: Febrero 2026</p> 1126<h3>Información según § 5 TMG</h3> 1127<p>Lit-X GmbH<br>Hamburgo, Alemania</p> 1128<h3>Representada por</h3> 1129<p>Directores Generales: Lars Leipson, Sebastian Hermanns</p> 1130<h3>Contacto</h3> 1131<p>Email: <a href="mailto:[email protected]">[email protected]</a><br>Teléfono: +49 (0) 157 86 80 06 08</p> 1132<h3>Registro</h3> 1133<p>Registro mercantil: Amtsgericht Hamburg<br>Número de registro: HRB 181435</p> 1134<h3>IVA</h3> 1135<p>Número de identificación fiscal según § 27 a Umsatzsteuergesetz: pendiente</p> 1136<h3>Resolución de litigios de la UE</h3> 1137<p>La Comisión Europea ofrece una plataforma para la resolución de litigios en lÃnea: <a href="https://ec.europa.eu/consumers/odr/" target="_blank" rel="noopener">https://ec.europa.eu/consumers/odr/</a>. No estamos obligados ni dispuestos a participar en procedimientos de resolución de litigios ante una junta de arbitraje de consumidores.</p>` 1138 }, 1139 privacy: { 1140 title: "PolÃtica de Protección de Datos", 1141 html: `<p class="legal-updated">Ãltima actualización: Febrero 2026</p> 1142<h3>1. Responsable del tratamiento</h3> 1143<p>Lit-X GmbH<br>Directores Generales: Lars Leipson, Sebastian Hermanns<br>Hamburgo, Alemania<br>Email: <a href="mailto:[email protected]">[email protected]</a></p> 1144<h3>2. Recogida de datos</h3> 1145<p>Recogemos datos que usted nos proporciona directamente (por ejemplo, mediante formularios de contacto o correo electrónico) y datos técnicos que se recopilan automáticamente cuando visita nuestro sitio web (dirección IP, navegador, hora de acceso).</p> 1146<h3>3. Cookies</h3> 1147<p>Este sitio web no utiliza cookies para análisis. Utilizamos Umami, una herramienta de análisis respetuosa con la privacidad y sin cookies. No se almacenan datos personales ni se colocan cookies. Las cookies técnicas esenciales pueden ser establecidas por nuestro proveedor de hosting por razones de seguridad. Puede configurar su navegador para bloquear cookies en cualquier momento.</p> 1148<h3>4. Sus derechos</h3> 1149<p>Usted tiene derecho de acceso, rectificación, supresión, limitación del tratamiento, portabilidad de datos y oposición según el RGPD. Para ejercer estos derechos, contacte con <a href="mailto:[email protected]">[email protected]</a>.</p> 1150<h3>5. Derecho de reclamación</h3> 1151<p>Tiene derecho a presentar una reclamación ante una autoridad de control si considera que el tratamiento de sus datos vulnera la normativa de protección de datos.</p>` 1152 }, 1153 terms: { 1154 title: "Condiciones Generales", 1155 html: `<p class="legal-updated">Ãltima actualización: Febrero 2026</p> 1156<h3>1. Ãmbito de aplicación</h3> 1157<p>Estas Condiciones Generales se aplican a todas las relaciones comerciales entre Lit-X GmbH, Hamburgo ("Lit-X") y nuestros clientes ("Cliente").</p> 1158<h3>2. Servicios</h3> 1159<p>Lit-X proporciona soluciones de datos e IA y servicios de consultorÃa para la industria editorial y de marketing de influencers. El alcance especÃfico se define en el contrato individual.</p> 1160<h3>3. Propiedad intelectual</h3> 1161<p>Todos los derechos de propiedad intelectual sobre servicios, herramientas y contenidos creados por Lit-X permanecen en Lit-X, salvo acuerdo explÃcito por escrito.</p> 1162<h3>4. Confidencialidad</h3> 1163<p>Ambas partes se comprometen a tratar toda información confidencial de forma estricta y a no divulgarla a terceros.</p> 1164<h3>
11645. Legislación aplicable</h3> 1165<p>Se aplica el derecho de la República Federal de Alemania. El lugar de jurisdicción exclusivo es Hamburgo, Alemania.</p>` 1166 } 1167}, 1168ko: { 1169 imprint: { 1170 title: "ë²ì ê³ ì§ (Impressum)", 1171 html: `<p class="legal-updated">ìµì¢ ì ë°ì´í¸: 2026ë 2ì</p> 1172<h3>§ 5 TMGì ë°ë¥¸ ì ë³´</h3> 1173<p>Lit-X GmbH<br>í¨ë¶ë¥´í¬, ë ì¼</p> 1174<h3>ëí</h3> 1175<p>ëíì´ì¬: Lars Leipson, Sebastian Hermanns</p> 1176<h3>ì°ë½ì²</h3> 1177<p>ì´ë©ì¼: <a href="mailto:[email protected]">[email protected]</a><br>ì í: +49 (0) 157 86 80 06 08</p> 1178<h3>ë±ê¸°</h3> 1179<p>ë±ê¸°ì: Amtsgericht Hamburg<br>ë±ê¸°ë²í¸: HRB 181435</p> 1180<h3>ë¶ê°ê°ì¹ì¸ ID</h3> 1181<p>§ 27 a Umsatzsteuergesetzì ë°ë¥¸ ë¶ê°ê°ì¹ì¸ ìë³ë²í¸: ì ì² ì¤</p> 1182<h3>EU ë¶ì í´ê²°</h3> 1183<p>ì ë½ ììíë ì¨ë¼ì¸ ë¶ì í´ê²° íë«í¼ì ì ê³µí©ëë¤: <a href="https://ec.europa.eu/consumers/odr/" target="_blank" rel="noopener">https://ec.europa.eu/consumers/odr/</a></p>` 1184 }, 1185 privacy: { 1186 title: "ê°ì¸ì ë³´ ë³´í¸ì ì± ", 1187 html: `<p class="legal-updated">ìµì¢ ì ë°ì´í¸: 2026ë 2ì</p> 1188<h3>1. ë°ì´í° ê´ë¦¬ì</h3> 1189<p>Lit-X GmbH<br>ëíì´ì¬: Lars Leipson, Sebastian Hermanns<br>í¨ë¶ë¥´í¬, ë ì¼<br>ì´ë©ì¼: <a href="mailto:[email protected]">[email protected]</a></p> 1190<h3>2. ë°ì´í° ìì§</h3> 1191<p>ë¹ì¬ë ê·íê° ì§ì ì ê³µíë ë°ì´í°(ì°ë½ ìì, ì´ë©ì¼)ì ì¹ì¬ì´í¸ 방문 ì ìëì¼ë¡ ìì§ëë 기ì ë°ì´í°(IP 주ì, ë¸ë¼ì°ì , ì ì ìê°)를 ìì§í©ëë¤.</p> 1192<h3>3. ì¿ í¤</h3> 1193<p>ì´ ì¹ì¬ì´í¸ë ë¶ìì ìí´ ì¿ í¤ë¥¼ ì¬ì©íì§ ììµëë¤. ê°ì¸ì ë³´ ë³´í¸ì ì¹íì ì´ê³ ì¿ í¤ë¥¼ ì¬ì©íì§ ìë ë¶ì ëêµ¬ì¸ Umami를 ì¬ì©í©ëë¤. ê°ì¸ ë°ì´í°ë ì ì¥ëì§ ìì¼ë©° ì¿ í¤ê° ì¤ì¹ëì§ ììµëë¤. í¸ì¤í ì ê³µì ì²´ìì ë³´ì 목ì ì¼ë¡ íì 기ì ì¿ í¤ë¥¼ ì¤ì í ì ììµëë¤. ì¸ì ë ì§ ë¸ë¼ì°ì ìì ì¿ í¤ë¥¼ ì°¨ë¨íëë¡ ì¤ì í ì ììµëë¤.</p> 1194<h3>4. ê·íì ê¶ë¦¬</h3> 1195<p>GDPRì ë°ë¼ ì ê·¼ê¶, ì ì ê¶, ìì ê¶, ì²ë¦¬ ì íê¶, ë°ì´í° ì´ëê¶, ì´ì ì 기ê¶ì´ ììµëë¤. ì´ë¬í ê¶ë¦¬ë¥¼ íì¬íë ¤ë©´ <a href="mailto:[email protected]">[email protected]</a>ì¼ë¡ ì°ë½í´ 주ì¸ì.</p>` 1196 }, 1197 terms: { 1198 title: "ì¼ë° ì´ì©ì½ê´", 1199 html: `<p class="legal-updated">ìµì¢ ì ë°ì´í¸: 2026ë 2ì</p> 1200<h3>1. ì ì© ë²ì</h3> 1201<p>ì´ ì¼ë° ì´ì©ì½ê´ì Lit-X GmbH, í¨ë¶ë¥´í¬("Lit-X")ì ê³ ê°("ê³ ê°") ê°ì 모ë ë¹ì¦ëì¤ ê´ê³ì ì ì©ë©ëë¤.</p> 1202<h3>2. ìë¹ì¤</h3> 1203<p>Lit-Xë ì¶í ë° ì¸í루ì¸ì ë§ì¼í ì°ì ì ìí AI ê¸°ë° ë°ì´í° ì루ì ë° ì»¨ì¤í ìë¹ì¤ë¥¼ ì ê³µí©ëë¤.</p> 1204<h3>3. ì§ì ì¬ì°ê¶</h3> 1205<p>Lit-Xê° ìì±í ìë¹ì¤, ë구 ë° ì½í ì¸ ì ëí 모ë ì§ì ì¬ì°ê¶ì ë³ëì ìë©´ í©ìê° ìë í Lit-Xì ê·ìë©ëë¤.</p> 1206<h3>4. ê¸°ë° ì ì§</h3> 1207<p>ì ë¹ì¬ìë ìëë°©ì 모ë ê¸°ë° ì 보를 ì격íê² ë¹ë°ë¡ ì·¨ê¸íê³ ì 3ììê² ê³µê°íì§ ìì ê²ì ì½ìí©ëë¤.</p> 1208<h3>5. ì¤ê±°ë²</h3> 1209<p>ë ì¼ ì°ë°©ê³µíêµ ë²ë¥ ì´ ì ì©ë©ëë¤. ì ìì ê´í ì§ë ë ì¼ í¨ë¶ë¥´í¬ì ëë¤.</p>` 1210 } 1211} 1212}; 1213 1214function openLegal(page) { 1215 const lang = currentLang || 'en'; 1216 const content = LEGAL[lang] && LEGAL[lang][page] ? LEGAL[lang][page] : LEGAL.en[page]; 1217 if (!content) return; 1218 document.getElementById('legalTitle').textContent = content.title; 1219 document.getElementById('legalBody').innerHTML = content.html; 1220 document.getElementById('legalOverlay').classList.add('open'); 1221 document.body.style.overflow = 'hidden'; 1222} 1223function closeLegal() { 1224 document.getElementById('legalOverlay').classList.remove('open'); 1225 document.body.style.overflow = ''; 1226} 1227document.addEventListener('keydown', e => { if (e.key === 'Escape') closeLegal(); }); 1228 1229// ============================================= 1230// INIT 1231// ============================================= 1232setLang(currentLang); 1233initExplorer(); 1234 1235// Nav scroll 1236const nav = document.getElementById('navbar'); 1237window.addEventListener('scroll', () => nav.classList.toggle('scrolled', window.scrollY > 20)); 1238 1239// Reveal on scroll 1240const obs = new IntersectionObserver(entries => {
1241 entries.forEach(e => { if (e.isIntersecting) e.target.classList.add('visible'); }); 1242}, { threshold: 0.1, rootMargin: '0px 0px -40px 0px' }); 1243document.querySelectorAll('.reveal').forEach(el => obs.observe(el)); 1244 1245// Screenshot carousel tab switching 1246function ssTab(el, idx) { 1247 const carousel = el.closest('.ss-carousel'); 1248 carousel.querySelectorAll('.ss-tab').forEach((t,i) => t.classList.toggle('act', i===idx)); 1249 carousel.querySelectorAll('.ss-slide').forEach((s,i) => s.classList.toggle('act', i===idx)); 1250} 1251 1252// UC Explorer: Department filter 1253function ucDeptFilter(dept) { 1254 document.querySelectorAll('.uc-dept-btn').forEach(b => b.classList.toggle('act', b.dataset.dept === dept)); 1255 const navBtns = document.querySelectorAll('.uc-nav-btn'); 1256 let firstVisible = null; 1257 navBtns.forEach(b => { 1258 const show = dept === 'all' || b.dataset.dept === dept; 1259 b.style.display = show ? '' : 'none'; 1260 if (show && !firstVisible) firstVisible = b.dataset.uc; 1261 }); 1262 // Auto-select first visible UC if current is hidden 1263 const current = document.querySelector('.uc-nav-btn.act'); 1264 if (current && current.style.display === 'none' && firstVisible) { 1265 ucSelect(firstVisible); 1266 } 1267} 1268 1269// UC Explorer: Select a use case 1270function ucSelect(key) { 1271 document.querySelectorAll('.uc-nav-btn').forEach(b => b.classList.toggle('act', b.dataset.uc === key)); 1272 document.querySelectorAll('.uc-panel').forEach(p => p.classList.toggle('act', p.dataset.uc === key)); 1273} 1274 1275// ============================================= 1276// DATA EXPLORER 1277// ============================================= 1278var explorerIndex = null; 1279var explorerData = null; 1280var explorerIndexLoading = false; 1281 1282function loadExplorerIndex() { 1283 if (explorerIndex || explorerIndexLoading) return; 1284 explorerIndexLoading = true; 1285 fetch('data/processed/_xi.json') 1286 .then(function(r) { return r.json(); }) 1287 .then(function(data) { explorerIndex = data; explorerIndexLoading = false; }) 1288 .catch(function() { explorerIndexLoading = false; }); 1289} 1290 1291function loadExplorerData(cb) { 1292 if (explorerData) { cb(explorerData); return; } 1293 fetch('data/processed/_xd.json') 1294 .then(function(r) { return r.json(); }) 1295 .then(function(data) { explorerData = data; cb(data); }) 1296 .catch(function() { cb(null); }); 1297} 1298 1299function formatBigNum(n) { 1300 if (n >= 1e6) return (n / 1e6).toFixed(1) + 'M'; 1301 if (n >= 1e3) return (n / 1e3).toFixed(1) + 'K'; 1302 return String(n); 1303} 1304 1305function explorerSearch(query) { 1306 if (!explorerIndex || !query || query.length < 2) return []; 1307 var q = query.toLowerCase(); 1308 var results = []; 1309 for (var i = 0; i < explorerIndex.length && results.length < 8; i++) { 1310 var entry = explorerIndex[i]; 1311 if (entry.t.toLowerCase().indexOf(q) !== -1 || entry.a.toLowerCase().indexOf(q) !== -1) { 1312 results.push(entry); 1313 } 1314 } 1315 return results; 1316} 1317 1318var explorerDebounce = null; 1319function initExplorer() { 1320 var input = document.getElementById('explorerInput'); 1321 var acDiv = document.getElementById('explorerAutocomplete'); 1322 var resultsDiv = document.getElementById('explorerResults'); 1323 if (!input) return; 1324 1325 input.addEventListener('focus', loadExplorerIndex); 1326 1327 var ph = t('explorer.placeholder'); 1328 if (ph && ph !== 'explorer.placeholder') input.placeholder = ph; 1329 1330 var state = getExplorerState(); 1331 if (state.email) { 1332 var promptEl = document.querySelector('.explorer-prompt'); 1333 if (promptEl) promptEl.textContent = (t('explorer.welcome_back') || 'Welcome back! Search another title:'); 1334 } 1335 1336 input.addEventListener('input', function() { 1337 clearTimeout(explorerDebounce); 1338 var val = input.value.trim(); 1339 if (val.length < 2) { acDiv.innerHTML = ''; acDiv.style.display = 'none'; return; } 1340 explorerDebounce = setTimeout(function() { 1341 var results = explorerSearch(val); 1342 if (results.length === 0) { 1343 acDiv.innerHTML = '<div class="explorer-ac-item explorer-ac-empty">' + (t('explorer.not_found') || 'No results') + '</div>'; 1344 acDiv.style.display = 'block'; 1345 return; 1346 } 1347 acDiv.innerHTML = results.map(function(r) { 1348 return '<div class="explorer-ac-item" data-id="' + r.i + '"><strong>' + escHtml(r.t) + '</strong> <span style="color:var(--g4);font-size:.8em">â ' + escHtml(r.a) + '</span></div>'; 1349 }).join(''); 1350 acDiv.style.display = 'block'; 1351 }, 200); 1352 }); 1353 1354 acDiv.addEventListener('click', function(e) { 1355 var item = e.target.closest('.explorer-ac-item'); 1356 if (!item || item.classList.contains('explorer-ac-empty')) return; 1357 var id = item.getAttribute('data-id'); 1358 acDiv.style.display = 'none'; 1359 input.value = item.querySelector('strong').textContent; 1360 showExplorerResult(id); 1361 }); 1362 1363 document.addEventListener('click', function(e) { 1364 if (!e.target.closest('.explorer-search')) acDiv.style.display = 'none'; 1365 }); 1366} 1367 1368function escHtml(s) { var d = document.createElement('div'); d.textContent = s; return d.innerHTML; } 1369 1370function showExplorerResult(titleId) { 1371 var resultsDiv = document.getElementById('explorerResults'); 1372 resultsDiv.innerHTML = '<div class="explorer-loading">' + (t('explorer.loading') || 'Searching...') + '</div>'; 1373 1374 loadExplorerData(function(data) { 1375 if (!data || !data[titleId]) { 1376 resultsDiv.innerHTML = '<div class="explorer-not-found">' + (t('explorer.not_found') || 'No data found') + '</div>'; 1377 return; 1378 } 1379 var d = data[titleId]; 1380 1381 var html = '<div class="explorer-result">'; 1382 html += '<div class="explorer-found">' + (t('explorer.found') || 'We have data for this title!') + '</div>'; 1383 html += '<div class="explorer-stats-row">'; 1384 html += '<div class="explorer-stat"><div class="explorer-stat-label">' + (t('explorer.reach') || 'Reach') + '</div><div class="explorer-stat-num" data-target="' + d.tv + '">' + formatBigNum(d.tv) + '</div><div class="explorer-stat-sub">' + (t('explorer.views') || 'views') + '</div></div>'; 1385 html += '<div class="explorer-stat"><div class="explorer-stat-label">' + (t('explorer.engagement') || 'Engagement') + '</div><div class="explorer-stat-num" data-target="' + d.tl + '">' + formatBigNum(d.tl) + '</div><div class="explorer-stat-sub">' + (t('explorer.likes') || 'likes') + '</div></div>'; 1386 html += '</div>'; 1387 1388 var explorerState = getExplorerState(); 1389 var today = new Date().toISOString().slice(0, 10); 1390 var canViewDetails = !explorerState.lastDetailDate || explorerState.lastDetailDate !== today; 1391 1392 if (canViewDetails) { 1393 html += '<button class="explorer-details-btn" onclick="explorerShowGate(\'' + titleId + '\')">' + (t('explorer.details') || 'See Details') + '</button>'; 1394 } else { 1395 html += '<div class="explorer-comeback">' + (t('explorer.comeback') || 'Come back tomorrow!') + '</div>'; 1396 } 1397 1398 html += '</div>'; 1399 resultsDiv.innerHTML = html; 1400 1401 if (window.umami) umami.track('data-explorer-search', { title: d.t }); 1402 }); 1403} 1404 1405function getExplorerState() { 1406 try { 1407 return JSON.parse(localStorage.getItem('litx-explorer') || '{}'); 1408 } catch(e) { return {}; } 1409} 1410 1411function setExplorerState(state) { 1412 localStorage.setItem('litx-explorer', JSON.stringify(state)); 1413} 1414 1415function explorerShowGate(titleId) { 1416 var state = getExplorerState(); 1417 if (state.email) {
1418 explorerShowDetails(titleId); 1419 return; 1420 } 1421 1422 var resultsDiv = document.getElementById('explorerResults'); 1423 var currentHtml = resultsDiv.innerHTML; 1424 1425 var gateHtml = '<div class="explorer-gate">'; 1426 gateHtml += '<div class="explorer-gate-title">' + (t('explorer.email_gate') || 'Enter your email to unlock detailed insights') + '</div>'; 1427 gateHtml += '<div class="explorer-gate-form">'; 1428 gateHtml += '<input type="email" id="explorerEmail" class="explorer-email-input" placeholder="' + (t('explorer.email_placeholder') || '[email protected]') + '" required>'; 1429 gateHtml += '<button class="explorer-unlock-btn" onclick="explorerSubmitEmail(\'' + titleId + '\')">' + (t('explorer.unlock') || 'Unlock Insights') + '</button>'; 1430 gateHtml += '</div></div>'; 1431 1432 resultsDiv.innerHTML += gateHtml; 1433} 1434 1435function explorerSubmitEmail(titleId) { 1436 var emailInput = document.getElementById('explorerEmail'); 1437 var email = emailInput ? emailInput.value.trim() : ''; 1438 if (!email || !email.match(/^[^@]+@[^@]+\.[^@]+$/)) { emailInput.focus(); return; } 1439 1440 var state = getExplorerState(); 1441 state.email = email; 1442 setExplorerState(state); 1443 1444 loadExplorerData(function(data) { 1445 var titleName = (data && data[titleId]) ? data[titleId].t : 'Unknown title'; 1446 if (window.emailjs && window.EMAILJS_SERVICE_ID) { 1447 emailjs.send(window.EMAILJS_SERVICE_ID, window.EMAILJS_TEMPLATE_CONTACT, { 1448 from_name: 'Data Explorer Lead', 1449 from_email: email, 1450 message: 'New data explorer lead.\n\nEmail: ' + email + '\nTitle searched: ' + titleName + '\nDate: ' + new Date().toISOString().slice(0,10) 1451 }, window.EMAILJS_PUBLIC_KEY).catch(function(err) { console.error('EmailJS lead error:', err); }); 1452 } 1453 }); 1454 1455 if (window.umami) umami.track('data-explorer-email-capture', { email: email }); 1456 1457 explorerShowDetails(titleId); 1458} 1459 1460function explorerShowDetails(titleId) { 1461 var state = getExplorerState(); 1462 state.lastDetailDate = new Date().toISOString().slice(0, 10); 1463 setExplorerState(state); 1464 1465 loadExplorerData(function(data) { 1466 if (!data || !data[titleId]) return; 1467 var d = data[titleId]; 1468 var totalViews = d.tv; 1469 var totalLikes = d.tl; 1470 1471 var platforms = Object.keys(d.pl); 1472 var platColors = {TikTok:'#00f2ea',YouTube:'#ff0000',Instagram:'#e1306c'}; 1473 var platIcons = {TikTok:'T',YouTube:'Y',Instagram:'I'}; 1474 var MONTH_NAMES = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']; 1475 1476 // Real channel type data from pipeline 1477 var ctColors = {Bookfluencer:'#6366f1',Verlag:'#f59e0b','Autor:in':'#10b981',Handel:'#8b5cf6','Hörbuch':'#ec4899'}; 1478 var ctLabels = {Bookfluencer:t('ex.chBookfluencer')||'Bookfluencer',Verlag:t('ex.chVerlag')||'Verlag (Publisher)','Autor:in':t('ex.chAutor')||'Autor:in (Author)',Handel:t('ex.chHandel')||'Handel (Retail)','Hörbuch':t('ex.chHoerbuch')||'Hörbuch (Audiobook)'}; 1479 var channelTypes = []; 1480 if (d.ct) { 1481 ['Bookfluencer','Verlag','Autor:in','Handel','Hörbuch'].forEach(function(tp) { 1482 if (d.ct[tp]) channelTypes.push({type:tp,label:ctLabels[tp],views:d.ct[tp].v,color:ctColors[tp]}); 1483 }); 1484 } 1485 if (!channelTypes.length) channelTypes = [{type:'Bookfluencer',label:'Bookfluencer',views:totalViews,color:'#6366f1'}]; 1486 1487 // Real bookfluencer data from pipeline 1488 var topBf = (d.bf || []).map(function(bf) { 1489 var er = bf.v > 0 ? ((bf.l / bf.v) * 100).toFixed(1) : '0.0'; 1490 return {name:bf.n,platform:bf.p,views:bf.v,er:parseFloat(er),link:bf.lk||''}; 1491 }); 1492 var remainingBf = Math.max(0, (d.bfc || 0) - topBf.length); 1493 1494 // Real momentum from pipeline 1495 var momentumPct = d.vg || 0; 1496 var isUp = momentumPct >= 0; 1497 1498 // Real sparkline from pipeline 1499 var sparkData = [], sparkLabels = []; 1500 if (d.sp && d.sp.length) { 1501 d.sp.forEach(function(s) { sparkData.push(s.v); sparkLabels.push(MONTH_NAMES[parseInt(s.m,10)-1]||s.m); }); 1502 } else { 1503 sparkData = [0]; sparkLabels = ['â']; 1504 } 1505 1506 // Real language data from pipeline 1507 var langColors = ['#6366f1','#a5b4fc','#c7d2fe','#e0e7ff','#f1f5f9']; 1508 var langTotal = 0;
1509 (d.ln || []).forEach(function(l) { langTotal += l.v; }); 1510 var langData = (d.ln || []).map(function(l, i) { 1511 var pct = langTotal > 0 ? Math.round((l.v / langTotal) * 100) : 0; 1512 return {l:l.l, s:pct, c:langColors[i]||'#f1f5f9'}; 1513 }); 1514 1515 var overlay = document.createElement('div'); 1516 overlay.className = 'explorer-overlay'; 1517 overlay.onclick = function(e) { if (e.target === overlay) { document.body.removeChild(overlay); document.body.style.overflow=''; } }; 1518 document.body.style.overflow = 'hidden'; 1519 1520 var html = '<div class="explorer-detail-box">'; 1521 html += '<button class="explorer-detail-close" onclick="this.closest(\'.explorer-overlay\').remove();document.body.style.overflow=\'\'">â</button>'; 1522 1523 html += '<div class="ex2-header">'; 1524 html += '<div class="ex2-eyebrow">' + (t('ex.eyebrow')||'Social Intelligence for') + '</div>'; 1525 html += '<h2>' + escHtml(d.t) + '</h2>'; 1526 html += '<div class="ex2-meta">' + escHtml(d.a) + ' · ' + formatBigNum(d.dp) + ' ' + (t('ex.postsTracked')||'posts tracked') + ' · ' + escHtml(d.g) + '</div>'; 1527 html += '</div>'; 1528 1529 html += '<div class="ex2-isbn-line">'; 1530 html += '<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M7 1L8.75 3.5H12V7L14 8L12 9V12.5H8.75L7 15L5.25 12.5H2V9L0 8L2 7V3.5H5.25L7 1Z" fill="#6366f1" fill-opacity="0.1" stroke="#6366f1" stroke-width="0.8"/></svg>'; 1531 html += '<span>' + (t('ex.isbnLine')||'Every result is verified against this title\'s ISBN â not a keyword match.') + ' <span style="color:#94a3b8">' + (t('ex.isbnSub')||'Your social listening tool can\'t do this.') + '</span></span>'; 1532 html += '</div>'; 1533 1534 html += '<div class="ex2-inner">'; 1535 1536 // Section 1: Platform Breakdown 1537 html += '<div class="ex2-section">'; 1538 html += '<div class="ex2-section-label"><span class="ex2-section-num">1</span><span class="ex2-section-title">' + (t('ex.s1')||'Where the Buzz Lives') + '</span></div>'; 1539 html += '<div class="ex2-plat-grid">'; 1540 platforms.forEach(function(p) { 1541 var pd = d.pl[p]; 1542 var er = pd.v > 0 ? ((pd.l / pd.v) * 100).toFixed(1) + '%' : 'â'; 1543 html += '<div class="ex2-plat-card">'; 1544 html += '<div class="ex2-plat-icon" style="background:' + (platColors[p]||'var(--blue)') + '">' + (platIcons[p]||p[0]) + '</div>'; 1545 html += '<div style="font-size:.82rem;font-weight:600;color:#334155;margin-bottom:6px">' + p + '</div>'; 1546 html += '<div class="ex2-plat-views">' + formatBigNum(pd.v) + '</div>'; 1547 html += '<div class="ex2-plat-label">' + (t('ex.views')||'Views') + '</div>'; 1548 html += '<div class="ex2-plat-stats"><span>' + formatBigNum(pd.l) + ' ' + (t('ex.likes')||'Likes') + '</span><span class="er">' + er + ' ' + (t('ex.er')||'ER') + '</span></div>'; 1549 html += '<div class="ex2-plat-posts">' + formatBigNum(pd.c) + ' ' + (t('ex.posts')||'Posts') + '</div>'; 1550 html += '</div>'; 1551 }); 1552 html += '</div></div>'; 1553 1554 // Section 2: Channel Type Split (donut) 1555 var ctTotalViews = 0; 1556 channelTypes.forEach(function(ct) { ctTotalViews += ct.views; }); 1557 var bfShare = ctTotalViews > 0 ? Math.round((channelTypes[0].views / ctTotalViews) * 100) : 0; 1558 html += '<div class="ex2-section">'; 1559 html += '<div class="ex2-section-label"><span class="ex2-section-num">2</span><span class="ex2-section-title">' + (t('ex.s2')||'Who Is Actually Talking About This Book') + '</span></div>'; 1560 html += '<div class="ex2-donut-wrap">'; 1561 var donutR = 60, donutC = 70, donutInner = 38; 1562 var circumference = 2 * Math.PI * donutR; 1563 var donutOffset = 0; 1564 html += '<div class="ex2-donut-chart"><svg viewBox="0 0 140 140" width="160" height="160">'; 1565 channelTypes.forEach(function(ct) { 1566 var pct = ctTotalViews > 0 ? ct.views / ctTotalViews : 0; 1567 var dashLen = pct * circumference; 1568 var dashGap = circumference - dashLen; 1569 html += '<circle cx="' + donutC + '" cy="' + donutC + '" r="' + donutR + '" fill="none" stroke="' + ct.color + '" stroke-width="22" stroke-dasharray="' + dashLen + ' ' + dashGap + '" stroke-dashoffset="-' + donutOffset + '" transform="rotate(-90 ' + donutC + ' ' + donutC + ')"/>'; 1570 donutOffset += dashLen; 1571 }); 1572 html += '<circle cx="' + donutC + '" cy="' + donutC + '" r="' + donutInner + '" fill="#fafbfc"/>'; 1573 html += '</svg></div>'; 1574 html += '<div class="ex2-donut-legend">';
1575 channelTypes.forEach(function(ct) { 1576 var pctVal = ctTotalViews > 0 ? Math.round((ct.views / ctTotalViews) * 100) : 0; 1577 html += '<div class="ex2-donut-row"><div style="display:flex;align-items:center"><span class="ex2-dot" style="background:' + ct.color + '"></span><span class="ex2-type">' + ct.label + '</span></div>'; 1578 html += '<div style="display:flex;align-items:center;gap:8px"><span class="ex2-val">' + formatBigNum(ct.views) + '</span><span class="ex2-pct">' + pctVal + '%</span></div></div>'; 1579 }); 1580 html += '</div></div>'; 1581 var insightText; 1582 if (bfShare > 60) insightText = (t('ex.insightBf')||'%s% of this title\'s social reach comes from independent bookfluencers â not publisher or author channels.').replace('%s',bfShare); 1583 else if (channelTypes.length > 1 && channelTypes[1].views / ctTotalViews > 0.4) insightText = t('ex.insightPub')||'Publisher-owned channels drive a large share of this title\'s social presence â organic bookfluencer discovery may be an untapped opportunity.'; 1584 else insightText = (t('ex.insightMix')||'Social reach for this title is spread across multiple channel types, with bookfluencers driving %s%.').replace('%s',bfShare); 1585 html += '<div class="ex2-insight">' + insightText + '</div>'; 1586 html += '</div>'; 1587 1588 // Section 3: Confidence Badge 1589 var matchConfidence = 96.8; 1590 var badgeColor = '#059669', badgeBg = '#ecfdf5', badgeLabel = t('ex.highConf')||'High confidence'; 1591 html += '<div class="ex2-section">'; 1592 html += '<div class="ex2-confidence" style="background:' + badgeBg + ';border-color:' + badgeColor + '22">'; 1593 html += '<div style="display:flex;align-items:center;gap:8px">'; 1594 html += '<svg width="20" height="20" viewBox="0 0 20 20" fill="none"><path d="M10 1L12.5 4H17V8.5L20 10L17 11.5V16H12.5L10 19L7.5 16H3V11.5L0 10L3 8.5V4H7.5L10 1Z" fill="' + badgeColor + '" fill-opacity="0.15"/><path d="M10 1L12.5 4H17V8.5L20 10L17 11.5V16H12.5L10 19L7.5 16H3V11.5L0 10L3 8.5V4H7.5L10 1Z" stroke="' + badgeColor + '" stroke-width="1.2"/><path d="M7 10L9 12L13 8" stroke="' + badgeColor + '" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>'; 1595 html += '<div><span class="ex2-confidence-score" style="color:' + badgeColor + '">' + matchConfidence + '%</span><span class="ex2-confidence-label">' + (t('ex.matchPrecision')||'title match precision') + '</span></div>'; 1596 html += '</div>'; 1597 html += '<span class="ex2-confidence-badge" style="background:' + badgeColor + '15;color:' + badgeColor + '">' + badgeLabel + '</span>'; 1598 html += '</div>'; 1599 html += '<div class="ex2-confidence-sub">' + (t('ex.isbnSub2')||'Every result is verified against this title\'s ISBN â not a keyword match.') + '</div>'; 1600 html += '</div>'; 1601 1602 // Section 4: Top 3 Bookfluencers with post links 1603 html += '<div class="ex2-section">'; 1604 html += '<div class="ex2-section-label"><span class="ex2-section-num">4</span><span class="ex2-section-title">' + (t('ex.s4')||'Top Bookfluencers â The Action Trigger') + '</span></div>'; 1605 html += '<div class="ex2-bf-list">'; 1606 topBf.forEach(function(bf, i) { 1607 html += '<div class="ex2-bf-card">'; 1608 html += '<span class="ex2-bf-rank">' + (i+1) + '</span>'; 1609 html += '<span class="ex2-plat-icon" style="background:' + (platColors[bf.platform]||'var(--blue)') + ';width:30px;height:30px;flex-shrink:0">' + (platIcons[bf.platform]||'?') + '</span>'; 1610 html += '<div class="ex2-bf-info">'; 1611 html += '<div><span class="ex2-bf-name">@' + escHtml(bf.name) + '</span><span class="ex2-bf-platform-tag">' + bf.platform + '</span></div>'; 1612 html += '<div class="ex2-bf-stats-row"><span>' + formatBigNum(bf.views) + ' ' + (t('ex.views')||'views').toLowerCase() + '</span><span>' + bf.er + '% ' + (t('ex.er')||'ER') + '</span></div>'; 1613 if (bf.link) { 1614 html += '<a href="' + escHtml(bf.link) + '" target="_blank" rel="noopener" class="ex2-bf-post-link" data-umami-event="explorer-bf-post-click">â¶ ' + (t('ex.topPost')||'Most impactful post') + '</a>'; 1615 } 1616 html += '</div>'; 1617 html += '</div>'; 1618 }); 1619 if (remainingBf > 0) { 1620 html += '<div class="ex2-bf-locked">';
1621 html += '<svg width="16" height="16" viewBox="0 0 16 16" fill="none" style="color:#94a3b8;flex-shrink:0"><rect x="3" y="7" width="10" height="8" rx="2" stroke="currentColor" stroke-width="1.2"/><path d="M5 7V5C5 3.343 6.343 2 8 2C9.657 2 11 3.343 11 5V7" stroke="currentColor" stroke-width="1.2"/></svg>'; 1622 html += '<span>' + ((t('ex.moreBf')||'%n more bookfluencers tracked for this title â unlock with a platform subscription.').replace('%n','<strong>'+remainingBf+'</strong>')) + '</span>'; 1623 html += '</div>'; 1624 } 1625 html += '</div></div>'; 1626 1627 // Section 5: Momentum & Language 1628 html += '<div class="ex2-section">'; 1629 html += '<div class="ex2-section-label"><span class="ex2-section-num">5</span><span class="ex2-section-title">' + (t('ex.s5')||'Momentum & Language') + '</span></div>'; 1630 html += '<div class="ex2-momentum-grid">'; 1631 html += '<div class="ex2-momentum-card">'; 1632 html += '<div class="ex2-momentum-label">' + (t('ex.mom')||'Month-over-Month') + '</div>'; 1633 html += '<div class="ex2-momentum-num ' + (isUp ? 'up' : 'down') + '">' + (isUp ? 'â' : 'â') + ' ' + Math.abs(momentumPct) + '%</div>'; 1634 html += '<div class="ex2-momentum-sub">' + (t('ex.vsPrev')||'vs. previous month') + '</div>'; 1635 if (sparkData.length > 1) { 1636 var sparkMax = Math.max.apply(null, sparkData); 1637 if (sparkMax === 0) sparkMax = 1; 1638 var sparkW = 240, sparkH = 40; 1639 var sparkPoints = sparkData.map(function(v, i) { 1640 return Math.round(i * sparkW / (sparkData.length - 1)) + ',' + Math.round(sparkH - (v / sparkMax) * (sparkH - 4)); 1641 }).join(' '); 1642 var sparkFillPoints = sparkPoints + ' ' + sparkW + ',' + sparkH + ' 0,' + sparkH; 1643 html += '<div class="ex2-sparkline"><svg viewBox="0 0 ' + sparkW + ' ' + (sparkH + 16) + '" style="width:100%;height:100%">'; 1644 html += '<defs><linearGradient id="sparkGrad" x1="0" y1="0" x2="0" y2="1"><stop offset="0%" stop-color="#6366f1" stop-opacity="0.2"/><stop offset="100%" stop-color="#6366f1" stop-opacity="0"/></linearGradient></defs>'; 1645 html += '<polygon points="' + sparkFillPoints + '" fill="url(#sparkGrad)"/>'; 1646 html += '<polyline points="' + sparkPoints + '" fill="none" stroke="#6366f1" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"/>';
1647 sparkLabels.forEach(function(lbl, i) { 1648 html += '<text x="' + Math.round(i * sparkW / (sparkData.length - 1)) + '" y="' + (sparkH + 14) + '" text-anchor="middle" font-size="8" fill="#94a3b8">' + lbl + '</text>'; 1649 }); 1650 html += '</svg></div>'; 1651 } 1652 html += '</div>'; 1653 if (langData.length) { 1654 html += '<div class="ex2-momentum-card">'; 1655 html += '<div class="ex2-momentum-label">' + (t('ex.langDist')||'Language Distribution') + '</div>'; 1656 langData.forEach(function(lg) { 1657 html += '<div class="ex2-lang-bar">'; 1658 html += '<div class="ex2-lang-row"><span class="ex2-lang-name">' + lg.l + '</span><span class="ex2-lang-pct">' + lg.s + '%</span></div>'; 1659 html += '<div class="ex2-lang-track"><div class="ex2-lang-fill" style="width:' + lg.s + '%;background:' + lg.c + '"></div></div>'; 1660 html += '</div>'; 1661 }); 1662 html += '</div>'; 1663 } 1664 html += '</div></div>'; 1665 1666 // Blurred Teaser â visually rich dummy analytics 1667 html += '<div class="ex2-blur-teaser">'; 1668 html += '<div class="ex2-blur-content">'; 1669 // Fake section header 1670 html += '<div style="display:flex;align-items:center;gap:8px;margin-bottom:14px"><div style="width:28px;height:28px;border-radius:50%;background:linear-gradient(135deg,#6366f1,#818cf8)"></div><div style="height:4px;width:140px;border-radius:4px;background:#cbd5e1"></div></div>'; 1671 // Fake time series chart 1672 html += '<div style="height:90px;border-radius:12px;background:linear-gradient(180deg,#ede9fe 0%,#f5f3ff 100%);position:relative;overflow:hidden;margin-bottom:14px">'; 1673 html += '<svg viewBox="0 0 300 80" style="width:100%;height:100%" preserveAspectRatio="none"><defs><linearGradient id="blurG" x1="0" y1="0" x2="0" y2="1"><stop offset="0%" stop-color="#6366f1" stop-opacity="0.3"/><stop offset="100%" stop-color="#6366f1" stop-opacity="0"/></linearGradient></defs>'; 1674 html += '<polygon points="0,70 20,55 50,60 80,35 120,40 150,20 180,25 210,15 240,30 270,22 300,10 300,80 0,80" fill="url(#blurG)"/>'; 1675 html += '<polyline points="0,70 20,55 50,60 80,35 120,40 150,20 180,25 210,15 240,30 270,22 300,10" fill="none" stroke="#6366f1" stroke-width="2"/>'; 1676 html += '</svg></div>'; 1677 // Fake KPI row 1678 html += '<div style="display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:14px">'; 1679 var fakeKpis = ['+34%','#12','4.2x','89%']; 1680 var fakeLabels = [t('ex.growth')||'Growth',t('ex.genreRank')||'Genre Rank',t('ex.roiScore')||'ROI Score',t('ex.sentiment')||'Sentiment']; 1681 for (var ki=0;ki<4;ki++) { 1682 html += '<div style="text-align:center;padding:10px 4px;border-radius:10px;background:#f8fafc;border:1px solid #e2e8f0">'; 1683 html += '<div style="font-size:1.1rem;font-weight:700;color:#334155">' + fakeKpis[ki] + '</div>'; 1684 html += '<div style="font-size:.65rem;color:#94a3b8;margin-top:2px">' + fakeLabels[ki] + '</div></div>'; 1685 } 1686 html += '</div>'; 1687 // Fake competitor table 1688 html += '<div style="border-radius:10px;border:1px solid #e2e8f0;overflow:hidden">'; 1689 html += '<div style="display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:0;font-size:.7rem;color:#64748b">'; 1690 html += '<div style="padding:6px 10px;background:#f8fafc;font-weight:600">' + (t('ex.title')||'Title') + '</div><div style="padding:6px;background:#f8fafc;font-weight:600;text-align:right">' + (t('ex.reach')||'Reach') + '</div><div style="padding:6px;background:#f8fafc;font-weight:600;text-align:right">' + (t('ex.er')||'ER') + '</div><div style="padding:6px 10px;background:#f8fafc;font-weight:600;text-align:right">' + (t('ex.trend')||'Trend') + '</div>'; 1691 for (var ri=0;ri<3;ri++) { 1692 var bg = ri % 2 === 0 ? '#fff' : '#fafbfc'; 1693 html += '<div style="padding:5px 10px;background:'+bg+';border-top:1px solid #f1f5f9"><div style="height:3px;width:'+(70-ri*15)+'%;border-radius:2px;background:#cbd5e1"></div></div>'; 1694 html += '<div style="padding:5px 6px;background:'+bg+';border-top:1px solid #f1f5f9;text-align:right"><div style="height:3px;width:60%;border-radius:2px;background:#cbd5e1;margin-left:auto"></div></div>'; 1695 html += '<div style="padding:5px 6px;background:'+bg+';border-top:1px solid #f1f5f9;text-align:right"><div style="height:3px;width:40%;border-radius:2px;background:#cbd5e1;margin-left:auto"></div></div>'; 1696 html += '<div style="padding:5px 10px;background:'+bg+';border-top:1px solid #f1f5f9;text-align:right"><div style="height:3px;width:50%;border-radius:2px;background:#cbd5e1;margin-left:auto"></div></div>'; 1697 } 1698 html += '</div></div>'; 1699 html += '</div>'; // ex2-blur-content 1700 html += '<div class="ex2-blur-gradient"></div>'; 1701 html += '<div class="ex2-blur-cta">'; 1702 html += '<div class="ex2-blur-cta-title">' + (t('ex.blurTitle')||'There\'s much more behind this data') + '</div>'; 1703 html += '<p>' + (t('ex.blurFeatures')||'Full 38-month time series · Complete bookfluencer ranking with post-level data · Genre benchmarks · Competitor comparison · Sentiment analysis · ROI scoring') + '</p>'; 1704 html += '</div></div>'; 1705 1706 html += '</div>'; // ex2-inner 1707 html += '</div>'; // explorer-detail-box 1708 overlay.innerHTML = html; 1709 document.body.appendChild(overlay); 1710 1711 if (window.umami) umami.track('data-explorer-detail-view', { title: d.t }); 1712 }); 1713} 1714 1715// Contact popup 1716var _contactSource = ''; 1717function openContactPopup(source) { 1718 _contactSource = source || ''; 1719 document.getElementById('contactOverlay').style.display = 'flex'; 1720 document.body.style.overflow = 'hidden'; 1721} 1722function closeContactPopup() { 1723 document.getElementById('contactOverlay').style.display = 'none'; 1724 document.body.style.overflow = ''; 1725} 1726function submitContactForm(e) { 1727 e.preventDefault(); 1728 var n = document.getElementById('contactName').value.trim(); 1729 var em = document.getElementById('contactEmail').value.trim(); 1730 var msg = document.getElementById('contactMsg').value.trim(); 1731 var btn = e.target.querySelector('button[type="submit"]'); 1732 var origText = btn.textContent; 1733 btn.textContent = t('contact.sending') || 'Sending...'; 1734 btn.disabled = true; 1735 1736 var fullMsg = msg + (_contactSource ? '\n\n---\nSource: ' + _contactSource : ''); 1737 if (window.emailjs && window.EMAILJS_SERVICE_ID) { 1738 emailjs.send(window.EMAILJS_SERVICE_ID, window.EMAILJS_TEMPLATE_CONTACT, { 1739 from_name: n, from_email: em, message: fullMsg 1740 }, window.EMAILJS_PUBLIC_KEY).then(function() { 1741 btn.textContent = t('contact.sent') || 'Sent!'; 1742 if (window.umami) umami.track('contact-form-submit'); 1743 setTimeout(function() { closeContactPopup(); btn.textContent = origText; btn.disabled = false; document.getElementById('contactForm').reset(); }, 2000); 1744 }, function(err) { 1745 console.error('EmailJS error:', err); 1746 var subject = encodeURIComponent('Lit-X Contact: ' + n);
1747 var body = encodeURIComponent('From: ' + n + ' (' + em + ')\n\n' + fullMsg); 1748 window.location.href = 'mailto:[email protected]?subject=' + subject + '&body=' + body; 1749 btn.textContent = origText; btn.disabled = false; 1750 closeContactPopup(); 1751 }); 1752 } else { 1753 var subject = encodeURIComponent('Lit-X Contact: ' + n); 1754 var body = encodeURIComponent('From: ' + n + ' (' + em + ')\n\n' + fullMsg); 1755 window.location.href = 'mailto:[email protected]?subject=' + subject + '&body=' + body; 1756 if (window.umami) umami.track('contact-form-submit'); 1757 btn.textContent = origText; btn.disabled = false; 1758 closeContactPopup(); 1759 } 1760} 1761 1762// Smooth scroll 1763document.querySelectorAll('a[href^="#"]').forEach(a => { 1764 a.addEventListener('click', e => { 1765 const target = document.querySelector(a.getAttribute('href')); 1766 if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); } 1767 }); 1768});
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.