PageSourceSearch

https://hubverse.io/contact.html

html hubverse.io collected 2026-10-03 21:38:35 UTC 34,891 bytes, 828 lines download raw bytes

1<!DOCTYPE html>
2<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
3
4<meta charset="utf-8">
5<meta name="generator" content="quarto-1.10.18">
6
7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
8
9
10<title> Contact – hubverse</title>
11<style>
12/* Default styles provided by pandoc.
13** See https://pandoc.org/MANUAL.html#variables-for-html for config info.
14*/
15span.smallcaps{font-variant: small-caps;}
16div.columns{display: flex; gap: 1.5em;}
17div.column{flex: auto;}
18@media screen {
19div.columns{gap: min(4vw, 1.5em);}
20div.column{overflow-x: auto;}
21}
22div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
23ul.task-list{list-style: none;}
24ul.task-list li input[type="checkbox"] {
25  width: 0.8em;
26  margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 
27  vertical-align: middle;
28}
29</style>
30
31
32<script src="site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 32
32
33<script src="site_libs/quarto-nav/headroom.min.js"></script>
vendor: 1 bytes, line 33
33
34<script src="site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 34
34
35<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
vendor: 1 bytes, line 35
35
36<script src="site_libs/quarto-search/fuse.min.js"></script>
vendor: 1 bytes, line 36
36
37<script src="site_libs/quarto-search/quarto-search.js"></script>
37
38<meta name="quarto:offset" content="./">
39<link href=".//brand/logo/logo.png" rel="icon" type="image/png">
40<script src="site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 40
40
41<script src="site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 41
41
42<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 42
42
43<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
vendor: 1 bytes, line 43
43
44<script src="site_libs/quarto-html/anchor.min.js"></script>
44
45<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
46<link href="site_libs/quarto-html/quarto-syntax-highlighting-64a204ab8560d761af7679ceaba22944.css" rel="stylesheet" class="quarto-color-scheme" id="quarto-text-highlighting-styles">
47<link href="site_libs/quarto-html/quarto-syntax-highlighting-dark-b85bc7c33db8c58e0ec93c3465666fed.css" rel="stylesheet" class="quarto-color-scheme quarto-color-alternate" id="quarto-text-highlighting-styles">
48<link href="site_libs/quarto-html/quarto-syntax-highlighting-64a204ab8560d761af7679ceaba22944.css" rel="stylesheet" class="quarto-color-scheme-extra" id="quarto-text-highlighting-styles">
49<script src="site_libs/bootstrap/bootstrap.min.js"></script>
49
50<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
51<link href="site_libs/bootstrap/bootstrap-faa19e120cee703ce4399906c6e9bee7.min.css" rel="stylesheet" append-hash="true" class="quarto-color-scheme" id="quarto-bootstrap" data-mode="light">
52<link href="site_libs/bootstrap/bootstrap-dark-faa19e120cee703ce4399906c6e9bee7.min.css" rel="stylesheet" append-hash="true" class="quarto-color-scheme quarto-color-alternate" id="quarto-bootstrap" data-mode="light">
53<link href="site_libs/bootstrap/bootstrap-faa19e120cee703ce4399906c6e9bee7.min.css" rel="stylesheet" append-hash="true" class="quarto-color-scheme-extra" id="quarto-bootstrap" data-mode="light">
54<link href="site_libs/quarto-contrib/fontawesome6-6.7.2/all.min.css" rel="stylesheet">
55<link href="site_libs/quarto-contrib/fontawesome6-6.7.2/latex-fontsize.css" rel="stylesheet">
56<script id="quarto-search-options" type="application/json">{
57  "location": "navbar",
58  "copy-button": false,
59  "collapse-after": 3,
60  "panel-placement": "end",
61  "type": "overlay",
62  "limit": 50,
63  "keyboard-shortcut": [
64    "f",
65    "/",
66    "s"
67  ],
68  "show-item-context": false,
69  "language": {
70    "search-no-results-text": "No results",
71    "search-matching-documents-text": "matching documents",
72    "search-copy-link-title": "Copy link to search",
73    "search-hide-matches-text": "Hide additional matches",
74    "search-more-match-text": "more match in this document",
75    "search-more-matches-text": "more matches in this document",
76    "search-clear-button-title": "Clear",
77    "search-text-placeholder": "",
78    "search-detached-cancel-button-title": "Cancel",
79    "search-submit-button-title": "Submit",
80    "search-label": "Search"
81  }
82}</script>
82
83<!-- Privacy-friendly analytics by Plausible -->
84<script async="" src="https://plausible.io/js/pa-Qtr0-pdxejuvymNBgYMIj.js"></script>
vendor: 1 bytes, line 84
84
85<script>
86  window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
87  plausible.init()
88</script>
88
89
90
91<link rel="stylesheet" href="styles.css">
92</head>
93
94<body class="nav-fixed quarto-light">
95
96<div id="quarto-search-results"></div>
97  <header id="quarto-header" class="headroom fixed-top">
98    <div id="quarto-announcement" data-announcement-id="8501bbe9620e8dff98c7b235d38034d7" class="alert alert-info hidden"><i class="bi bi-baloon quarto-announcement-icon"></i><div class="quarto-announcement-content">
99<p>Welcome to the hubverse. Discover <a href="./community/index.html">our community</a>, get involved, or reach out to share your feedback.</p>
100</div><i class="bi bi-x-lg quarto-announcement-action"></i></div>
101    <nav class="navbar navbar-expand-lg " data-bs-theme="dark">
102      <div class="navbar-container container-fluid">
103      <div class="navbar-brand-container mx-auto">
104    <a href="./index.html" class="navbar-brand navbar-brand-logo">
105    <img src="./brand/logo/logo.png" alt="" class="navbar-logo light-content">
106    <img src="./brand/logo/logo.png" alt="" class="navbar-logo dark-content">
107    </a>
108    <a class="navbar-brand" href="./index.html">
109    <span class="navbar-title">hubverse</span>
110    </a>
111  </div>
112            <div id="quarto-search" class="" title="Search"></div>
113          <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">
114  <span class="navbar-toggler-icon"></span>
115</button>
116          <div class="collapse navbar-collapse" id="navbarCollapse">
117            <ul class="navbar-nav navbar-nav-scroll ms-auto">
118  <li class="nav-item">
119    <a class="nav-link" href="./index.html"> 
120<span class="menu-text">Home</span></a>
121  </li>  
122  <li class="nav-item dropdown ">
123    <a class="nav-link dropdown-toggle" href="#" id="nav-menu-get-started" role="link" data-bs-toggle="dropdown" aria-expanded="false">
124 <span class="menu-text"><strong>Get started</strong></span>
125    </a>
126    <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="nav-menu-get-started">    
127        <li>
128    <a class="dropdown-item" href="./quickstart/index.html"><i class="bi bi-question-circle" role="img">
129</i> 
130 <span class="dropdown-text">What is a modeling hub?</span></a>
131  </li>  
132        <li>
133    <a class="dropdown-item" href="./quickstart/create.html"><i class="bi bi-diagram-3" role="img">
134</i> 
135 <span class="dropdown-text">Create a hub</span></a>
136  </li>  
137        <li>
138    <a class="dropdown-item" href="./quickstart/submit.html"><i class="bi bi-file-earmark-arrow-up" role="img">
139</i> 
140 <span class="dropdown-text">Submit model output</span></a>
141  </li>  
142        <li>
143    <a class="dropdown-item" href="./quickstart/analyze.html"><i class="bi bi-graph-up" role="img">
144</i> 
145 <span class="dropdown-text">Analyze data</span></a>
146  </li>  
147        <li>
148    <a class="dropdown-item" href="./quickstart/develop.html"><i class="bi bi-braces" role="img">
149</i> 
150 <span class="dropdown-text">Develop software</span></a>
151  </li>  
152        <li><hr class="dropdown-divider"></li>
153        <li>
154    <a class="dropdown-item" href="./quickstart/support-consulting.html"><i class="bi bi-headset" role="img">
155</i> 
156 <span class="dropdown-text">Consulting support</span></a>
157  </li>  
158    </ul>
159  </li>
160  <li class="nav-item dropdown ">
161    <a class="nav-link dropdown-toggle" href="#" id="nav-menu-tools" role="link" data-bs-toggle="dropdown" aria-expanded="false">
162 <span class="menu-text">Tools</span>
163    </a>
164    <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="nav-menu-tools">    
165        <li>
166    <a class="dropdown-item" href="./tools/data.html"><i class="bi bi-compass" role="img">
167</i> 
168 <span class="dropdown-text">Data standards</span></a>
169  </li>  
170        <li>
171    <a class="dropdown-item" href="./tools/software.html"><i class="bi bi-tools" role="img">
172</i> 
173 <span class="dropdown-text">Software</span></a>
174  </li>  
175        <li>
176    <a class="dropdown-item" href="./tools/dashboards.html"><i class="bi bi-speedometer" role="img">
177</i> 
178 <span class="dropdown-text">Dashboards</span></a>
179  </li>  
180    </ul>
181  </li>
182  <li class="nav-item dropdown ">
183    <a class="nav-link dropdown-toggle" href="#" id="nav-menu-community" role="link" data-bs-toggle="dropdown" aria-expanded="false">
184 <span class="menu-text">Community</span>
185    </a>
186    <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="nav-menu-community">    
187        <li>
188    <a class="dropdown-item" href="./community/index.html">
189 <span class="dropdown-text"><i class="fa-solid fa-people-line" aria-label="people-line"></i> &nbsp;Community</span></a>
190  </li>  
191        <li>
192    <a class="dropdown-item" href="./community/hubs.html">
193 <span class="dropdown-text"><i class="fa-solid fa-list" aria-label="list"></i> &nbsp;&nbsp;List of hubs</span></a>
194  </li>  
195        <li>
196    <a class="dropdown-item" href="./community/contributors.html">
197 <span class="dropdown-text"><i class="fa-solid fa-pencil" aria-label="pencil"></i> &nbsp;&nbsp;Contributors</span></a>
198  </li>  
199        <li>
200    <a class="dropdown-item" href="./contact.html">
201 <span class="dropdown-text"><i class="fa-solid fa-address-card" aria-label="address-card"></i> &nbsp;&nbsp;Contact</span></a>
202  </li>  
203        <li><hr class="dropdown-divider"></li>
204        <li>
205    <a class="dropdown-item" href="./about.html"><i class="bi bi-info-circle-fill" role="img">
206</i> 
207 <span class="dropdown-text">
207About the hubverse</span></a>
208  </li>  
209    </ul>
210  </li>
211  <li class="nav-item dropdown ">
212    <a class="nav-link dropdown-toggle" href="#" id="nav-menu-resources" role="link" data-bs-toggle="dropdown" aria-expanded="false">
213 <span class="menu-text">Resources</span>
214    </a>
215    <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="nav-menu-resources">    
216        <li>
217    <a class="dropdown-item" href="./terminology.html"><i class="bi bi-book" role="img">
218</i> 
219 <span class="dropdown-text">Terminology</span></a>
220  </li>  
221        <li>
222    <a class="dropdown-item" href="https://docs.hubverse.io/">
223 <span class="dropdown-text"><i class="fa-solid fa-book" aria-label="book"></i> &nbsp;&nbsp;Documentation <i class="fa-solid fa-arrow-up-right-from-square" aria-label="arrow-up-right-from-square"></i></span></a>
224  </li>  
225        <li>
226    <a class="dropdown-item" href="./funding.html">
227 <span class="dropdown-text"><i class="fa-solid fa-coins" aria-label="coins"></i> &nbsp;&nbsp;Funding</span></a>
228  </li>  
229        <li>
230    <a class="dropdown-item" href="./researchtalks.html">
231 <span class="dropdown-text"><i class="fa-solid fa-user-graduate" aria-label="user-graduate"></i> &nbsp;Research &amp; talks</span></a>
232  </li>  
233        <li>
234    <a class="dropdown-item" href="./trainings.html">
235 <span class="dropdown-text"><i class="fa-solid fa-laptop-code" aria-label="laptop-code"></i> &nbsp;Trainings</span></a>
236  </li>  
237        <li>
238    <a class="dropdown-item" href="./cite.html">
239 <span class="dropdown-text"><i class="fa-solid fa-quote-left" aria-label="quote-left"></i> &nbsp;&nbsp;How to cite</span></a>
240  </li>  
241        <li>
242    <a class="dropdown-item" href="./CONTRIBUTING.html"><i class="bi bi-github" role="img">
243</i> 
244 <span class="dropdown-text">Contributing to the site</span></a>
245  </li>  
246        <li><hr class="dropdown-divider"></li>
247        <li>
248    <a class="dropdown-item" href="./quickstart/support-consulting.html"><i class="bi bi-headset" role="img">
249</i> 
250 <span class="dropdown-text">Consulting support</span></a>
251  </li>  
252    </ul>
253  </li>
254  <li class="nav-item compact">
255    <a class="nav-link" href="https://github.com/hubverse-org"> <i class="bi bi-github" role="img" aria-label="hubverse GitHub organization">
256</i> 
257<span class="menu-text"></span></a>
258  </li>  
259</ul>
260          </div> <!-- /navcollapse -->
261            <div class="quarto-navbar-tools">
262</div>
263      </div> <!-- /container-fluid -->
264    </nav>
265</header>
266<!-- content -->
267<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar">
268<!-- sidebar -->
269<!-- margin-sidebar -->
270    <div id="quarto-margin-sidebar" class="sidebar margin-sidebar">
271        <nav id="TOC" role="doc-toc" class="toc-active">
272    <h2 id="toc-title">On this page</h2>
273   
274  <ul>
275  <li><a href="#mailing-list" id="toc-mailing-list" class="nav-link active" data-scroll-target="#mailing-list">Mailing List</a></li>
276  <li><a href="#website" id="toc-website" class="nav-link" data-scroll-target="#website">Website</a></li>
277  <li><a href="#contributions" id="toc-contributions" class="nav-link" data-scroll-target="#contributions">Contributions</a></li>
278  </ul>
279<div class="toc-actions"><ul><li><a href="https://github.com/hubverse-org/hubverse-site/edit/main/contact.qmd" class="toc-action"><i class="bi bi-github"></i>Edit this page</a></li><li><a href="https://github.com/hubverse-org/hubverse-site/blob/main/contact.qmd" class="toc-action"><i class="bi empty"></i>View source</a></li><li><a href="https://github.com/hubverse-org/hubverse-site/issues/new" class="toc-action"><i class="bi empty"></i>Report an issue</a></li></ul></div></nav>
280    </div>
281<!-- main -->
282<main class="content" id="quarto-document-content">
283<script>
284  const path = window.location.pathname;
285  const isDev = window.location.hostname === "localhost";
286
287  // Use console.log for debugging:
288  // console.log("🔍 docs-redirect script loaded");
289  // console.log("🚧 Current path:", path);
290
291  const redirects = {
292    "overview/history.html": "https://hubverse.io/about.html#history",
293    "overview/contributors.html": "https://hubverse.io/community/contributors.html",
294    "overview/contribute.html": "https://hubverse.io/community/",
295    "overview/who-we-are.html": "https://hubverse.io/about.html",
296    "overview/scope.html": "https://hubverse.io/about.html#scope",
297    "overview/support-consulting.html": "https://hubverse.io/quickstart/support-consulting.html",
298    "overview/data-storage.html": "https://docs.hubverse.io/en/latest/user-guide/data-storage.html",
299    "user-guide/presentations.html": "https://hubverse.io/researchtalks.html"
300  };
301
302  const versionedPathRegex = /^\/en\/(\d+\.\d+\.\d+|latest|stable)\//;
303  const isVersionedPath = versionedPathRegex.test(path);
304  const isLatestOrStable = path.startsWith("/en/latest") || path.startsWith("/en/stable");
305
306  let redirected = false;
307
308  if (isDev || isVersionedPath) {
309    if (isLatestOrStable) {
310      for (const [key, url] of Object.entries(redirects)) {
311        if (path.includes(key)) {
312          // console.log("🔀 Redirecting to:", url);
313          window.location.href = url;
314          redirected = true;
315          break;
316        }
317      }
318    }
319  }
320
321  if (!redirected && isVersionedPath) {
322    const fallback = "https://docs.hubverse.io" + path;
323    // console.log("🔀 Redirecting to fallback docs:", fallback);
324    window.location.href = fallback;
325  }
326</script>
326
327
328
329<header id="title-block-header" class="quarto-title-block default">
330<div class="quarto-title">
331<h1 class="title"><i class="fa-solid fa-address-card" aria-label="address-card"></i> Contact</h1>
332</div>
333
334
335
336<div class="quarto-title-meta">
337
338    
339  
340    
341  </div>
342  
343
344
345</header>
346
347
348<section id="mailing-list" class="level2">
349<h2 class="anchored" data-anchor-id="mailing-list">Mailing List</h2>
350<ul>
351<li>If you want to learn more about our work and attend our open monthly community meetings, please join our <a href="https://groups.io/g/hubverse">email listserv</a>. We send occasional updates (1-2 times per month) on our activities and the agenda for our monthly meetings.</li>
352<li>To reach out directly, please <a href="mailto:[email protected]">send a message to the hubverse group</a>.</li>
353</ul>
354</section>
355<section id="website" class="level2">
356<h2 class="anchored" data-anchor-id="website">Website</h2>
357<ul>
358<li>If you want to submit your organization or hub to the list of active hubs, please use our <a href="https://github.com/hubverse-org/hubverse-site/issues/new?template=HUB.yml">organization submission form</a></li>
359<li>If you want to submit a testimonial to display on the front page, please use our <a href="https://github.com/hubverse-org/hubverse-site/issues/new?template=TESTIMONIAL.yml">testimonial submission form</a></li>
360<li>If you encounter a problem with this website, please <a href="https://github.com/hubverse-org/hubverse-site/issues/new?template=bug_report.md">file an issue in the hubverse-site repository</a>.</li>
361</ul>
362</section>
363<section id="contributions" class="level2">
364<h2 class="anchored" data-anchor-id="contributions">Contributions</h2>
365<ul>
366<li>If you encounter difficulties with our software or tools, please <a href="./community/index.html#file-issues">file an issue in the appropriate repository</a>.</li>
367<li>If you are an interested in contributing to <em>the hubverse</em>, please visit the <a href="./community/index.html">community page</a>.</li>
368</ul>
369<div class="page-nav">
370<div class="prev-page">
371<p><a href="./community/contributors.html" class="prev-arrow">‹</a></p>
372<p><a href="./community/contributors.html" class="prev-label">Previous</a></p>
373<p><a href="./community/contributors.html" class="prev-title"><strong>Contributors</strong></a></p>
374</div>
375<div class="next-page">
376<p><a href="./about.html" class="next-label">Next</a></p>
377<p><a href="./about.html" class="next-arrow">›</a></p>
378<p><a href="./about.html" class="next-title"><strong>About the hubverse</strong></a></p>
379</div>
380</div>
381
382
383</section>
384
385</main> <!-- /main -->
386<script id="quarto-html-after-body" type="application/javascript">
387  window.document.addEventListener("DOMContentLoaded", function (event) {
388    const icon = "";
389    const anchorJS = new window.AnchorJS();
390    anchorJS.options = {
391      placement: 'right',
392      icon: icon
393    };
394    anchorJS.add('.anchored');
395    const isCodeAnnotation = (el) => {
396      for (const clz of el.classList) {
397        if (clz.startsWith('code-annotation-')) {                     
398          return true;
399        }
400      }
401      return false;
402    }
403    const onCopySuccess = function(e) {
404      // button target
405      const button = e.trigger;
406      // don't keep focus
407      button.blur();
408      // flash "checked"
409      button.classList.add('code-copy-button-checked');
410      var currentTitle = button.getAttribute("title");
411      button.setAttribute("title", "Copied!");
412      let tooltip;
413      if (window.bootstrap) {
414        button.setAttribute("data-bs-toggle", "tooltip");
415        button.setAttribute("data-bs-placement", "left");
416        button.setAttribute("data-bs-title", "Copied!");
417        tooltip = new bootstrap.Tooltip(button, 
418          { trigger: "manual", 
419            customClass: "code-copy-button-tooltip",
420            offset: [0, -8]});
421        tooltip.show();    
422      }
423      setTimeout(function() {
424        if (tooltip) {
425          tooltip.hide();
426          button.removeAttribute("data-bs-title");
427          button.removeAttribute("data-bs-toggle");
428          button.removeAttribute("data-bs-placement");
429        }
430        button.setAttribute("title", currentTitle);
431        button.classList.remove('code-copy-button-checked');
432      }, 1000);
433      // clear code selection
434      e.clearSelection();
435    }
436    const getTextToCopy = function(trigger) {
437      const outerScaffold = trigger.parentElement.cloneNode(true);
438      const codeEl = outerScaffold.querySelector('code');
439      for (const childEl of codeEl.children) {
440        if (isCodeAnnotation(childEl)) {
441          childEl.remove();
442        }
443      }
444      return codeEl.innerText;
445    }
446    const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
447      text: getTextToCopy
448    });
449    clipboard.on('success', onCopySuccess);
450    if (window.document.getElementById('quarto-embedded-source-code-modal')) {
451      const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
452        text: getTextToCopy,
453        container: window.document.getElementById('quarto-embedded-source-code-modal')
454      });
455      clipboardModal.on('success', onCopySuccess);
456    }
457      var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
458      var mailtoRegex = new RegExp(/^mailto:/);
459        var filterRegex = new RegExp("https:\/\/hubverse\.io");
460      var isInternal = (href) => {
461          return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
462      }
463      // Inspect non-navigation links and adorn them if external
464     var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)');
465      for (var i=0; i<links.length; i++) {
466        const link = links[i];
467        if (!isInternal(link.href)) {
468          // undo the damage that might have been done by quarto-nav.js in the case of
469          // links that we want to consider external
470          if (link.dataset.originalHref !== undefined) {
471            link.href = link.dataset.originalHref;
472          }
473            // default icon
474            link.classList.add("external");
475        }
476      }
477    function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
478      const config = {
479        allowHTML: true,
480        maxWidth: 500,
481        delay: 100,
482        arrow: false,
483        appendTo: function(el) {
484            return el.parentElement;
485        },
486        interactive: true,
487        interactiveBorder: 10,
488        theme: 'quarto',
489        placement: 'bottom-start',
490      };
491      if (contentFn) {
492        config.content = contentFn;
493      }
494      if (onTriggerFn) {
495        config.onTrigger = onTriggerFn;
496      }
497      if (onUntriggerFn) {
498        config.onUntrigger = onUntriggerFn;
499      }
500      window.tippy(el, config); 
501    }
502    const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
503    for (var i=0; i<noterefs.length; i++) {
504      const ref = noterefs[i];
505      tippyHover(ref, function() {
506        // use id or data attribute instead here
507        let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
508        try { href = new URL(href).hash; } catch {}
509        const id = href.replace(/^#\/?/, "");
510        const note = window.document.getElementById(id);
511        if (note) {
512          return note.innerHTML;
513        } else {
514          return "";
515        }
516      });
517    }
518    const xrefs = window.document.querySelectorAll('a.quarto-xref');
519    const processXRef = (id, note) => {
520      // Strip column container classes
521      const stripColumnClz = (el) => {
522        el.classList.remove("page-full", "page-columns");
523        if (el.children) {
524          for (const child of el.children) {
525            stripColumnClz(child);
526          }
527        }
528      }
529      stripColumnClz(note)
530      if (id === null || id.startsWith('sec-')) {
531        // Special case sections, only their first couple elements
532        const container = document.createElement("div");
533        if (note.children && note.children.length > 2) {
534          container.appendChild(note.children[0].cloneNode(true));
535          for (let i = 1; i < note.children.length; i++) {
536            const child = note.children[i];
537            if (child.tagName === "P" && child.innerText === "") {
538              continue;
539            } else {
540              container.appendChild(child.cloneNode(true));
541              break;
542            }
543          }
544          if (window.Quarto?.typesetMath) {
545            window.Quarto.typesetMath(container);
546          }
547          return container.innerHTML
548        } else {
549          if (window.Quarto?.typesetMath) {
550            window.Quarto.typesetMath(note);
551          }
552          return note.innerHTML;
553        }
554      } else {
555        // Remove any anchor links if they are present
556        const anchorLink = note.querySelector('a.anchorjs-link');
557        if (anchorLink) {
558          anchorLink.remove();
559        }
560        if (window.Quarto?.typesetMath) {
561          window.Quarto.typesetMath(note);
562        }
563        if (note.classList.contains("callout")) {
564          return note.outerHTML;
565        } else {
566          return note.innerHTML;
567        }
568      }
569    }
570    for (var i=0; i<xrefs.length; i++) {
571      const xref = xrefs[i];
572      tippyHover(xref, undefined, function(instance) {
573        instance.disable();
574        let url = xref.getAttribute('href');
575        let hash = undefined; 
576        if (url.startsWith('#')) {
577          hash = url;
578        } else {
579          try { hash = new URL(url).hash; } catch {}
580        }
581        if (hash) {
582          const id = hash.replace(/^#\/?/, "");
583          const note = window.document.getElementById(id);
584          if (note !== null) {
585            try {
586              const html = processXRef(id, note.cloneNode(true));
587              instance.setContent(html);
588            } finally {
589              instance.enable();
590              instance.show();
591            }
592          } else {
593            // See if we can fetch this
594            fetch(url.split('#')[0])
595            .then(res => res.text())
596            .then(html => {
597              const parser = new DOMParser();
598              const htmlDoc = parser.parseFromString(html, "text/html");
599              const note = htmlDoc.getElementById(id);
600              if (note !== null) {
601                const html = processXRef(id, note);
602                instance.setContent(html);
603              } 
604            }).finally(() => {
605              instance.enable();
606              instance.show();
607            });
608          }
609        } else {
610          // See if we can fetch a full url (with no hash to target)
611          // This is a special case and we should probably do some content thinning / targeting
612          fetch(url)
613          .then(res => res.text())
614          .then(html => {
615            const parser = new DOMParser();
616            const htmlDoc = parser.parseFromString(html, "text/html");
617            const note = htmlDoc.querySelector('main.content');
618            if (note !== null) {
619              // This should only happen for chapter cross references
620              // (since there is no id in the URL)
621              // remove the first header
622              if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
623                note.children[0].remove();
624              }
625              const html = processXRef(null, note);
626              instance.setContent(html);
627            } 
628          }).finally(() => {
629            instance.enable();
630            instance.show();
631          });
632        }
633      }, function(instance) {
634      });
635    }
636        let selectedAnnoteEl;
637        const selectorForAnnotation = ( cell, annotation) => {
638          let cellAttr = 'data-code-cell="' + cell + '"';
639          let lineAttr = 'data-code-annotation="' +  annotation + '"';
640          const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
641          return selector;
642        }
643        const selectCodeLines = (annoteEl) => {
644          const doc = window.document;
645          const targetCell = annoteEl.getAttribute("data-target-cell");
646          const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
647          const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
648          const lines = annoteSpan.getAttribute("data-code-lines").split(",");
649          const lineIds = lines.map((line) => {
650            return targetCell + "-" + line;
651          })
652          let top = null;
653          let height = null;
654          let parent = null;
655          if (lineIds.length > 0) {
656              //compute the position of the single el (top and bottom and make a div)
657              const el = window.document.getElementById(lineIds[0]);
658              top = el.offsetTop;
659              height = el.offsetHeight;
660              parent = el.parentElement.parentElement;
661            if (lineIds.length > 1) {
662              const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
663              const bottom = lastEl.offsetTop + lastEl.offsetHeight;
664              height = bottom - top;
665            }
666            if (top !== null && height !== null && parent !== null) {
667              // cook up a div (if necessary) and position it 
668              let div = window.document.getElementById("code-annotation-line-highlight");
669              if (div === null) {
670                div = window.document.createElement("div");
671                div.setAttribute("id", "code-annotation-line-highlight");
672                div.style.position = 'absolute';
673                parent.appendChild(div);
674              }
675              div.style.top = top - 2 + "px";
676              div.style.height = height + 4 + "px";
677              div.style.left = 0;
678              let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
679              if (gutterDiv === null) {
680                gutterDiv = window.document.createElement("div");
681                gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
682                gutterDiv.style.position = 'absolute';
683                const codeCell = window.document.getElementById(targetCell);
684                const gutter = codeCell.querySelector('.code-annotation-gutter');
685                gutter.appendChild(gutterDiv);
686              }
687              gutterDiv.style.top = top - 2 + "px";
688              gutterDiv.style.height = height + 4 + "px";
689            }
690            selectedAnnoteEl = annoteEl;
691          }
692        };
693        const unselectCodeLines = () => {
694          const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
695          elementsIds.forEach((elId) => {
696            const div = window.document.getElementById(elId);
697            if (div) {
698              div.remove();
699            }
700          });
701          selectedAnnoteEl = undefined;
702        };
703          // Handle positioning of the toggle
704      window.addEventListener(
705        "resize",
706        throttle(() => {
707          elRect = undefined;
708          if (selectedAnnoteEl) {
709            selectCodeLines(selectedAnnoteEl);
710          }
711        }, 10)
712      );
713      function throttle(fn, ms) {
714      let throttle = false;
715      let timer;
716        return (...args) => {
717          if(!throttle) { // first call gets through
718              fn.apply(this, args);
719              throttle = true;
720          } else { // all the others get throttled
721              if(timer) clearTimeout(timer); // cancel #2
722              timer = setTimeout(() => {
723                fn.apply(this, args);
724                timer = throttle = false;
725              }, ms);
726          }
727        };
728      }
729        // Attach click handler to the DT
730        const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
731        for (const annoteDlNode of annoteDls) {
732          annoteDlNode.addEventListener('click', (event) => {
733            const clickedEl = event.target;
734            if (clickedEl !== selectedAnnoteEl) {
735              unselectCodeLines();
736              const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
737              if (activeEl) {
738                activeEl.classList.remove('code-annotation-active');
739              }
740              selectCodeLines(clickedEl);
741              clickedEl.classList.add('code-annotation-active');
742            } else {
743              // Unselect the line
744              unselectCodeLines();
745              clickedEl.classList.remove('code-annotation-active');
746            }
747          });
748        }
749    const findCites = (el) => {
750      const parentEl = el.parentElement;
751      if (parentEl) {
752        const cites = parentEl.dataset.cites;
753        if (cites) {
754          return {
755            el,
756            cites: cites.split(' ')
757          };
758        } else {
759          return findCites(el.parentElement)
760        }
761      } else {
762        return undefined;
763      }
764    };
765    var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
766    for (var i=0; i<bibliorefs.length; i++) {
767      const ref = bibliorefs[i];
768      const citeInfo = findCites(ref);
769      if (citeInfo) {
770        tippyHover(citeInfo.el, function() {
771          var popup = window.document.createElement('div');
772          citeInfo.cites.forEach(function(cite) {
773            var citeDiv = window.document.createElement('div');
774            citeDiv.classList.add('hanging-indent');
775            citeDiv.classList.add('csl-entry');
776            var biblioDiv = window.document.getElementById('ref-' + cite);
777            if (biblioDiv) {
778              citeDiv.innerHTML = biblioDiv.innerHTML;
779            }
780            popup.appendChild(citeDiv);
781          });
782          return popup.innerHTML;
783        });
784      }
785    }
786  });
787  </script>
787
788</div> <!-- /content -->
789<footer class="footer">
790  <div class="nav-footer">
791    <div class="nav-footer-left">
792      <ul class="footer-items list-unstyled">
793    <li class="nav-item">
794      <i class="bi bi-c-circle" role="img">
795</i> 
796 Copyright 2025, Collaborative Modelling Consortium
797  </li>  
798</ul>
799    </div>   
800    <div class="nav-footer-center">
801      &nbsp;
802    <div class="toc-actions d-sm-block d-md-none"><ul><li><a href="https://github.com/hubverse-org/hubverse-site/edit/main/contact.qmd" class="toc-action"><i class="bi bi-github"></i>Edit this page</a></li><li><a href="https://github.com/hubverse-org/hubverse-site/blob/main/contact.qmd" class="toc-action"><i class="bi empty"></i>View source</a></li><li><a href="https://github.com/hubverse-org/hubverse-site/issues/new" class="toc-action"><i class="bi empty"></i>Report an issue</a></li></ul></div></div>
803    <div class="nav-footer-right">
804      <ul class="footer-items list-unstyled">
805    <li class="nav-item">
806    <a class="nav-link" href="./funding.html">
807<p><i class="fa-solid fa-coins" aria-label="coins"></i> Funding supporting the hubverse</p>
808</a>
809  </li>  
810    <li class="nav-item">
811    <a class="nav-link active" href="./contact.html" aria-current="page">
812<p><i class="fa-solid fa-address-card" aria-label="address-card"></i> Contact</p>
813</a>
814  </li>  
815    <li class="nav-item">
816    <a class="nav-link" href="./about.html">
817<p><i class="bi bi-info-circle-fill"></i> About the hubverse</p>
818</a>
819  </li>  
820</ul>
821    </div>
822  </div>
823</footer>
824
825
826
827
828</body></html>

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.