// trf-data.jsx — Traffic & Channels data + i18n

const TRF_T = {
  ru: {
    pageTitle: 'Traffic & Channels',
    pageSub: 'GA4 + Yandex Metrica · последние 30 дней',
    sec1: 'Snapshot',
    sec2: 'Каналы',
    sec3: 'Страницы',
    sec4: 'SEO',
    sec5: 'Воронка',
    sec6: 'Tech',
    snap: {
      sessions: 'Сессии',
      users: 'Пользователи',
      newUsers: 'Новые',
      pageViews: 'Просмотры',
      avgEngage: 'Engagement time',
      bounce: 'Bounce rate',
      pps: 'Pages / session',
      eventsPer: 'События / сессия',
      conv: 'CR в бронь',
      revPerS: 'Revenue / session',
    },
    chTitle: 'Каналы трафика',
    chTable: { ch: 'Канал', s: 'Сессии', u: 'Польз.', new: 'Новые %', avg: 'Engage', cr: 'CR', rev: 'Revenue' },
    chMix: 'Состав трафика по неделям',
    chQuad: 'Качество × Объём (CR vs Sessions)',
    pgTitle: 'Топ страниц',
    pgTable: { url: 'URL', s: 'Сессии', u: 'Польз.', t: 'Avg time', e: 'Exit %', cr: 'CR' },
    pgQuad: 'Качество страниц (Engagement × CR)',
    pgPaths: 'Топ путей пользователя',
    seoTitle: 'SEO · Search Console',
    seoKpi: { imp: 'Показы', clk: 'Клики', ctr: 'CTR', pos: 'Avg position' },
    seoQueries: 'Топ запросов',
    seoQTbl: { q: 'Запрос', i: 'Показы', c: 'Клики', ctr: 'CTR', pos: 'Pos.', tr: '7d trend' },
    seoMovers: 'Победители и проигравшие',
    seoLanding: 'Топ landing pages из органики',
    seoCoverage: 'Покрытие индекса',
    funnelTitle: 'Конверсионная воронка',
    funnelByDevice: 'Воронка по устройствам',
    funnelByChannel: 'Конверсия по каналам',
    techTitle: 'Tech & Performance',
    cwv: 'Core Web Vitals',
    cwvNames: { lcp: 'LCP', inp: 'INP', cls: 'CLS' },
    cwvBy: 'CWV по устройствам',
    devices: 'Устройства',
    browsers: 'Браузеры',
    slow: 'Самые медленные страницы',
    errors: '404 и ошибки',
    skel: 'Загрузка…',
    legend: { actual: 'Факт', prev: 'Прошлый период', target: 'Цель' },
    deltaUp: 'vs пр.', deltaDown: 'vs пр.',
  },
  en: {
    pageTitle: 'Traffic & Channels',
    pageSub: 'GA4 + Yandex Metrica · last 30 days',
    sec1: 'Snapshot',
    sec2: 'Channels',
    sec3: 'Pages',
    sec4: 'SEO',
    sec5: 'Funnel',
    sec6: 'Tech',
    snap: {
      sessions: 'Sessions',
      users: 'Users',
      newUsers: 'New users',
      pageViews: 'Page views',
      avgEngage: 'Engagement time',
      bounce: 'Bounce rate',
      pps: 'Pages / session',
      eventsPer: 'Events / session',
      conv: 'Booking CR',
      revPerS: 'Revenue / session',
    },
    chTitle: 'Channel mix',
    chTable: { ch: 'Channel', s: 'Sessions', u: 'Users', new: 'New %', avg: 'Engage', cr: 'CR', rev: 'Revenue' },
    chMix: 'Weekly channel composition',
    chQuad: 'Quality × Volume (CR vs Sessions)',
    pgTitle: 'Top pages',
    pgTable: { url: 'URL', s: 'Sessions', u: 'Users', t: 'Avg time', e: 'Exit %', cr: 'CR' },
    pgQuad: 'Page quality (Engagement × CR)',
    pgPaths: 'Top user paths',
    seoTitle: 'SEO · Search Console',
    seoKpi: { imp: 'Impressions', clk: 'Clicks', ctr: 'CTR', pos: 'Avg position' },
    seoQueries: 'Top queries',
    seoQTbl: { q: 'Query', i: 'Impr.', c: 'Clicks', ctr: 'CTR', pos: 'Pos.', tr: '7d trend' },
    seoMovers: 'Movers',
    seoLanding: 'Top organic landing pages',
    seoCoverage: 'Index coverage',
    funnelTitle: 'Conversion funnel',
    funnelByDevice: 'Funnel by device',
    funnelByChannel: 'CR by channel',
    techTitle: 'Tech & Performance',
    cwv: 'Core Web Vitals',
    cwvNames: { lcp: 'LCP', inp: 'INP', cls: 'CLS' },
    cwvBy: 'CWV by device',
    devices: 'Devices',
    browsers: 'Browsers',
    slow: 'Slowest pages',
    errors: '404 & errors',
    skel: 'Loading…',
    legend: { actual: 'Current', prev: 'Previous', target: 'Target' },
    deltaUp: 'vs prev.', deltaDown: 'vs prev.',
  },
};

const TRF_HELP = {
  ru: {
    sessions: { title: 'Сессии', body: 'Количество визитов на сайт за период. Сессия завершается через 30 минут неактивности.' },
    users: { title: 'Пользователи', body: 'Уникальные посетители сайта по cookie / fingerprint.' },
    newUsers: { title: 'Новые пользователи', body: 'Пользователи, впервые попавшие на сайт за период.' },
    pageViews: { title: 'Просмотры страниц', body: 'Общее число загрузок страниц. Перезагрузка считается новым просмотром.' },
    avgEngage: { title: 'Engagement time', body: 'Среднее время активного взаимодействия со страницей (без idle-секунд).' },
    bounce: { title: 'Bounce rate', body: 'Доля сессий с одним просмотром, без событий и менее 10 секунд.' },
    pps: { title: 'Pages / session', body: 'Средняя глубина просмотра — сколько страниц видит пользователь за визит.' },
    eventsPer: { title: 'Events / session', body: 'Среднее число действий (клики, формы, скролл) за сессию.' },
    conv: { title: 'CR в бронь', body: 'Доля сессий, завершившихся отправкой формы или платежом.' },
    revPerS: { title: 'Revenue / session', body: 'Средняя выручка с одной сессии — total revenue ÷ sessions.' },
    lcp: { title: 'LCP', body: 'Largest Contentful Paint — время загрузки самого большого блока. Зелёная зона ≤ 2.5 с.' },
    inp: { title: 'INP', body: 'Interaction to Next Paint — отклик интерфейса. Зелёная зона ≤ 200 мс.' },
    cls: { title: 'CLS', body: 'Cumulative Layout Shift — стабильность раскладки. Зелёная зона ≤ 0.1.' },
    imp: { title: 'Показы в поиске', body: 'Для чего: показывает видимость сайта в органической выдаче. Как работает: считает показы URL в Search Console по запросам за период.' },
    clk: { title: 'Клики из поиска', body: 'Для чего: показывает реальный органический трафик из выдачи. Как работает: считает клики из Search Console, не включая рекламу.' },
    pos: { title: 'Avg position', body: 'Средняя позиция в выдаче по всем запросам, по которым показывался сайт.' },
    ctr: { title: 'CTR', body: 'Click-through rate — отношение кликов к показам в поиске.' },
    channels: { title: 'Каналы трафика', body: 'Для чего: понять, откуда приходят пользователи и деньги. Как работает: группирует сессии по GA4 channel grouping и показывает качество, CR и revenue.' },
    channelMix: { title: 'Состав трафика', body: 'Для чего: видеть изменения структуры каналов по неделям. Как работает: stacked area показывает доли Organic, Direct, Paid, Social, Referral, Email и Display.' },
    channelQuality: { title: 'Качество × объем', body: 'Для чего: отличить массовый, но слабый трафик от малого, но ценного. Как работает: X — sessions, Y — booking CR, размер пузыря — revenue.' },
    pages: { title: 'Топ страниц', body: 'Для чего: понять, какие страницы привлекают и конвертируют пользователей. Как работает: показывает sessions, users, time, exit и CR по URL.' },
    pageQuality: { title: 'Качество страниц', body: 'Для чего: найти страницы, где engagement не превращается в бронь или наоборот. Как работает: X — среднее время, Y — CR, размер — sessions.' },
    paths: { title: 'Пути пользователя', body: 'Для чего: увидеть частые маршруты перед бронью. Как работает: группирует последовательности страниц и считает конверсию каждого пути.' },
    seoQueries: { title: 'Топ запросов', body: 'Для чего: понять, какие поисковые запросы дают видимость и клики. Как работает: таблица берет impressions, clicks, CTR, position и 7-day trend из Search Console.' },
    seoMovers: { title: 'SEO movers', body: 'Для чего: быстро увидеть запросы, которые выросли или просели. Как работает: сравнивает текущую позицию с прошлым периодом и делит на winners/losers.' },
    seoLanding: { title: 'Organic landing pages', body: 'Для чего: понять, какие страницы лучше всего работают в SEO. Как работает: ранжирует landing pages по кликам, CTR и позиции.' },
    seoCoverage: { title: 'Покрытие индекса', body: 'Для чего: контролировать, какие страницы Google видит и индексирует. Как работает: раскладывает submitted URL на indexed, warnings и errors.' },
    funnel: { title: 'Конверсионная воронка', body: 'Для чего: найти главный провал от сессии до оплаты. Как работает: считает шаги Sessions → View cabin → Open booking → Fill form → Confirm payment.' },
    funnelDevice: { title: 'Воронка по устройствам', body: 'Для чего: увидеть, где mobile или desktop теряют конверсию. Как работает: сравнивает booking CR и sessions по device category.' },
    funnelChannel: { title: 'Конверсия по каналам', body: 'Для чего: понять, какие каналы приводят наиболее готовых гостей. Как работает: сравнивает booking CR по traffic channel.' },
    cwv: { title: 'Core Web Vitals', body: 'Для чего: контролировать скорость и стабильность сайта. Как работает: показывает p75 LCP, INP и CLS относительно рекомендованных порогов Google.' },
    cwvBy: { title: 'CWV по устройствам', body: 'Для чего: увидеть, где именно сайт медленный. Как работает: сравнивает LCP, INP и CLS отдельно для desktop, mobile и tablet.' },
    devices: { title: 'Устройства и браузеры', body: 'Для чего: понимать, под какие устройства оптимизировать сайт. Как работает: показывает долю sessions по device и browser mix.' },
    slow: { title: 'Самые медленные страницы', body: 'Для чего: выбрать страницы для технической оптимизации в первую очередь. Как работает: ранжирует URL по LCP/INP и статусу качества.' },
    errors: { title: '404 и ошибки', body: 'Для чего: ловить технические проблемы, которые портят конверсию и SEO. Как работает: агрегирует 404, 500, JS errors и broken links по счетчику и top URL.' },
  },
  en: {
    sessions: { title: 'Sessions', body: 'Visits to the site during the period. A session ends after 30 minutes of inactivity.' },
    users: { title: 'Users', body: 'Unique visitors identified by cookie / fingerprint.' },
    newUsers: { title: 'New users', body: 'Users who visited the site for the first time during the period.' },
    pageViews: { title: 'Page views', body: 'Total page loads. A reload counts as a new view.' },
    avgEngage: { title: 'Engagement time', body: 'Avg active engagement time per session (idle seconds excluded).' },
    bounce: { title: 'Bounce rate', body: 'Share of sessions with a single view, no events, under 10 seconds.' },
    pps: { title: 'Pages / session', body: 'Avg pages viewed per session.' },
    eventsPer: { title: 'Events / session', body: 'Avg user actions (clicks, forms, scroll) per session.' },
    conv: { title: 'Booking CR', body: 'Share of sessions that submitted a booking form or completed payment.' },
    revPerS: { title: 'Revenue / session', body: 'Avg revenue per session — total revenue ÷ sessions.' },
    lcp: { title: 'LCP', body: 'Largest Contentful Paint — biggest element load time. Green zone ≤ 2.5 s.' },
    inp: { title: 'INP', body: 'Interaction to Next Paint — UI responsiveness. Green zone ≤ 200 ms.' },
    cls: { title: 'CLS', body: 'Cumulative Layout Shift — layout stability. Green zone ≤ 0.1.' },
    imp: { title: 'Search impressions', body: 'Purpose: shows organic search visibility. How it works: counts Search Console impressions for site URLs and queries during the period.' },
    clk: { title: 'Search clicks', body: 'Purpose: shows actual organic traffic from search. How it works: counts Search Console clicks, excluding paid ads.' },
    pos: { title: 'Avg position', body: 'Mean SERP position across queries the site appeared for.' },
    ctr: { title: 'CTR', body: 'Click-through rate — clicks ÷ impressions in search.' },
    channels: { title: 'Traffic channels', body: 'Purpose: shows where users and revenue come from. How it works: groups sessions by GA4 channel grouping and shows quality, CR, and revenue.' },
    channelMix: { title: 'Traffic composition', body: 'Purpose: shows weekly channel-mix changes. How it works: stacked area displays Organic, Direct, Paid, Social, Referral, Email, and Display shares.' },
    channelQuality: { title: 'Quality × volume', body: 'Purpose: separates large weak traffic from smaller valuable traffic. How it works: X is sessions, Y is booking CR, bubble size is revenue.' },
    pages: { title: 'Top pages', body: 'Purpose: shows which pages attract and convert users. How it works: lists sessions, users, time, exit rate, and CR by URL.' },
    pageQuality: { title: 'Page quality', body: 'Purpose: finds pages where engagement and booking conversion diverge. How it works: X is average time, Y is CR, bubble size is sessions.' },
    paths: { title: 'User paths', body: 'Purpose: shows common journeys before booking. How it works: groups page sequences and calculates conversion for each path.' },
    seoQueries: { title: 'Top queries', body: 'Purpose: shows which search queries drive visibility and clicks. How it works: uses Search Console impressions, clicks, CTR, position, and 7-day trend.' },
    seoMovers: { title: 'SEO movers', body: 'Purpose: highlights queries that gained or lost position. How it works: compares current position with the previous period and splits winners/losers.' },
    seoLanding: { title: 'Organic landing pages', body: 'Purpose: shows which pages work best in SEO. How it works: ranks landing pages by clicks, CTR, and position.' },
    seoCoverage: { title: 'Index coverage', body: 'Purpose: monitors what Google can see and index. How it works: splits submitted URLs into indexed, warnings, and errors.' },
    funnel: { title: 'Conversion funnel', body: 'Purpose: finds the main drop-off from session to payment. How it works: counts Sessions → View cabin → Open booking → Fill form → Confirm payment.' },
    funnelDevice: { title: 'Funnel by device', body: 'Purpose: shows whether mobile or desktop loses conversion. How it works: compares booking CR and sessions by device category.' },
    funnelChannel: { title: 'Conversion by channel', body: 'Purpose: shows which channels bring guests ready to book. How it works: compares booking CR by traffic channel.' },
    cwv: { title: 'Core Web Vitals', body: 'Purpose: monitors speed and stability. How it works: shows p75 LCP, INP, and CLS against Google thresholds.' },
    cwvBy: { title: 'CWV by device', body: 'Purpose: shows where the site is slow. How it works: compares LCP, INP, and CLS across desktop, mobile, and tablet.' },
    devices: { title: 'Devices and browsers', body: 'Purpose: shows what to optimize for. How it works: displays sessions by device and browser mix.' },
    slow: { title: 'Slowest pages', body: 'Purpose: prioritizes technical optimization. How it works: ranks URLs by LCP/INP and quality status.' },
    errors: { title: '404 & errors', body: 'Purpose: catches technical issues that hurt conversion and SEO. How it works: aggregates 404, 500, JS errors, and broken links by count and top URL.' },
  },
};

const TRF = {
  // ============ Section 1 — Snapshot ============
  snapshot: {
    default: {
      sessions:   { value: 48720, delta: 8.4,  unit: '' },
      users:      { value: 36480, delta: 6.1,  unit: '' },
      newUsers:   { value: 27015, delta: 9.2,  unit: '' },
      pageViews:  { value: 142800, delta: 5.7, unit: '' },
      avgEngage:  { value: 142,   delta: 4.3,  unit: 's' },
      bounce:     { value: 41.2,  delta: -2.1, unit: '%' },
      pps:        { value: 2.93,  delta: 1.8,  unit: '' },
      eventsPer:  { value: 8.4,   delta: 3.6,  unit: '' },
      conv:       { value: 2.74,  delta: 0.4,  unit: '%' },
      revPerS:    { value: 5.18,  delta: 7.1,  unit: '€' },
    },
    alert: {
      sessions:   { value: 41320, delta: -7.8 },
      users:      { value: 31420, delta: -5.4 },
      newUsers:   { value: 20860, delta: -14.2 },
      pageViews:  { value: 118200, delta: -8.3 },
      avgEngage:  { value: 118, delta: -16.9, unit: 's' },
      bounce:     { value: 52.4, delta: 11.4, unit: '%', alert: true },
      pps:        { value: 2.41, delta: -17.7 },
      eventsPer:  { value: 6.2, delta: -26.1 },
      conv:       { value: 1.92, delta: -29.9, unit: '%', alert: true },
      revPerS:    { value: 3.42, delta: -34.0, unit: '€', alert: true },
    },
  },

  // ============ Section 2 — Channels ============
  channels: [
    { ch: 'Organic Search',   s: 18420, u: 13260, newPct: 62, avg: 168, cr: 3.21, rev: 32820, color: '#10B981' },
    { ch: 'Direct',            s:  9840, u:  7140, newPct: 38, avg: 192, cr: 4.12, rev: 28640, color: '#6366F1' },
    { ch: 'Paid Search',       s:  7320, u:  6210, newPct: 78, avg: 132, cr: 2.84, rev: 17840, color: '#F59E0B' },
    { ch: 'Social',            s:  5640, u:  4920, newPct: 84, avg:  98, cr: 1.62, rev:  6420, color: '#EC4899' },
    { ch: 'Referral',          s:  3820, u:  3180, newPct: 56, avg: 154, cr: 2.94, rev:  9180, color: '#06B6D4' },
    { ch: 'Email',             s:  2480, u:  1940, newPct: 14, avg: 218, cr: 5.62, rev: 11820, color: '#8B5CF6' },
    { ch: 'Display',           s:  1200, u:  1080, newPct: 92, avg:  62, cr: 0.41, rev:   480, color: '#EF4444' },
  ],
  channelMix: [ // 8 weeks, % share
    { w: 'W1', org: 38, dir: 22, paid: 14, soc: 10, ref: 8, em: 6, dis: 2 },
    { w: 'W2', org: 39, dir: 21, paid: 15, soc: 11, ref: 7, em: 5, dis: 2 },
    { w: 'W3', org: 37, dir: 20, paid: 17, soc: 11, ref: 8, em: 5, dis: 2 },
    { w: 'W4', org: 36, dir: 21, paid: 16, soc: 12, ref: 8, em: 5, dis: 2 },
    { w: 'W5', org: 38, dir: 20, paid: 15, soc: 12, ref: 8, em: 5, dis: 2 },
    { w: 'W6', org: 37, dir: 22, paid: 14, soc: 12, ref: 8, em: 5, dis: 2 },
    { w: 'W7', org: 38, dir: 21, paid: 15, soc: 11, ref: 8, em: 5, dis: 2 },
    { w: 'W8', org: 38, dir: 21, paid: 15, soc: 11, ref: 8, em: 5, dis: 2 },
  ],

  // ============ Section 3 — Pages ============
  pages: [
    { url: '/',                    s: 14820, u: 11240, t: 96,  exit: 32, cr: 3.42 },
    { url: '/cabins/cyprus',       s:  4280, u:  3640, t: 188, exit: 18, cr: 6.84 },
    { url: '/cabins/bali',         s:  3920, u:  3340, t: 174, exit: 20, cr: 5.91 },
    { url: '/cabins/portofino',    s:  3640, u:  3120, t: 162, exit: 22, cr: 5.42 },
    { url: '/cabins/maldives',     s:  3210, u:  2840, t: 156, exit: 24, cr: 4.82 },
    { url: '/spa',                 s:  2840, u:  2410, t: 128, exit: 28, cr: 3.18 },
    { url: '/restaurant',          s:  2410, u:  2080, t: 142, exit: 26, cr: 2.94 },
    { url: '/booking',             s:  2180, u:  1920, t: 218, exit: 16, cr: 18.4 },
    { url: '/blog/wine-pairing',   s:  1840, u:  1620, t:  84, exit: 64, cr: 0.42 },
    { url: '/contacts',            s:  1620, u:  1380, t:  62, exit: 71, cr: 0.18 },
  ],
  paths: [
    { path: ['/', '/cabins/cyprus', '/booking'], count: 1240, conv: 184 },
    { path: ['/', '/cabins/bali', '/booking'], count: 1080, conv: 162 },
    { path: ['/spa', '/booking'], count: 480, conv: 84 },
    { path: ['/', '/restaurant', '/booking'], count: 320, conv: 24 },
    { path: ['/blog/wine-pairing', '/restaurant'], count: 280, conv: 6 },
    { path: ['/', '/contacts'], count: 420, conv: 0 },
  ],

  // ============ Section 4 — SEO ============
  seoKpi: {
    imp: { value: 1842000, delta: 12.4 },
    clk: { value: 38420, delta: 8.6 },
    ctr: { value: 2.08, delta: -0.34, unit: '%' },
    pos: { value: 14.8, delta: -1.2 }, // delta negative = improvement (lower is better)
  },
  seoQueries: [
    { q: 'отель загородный премиум',   i: 28400, c: 1240, ctr: 4.36, pos: 4.2,  tr: 'up',   delta: 18 },
    { q: 'загородный комплекс с спа',  i: 18200, c:  720, ctr: 3.96, pos: 5.8,  tr: 'up',   delta: 12 },
    { q: 'seovillage',                 i: 12800, c: 8420, ctr: 65.8, pos: 1.2,  tr: 'flat', delta: 0 },
    { q: 'отель с видом на залив',     i:  9420, c:  280, ctr: 2.97, pos: 8.4,  tr: 'down', delta: -8 },
    { q: 'ресторан загородный',        i:  8240, c:  184, ctr: 2.23, pos: 12.4, tr: 'up',   delta: 6 },
    { q: 'спа выходного дня',          i:  6480, c:  142, ctr: 2.19, pos: 14.8, tr: 'down', delta: -14 },
    { q: 'аренда домика на выходные',  i:  5840, c:  118, ctr: 2.02, pos: 18.2, tr: 'up',   delta: 4 },
    { q: 'отель премиум москва',       i:  4820, c:   62, ctr: 1.29, pos: 22.4, tr: 'down', delta: -18 },
  ],
  seoMovers: {
    winners: [
      { q: 'загородный отель премиум', from: 8.4, to: 4.2, delta: -4.2 },
      { q: 'загородный комплекс с спа', from: 9.6, to: 5.8, delta: -3.8 },
      { q: 'аренда домика на выходные', from: 22.4, to: 18.2, delta: -4.2 },
    ],
    losers: [
      { q: 'отель премиум москва', from: 14.2, to: 22.4, delta: 8.2 },
      { q: 'спа выходного дня', from: 11.4, to: 14.8, delta: 3.4 },
      { q: 'отель с видом на залив', from: 6.8, to: 8.4, delta: 1.6 },
    ],
  },
  seoLanding: [
    { url: '/cabins/cyprus',   c: 14200, i: 184000, ctr: 7.72, pos: 4.2 },
    { url: '/cabins/bali',     c: 12400, i: 162000, ctr: 7.65, pos: 4.6 },
    { url: '/spa',             c:  4820, i:  84000, ctr: 5.74, pos: 8.4 },
    { url: '/restaurant',      c:  3480, i:  62000, ctr: 5.61, pos: 9.6 },
    { url: '/blog/wine-pairing', c: 1840, i: 124000, ctr: 1.48, pos: 18.2 },
  ],
  coverage: {
    indexed: 184,
    submitted: 212,
    excluded: 28,
    errors: 4,
    breakdown: [
      { reason: 'Submitted and indexed', n: 184, kind: 'ok' },
      { reason: 'Crawled — currently not indexed', n: 18, kind: 'warn' },
      { reason: 'Discovered — not crawled', n: 6, kind: 'warn' },
      { reason: 'Duplicate without canonical', n: 4, kind: 'warn' },
      { reason: 'Not found (404)', n: 4, kind: 'err' },
    ],
  },

  // ============ Section 5 — Funnel ============
  funnel: {
    default: [
      { step: 'Sessions',         value: 48720, dropPct: 0,    cr: 100 },
      { step: 'View cabin',       value: 22480, dropPct: 53.9, cr: 46.1 },
      { step: 'Open booking',     value:  6240, dropPct: 72.2, cr: 12.8 },
      { step: 'Fill form',        value:  2840, dropPct: 54.5, cr: 5.83 },
      { step: 'Confirm payment',  value:  1340, dropPct: 52.8, cr: 2.74 },
    ],
    alert: [
      { step: 'Sessions',         value: 41320, dropPct: 0,    cr: 100 },
      { step: 'View cabin',       value: 16480, dropPct: 60.1, cr: 39.9 },
      { step: 'Open booking',     value:  4180, dropPct: 74.6, cr: 10.1 },
      { step: 'Fill form',        value:  1820, dropPct: 56.4, cr: 4.4 },
      { step: 'Confirm payment',  value:   794, dropPct: 56.4, cr: 1.92, alert: true },
    ],
  },
  funnelByDevice: [
    { dev: 'Desktop',  cr: 3.84, sessions: 18420 },
    { dev: 'Mobile',   cr: 2.12, sessions: 26840 },
    { dev: 'Tablet',   cr: 2.96, sessions:  3460 },
  ],
  crByChannel: [
    { ch: 'Email',         cr: 5.62 },
    { ch: 'Direct',        cr: 4.12 },
    { ch: 'Organic Search', cr: 3.21 },
    { ch: 'Referral',      cr: 2.94 },
    { ch: 'Paid Search',   cr: 2.84 },
    { ch: 'Social',        cr: 1.62 },
    { ch: 'Display',       cr: 0.41 },
  ],

  // ============ Section 6 — Tech ============
  cwv: {
    lcp: { value: 2.4, status: 'good',   p75: 2.4, target: 2.5, unit: 's' },
    inp: { value: 184, status: 'good',   p75: 184, target: 200, unit: 'ms' },
    cls: { value: 0.08, status: 'good',  p75: 0.08, target: 0.1, unit: '' },
  },
  cwvByDevice: [
    { dev: 'Desktop', lcp: 1.8, inp: 142, cls: 0.04 },
    { dev: 'Mobile',  lcp: 2.9, inp: 218, cls: 0.12 },
    { dev: 'Tablet',  lcp: 2.4, inp: 184, cls: 0.08 },
  ],
  devices: [
    { dev: 'Mobile',  pct: 55.1, sessions: 26840 },
    { dev: 'Desktop', pct: 37.8, sessions: 18420 },
    { dev: 'Tablet',  pct:  7.1, sessions:  3460 },
  ],
  browsers: [
    { br: 'Chrome',   pct: 58.4 },
    { br: 'Safari',   pct: 24.2 },
    { br: 'Yandex',   pct:  8.1 },
    { br: 'Firefox',  pct:  4.8 },
    { br: 'Edge',     pct:  3.2 },
    { br: 'Other',    pct:  1.3 },
  ],
  slowPages: [
    { url: '/blog/wine-pairing',  lcp: 4.8, inp: 412, status: 'poor' },
    { url: '/cabins/portofino',   lcp: 3.2, inp: 248, status: 'needs' },
    { url: '/restaurant',         lcp: 2.9, inp: 218, status: 'needs' },
    { url: '/spa',                lcp: 2.6, inp: 196, status: 'good' },
    { url: '/contacts',           lcp: 2.4, inp: 162, status: 'good' },
  ],
  errors: [
    { kind: '404', count: 84, top: '/old-prices' },
    { kind: '500', count: 12, top: '/booking' },
    { kind: 'JS errors', count: 248, top: '/cabins/cyprus' },
    { kind: 'Broken links', count: 18, top: '/blog/wine-pairing' },
  ],
};

window.TRF = TRF;
window.TRF_T = TRF_T;
window.TRF_HELP = TRF_HELP;
