// CollectionPage — sub-view of La Biblioteca for non-canonical CORPUS items.
//
// Entry points:
//   • Sidebar CORPUS item click (non-canonical only)
//   • "→ N documents" link on a rail head
//
// Shows:
//   • Breadcrumb back to Biblioteca
//   • Editorial hero (collection name, sub, stat strip, "Open deeper article" CTA)
//   • Filter/sort toolbar scoped to this collection
//   • Full grid of documents in this collection
//   • Related collections cross-links at the bottom
//
// Does NOT render its own sidebar/topbar — embedded inside the main shell.

function CollectionPage({
  traditionKey,
  onBack,
  onOpenDoc,
  onCommissionBook,
  onOpenArticle,          // opens the editorial drawer
  onOpenRelated,          // (key) => navigate to another collection
  signedIn,
  onOpenLanguageModal,
  onOpenSignIn,
  onOpenUserMenu,
  userMenuOpen,
  onCloseUserMenu,
  onSignOut
}) {
  const I = window.useI18n();
  const { TRADITIONS, DOCS } = window.LIBRARY_DATA;
  const t = TRADITIONS.find(x => x.key === traditionKey);
  if (!t) return null;

  const meta = COLLECTION_META[traditionKey] || {};
  const docs = DOCS.filter(d => d.tradition === traditionKey);

  const [sort, setSort] = React.useState('default');
  const [eraFilter, setEraFilter] = React.useState(null);
  const [langFilter, setLangFilter] = React.useState(null);
  const [tierFilter, setTierFilter] = React.useState(null);
  const [view, setView] = React.useState('grid');

  // Does this collection have author bios to surface? (patristic, parabiblical)
  const AUTHORS = (window.LIBRARY_V2 && window.LIBRARY_V2.AUTHORS) || [];
  const hasAuthors = AUTHORS.some(a => (a.works || []).some(w => w.tradition === traditionKey));

  // Language list present in this collection (derived)
  const langs = Array.from(new Set(docs.flatMap(d => d.langs || []))).slice(0, 8);

  // Eras: buckets defined per collection in COLLECTION_META.eras
  const eras = meta.eras || [];

  const filtered = docs.filter(d => {
    if (langFilter && !(d.langs || []).includes(langFilter)) return false;
    if (tierFilter && d.tier !== tierFilter) return false;
    if (eraFilter) {
      const era = eras.find(e => e.key === eraFilter);
      if (era && era.match) {
        if (!era.match(d)) return false;
      }
    }
    return true;
  });

  const sorted = [...filtered].sort((a, b) => {
    if (sort === 'title') return (a.title || '').localeCompare(b.title || '');
    if (sort === 'words') {
      const pa = parseWords(a.words); const pb = parseWords(b.words);
      return pb - pa;
    }
    if (sort === 'tier') return (a.tier || '').localeCompare(b.tier || '');
    return 0;
  });

  // Stat strip
  const totalWords = docs.reduce((s, d) => s + parseWords(d.words), 0);
  const languagesCount = langs.length;
  const completedCount = docs.filter(d => d.tier === 'Complete' || d.tier === 'Canonical').length;

  const stats = meta.stats || [
    { label: 'Documents',           value: docs.length.toLocaleString() },
    { label: 'Total words',         value: fmtWords(totalWords) },
    { label: 'Languages attested',  value: languagesCount },
    { label: 'Fully translated',    value: completedCount + '/' + docs.length },
  ];

  const ACCENT = ({
    patristic:    '#b8443a',
    parabiblical: '#8b6d9e',
    qumran:       '#8a7b58',
    vernacular:   '#26828F',
    greek:        '#5b7aa8',
    hebrew:       '#7a9579',
    latin:        '#d4a24c'
  })[traditionKey] || '#26828F';

  return React.createElement('div', { className:'amos-main' },
    // ── Topbar ────────────────────────────────
    React.createElement('div', { className:'amos-topbar' },
      React.createElement('button', {
        className: 'amos-sidebar-toggle',
        onClick: () => window.dispatchEvent(new CustomEvent('amos:toggle-sidebar')),
        title: 'Toggle sidebar  ([)',
        'aria-label': 'Toggle sidebar'
      },
        React.createElement('svg', { width:16, height:16, viewBox:'0 0 24 24', fill:'none', stroke:'currentColor', strokeWidth:'2', strokeLinecap:'round', strokeLinejoin:'round' },
          React.createElement('rect', { x:'3', y:'4', width:'18', height:'16', rx:'2' }),
          React.createElement('line', { x1:'9', y1:'4', x2:'9', y2:'20' })
        )
      ),
      React.createElement('div', { className:'amos-crumbs' },
        React.createElement('span', null, 'The Amos Project'),
        React.createElement('span', { className:'sep' }, '›'),
        React.createElement('a', { className:'crumb-link', onClick: onBack }, I.t('crumbs.library')),
        React.createElement('span', { className:'sep' }, '›'),
        React.createElement('span', { className:'here' }, meta.name || t.name)
      ),
      React.createElement('div', { className:'amos-topbar-right' },
        React.createElement('button', { className:'amos-icon-btn', title:'Filters' }, window.I.sliders(16)),
        window.NotificationsBell ? React.createElement(window.NotificationsBell, null) : React.createElement('button', { className:'amos-icon-btn', title:'Notifications' }, window.I.bell(16)),
        window.WalletChip && React.createElement(window.WalletChip, null),
        React.createElement('div', { className:'amos-sc-pair' },
          React.createElement(window.CiteButton, { compact:true, refFor: () => ({
            kind:'collection',
            title: (meta.name || t.name) + ' — collection',
            subtitle: meta.sub || t.sub,
            edition: 'The Amos Project, editorial catalog',
            editor: 'World Mission Media editorial team',
            year: 2026,
            url: 'https://worldmission.media/collection/' + traditionKey,
            description: meta.tagline || '',
            collectionKey: traditionKey
          }) }),
          React.createElement(window.ShareButton, { compact:true, refFor: () => ({
            kind:'collection',
            title: meta.name || t.name,
            subtitle: meta.tagline || meta.sub || '',
            edition: 'The Amos Project',
            editor: 'World Mission Media',
            year: 2026,
            url: 'https://worldmission.media/collection/' + traditionKey,
            description: meta.sub || t.sub || '',
            collectionKey: traditionKey
          }) })
        ),
        React.createElement('button', {
          className:'amos-pill lang',
          onClick: onOpenLanguageModal,
          title: I.getLangObj().native
        },
          React.createElement('span', { className:'code' }, I.getLang()),
          React.createElement('span', { className:'chev' }, window.I.chevronDown(14))
        ),
        React.createElement('span', { className:'topbar-sep' }),
        signedIn
          ? React.createElement('div', { className:'amos-userpill-wrap' },
              React.createElement('button', {
                className:'amos-pill avatar',
                onClick: onOpenUserMenu
              },
                React.createElement('span', { className:'av' }, 'JR'),
                React.createElement('span', { className:'chev' }, window.I.chevronDown(14))
              ),
              React.createElement(window.UserMenu, {
                open: !!userMenuOpen,
                onClose: onCloseUserMenu,
                onSignOut
              })
            )
          : React.createElement('button', {
              className:'amos-pill signin',
              onClick: onOpenSignIn
            }, I.t('topbar.sign_in'))
      )
    ),

    // ── Editorial Hero ───────────────────────
    React.createElement('section', {
      className:'coll-hero',
      style: { '--coll-accent': ACCENT }
    },
      React.createElement('div', { className:'coll-hero-top' },
        React.createElement('div', { className:'coll-hero-tag' },
          React.createElement('span', { className:'num' }, t.tag),
          React.createElement('span', null, 'COLLECTION'),
          meta.subtype && React.createElement('span', { className:'dot' }),
          meta.subtype && React.createElement('span', { className:'coll-subtype' }, meta.subtype)
        ),
        React.createElement('button', {
          className:'coll-article-cta',
          onClick: () => onOpenArticle && onOpenArticle(traditionKey)
        },
          window.I.book ? window.I.book(14) : null,
          React.createElement('span', null, 'Open editorial article'),
          window.I.arrowRight(13)
        )
      ),
      React.createElement('h1', { className:'coll-hero-title' }, meta.name || t.name),
      meta.tagline && React.createElement('div', { className:'coll-hero-tagline' }, meta.tagline),
      React.createElement('p', { className:'coll-hero-sub' }, meta.sub || t.sub),

      // Stat strip
      React.createElement('div', { className:'coll-stats' },
        stats.map((s, i) => React.createElement('div', { key: i, className:'coll-stat' },
          React.createElement('div', { className:'coll-stat-val' }, s.value),
          React.createElement('div', { className:'coll-stat-lbl' }, s.label)
        ))
      ),

      // Editorial bullets
      meta.editorial && React.createElement('div', { className:'coll-editorial' },
        meta.editorial.map((line, i) => React.createElement('div', { key:i, className:'coll-ed-line' },
          React.createElement('span', { className:'coll-ed-mark' }, '§'),
          React.createElement('span', null, line)
        ))
      )
    ),

    // ── Toolbar ──────────────────────────────
    React.createElement('div', { className:'amos-toolbar coll-toolbar' },
      // Era chips (if defined)
      eras.length > 0 && React.createElement(React.Fragment, null,
        React.createElement('button', {
          className:'amos-chip ' + (!eraFilter ? 'on' : ''),
          onClick: () => setEraFilter(null)
        }, 'All eras'),
        ...eras.map(e => React.createElement('button', {
          key: e.key,
          className:'amos-chip ' + (eraFilter === e.key ? 'on' : ''),
          onClick: () => setEraFilter(eraFilter === e.key ? null : e.key)
        }, e.label)),
        React.createElement('div', { className:'amos-divider-v' })
      ),

      React.createElement('button', { className:'amos-chip' },
        window.I.filter(13),
        'Language · ', langFilter || 'Any',
        window.I.chevronDown(13)
      ),
      React.createElement('button', { className:'amos-chip' },
        window.I.filter(13),
        'Completeness · ', tierFilter || 'Any',
        window.I.chevronDown(13)
      ),
      React.createElement('button', { className:'amos-sort' },
        window.I.sort(13),
        ({default:'Editorial order', title:'A → Z', words:'Longest first', tier:'Completeness'})[sort]
      ),
      React.createElement('div', { className:'amos-view-switch' },
        React.createElement('button', { className: view==='grid'?'on':'', onClick:()=>setView('grid'), title:'Grid' }, window.I.grid(14)),
        hasAuthors && React.createElement('button', { className: view==='authors'?'on':'', onClick:()=>setView('authors'), title:'Authors & bios' }, window.I.users ? window.I.users(14) : window.I.layers(14)),
        React.createElement('button', { className: view==='list'?'on':'', onClick:()=>setView('list'), title:'List' }, window.I.list(14))
      )
    ),

    // ── Body — authors view (collections that have author bios) ────
    view === 'authors' && window.AuthorsView && React.createElement('section', { className:'coll-body coll-body-authors' },
      React.createElement('div', { className:'coll-body-head' },
        React.createElement('span', null, 'Writers in this collection')
      ),
      React.createElement(window.AuthorsView, { onOpenDoc, filterTrad: traditionKey })
    ),

    // ── Body — doc grid/list ─────────────────
    view !== 'authors' && React.createElement('section', { className:'coll-body' },
      React.createElement('div', { className:'coll-body-head' },
        React.createElement('span', null, sorted.length, ' of ', docs.length, ' documents'),
        (langFilter || tierFilter || eraFilter) && React.createElement('button', {
          className:'coll-clear',
          onClick: () => { setLangFilter(null); setTierFilter(null); setEraFilter(null); }
        }, 'Clear filters')
      ),

      view === 'grid' ?
        React.createElement('div', { className:'amos-grid' },
          sorted.map(d => React.createElement(window.DocCardV2, {
            key: d.id, d, onOpen: onOpenDoc,
            seals: window.getSealsFor(d),
            onCommissionBook
          }))
        ) :
        React.createElement('div', { className:'amos-list' },
          React.createElement('div', { className:'amos-list-head' },
            React.createElement('div', null, ''),
            React.createElement('div', null, 'Title'),
            React.createElement('div', null, 'Collection'),
            React.createElement('div', { style:{textAlign:'right'} }, 'Words'),
            React.createElement('div', null, 'Languages'),
            React.createElement('div', null, 'Seals'),
            React.createElement('div', null, '')
          ),
          sorted.map(d => React.createElement(window.DocListRowV2, {
            key: d.id, d, onOpen: onOpenDoc,
            seals: window.getSealsFor(d),
            onCommissionBook
          }))
        )
    ),

    // ── Related collections ──────────────────
    meta.related && meta.related.length > 0 && React.createElement('section', { className:'coll-related' },
      React.createElement('div', { className:'coll-related-head' }, 'Related collections'),
      React.createElement('div', { className:'coll-related-grid' },
        meta.related.map(rk => {
          const rt = TRADITIONS.find(x => x.key === rk);
          if (!rt) return null;
          const rmeta = COLLECTION_META[rk] || {};
          return React.createElement('a', {
            key: rk,
            className:'coll-related-card',
            onClick: () => onOpenRelated && onOpenRelated(rk)
          },
            React.createElement('div', { className:'coll-rel-tag trad-' + rt.class + '-bg' }, rt.tag),
            React.createElement('div', { className:'coll-rel-name' }, rmeta.name || rt.name),
            React.createElement('div', { className:'coll-rel-sub' }, rmeta.tagline || rt.sub),
            React.createElement('div', { className:'coll-rel-count' }, rt.docs + ' documents', window.I.arrowRight(12))
          );
        })
      )
    ),
    React.createElement(window.Footer, null)
  );
}

// ──────────────────────────────────────────────
// Helpers
// ──────────────────────────────────────────────
function parseWords(w) {
  if (!w) return 0;
  const s = String(w).toUpperCase();
  const n = parseFloat(s);
  if (isNaN(n)) return 0;
  if (s.includes('M')) return n * 1e6;
  if (s.includes('K')) return n * 1e3;
  return n;
}
function fmtWords(n) {
  if (n >= 1e6) return (n / 1e6).toFixed(2).replace(/\.00$/, '') + 'M';
  if (n >= 1e3) return (n / 1e3).toFixed(0) + 'K';
  return String(n);
}

// ──────────────────────────────────────────────
// Editorial metadata per collection
// ──────────────────────────────────────────────
const COLLECTION_META = {
  patristic: {
    name: 'Pre-Nicene Fathers',
    subtype: 'Editorially curated',
    tagline: 'The generation that hands the apostolic deposit on.',
    sub: 'Irenaeus, Clement, Origen, Tertullian, Justin, and the anonymous tradition — writings from the first three centuries of the Church, before the imperial councils fix the language of orthodoxy. Here we read what the deposit looks like while it is still being handed.',
    editorial: [
      'Scope runs from the Didache and 1 Clement through Cyprian and the Alexandrian catechesis — roughly AD 80 to AD 260.',
      'Each document is tagged for pericope citation: when Origen quotes Romans 8, it surfaces on the coverage map as a witness node.',
      'Translations are aligned to the Greek or Latin critical base text; apparatus variants are carried through.'
    ],
    stats: [
      { label: 'Documents',        value: '424' },
      { label: 'Corpus words',     value: '4.47M' },
      { label: 'Languages',        value: '9' },
      { label: 'NT citations indexed', value: '11,840' },
    ],
    eras: [
      { key:'apostolic',  label:'Apostolic Fathers (c. 80–150)',   match: () => true },
      { key:'apologists', label:'Apologists (c. 140–200)',          match: () => true },
      { key:'alexandrian',label:'Alexandrian school',               match: () => true },
      { key:'latin',      label:'Latin tradition',                  match: () => true },
      { key:'anon',       label:'Anonymous & fragments',            match: () => true },
    ],
    related: ['parabiblical', 'greek', 'qumran']
  },

  parabiblical: {
    name: 'Preterocanonical Library',
    subtype: 'Editorially framed',
    tagline: 'What the canon grew up alongside.',
    sub: 'Enoch, Jubilees, the Testaments of the Twelve, the Odes of Solomon, 4 Ezra, the Nag Hammadi cache — writings the canon never absorbed but never stopped talking to. Preterocanonical because they are prior and adjacent, not apocryphal in the polemical sense.',
    editorial: [
      'We prefer "preterocanonical" to "pseudepigrapha" — the latter prejudges authorship; the former just marks the textual neighborhood.',
      'Every document carries a canon-adjacency note: what Jude quotes, what Barnabas reads as scripture, what Athanasius singles out to exclude.',
      'Where a work survives in multiple recensions (Enoch in Ge\u02bdez, Greek, Aramaic) we present them as aligned witnesses, not rival texts.'
    ],
    stats: [
      { label: 'Documents',            value: '89'   },
      { label: 'Corpus words',         value: '533K' },
      { label: 'Recension witnesses',  value: '214'  },
      { label: 'Canon-adjacency notes', value: '340' },
    ],
    eras: [
      { key:'second-temple', label:'Second Temple (c. 300 BC–AD 70)', match: () => true },
      { key:'tannaitic',     label:'Tannaitic penumbra',               match: () => true },
      { key:'nag-hammadi',   label:'Nag Hammadi cache',                match: () => true },
      { key:'fragments',     label:'Fragments & testimonia',           match: () => true },
    ],
    related: ['qumran', 'patristic', 'hebrew']
  },

  qumran: {
    name: 'Zadokite Settlement · Dead Sea Scrolls',
    subtype: 'Site-specific corpus',
    tagline: 'Sectarian writings from the caves above Khirbet Qumran.',
    sub: 'Community Rule, War Scroll, Damascus Document, Hodayot, Pesharim, and the variant scripture copies — a single library from a single settlement, read as one theological voice rather than as a miscellany.',
    editorial: [
      'Cave-by-cave organization rather than the traditional DJD volume sequence.',
      'Biblical and sectarian manuscripts are distinguished but cross-linked: 1QIsaᵃ sits beside the Community Rule because both came from Cave 1.',
      'Paleographic dating and scribal-hand attribution are shown as editorial metadata, not as textual fact.'
    ],
    stats: [
      { label: 'Manuscripts',         value: '981' },
      { label: 'Sectarian compositions', value: '34' },
      { label: 'Biblical witnesses',  value: '219' },
      { label: 'Caves represented',   value: '11' },
    ],
    eras: [
      { key:'foundation', label:'Foundation-era (c. 150 BC)',  match: () => true },
      { key:'hasmonean',  label:'Hasmonean redaction',         match: () => true },
      { key:'herodian',   label:'Herodian hands',              match: () => true },
      { key:'biblical',   label:'Biblical witnesses only',     match: () => true },
      { key:'sectarian',  label:'Sectarian compositions only', match: () => true },
    ],
    related: ['parabiblical', 'hebrew', 'patristic']
  },

  greek: {
    name: 'Greek New Testament',
    subtype: 'Critical base text',
    tagline: 'The text the Church received, under continuous editorial scrutiny.',
    sub: 'The Nestle-Aland/UBS line, the Tyndale House GNT, the SBLGNT, and the Byzantine majority tradition — four critical editions, one apparatus surface, read against the Peshitta and the Old Latin. The Greek is not a relic here; it is the working text from which every translation downstream is held accountable.',
    editorial: [
      'Four editions run in parallel columns when the verse differs: NA28, THGNT, SBLGNT, and the Robinson-Pierpont Byzantine — so the reader sees the editorial disagreement, not a flattened consensus.',
      'The apparatus is first-class content, not a footnote: every reading we print is cross-linked to the manuscripts that witness it (𝔓⁴⁶, א, B, D, the minuscule family 1739) with paleographic dates.',
      'Peshitta and Old Latin are carried as ancient-version witnesses in the same reader, not siloed into the Septuagint & Vulgate collection — the NT reader needs its own non-Greek witnesses at hand.',
      'Morphological tagging (MorphGNT, SBLGNT tags) is editable: a reader who disagrees with a parse can annotate and publish the counter-parse.',
    ],
    stats: [
      { label: 'Documents',              value: '139' },
      { label: 'Corpus words',           value: '6.80M' },
      { label: 'Editions in parallel',   value: '4' },
      { label: 'Manuscripts indexed',    value: '5,800+' },
    ],
    eras: [
      { key:'gospels',     label:'Gospels',               match: () => true },
      { key:'acts',        label:'Acts',                  match: () => true },
      { key:'pauline',     label:'Pauline corpus',        match: () => true },
      { key:'catholic',    label:'Catholic epistles',     match: () => true },
      { key:'revelation',  label:'Revelation',            match: () => true },
      { key:'apparatus',   label:'Apparatus only',        match: () => true },
    ],
    related: ['hebrew', 'latin', 'patristic']
  },

  hebrew: {
    name: 'Hebrew Scriptures',
    subtype: 'Masoretic base with Aramaic witnesses',
    tagline: 'The Tanakh as the Masoretes handed it, with the Targums reading over its shoulder.',
    sub: 'The Westminster Leningrad Codex (1008 CE) as the base text, BHSA for linguistic annotation, the Translators Amalgamated Hebrew OT (TAHOT) for composite readings, and the Targums — Onkelos, Jonathan, Neofiti, Pseudo-Jonathan — as the Aramaic reception already at work inside the Hebrew manuscript tradition.',
    editorial: [
      'Codex Leningradensis (B19ᴬ) is the base witness — not because it is the oldest complete codex (it is) but because its vocalization and accentuation are fully preserved and machine-readable.',
      'Targums are not treated as translations but as Aramaic reception-texts: the reader sees the Hebrew verse, the Aramaic rendering, and the interpretive move the Targum is making — in the same line.',
      'DSS variants (1QIsaᵃ, the Cave 4 Samuel scrolls) live in the Qumran collection but surface here as apparatus glosses wherever they diverge from the MT.',
      'Kethiv/qere readings and Masoretic marginalia (sevirin, the puncta extraordinaria) are carried as editorial content, not suppressed into a footnote.',
    ],
    stats: [
      { label: 'Documents',                value: '92' },
      { label: 'Corpus words',             value: '5.94M' },
      { label: 'Masoretic accents tagged', value: '100%' },
      { label: 'Targumic witnesses',       value: '12' },
    ],
    eras: [
      { key:'torah',       label:'Torah',              match: () => true },
      { key:'neviim',      label:'Nevi\u02beim',        match: () => true },
      { key:'ketuvim',     label:'Ketuvim',            match: () => true },
      { key:'targum',      label:'Targumic',           match: () => true },
      { key:'masora',      label:'Masoretic apparatus', match: () => true },
    ],
    related: ['latin', 'qumran', 'greek']
  },

  latin: {
    name: 'Septuagint, Vulgate & Ancient Versions',
    subtype: 'Ancient translation corpus',
    tagline: 'The versions the early Church actually read.',
    sub: 'The Septuagint (Rahlfs-Hanhart and the Göttingen critical volumes), Jerome\u2019s Vulgate against the Vetus Latina, the Peshitta, and the Coptic versions — the ancient translations that carried the biblical text into the Mediterranean world. Not a back-translation aid: a primary witness corpus with its own textual history and its own quotational afterlife in the Fathers.',
    editorial: [
      'The LXX is not one text. We present the Göttingen critical editions where they exist (Genesis, Isaiah, the Twelve), Rahlfs-Hanhart elsewhere — and we mark the boundary: readers see which verses rest on a fully critical apparatus and which on a handbook edition.',
      'Vulgate and Vetus Latina run as a paired rail. Jerome\u2019s iuxta Hebraeos Psalter and iuxta Septuaginta Psalter are both preserved; the Gallican Psalter (which the liturgical tradition inherited) is marked as such.',
      'Peshitta OT is treated as a translation from Hebrew with Targumic influence, not a daughter of the LXX — a contested claim that the editorial apparatus documents rather than assumes.',
      'Every ancient-version reading is cross-linked to its patristic citations: when Origen in the Hexapla or Jerome in a letter quotes a variant, the variant surfaces as an apparatus witness.',
    ],
    stats: [
      { label: 'Documents',                value: '254' },
      { label: 'Corpus words',             value: '8.57M' },
      { label: 'Ancient versions',         value: '6' },
      { label: 'Göttingen volumes online', value: '19/24' },
    ],
    eras: [
      { key:'lxx',      label:'Septuagint (LXX)',        match: () => true },
      { key:'vulgate',  label:'Vulgate',                 match: () => true },
      { key:'vetus',    label:'Vetus Latina',            match: () => true },
      { key:'peshitta', label:'Peshitta',                match: () => true },
      { key:'coptic',   label:'Coptic versions',         match: () => true },
      { key:'hexapla',  label:'Hexaplaric fragments',    match: () => true },
    ],
    related: ['greek', 'hebrew', 'patristic']
  },

  vernacular: {
    name: 'Vernacular Reference Bibles',
    subtype: 'Reference corpus',
    tagline: 'Modern translations for cross-reference.',
    sub: 'Not a source corpus — a reading corpus. English, Spanish, Catalan, Portuguese and others, kept current and aligned to the critical editions so a reader can move between a pericope in the Greek NT rail and its rendering in twelve living languages without losing the verse count.',
    editorial: [
      'Included for cross-reference only; these translations are not cited as witnesses to the text.',
      'Each translation is paired with its base text (NA28, BHS, UBS) and its translation philosophy in one sentence.',
      'License status is always visible: what we can reproduce inline vs. what links to the publisher.'
    ],
    stats: [
      { label: 'Translations',       value: '76'  },
      { label: 'Languages',          value: '34'  },
      { label: 'Pericope coverage',  value: '100%' },
      { label: 'Licensed for inline', value: '42/76' },
    ],
    eras: [
      { key:'english',  label:'English',        match: () => true },
      { key:'romance',  label:'Romance family', match: () => true },
      { key:'germanic', label:'Germanic family', match: () => true },
      { key:'other',    label:'Other',           match: () => true },
    ],
    related: ['greek', 'hebrew', 'latin']
  }
};

Object.assign(window, { CollectionPage, COLLECTION_META });
