PageSourceSearch

https://lit-x.com/js/app.js

js lit-x.com collected 2026-10-10 00:25:39 UTC 156,376 bytes, 1,768 lines download raw bytes

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.