{"version":3,"sources":["jsdelivr-header.js","/gh/cohesivecc/ccc-tables@0.2.2/ccc-tables.js"],"names":[],"mappings":"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","file":"/gh/cohesivecc/ccc-tables@0.2.2/ccc-tables.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.48.0.\n * Original file: /gh/cohesivecc/ccc-tables@0.2.2/ccc-tables.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/*!\n * ccc-tables v0.2.2 — CMS-data-driven table renderer (Cohesive CCC starter)\n * https://github.com/cohesivecc/ccc-tables\n *\n * Renders semantic table markup from data blobs in the DOM:\n *   <script type=\"application/json\" data-ccc-table=\"slug\">…JSON or TSV…</script>\n *   <div ccc-table=\"slug\"></div>   ← mount point\n *\n * Split-field overlay (all optional, override the inline JSON when present):\n *   [data-ccc-table-caption=\"slug\"]                       plain-text caption\n *   [data-ccc-table-footnotes=\"slug\"]                     rich-text footnotes (HTML kept)\n *   <script type=\"application/json\"\n *           data-ccc-table-config=\"slug\">…JSON…</script>  config\n *\n * Data field accepts JSON ({…}) or TSV (an Excel/Sheets copy IS TSV — paste as-is).\n * Cell tokens: [check] [xmark] [dollar] ^N [link:url|label] [tip:text|body]\n */\n(function () {\n  'use strict';\n\n  var VERSION = '0.2.2';\n\n  function el(tag, cls, text) {\n    var n = document.createElement(tag);\n    if (cls) n.className = cls;\n    if (text != null) n.textContent = text;\n    return n;\n  }\n\n  /* Resolve colspan/rowspan into absolute grid columns (each cell gets data-col). */\n  function resolveGrid(rows) {\n    var carry = [];\n    return rows.map(function (row) {\n      var placed = [], col = 0;\n      (row.cells || []).forEach(function (c) {\n        while (carry[col] > 0) col++;\n        placed.push({ cell: c, col: col, span: c.colspan || 1 });\n        var rs = c.rowspan || 1;\n        for (var i = 0; i < (c.colspan || 1); i++) { if (rs > 1) carry[col + i] = rs; }\n        col += c.colspan || 1;\n      });\n      for (var k = 0; k < carry.length; k++) if (carry[k] > 0) carry[k]--;\n      return placed;\n    });\n  }\n\n  var SAFE_HREF = /^(https?:|tel:|mailto:|\\/|#)/i;\n\n  /* Escape, then expand the closed token vocabulary (D11) into markup. */\n  function fmt(t) {\n    return String(t == null ? '' : t)\n      .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/\"/g, '&quot;')\n      .replace(/\\n/g, '<br>')\n      .replace(/\\[(check|xmark|dollar)\\]/g, '<span class=\"ccc-ico is-$1\" aria-hidden=\"true\"></span>')\n      .replace(/\\[link:([^\\]|]+)\\|([^\\]]+)\\]/g, function (m, url, label) {\n        url = url.trim();\n        if (!SAFE_HREF.test(url)) return label;\n        return '<a class=\"ccc-table_link\" href=\"' + url + '\">' + label + '</a>';\n      })\n      .replace(/\\[tip:([^\\]|]+)\\|([^\\]]+)\\]/g,\n        '<span class=\"ccc-table_tip\" data-tippy-content=\"$2\" tabindex=\"0\">$1</span>')\n      .replace(/\\^(\\d+)/g, '<sup>$1</sup>');\n  }\n\n  /* TSV → {columns, rows}. First line = header row. A row whose first cell is\n     filled while every other cell is empty becomes a group row (disable with\n     config.tsvGroups === false). */\n  function parseTSV(text, opts) {\n    var lines = String(text).replace(/\\r\\n?/g, '\\n').split('\\n')\n      .filter(function (l) { return l.trim() !== ''; });\n    if (!lines.length) throw new Error('empty data');\n    var grid = lines.map(function (l) {\n      return l.split('\\t').map(function (c) { return c.trim(); });\n    });\n    var groups = !(opts && opts.tsvGroups === false);\n    var columns = grid[0].map(function (t) { return { text: t }; });\n    var colCount = columns.length;\n    var rows = grid.slice(1).map(function (cells) {\n      var isGroup = groups && colCount > 1 && cells[0] !== '' &&\n        cells.slice(1).every(function (c) { return c === ''; });\n      var row = { cells: (isGroup ? [cells[0]] : cells).map(function (t) { return { text: t }; }) };\n      if (isGroup) row.group = true;\n      return row;\n    });\n    return { columns: columns, rows: rows };\n  }\n\n  /* Data field sniff: '{' → JSON, anything else → TSV. Only the sniff is\n     trimmed — TSV keeps its leading tabs (an empty first header cell). */\n  function parseData(raw, opts) {\n    var t = String(raw == null ? '' : raw);\n    var sniff = t.trim();\n    if (!sniff) throw new Error('empty data');\n    if (sniff.charAt(0) === '{') return JSON.parse(sniff);\n    return parseTSV(t, opts);\n  }\n\n  function buildTable(data, mount) {\n    var cfg = data.config || {};\n    var outer = el('div', 'table_outer ccc-table');\n    var toolbar = el('div', 'ccc-table_toolbar');\n    var wrapper = el('div', 'table_wrapper ccc-table_scroll');\n    var table = el('table', 'table_component is-layout-auto');\n    if (cfg.stickyFirstCol) outer.setAttribute('ccc-sticky-first', '');\n    if (data.caption) table.appendChild(el('caption', 'ccc-table_caption', data.caption));\n    var headRows = data.headerRows || (data.columns ? [{ cells: data.columns.map(function (c) { var t = (c && typeof c === 'object') ? (c.text || '') : c; return { text: t, header: true, colspan: c && c.colspan }; }) }] : []);\n    var thead = el('thead', 'table_head');\n    resolveGrid(headRows).forEach(function (placed) {\n      var tr = el('tr', 'table_row');\n      placed.forEach(function (p) {\n        var th = el('th', 'table_header', p.cell.text);\n        th.setAttribute('scope', 'col');\n        if (p.cell.colspan) th.colSpan = p.cell.colspan;\n        if (p.cell.rowspan) th.rowSpan = p.cell.rowspan;\n        th.setAttribute('data-col', p.col);\n        if (p.col === 0) th.classList.add('is-row-header');\n        tr.appendChild(th);\n      });\n      thead.appendChild(tr);\n    });\n    table.appendChild(thead);\n    var tbody = el('tbody', 'table_body');\n    var groupIdx = 0;\n    resolveGrid(data.rows || []).forEach(function (placed, i) {\n      var row = (data.rows || [])[i];\n      var tr = el('tr', 'table_row');\n      if (row.group) {\n        tr.classList.add('is-legend-row', 'ccc-table_group-row');\n        var td = el('th', 'table_header is-row-header', '');\n        td.colSpan = 99;\n        td.setAttribute('scope', 'colgroup');\n        if (cfg.collapsibleGroups) {\n          var btn = el('button', 'ccc-table_group-toggle');\n          btn.type = 'button';\n          btn.setAttribute('aria-expanded', 'true');\n          var lbl = el('span');\n          lbl.innerHTML = fmt((row.cells[0] || {}).text || '');\n          btn.appendChild(lbl);\n          btn.appendChild(el('span', 'ccc-table_group-chevron', '▾'));\n          td.appendChild(btn);\n          groupIdx++;\n          tr.setAttribute('data-group', groupIdx);\n          btn.addEventListener('click', (function (g) {\n            return function (e) {\n              var open = e.currentTarget.getAttribute('aria-expanded') === 'true';\n              e.currentTarget.setAttribute('aria-expanded', String(!open));\n              tbody.querySelectorAll('[data-in-group=\"' + g + '\"]').forEach(function (r) { r.style.display = open ? 'none' : ''; });\n            };\n          })(groupIdx));\n        } else {\n          td.innerHTML = fmt((row.cells[0] || {}).text || '');\n        }\n        tr.appendChild(td);\n      } else {\n        placed.forEach(function (p) {\n          var isHead = p.cell.header || p.col === 0;\n          var cell = el(isHead ? 'th' : 'td', isHead ? 'table_header is-row-header' : 'table_cell', '');\n          if (isHead) cell.setAttribute('scope', 'row');\n          cell.innerHTML = fmt(p.cell.text);\n          if (p.cell.colspan) cell.colSpan = p.cell.colspan;\n          if (p.cell.rowspan) cell.rowSpan = p.cell.rowspan;\n          cell.setAttribute('data-col', p.col);\n          if (cfg.highlightCol != null && p.col === cfg.highlightCol) cell.classList.add('ccc-table_highlight');\n          tr.appendChild(cell);\n        });\n        if (groupIdx && cfg.collapsibleGroups) tr.setAttribute('data-in-group', groupIdx);\n      }\n      tbody.appendChild(tr);\n    });\n    table.appendChild(tbody);\n    var hasBodySpans = (data.rows || []).some(function (r) {\n      return !r.group && (r.cells || []).some(function (c) { return (c.colspan || 1) > 1 || (c.rowspan || 1) > 1; });\n    });\n    var lastHead = resolveGrid(headRows)[headRows.length - 1] || [];\n    var colCount = lastHead.reduce(function (m, p) { return Math.max(m, p.col + p.span); }, 0);\n    if (cfg.mobileSwitcher && !hasBodySpans && colCount > 2) {\n      var setCol = function (col) {\n        table.querySelectorAll('th[data-col], td[data-col]').forEach(function (c) {\n          var cc = c.getAttribute('data-col');\n          if (cc === '0') return;\n          if (cc === String(col)) c.removeAttribute('data-ccc-colhide');\n          else c.setAttribute('data-ccc-colhide', '');\n        });\n        outer.setAttribute('ccc-show-col', col);\n      };\n      var chips = el('div', 'ccc-table_chips');\n      lastHead.forEach(function (p) {\n        if (p.col === 0) return;\n        var chip = el('button', 'ccc-table_chip', p.cell.text);\n        chip.type = 'button';\n        chip.setAttribute('data-col', p.col);\n        chip.addEventListener('click', function () {\n          chips.querySelectorAll('.ccc-table_chip').forEach(function (c) { c.classList.remove('is-active'); });\n          chip.classList.add('is-active');\n          setCol(p.col);\n        });\n        chips.appendChild(chip);\n      });\n      toolbar.appendChild(chips);\n      var first = chips.querySelector('.ccc-table_chip');\n      if (first) { first.classList.add('is-active'); setCol(first.getAttribute('data-col')); }\n      outer.setAttribute('ccc-mobile-switcher', '');\n    }\n    wrapper.appendChild(table);\n    if (toolbar.childNodes.length) outer.appendChild(toolbar);\n    outer.appendChild(wrapper);\n    if (data.footnotesHTML) {\n      var fnr = el('div', 'ccc-table_footnotes');\n      fnr.innerHTML = data.footnotesHTML;\n      outer.appendChild(fnr);\n    } else if (data.footnotes && data.footnotes.length) {\n      var fn = el('div', 'ccc-table_footnotes');\n      data.footnotes.forEach(function (f) { var p = el('p'); p.innerHTML = fmt(f); fn.appendChild(p); });\n      outer.appendChild(fn);\n    }\n    mount.innerHTML = '';\n    mount.appendChild(outer);\n  }\n\n  /* Merge the split-field carriers over the parsed Data blob (split fields win). */\n  function overlay(data, extras) {\n    if (extras.caption != null && extras.caption !== '') data.caption = extras.caption;\n    if (extras.footnotesHTML) data.footnotesHTML = extras.footnotesHTML;\n    if (extras.config) data.config = extras.config;\n    return data;\n  }\n\n  function collect(root) {\n    var blobs = {};\n    root.querySelectorAll('script[type=\"application/json\"][data-ccc-table]').forEach(function (s) {\n      var k = s.getAttribute('data-ccc-table');\n      blobs[k] = (blobs[k] || '') + s.textContent;\n    });\n    return blobs;\n  }\n\n  function extrasFor(root, slug) {\n    var out = {};\n    var cap = root.querySelector('[data-ccc-table-caption=\"' + slug + '\"]');\n    if (cap) out.caption = cap.textContent.trim();\n    var fns = root.querySelector('[data-ccc-table-footnotes=\"' + slug + '\"]');\n    if (fns && fns.innerHTML.trim()) out.footnotesHTML = fns.innerHTML;\n    var cfg = root.querySelector('script[type=\"application/json\"][data-ccc-table-config=\"' + slug + '\"]');\n    var cfgText = cfg ? cfg.textContent.trim() : '';\n    if (cfgText) {\n      try { out.config = JSON.parse(cfgText); }\n      catch (e) { out.configError = 'bad config JSON — ' + e.message; }\n    }\n    return out;\n  }\n\n  function fail(mount, slug, msg) {\n    mount.innerHTML = '<div class=\"ccc-table_error\">ccc-tables: ' +\n      String(msg).replace(/</g, '&lt;') + ' (“' + slug + '”)</div>';\n  }\n\n  function init() {\n    var blobs = collect(document);\n    document.querySelectorAll('[ccc-table]').forEach(function (mount) {\n      var slug = mount.getAttribute('ccc-table');\n      var raw = blobs[slug];\n      if (!raw) { fail(mount, slug, 'no data found'); return; }\n      var extras = extrasFor(document, slug);\n      if (extras.configError) { fail(mount, slug, extras.configError); return; }\n      try {\n        var data = overlay(parseData(raw, extras.config), extras);\n        buildTable(data, mount);\n      } catch (e) {\n        fail(mount, slug, 'could not parse — ' + e.message);\n      }\n      /* Late tippy hookup for [tip:] tokens rendered after the site's tippy init. */\n      if (window.tippy) {\n        var fresh = [].filter.call(mount.querySelectorAll('[data-tippy-content]'),\n          function (n) { return !n._tippy; });\n        if (fresh.length) window.tippy(fresh, { theme: 'ccc' });\n      }\n    });\n  }\n\n  var api = {\n    version: VERSION,\n    init: init,\n    parseData: parseData,\n    parseTSV: parseTSV,\n    resolveGrid: resolveGrid,\n    fmt: fmt,\n    buildTable: buildTable,\n    overlay: overlay\n  };\n\n  if (typeof module !== 'undefined' && module.exports) {\n    module.exports = api;                       /* Node (tests, builder tooling) */\n  }\n  if (typeof window !== 'undefined') {\n    window.cccTables = api;                     /* browser (builder preview reuse) */\n    if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', init);\n    else init();\n  }\n})();\n"]}