// News + Publications + Projects sections.
// Papers and projects render as clickable cards.

function SecHead({ title, count }) {
  return (
    <div className="sec-head">
      <span className="title">{title}</span>
      <span className="rule" />
    </div>);

}

/* ---------- News ---------- */

const NEWS = [
{ when: "May 2026", body: <span>Started a 6-month student researcher position at <em>Google DeepMind</em> in London. 🇬🇧</span> },
{ when: "Apr 2026", body: <span>Our paper <a href="https://openreview.net/forum?id=fSwMCsBtTG" target="_blank" rel="noopener"><em>TOAST: Transformer Optimization using Adaptive and Simple Transformations</em></a> has been accepted at <em>TMLR</em>. 🎉</span> },
{ when: "Mar 2026", body: <span>Our paper <a href="https://openreview.net/forum?id=0fttB7cUsu" target="_blank" rel="noopener"><em>Test-Time Training Undermines Safety Guardrails</em></a> has been accepted as an <em>oral</em> at the Trustworthy AI workshop @ ICLR 2026. 🇧🇷</span> },
{ when: "Feb 2026", body: <span>Our paper <a href="https://openreview.net/forum?id=mXuUomGc0I" target="_blank" rel="noopener"><em>CATS: Conformalized Adaptive Test-Time Scaling</em></a> has been accepted as an <em>oral</em> at the CAO workshop @ ICLR 2026. 🇧🇷</span> },
{ when: "Nov 2025", body: <span>Nominated <a href="https://logconference.org/awards/" target="_blank" rel="noopener"><b>best reviewer</b></a> at the Learning on Graphs (LoG) 2025 conference. 🎉</span> },
{ when: "Oct 2025", body: <span>Started a 2-month visit to the CaRAML group in Cambridge, hosted by Pietro Liò. 🇬🇧</span> },
{ when: "Jul 2025", body: <span>Our paper <a href="https://openreview.net/forum?id=tNyApIqDSJ" target="_blank" rel="noopener"><em>Node-Level Data Valuation on Graphs</em></a> has been accepted at <em>TMLR</em>. 🎉</span> },
{ when: "Oct 2024", body: <span>Our paper <a href="https://openreview.net/forum?id=tNyApIqDSJ" target="_blank" rel="noopener"><em>Node-Level Data Valuation on Graphs</em></a> has been accepted at the 2nd Workshop on Attributing Model Behavior at Scale (ATTRIB @ NeurIPS). 🇨🇦</span> },
{ when: "Oct 2024", body: <span>Started a 3-month internship at Amboss Tech. 👨‍💻🇺🇸</span> },
{ when: "Aug 2024", body: <span>Awarded <a href="https://ellis.eu/news/over-100-phd-students-from-across-europe-gather-in-paris-for-this-year-s-ellis-doctoral-symposium" target="_blank" rel="noopener"><b>best poster</b></a> at EDS for our paper <a href="https://openreview.net/forum?id=tNyApIqDSJ" target="_blank" rel="noopener"><em>Node-Level Data Valuation on Graphs</em></a>. 🎉</span> },
{ when: "Apr 2023", body: <span>Our paper <a href="https://proceedings.mlr.press/v202/h-zargarbashi23a.html" target="_blank" rel="noopener"><em>Conformal Prediction Sets for Graph Neural Networks</em></a> has been accepted at <em>ICML</em>. 🌺</span> },
{ when: "Mar 2023", body: <span>Selected as <b>outstanding graduate student</b> for a.y. 2020/2021. 🎉</span> },
{ when: "Dec 2022", body: <span>Our paper <a href="https://proceedings.mlr.press/v198/crisostomi22a.html" target="_blank" rel="noopener"><em>Metric Based Few-Shot Graph Classification</em></a> has been accepted at the Learning on Graphs (LoG) conference.</span> },
{ when: "Nov 2022", body: <span>Started my Ph.D. at CISPA, joining Aleksandar Bojchevski’s group. 🇩🇪</span> }];


function News() {
  const [expanded, setExpanded] = React.useState(false);
  const initial = 5;
  const visible = expanded ? NEWS : NEWS.slice(0, initial);
  const hidden = NEWS.length - initial;
  return (
    <section className="section" id="news" data-screen-label="news">
      <SecHead title="News" count={NEWS.length} />
      <div className="news-rows">
        {visible.map((n, i) =>
        <div className="news-row" key={i}>
            <div className="when">{n.when}</div>
            <div className="body">{n.body}</div>
          </div>
        )}
      </div>
      {hidden > 0 &&
      <button
        type="button"
        className="show-more"
        onClick={() => setExpanded((v) => !v)}>
        
          {expanded ?
        <span>Show less <span className="chev">↑</span></span> :
        <span>Show {hidden} more <span className="chev">↓</span></span>}
        </button>
      }
    </section>);

}

/* ---------- Thumbs (decorative SVG headers for cards) ---------- */

function ThumbHatch({ angle = 30, color = "indianred", density = 8 }) {
  const stripes = [];
  for (let i = -10; i < 30; i++) {
    stripes.push(<line key={i} x1={i * density} y1="-20" x2={i * density - 60} y2="160" stroke={color} strokeWidth="0.8" opacity="0.18" />);
  }
  return (
    <svg className="thumb-decor" viewBox="0 0 200 140" preserveAspectRatio="xMidYMid slice">
      <g style={{ transform: `rotate(${angle}deg)`, transformOrigin: "center" }}>{stripes}</g>
    </svg>);

}

function ThumbDots({ rows = 7, cols = 14, hl = [] }) {
  const out = [];
  for (let r = 0; r < rows; r++) {
    for (let c = 0; c < cols; c++) {
      const isHl = hl.some(([rr, cc]) => rr === r && cc === c);
      out.push(
        <circle
          key={r + "_" + c}
          cx={14 + c * 13}
          cy={16 + r * 16}
          r={isHl ? 2.2 : 1.4}
          fill={isHl ? "var(--accent)" : "#bdbdbd"} />

      );
    }
  }
  return (
    <svg className="thumb-decor" viewBox="0 0 200 140" preserveAspectRatio="xMidYMid slice">
      {out}
    </svg>);

}

function ThumbGraph() {
  // simple node-link graph
  const nodes = [
  [40, 30], [90, 50], [140, 26], [170, 70],
  [60, 95], [110, 85], [150, 110], [30, 70]];

  const edges = [[0, 1], [1, 2], [1, 3], [1, 5], [4, 5], [5, 6], [3, 6], [0, 7], [4, 7]];
  return (
    <svg className="thumb-decor" viewBox="0 0 200 140" preserveAspectRatio="xMidYMid slice">
      {edges.map(([a, b], i) =>
      <line key={i} x1={nodes[a][0]} y1={nodes[a][1]} x2={nodes[b][0]} y2={nodes[b][1]} stroke="#cccccc" strokeWidth="0.8" />
      )}
      {nodes.map(([x, y], i) =>
      <g key={i}>
          <circle cx={x} cy={y} r={i === 1 ? 5.5 : 3.5} fill={i === 1 ? "var(--accent)" : "#222"} />
          {i === 1 && <circle cx={x} cy={y} r={9} fill="var(--accent)" opacity="0.15" />}
        </g>
      )}
    </svg>);

}

function ThumbStack() {
  // stacked drifting lines suggesting iterative test-time updates
  const out = [];
  for (let i = 0; i < 9; i++) {
    const y = 20 + i * 12;
    const dx = (i % 2 === 0 ? 0 : 18) + i * 2;
    out.push(
      <path
        key={i}
        d={`M ${10 + dx} ${y} Q 100 ${y - 6} ${190 - dx * 0.6} ${y + 2}`}
        stroke={i === 4 ? "var(--accent)" : "#cfcfcf"}
        strokeWidth={i === 4 ? 1.6 : 0.8}
        fill="none" />

    );
  }
  return (
    <svg className="thumb-decor" viewBox="0 0 200 140" preserveAspectRatio="xMidYMid slice">
      {out}
    </svg>);

}

function ThumbWave() {
  const out = [];
  for (let i = 0; i < 14; i++) {
    out.push(
      <path
        key={i}
        d={`M 0 ${10 + i * 10} Q 50 ${4 + i * 10 + (i % 2 ? 6 : -2)} 100 ${10 + i * 10} T 200 ${10 + i * 10}`}
        stroke={i === 6 ? "var(--accent)" : "#dadada"}
        strokeWidth={i === 6 ? 1.2 : 0.7}
        fill="none"
        opacity={i === 6 ? 0.9 : 0.6} />

    );
  }
  return (
    <svg className="thumb-decor" viewBox="0 0 200 140" preserveAspectRatio="xMidYMid slice">
      {out}
    </svg>);

}

/* ---------- Publications ---------- */

function linkifyAbstract(text) {
  if (!text) return text;
  const re = /(https?:\/\/[^\s)]+)/g;
  const out = [];
  let last = 0;
  let m;
  let i = 0;
  while ((m = re.exec(text)) !== null) {
    if (m.index > last) out.push(text.slice(last, m.index));
    const url = m[1];
    const gh = url.match(/^https?:\/\/github\.com\/([^/]+\/[^/?#]+)/i);
    const label = gh ? gh[1] : url.replace(/^https?:\/\//, "").replace(/\/$/, "");
    out.push(
      <a key={i++} href={url} target="_blank" rel="noopener">{label}</a>
    );
    last = m.index + url.length;
  }
  if (last < text.length) out.push(text.slice(last));
  return out;
}

const PUBS = [
{
  yr: "2026",
  title: "Test-Time Training Undermines Safety Guardrails",
  authors: <span><b>S. Antonelli</b>*, M. S. Akhondzadeh*, A. Bojchevski</span>,
  venue: <React.Fragment>Trustworthy AI @ ICLR 2026 (<span className="venue-honor">Oral</span>)</React.Fragment>,
  featured: true,
  pdf: "https://arxiv.org/pdf/2605.22984",
  paper: "https://arxiv.org/abs/2605.22984",
  project: "https://uoc-tail.github.io/ttt-jailbreak/",
  github: "https://github.com/UoC-tail/ttt-jailbreak",
  abstract: "Test-Time Training (TTT) is an emerging paradigm that enables models to adapt their parameters during inference, improving performance on tasks such as few-shot learning, retrieval-augmented generation, and complex reasoning. However, this dynamic adaptation introduces new vulnerabilities that adversaries can exploit to jailbreak models. We identify three threat models for TTT and demonstrate how attackers can leverage them to bypass safety filters. Our results show that TTT can significantly increase the Attack Success Rate (ASR) and the ASR over 10 generation trials (ASR@10). For example, under LoRA, the few-shot and generation-phase threat models achieve an average ASR@10 of 95% and 93% respectively, across models from different families and scales. These vulnerabilities transfer to production fine-tuning APIs. We also show that TTT-induced overfitting can produce degenerate outputs that inflate ASR under standard judges, and propose a validity-aware evaluation to correct for this. Our findings suggest that TTT exposes a new attack surface, strengthens attacks, and undermines existing safety guardrails. As a first step toward defense, we propose a lightweight provider-side detector that flags TTT requests via the perplexity shift on a private harmful holdout, but robust deployment will ultimately require dynamic alignment.",
  bibtex: `@misc{antonelli2026testtimetrainingunderminessafety,
      title={Test-Time Training Undermines Safety Guardrails}, 
      author={Simone Antonelli and Sadegh Akhondzadeh and Aleksandar Bojchevski},
      year={2026},
      eprint={2605.22984},
      archivePrefix={arXiv},
      primaryClass={cs.LG},
      url={https://arxiv.org/abs/2605.22984}, 
}`,
  thumb: <img className="thumb-img" src="assets/teasers/ttt.png" alt="Teaser figure for Test-Time Training Undermines Safety Guardrails" />
},
{
  yr: "2026",
  title: "Predicting Channel Closures in the Lightning Network with Machine Learning",
  authors: <span><b>S. Antonelli</b>, V. Davis, H. Rush, A. Potdevin, J. Shrader, V. Singh, E. Rossi</span>,
  venue: "arXiv preprint",
  pdf: "https://arxiv.org/pdf/2605.12759",
  paper: "https://arxiv.org/abs/2605.12759",
  github: "https://github.com/AmbossTech/ln-channel-closure-prediction",
  abstract: "The Lightning Network (LN) is a second-layer protocol for Bitcoin designed to enable fast and cost-efficient off-chain transactions. Channels in the LN can be closed either by mutual agreement or unilaterally through a forced closure, which locks the involved capital for an extended period and degrades network reliability. In this paper, we study the problem of predicting channel closure types from publicly available gossip data, framing it as a temporal link classification task over the evolving channel graph. We construct a dataset spanning over two years of LN activity and benchmark a range of machine learning approaches, from MLPs to temporal graph neural networks and spectral encodings. Our experiments reveal that the dominant predictive signals are temporal and behavioural, namely how recently each endpoint was active and the per-node history of past closures, while the surrounding network topology provides no additional benefit. We find that a simple MLP operating on edge-level features, node-level event counts, and temporal patterns outperforms all graph-based approaches, and discuss how the inherent privacy of the LN, where critical information such as channel balances and payment flows remains hidden, fundamentally limits the predictability of closures from gossip data alone.",
  bibtex: `@misc{antonelli2026predictingchannelclosureslightning,
      title={Predicting Channel Closures in the Lightning Network with Machine Learning}, 
      author={Simone Antonelli and Vincent Davis and Harrison Rush and Anthony Potdevin and Jesse Shrader and Vikash Singh and Emanuele Rossi},
      year={2026},
      eprint={2605.12759},
      archivePrefix={arXiv},
      primaryClass={cs.LG},
      url={https://arxiv.org/abs/2605.12759}, 
}`,
  thumb: <img className="thumb-img" src="assets/teasers/lightning.png" alt="Teaser figure for Predicting Channel Closures in the Lightning Network with Machine Learning" />
},
{
  yr: "2026",
  title: "TOAST: Transformer Optimization using Adaptive and Simple Transformations",
  authors: <span>I. Cannistraci, <b>S. Antonelli</b>, E. Palumbo, T. M. Sutter, E. Rodolà, B. Rieck, J. E. Vogt</span>,
  venue: "TMLR",
  featured: true,
  pdf: "https://openreview.net/pdf?id=fSwMCsBtTG",
  paper: "https://openreview.net/forum?id=fSwMCsBtTG",
  github: "https://github.com/icannistraci/toast",
  abstract: "Foundation models achieve state-of-the-art performance across different tasks, but their size and computational demands raise concerns about accessibility and sustainability. Existing efficiency methods often require additional retraining or finetuning, limiting their practicality. Recent findings suggest that deep neural networks exhibit internal representation similarities. While such similarities across different models have been exploited for enabling techniques such as model stitching and merging, intra-network redundancy remains underexplored as a source for efficiency gains. In this paper, we introduce Transformer Optimization using Adaptive and Simple Transformations (TOAST), a framework that exploits these redundancies to approximate entire transformer blocks with lightweight closed-form mappings, such as linear transformations or even the identity function, without any additional training. Across state-of-the-art pretrained vision models (e.g., ViT, DINOv2, DeiT) and datasets ranging from MNIST to ImageNet-1k, TOAST reduces parameters and computation while preserving, and in some cases improving, downstream performance. These results show that large portions of transformer depth can be replaced by trivial functions, opening a new perspective on efficient foundation models.",
  bibtex: `@article{
cannistraci2026toast,
title={{TOAST}: Transformer Optimization using Adaptive and Simple Transformations},
author={Irene Cannistraci and Simone Antonelli and Emanuele Palumbo and Thomas M. Sutter and Emanuele Rodol{\\\`a} and Bastian Rieck and Julia E Vogt},
journal={Transactions on Machine Learning Research},
issn={2835-8856},
year={2026},
url={https://openreview.net/forum?id=fSwMCsBtTG},
note={}
}`,
  thumb: <img className="thumb-img" src="assets/teasers/toast.png" alt="Teaser figure for TOAST: Transformer Optimization using Adaptive and Simple Transformations" />
},
{
  yr: "2025",
  title: "Node-Level Data Valuation on Graphs",
  authors: <span><b>S. Antonelli</b>, A. Bojchevski</span>,
  venue: <React.Fragment>TMLR · ATTRIB @ NeurIPS 2024 · EDS 2024 (<a href="assets/eds-poster.pdf" target="_blank" rel="noopener" className="venue-link venue-honor">Best Poster ↗</a>)</React.Fragment>,
  featured: true,
  pdf: "https://openreview.net/pdf?id=tNyApIqDSJ",
  paper: "https://openreview.net/forum?id=tNyApIqDSJ",
  github: "https://github.com/siantonelli/graph_valuation",
  abstract: "How much is a node worth? We answer this question using an emerging set of data valuation techniques, where the value of a data point is measured via its marginal contribution when added to the (training) dataset. Data valuation has been primarily studied in the i.i.d. setting, giving rise to methods like influence functions, leave-one-out estimation, data Shapley, and data Banzhaf. We conduct a comprehensive study of data valuation approaches applied to graph-structured models such as graph neural networks in a semi-supervised transductive setting. Since all nodes (labeled and unlabeled) influence both training and inference we construct various scenarios to understand the diverse mechanisms by which nodes can impact learning. We show that the resulting node values can be used to identify (positively and negatively) influential nodes, quantify model brittleness, detect poisoned data, and accurately predict counterfactuals.",
  bibtex: `@article{
antonelli2025nodelevel,
title={Node-Level Data Valuation on Graphs},
author={Simone Antonelli and Aleksandar Bojchevski},
journal={Transactions on Machine Learning Research},
issn={2835-8856},
year={2025},
url={https://openreview.net/forum?id=tNyApIqDSJ},
note={}
}`,
  thumb: <img className="thumb-img" src="assets/teasers/value.png" alt="Teaser figure for Node-Level Data Valuation on Graphs" />
},
{
  yr: "2023",
  title: "Conformal Prediction Sets for Graph Neural Networks",
  authors: <span>S. H. Zargarbashi, <b>S. Antonelli</b>, A. Bojchevski</span>,
  venue: "ICML 2023",
  featured: true,
  pdf: "https://proceedings.mlr.press/v202/h-zargarbashi23a/h-zargarbashi23a.pdf",
  paper: "https://proceedings.mlr.press/v202/h-zargarbashi23a.html",
  github: "https://github.com/soroushzargar/DAPS",
  abstract: "Despite the widespread use of graph neural networks (GNNs) we lack methods to reliably quantify their uncertainty. We propose a conformal procedure to equip GNNs with prediction sets that come with distribution-free guarantees – the output set contains the true label with arbitrarily high probability. Our post-processing procedure can wrap around any (pretrained) GNN, and unlike existing methods, results in meaningful sets even when the model provides only the top class. The key idea is to diffuse the node-wise conformity scores to incorporate neighborhood information. By leveraging the network homophily we construct sets with comparable or better efficiency (average size) and significantly improved singleton hit ratio (correct sets of size one). In addition to an extensive empirical evaluation, we investigate the theoretical conditions under which smoothing provably improves efficiency.",
  bibtex: `@InProceedings{pmlr-v202-h-zargarbashi23a,
  title = 	 {Conformal Prediction Sets for Graph Neural Networks},
  author =       {H. Zargarbashi, Soroush and Antonelli, Simone and Bojchevski, Aleksandar},
  booktitle = 	 {Proceedings of the 40th International Conference on Machine Learning},
  pages = 	 {12292--12318},
  year = 	 {2023},
  editor = 	 {Krause, Andreas and Brunskill, Emma and Cho, Kyunghyun and Engelhardt, Barbara and Sabato, Sivan and Scarlett, Jonathan},
  volume = 	 {202},
  series = 	 {Proceedings of Machine Learning Research},
  month = 	 {23--29 Jul},
  publisher =    {PMLR},
  pdf = 	 {https://proceedings.mlr.press/v202/h-zargarbashi23a/h-zargarbashi23a.pdf},
  url = 	 {https://proceedings.mlr.press/v202/h-zargarbashi23a.html},
}`,
  thumb: <img className="thumb-img" src="assets/teasers/daps.png" alt="Teaser figure for Conformal Prediction Sets for Graph Neural Networks (DAPS)" />
},
{
  yr: "2022",
  title: "Metric Based Few-Shot Graph Classification",
  authors: <span>D. Crisostomi, <b>S. Antonelli</b>, V. Maiorca, L. Moschella, R. Marin, E. Rodolà</span>,
  venue: "Learning on Graphs (LoG) 2022",
  featured: true,
  pdf: "https://proceedings.mlr.press/v198/crisostomi22a/crisostomi22a.pdf",
  paper: "https://proceedings.mlr.press/v198/crisostomi22a.html",
  github: "https://github.com/crisostomi/metric-few-shot-graph",
  abstract: "Few-shot graph classification is a novel yet promising emerging research field that still lacks the soundness of well-established research domains. Existing works often consider different benchmarks and evaluation settings, hindering comparison and, therefore, scientific progress. In this work, we start by providing an extensive overview of the possible approaches to solving the task, comparing the current state-of-the-art and baselines via a unified evaluation framework. Our findings show that while graph-tailored approaches have a clear edge on some distributions, easily adapted few-shot learning methods generally perform better. In fact, we show that it is sufficient to equip a simple metric learning baseline with a state-of-the-art graph embedder to obtain the best overall results. We then show that straightforward additions at the latent level lead to substantial improvements by introducing i) a task-conditioned embedding space ii) a MixUp-based data augmentation technique. Finally, we release a highly reusable codebase to foster research in the field, offering modular and extensible implementations of all the relevant techniques.",
  bibtex: `@InProceedings{pmlr-v198-crisostomi22a,
  title = 	 {Metric Based Few-Shot Graph Classification},
  author =       {Crisostomi, Donato and Antonelli, Simone and Maiorca, Valentino and Moschella, Luca and Marin, Riccardo and Rodol{\\\`a}, Emanuele},
  booktitle = 	 {Proceedings of the First Learning on Graphs Conference},
  pages = 	 {33:1--33:22},
  year = 	 {2022},
  editor = 	 {Rieck, Bastian and Pascanu, Razvan},
  volume = 	 {198},
  series = 	 {Proceedings of Machine Learning Research},
  month = 	 {09--12 Dec},
  publisher =    {PMLR},
  pdf = 	 {https://proceedings.mlr.press/v198/crisostomi22a/crisostomi22a.pdf},
  url = 	 {https://proceedings.mlr.press/v198/crisostomi22a.html},
}`,
  thumb: <img className="thumb-img" src="assets/teasers/protograph.png" alt="Teaser figure for Metric Based Few-Shot Graph Classification — prototypical networks architecture" />
}];


function PubEntry({ p }) {
  const [open, setOpen] = React.useState({ abs: false, bib: false });
  const toggle = (k) => setOpen((o) => ({ ...o, [k]: !o[k] }));
  return (
    <article className="pub-entry">
      <div className="pub-teaser">{p.thumb}</div>
      <div className="pub-main">
        <div className="pub-venue">
          <span className="yr">{p.yr}</span>
          <span style={{ opacity: 0.4 }}>·</span>
          <span className="venue">{p.venue}</span>
          {p.featured && <span className="featured-dot" title="featured" />}
        </div>
        <h3 className="pub-title">{p.title}</h3>
        <p className="pub-authors">{p.authors}</p>

        <div className="pub-actions">
          <div className="pub-actions-left">
            {(p.paper || p.pdf) &&
            <a className="pub-pill" href={p.paper || p.pdf} target="_blank" rel="noopener">paper →</a>
            }
            <button
              type="button"
              className={"pub-pill" + (open.abs ? " on" : "")}
              onClick={() => toggle("abs")}>
              abstract {open.abs ? "↑" : "↓"}</button>
            <button
              type="button"
              className={"pub-pill" + (open.bib ? " on" : "")}
              onClick={() => toggle("bib")}>
              bibtex {open.bib ? "↑" : "↓"}</button>
            {p.blog &&
            <a className="pub-pill" href={p.blog} target="_blank" rel="noopener">blog →</a>
            }
          </div>
          {(p.project || p.github) &&
          <div className="pub-link-cards">
            {p.project &&
            <a className="gh-card" href={p.project} target="_blank" rel="noopener">
              <GlobeIcon />
              <div className="gh-card-text">
                <div className="gh-card-label">PROJECT</div>
                <div className="gh-card-repo">{p.project.replace(/^https?:\/\//, "").replace(/\/$/, "")}</div>
              </div>
              <span className="gh-card-arrow">↗</span>
            </a>
            }
            {p.github &&
            <a className="gh-card" href={p.github} target="_blank" rel="noopener">
                <GhIcon />
                <div className="gh-card-text">
                  <div className="gh-card-label">CODE</div>
                  <div className="gh-card-repo">{p.github.replace("https://github.com/", "")}</div>
                </div>
                <span className="gh-card-arrow">↗</span>
              </a>
            }
          </div>
          }
        </div>

        {open.abs &&
        <div className="pub-collapse">
            <div className="pub-collapse-label">Abstract</div>
            <p className="pub-collapse-body">{linkifyAbstract(p.abstract)}</p>
          </div>
        }
        {open.bib &&
        <div className="pub-collapse">
            <div className="pub-collapse-label">BibTeX</div>
            <pre className="pub-bibtex">{p.bibtex}</pre>
          </div>
        }
      </div>
    </article>);

}

function GhIcon() {
  return (
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" width="18" height="18">
      <path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22" />
    </svg>);

}

function GlobeIcon() {
  return (
    <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true" width="18" height="18">
      <circle cx="12" cy="12" r="10" />
      <ellipse cx="12" cy="12" rx="4" ry="10" />
      <line x1="2" y1="12" x2="22" y2="12" />
    </svg>);

}

function Publications() {
  return (
    <section className="section" id="publications" data-screen-label="publications">
      <SecHead title="Research" count={PUBS.length} />
      <div className="pub-list">
        {PUBS.map((p, i) => <PubEntry key={i} p={p} />)}
      </div>
    </section>);

}

/* ---------- Colophon ---------- */

function Colophon() {
  return (
    <footer className="colophon">
      <div>
        <a href="https://scholar.google.com/citations?user=xzgqj2wAAAAJ" target="_blank" rel="noopener">scholar</a>
        &nbsp;·&nbsp;
        <a href="https://github.com/siantonelli" target="_blank" rel="noopener">github</a>
        &nbsp;·&nbsp;
        <a href="https://x.com/sntonelli" target="_blank" rel="noopener">x</a>
        &nbsp;·&nbsp;
        <a href="https://www.linkedin.com/in/siantonelli" target="_blank" rel="noopener">linkedin</a>
      </div>
      <div className="right">
        <div>© {new Date().getFullYear()} Simone Antonelli. All rights reserved.</div>
      </div>
    </footer>);

}

window.News = News;
window.Publications = Publications;
window.Colophon = Colophon;
window.SecHead = SecHead;