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> Community â 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> 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> 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> 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> 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> 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> 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> Research & 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> 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> 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="#get-involved" id="toc-get-involved" class="nav-link active" data-scroll-target="#get-involved">Get Involved</a> 276 <ul class="collapse"> 277 <li><a href="#mailing-list" id="toc-mailing-list" class="nav-link" data-scroll-target="#mailing-list">Mailing list</a></li> 278 <li><a href="#monthly-community-meetings" id="toc-monthly-community-meetings" class="nav-link" data-scroll-target="#monthly-community-meetings">Monthly community meetings</a></li> 279 </ul></li> 280 <li><a href="#use-and-test-our-software-and-tools" id="toc-use-and-test-our-software-and-tools" class="nav-link" data-scroll-target="#use-and-test-our-software-and-tools">Use and test our software and tools</a> 281 <ul class="collapse"> 282 <li><a href="#file-issues" id="toc-file-issues" class="nav-link" data-scroll-target="#file-issues">File issues</a></li> 283 <li><a href="#contribute-code" id="toc-contribute-code" class="nav-link" data-scroll-target="#contribute-code">Contribute code</a></li> 284 <li><a href="#join-the-development-team" id="toc-join-the-development-team" class="nav-link" data-scroll-target="#join-the-development-team">Join the development team</a></li> 285 </ul></li> 286 <li><a href="#governance" id="toc-governance" class="nav-link" data-scroll-target="#governance">Governance</a></li> 287 </ul> 288<div class="toc-actions"><ul><li><a href="https://github.com/hubverse-org/hubverse-site/edit/main/community/index.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/community/index.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> 289 </div> 290<!-- main --> 291<main class="content" id="quarto-document-content">
292<script> 293 const path = window.location.pathname; 294 const isDev = window.location.hostname === "localhost"; 295 296 // Use console.log for debugging: 297 // console.log("ð docs-redirect script loaded"); 298 // console.log("ð§ Current path:", path); 299 300 const redirects = { 301 "overview/history.html": "https://hubverse.io/about.html#history", 302 "overview/contributors.html": "https://hubverse.io/community/contributors.html", 303 "overview/contribute.html": "https://hubverse.io/community/", 304 "overview/who-we-are.html": "https://hubverse.io/about.html", 305 "overview/scope.html": "https://hubverse.io/about.html#scope", 306 "overview/support-consulting.html": "https://hubverse.io/quickstart/support-consulting.html", 307 "overview/data-storage.html": "https://docs.hubverse.io/en/latest/user-guide/data-storage.html", 308 "user-guide/presentations.html": "https://hubverse.io/researchtalks.html" 309 }; 310 311 const versionedPathRegex = /^\/en\/(\d+\.\d+\.\d+|latest|stable)\//; 312 const isVersionedPath = versionedPathRegex.test(path); 313 const isLatestOrStable = path.startsWith("/en/latest") || path.startsWith("/en/stable"); 314 315 let redirected = false; 316 317 if (isDev || isVersionedPath) { 318 if (isLatestOrStable) { 319 for (const [key, url] of Object.entries(redirects)) { 320 if (path.includes(key)) { 321 // console.log("ð Redirecting to:", url); 322 window.location.href = url; 323 redirected = true; 324 break; 325 } 326 } 327 } 328 } 329 330 if (!redirected && isVersionedPath) { 331 const fallback = "https://docs.hubverse.io" + path; 332 // console.log("ð Redirecting to fallback docs:", fallback); 333 window.location.href = fallback; 334 } 335</script>
335 336 337 338<header id="title-block-header" class="quarto-title-block default"> 339<div class="quarto-title"> 340<h1 class="title"><i class="fa-solid fa-people-line" aria-label="people-line"></i> Community</h1> 341</div> 342 343 344 345<div class="quarto-title-meta"> 346 347 348 349 350 </div> 351 352 353 354</header> 355 356 357<div class="quarto-figure quarto-figure-center"> 358<figure class="figure"> 359<p><img src="../includes/img/hubverse-retreat-2023.jpg" class="img-fluid figure-img"></p> 360<figcaption>The Consortium of Infectious Disease Modeling Hubs (June 2023).<br> 361Back row (L-R): Kath Sherratt, Lucie Contamin, Nick Reich, Matthew Biggerstaff, Rebecca Borchering, Martha Zorn<br> 362Front row (L-R): Anna Krystalli, Evan Ray</figcaption> 363</figure> 364</div> 365<section id="get-involved" class="level2"> 366<h2 class="anchored" data-anchor-id="get-involved">Get Involved</h2> 367<section id="mailing-list" class="level3"> 368<h3 class="anchored" data-anchor-id="mailing-list">Mailing list</h3> 369<p>This group is used to announce new features in the hubverse to the user community. If you would like to become a hubverse community member, go to <a href="https://groups.io/g/hubverse">the hubverse mailing list</a> and click on the <strong>+Apply for Membership in this group</strong> at the bottom left-hand side of the page.</p> 370<p>The Consortium of Infectious Disease Modeling Hubs built the hubverse collaboratively, and we benefit from your contributions.</p> 371</section> 372<section id="monthly-community-meetings" class="level3"> 373<h3 class="anchored" data-anchor-id="monthly-community-meetings">Monthly community meetings</h3> 374<p>If you are using the hubverse or are interested in using the hubverse in the future, please consider joining our monthly community hubverse meetings. During these meetings, we provide general updates from a broad mix of developers and public health representatives running hubs or thinking about starting to run hubs.</p> 375<p>To join the community hubverse meeting, please <a href="mailto:[email protected]">send an email to the hubverse group</a>, including your name, email, and a few sentences about how you would like to use the hubverse.</p> 376</section> 377</section> 378<section id="use-and-test-our-software-and-tools" class="level2"> 379<h2 class="anchored" data-anchor-id="use-and-test-our-software-and-tools">Use and test our software and tools</h2> 380<p>The hubverse was created for teams to develop and set up collaborative modeling hubs easily, and we benefit from having groups use these tools and tell us about them.</p> 381<section id="file-issues" class="level3"> 382<h3 class="anchored" data-anchor-id="file-issues">File issues</h3> 383<p>Let us know if something is not working for you or if something could improve. This could be a bug in the code, a case where the tools are not appropriate for your use case, a problem with the documentation, or something else. Issues can be filed in any of <a href="https://github.com/hubverse-org">the hubverse repositories</a>. You are also welcome to <a href="https://github.com/orgs/hubverse-org/discussions">join the discussion</a> on any existing issue in any of the hubverse repositories.</p> 384</section> 385<section id="contribute-code" class="level3"> 386<h3 class="anchored" data-anchor-id="contribute-code">Contribute code</h3> 387<p>If you want to contribute to an existing hubverse repository, please review the <a href="https://docs.hubverse.io/en/latest/developer/index.html">developer guide</a>. Alternatively, please consult the <code>CONTRIBUTING.md</code> document in the repository, if present, or the <code>README</code> for details on how to contribute.</p> 388</section> 389<section id="join-the-development-team" class="level3"> 390<h3 class="anchored" data-anchor-id="join-the-development-team">Join the development team</h3> 391<p>If you are an experienced programmer interested in joining the development team, we have âdevelopment meetingsâ on all Wednesdays except the first Wednesday of the month. These meetings are for technical updates and discussions about ongoing development tasks.</p> 392<p>To join the development team, please <a href="mailto:[email protected]">send an email to the hubverse group</a>, including your name, email, and a few sentences about what you can contribute to the development team.</p> 393</section> 394</section> 395<section id="governance" class="level2"> 396<h2 class="anchored" data-anchor-id="governance">Governance</h2> 397<p>The governing body of the <a href="../about.html">Consortium of Infectious Disease Modeling Hubs</a> is the Coding Council, which comprises any community member attending one of the peri
397odic virtual meetings. This council generally serves as a deliberative body, discussing and setting directions for new conceptual and software development. Typically, decisions about design and prioritization are made through consensus at the Coding Council level. If differences cannot be solved by consensus, then decisions are passed to the Steering Committee, which comprises three members. Members of the Steering Committee serve one-year terms, with elections occurring in July of each calendar year. Members of the Coding Council may nominate themselves or others to serve on the Steering Committee, and a closed-ballot vote is taken if more than three individuals are nominated. The highest three vote-getters serve on the council.</p> 398<p>On July 22, 2026, the following members of the steering committee were re-elected:</p> 399<ul> 400<li>Lucie Contamin, University of Pittsburgh, MIDAS</li> 401<li>Matthew Cornell, University of Massachusetts in Amherst, Reich Lab</li> 402<li>Anna Krystalli, R-RSE</li> 403</ul> 404<div class="page-nav"> 405<div class="prev-page"> 406<p><a href="../tools/dashboards.html" class="prev-arrow">â¹</a></p> 407<p><a href="../tools/dashboards.html" class="prev-label">Previous</a></p> 408<p><a href="../tools/dashboards.html" class="prev-title"><strong>Dashboards</strong></a></p> 409</div> 410<div class="next-page"> 411<p><a href="../community/hubs.html" class="next-label">Next</a></p> 412<p><a href="../community/hubs.html" class="next-arrow">âº</a></p> 413<p><a href="../community/hubs.html" class="next-title"><strong>List of hubs</strong></a></p> 414</div> 415</div> 416 417 418</section> 419 420</main> <!-- /main -->
421<script id="quarto-html-after-body" type="application/javascript"> 422 window.document.addEventListener("DOMContentLoaded", function (event) { 423 const icon = "î§"; 424 const anchorJS = new window.AnchorJS(); 425 anchorJS.options = { 426 placement: 'right', 427 icon: icon 428 }; 429 anchorJS.add('.anchored'); 430 const isCodeAnnotation = (el) => { 431 for (const clz of el.classList) { 432 if (clz.startsWith('code-annotation-')) { 433 return true; 434 } 435 } 436 return false; 437 } 438 const onCopySuccess = function(e) { 439 // button target 440 const button = e.trigger; 441 // don't keep focus 442 button.blur(); 443 // flash "checked" 444 button.classList.add('code-copy-button-checked'); 445 var currentTitle = button.getAttribute("title"); 446 button.setAttribute("title", "Copied!"); 447 let tooltip; 448 if (window.bootstrap) { 449 button.setAttribute("data-bs-toggle", "tooltip"); 450 button.setAttribute("data-bs-placement", "left"); 451 button.setAttribute("data-bs-title", "Copied!"); 452 tooltip = new bootstrap.Tooltip(button, 453 { trigger: "manual", 454 customClass: "code-copy-button-tooltip", 455 offset: [0, -8]}); 456 tooltip.show(); 457 } 458 setTimeout(function() { 459 if (tooltip) { 460 tooltip.hide(); 461 button.removeAttribute("data-bs-title"); 462 button.removeAttribute("data-bs-toggle"); 463 button.removeAttribute("data-bs-placement"); 464 } 465 button.setAttribute("title", currentTitle); 466 button.classList.remove('code-copy-button-checked'); 467 }, 1000); 468 // clear code selection 469 e.clearSelection(); 470 } 471 const getTextToCopy = function(trigger) { 472 const outerScaffold = trigger.parentElement.cloneNode(true); 473 const codeEl = outerScaffold.querySelector('code'); 474 for (const childEl of codeEl.children) { 475 if (isCodeAnnotation(childEl)) { 476 childEl.remove(); 477 } 478 } 479 return codeEl.innerText; 480 } 481 const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', { 482 text: getTextToCopy 483 }); 484 clipboard.on('success', onCopySuccess); 485 if (window.document.getElementById('quarto-embedded-source-code-modal')) { 486 const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', { 487 text: getTextToCopy, 488 container: window.document.getElementById('quarto-embedded-source-code-modal') 489 }); 490 clipboardModal.on('success', onCopySuccess); 491 } 492 var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//); 493 var mailtoRegex = new RegExp(/^mailto:/); 494 var filterRegex = new RegExp("https:\/\/hubverse\.io"); 495 var isInternal = (href) => { 496 return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href); 497 } 498 // Inspect non-navigation links and adorn them if external 499 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)'); 500 for (var i=0; i<links.length; i++) { 501 const link = links[i]; 502 if (!isInternal(link.href)) { 503 // undo the damage that might have been done by quarto-nav.js in the case of 504 // links that we want to consider external 505 if (link.dataset.originalHref !== undefined) { 506 link.href = link.dataset.originalHref; 507 } 508 // default icon 509 link.classList.add("external"); 510 } 511 } 512 function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) { 513 const config = { 514 allowHTML: true, 515 maxWidth: 500, 516 delay: 100, 517 arrow: false, 518 appendTo: function(el) { 519 return el.parentElement; 520 }, 521 interactive: true, 522 interactiveBorder: 10, 523 theme: 'quarto', 524 placement: 'bottom-start', 525 }; 526 if (contentFn) { 527 config.content = contentFn; 528 } 529 if (onTriggerFn) { 530 config.onTrigger = onTriggerFn; 531 } 532 if (onUntriggerFn) { 533 config.onUntrigger = onUntriggerFn; 534 } 535 window.tippy(el, config); 536 } 537 const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]'); 538 for (var i=0; i<noterefs.length; i++) { 539 const ref = noterefs[i]; 540 tippyHover(ref, function() { 541 // use id or data attribute instead here 542 let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href'); 543 try { href = new URL(href).hash; } catch {} 544 const id = href.replace(/^#\/?/, ""); 545 const note = window.document.getElementById(id); 546 if (note) { 547 return note.innerHTML; 548 } else { 549 return ""; 550 } 551 }); 552 } 553 const xrefs = window.document.querySelectorAll('a.quarto-xref'); 554 const processXRef = (id, note) => { 555 // Strip column container classes 556 const stripColumnClz = (el) => { 557 el.classList.remove("page-full", "page-columns"); 558 if (el.children) { 559 for (const child of el.children) {
560 stripColumnClz(child); 561 } 562 } 563 } 564 stripColumnClz(note) 565 if (id === null || id.startsWith('sec-')) { 566 // Special case sections, only their first couple elements 567 const container = document.createElement("div"); 568 if (note.children && note.children.length > 2) { 569 container.appendChild(note.children[0].cloneNode(true)); 570 for (let i = 1; i < note.children.length; i++) { 571 const child = note.children[i]; 572 if (child.tagName === "P" && child.innerText === "") { 573 continue; 574 } else { 575 container.appendChild(child.cloneNode(true)); 576 break; 577 } 578 } 579 if (window.Quarto?.typesetMath) { 580 window.Quarto.typesetMath(container); 581 } 582 return container.innerHTML 583 } else { 584 if (window.Quarto?.typesetMath) { 585 window.Quarto.typesetMath(note); 586 } 587 return note.innerHTML; 588 } 589 } else { 590 // Remove any anchor links if they are present 591 const anchorLink = note.querySelector('a.anchorjs-link'); 592 if (anchorLink) { 593 anchorLink.remove(); 594 } 595 if (window.Quarto?.typesetMath) { 596 window.Quarto.typesetMath(note); 597 } 598 if (note.classList.contains("callout")) { 599 return note.outerHTML; 600 } else { 601 return note.innerHTML; 602 } 603 } 604 } 605 for (var i=0; i<xrefs.length; i++) { 606 const xref = xrefs[i]; 607 tippyHover(xref, undefined, function(instance) { 608 instance.disable(); 609 let url = xref.getAttribute('href'); 610 let hash = undefined; 611 if (url.startsWith('#')) { 612 hash = url; 613 } else { 614 try { hash = new URL(url).hash; } catch {} 615 } 616 if (hash) { 617 const id = hash.replace(/^#\/?/, ""); 618 const note = window.document.getElementById(id); 619 if (note !== null) { 620 try { 621 const html = processXRef(id, note.cloneNode(true)); 622 instance.setContent(html); 623 } finally { 624 instance.enable(); 625 instance.show(); 626 } 627 } else { 628 // See if we can fetch this 629 fetch(url.split('#')[0]) 630 .then(res => res.text()) 631 .then(html => { 632 const parser = new DOMParser(); 633 const htmlDoc = parser.parseFromString(html, "text/html"); 634 const note = htmlDoc.getElementById(id); 635 if (note !== null) { 636 const html = processXRef(id, note); 637 instance.setContent(html); 638 } 639 }).finally(() => { 640 instance.enable(); 641 instance.show(); 642 }); 643 } 644 } else { 645 // See if we can fetch a full url (with no hash to target) 646 // This is a special case and we should probably do some content thinning / targeting 647 fetch(url) 648 .then(res => res.text()) 649 .then(html => { 650 const parser = new DOMParser(); 651 const htmlDoc = parser.parseFromString(html, "text/html"); 652 const note = htmlDoc.querySelector('main.content'); 653 if (note !== null) { 654 // This should only happen for chapter cross references 655 // (since there is no id in the URL) 656 // remove the first header 657 if (note.children.length > 0 && note.children[0].tagName === "HEADER") { 658 note.children[0].remove(); 659 } 660 const html = processXRef(null, note); 661 instance.setContent(html); 662 } 663 }).finally(() => { 664 instance.enable(); 665 instance.show(); 666 }); 667 } 668 }, function(instance) { 669 }); 670 } 671 let selectedAnnoteEl; 672 const selectorForAnnotation = ( cell, annotation) => { 673 let cellAttr = 'data-code-cell="' + cell + '"'; 674 let lineAttr = 'data-code-annotation="' + annotation + '"'; 675 const selector = 'span[' + cellAttr + '][' + lineAttr + ']'; 676 return selector; 677 } 678 const selectCodeLines = (annoteEl) => { 679 const doc = window.document; 680 const targetCell = annoteEl.getAttribute("data-target-cell"); 681 const targetAnnotation = annoteEl.getAttribute("data-target-annotation"); 682 const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation)); 683 const lines = annoteSpan.getAttribute("data-code-lines").split(","); 684 const lineIds = lines.map((line) => { 685 return targetCell + "-" + line; 686 }) 687 let top = null; 688 let height = null; 689 let parent = null; 690 if (lineIds.length > 0) { 691 //compute the position of the single el (top and bottom and make a div) 692 const el = window.document.getElementById(lineIds[0]); 693 top = el.offsetTop; 694 height = el.offsetHeight; 695 parent = el.parentElement.parentElement; 696 if (lineIds.length > 1) { 697 const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]); 698 const bottom = lastEl.offsetTop + lastEl.offsetHeight; 699 height = bottom - top; 700 } 701 if (top !== null && height !== null && parent !== null) { 702 // cook up a div (if necessary) and position it 703 let div = window.document.getElementById("code-annotation-line-highlight"); 704 if (div === null) { 705 div = window.document.createElement("div"); 706 div.setAttribute("id", "code-annotation-line-highlight"); 707 div.style.position = 'absolute'; 708 parent.appendChild(div); 709 } 710 div.style.top = top - 2 + "px"; 711 div.style.height = height + 4 + "px"; 712 div.style.left = 0; 713 let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter"); 714 if (gutterDiv === null) { 715 gutterDiv = window.document.createElement("div"); 716 gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter"); 717 gutterDiv.style.position = 'absolute'; 718 const codeCell = window.document.getElementById(targetCell); 719 const gutter = codeCell.querySelector('.code-annotation-gutter'); 720 gutter.appendChild(gutterDiv); 721 } 722 gutterDiv.style.top = top - 2 + "px"; 723 gutterDiv.style.height = height + 4 + "px"; 724 } 725 selectedAnnoteEl = annoteEl; 726 } 727 }; 728 const unselectCodeLines = () => { 729 const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"]; 730 elementsIds.forEach((elId) => { 731 const div = window.document.getElementById(elId); 732 if (div) { 733 div.remove(); 734 } 735 }); 736 selectedAnnoteEl = undefined; 737 }; 738 // Handle positioning of the toggle 739 window.addEventListener( 740 "resize", 741 throttle(() => { 742 elRect = undefined; 743 if (selectedAnnoteEl) { 744 selectCodeLines(selectedAnnoteEl); 745 } 746 }, 10) 747 ); 748 function throttle(fn, ms) { 749 let throttle = false;
750 let timer; 751 return (...args) => { 752 if(!throttle) { // first call gets through 753 fn.apply(this, args); 754 throttle = true; 755 } else { // all the others get throttled 756 if(timer) clearTimeout(timer); // cancel #2 757 timer = setTimeout(() => { 758 fn.apply(this, args); 759 timer = throttle = false; 760 }, ms); 761 } 762 }; 763 } 764 // Attach click handler to the DT 765 const annoteDls = window.document.querySelectorAll('dt[data-target-cell]'); 766 for (const annoteDlNode of annoteDls) { 767 annoteDlNode.addEventListener('click', (event) => { 768 const clickedEl = event.target; 769 if (clickedEl !== selectedAnnoteEl) { 770 unselectCodeLines(); 771 const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active'); 772 if (activeEl) { 773 activeEl.classList.remove('code-annotation-active'); 774 } 775 selectCodeLines(clickedEl); 776 clickedEl.classList.add('code-annotation-active'); 777 } else { 778 // Unselect the line 779 unselectCodeLines(); 780 clickedEl.classList.remove('code-annotation-active'); 781 } 782 }); 783 } 784 const findCites = (el) => { 785 const parentEl = el.parentElement; 786 if (parentEl) { 787 const cites = parentEl.dataset.cites; 788 if (cites) { 789 return { 790 el, 791 cites: cites.split(' ') 792 }; 793 } else { 794 return findCites(el.parentElement) 795 } 796 } else { 797 return undefined; 798 } 799 }; 800 var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]'); 801 for (var i=0; i<bibliorefs.length; i++) { 802 const ref = bibliorefs[i]; 803 const citeInfo = findCites(ref); 804 if (citeInfo) { 805 tippyHover(citeInfo.el, function() { 806 var popup = window.document.createElement('div'); 807 citeInfo.cites.forEach(function(cite) { 808 var citeDiv = window.document.createElement('div'); 809 citeDiv.classList.add('hanging-indent'); 810 citeDiv.classList.add('csl-entry'); 811 var biblioDiv = window.document.getElementById('ref-' + cite); 812 if (biblioDiv) { 813 citeDiv.innerHTML = biblioDiv.innerHTML; 814 } 815 popup.appendChild(citeDiv); 816 }); 817 return popup.innerHTML; 818 }); 819 } 820 } 821 }); 822 </script>
822 823</div> <!-- /content --> 824<footer class="footer"> 825 <div class="nav-footer"> 826 <div class="nav-footer-left"> 827 <ul class="footer-items list-unstyled"> 828 <li class="nav-item"> 829 <i class="bi bi-c-circle" role="img"> 830</i> 831 Copyright 2025, Collaborative Modelling Consortium 832 </li> 833</ul> 834 </div> 835 <div class="nav-footer-center"> 836 837 <div class="toc-actions d-sm-block d-md-none"><ul><li><a href="https://github.com/hubverse-org/hubverse-site/edit/main/community/index.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/community/index.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> 838 <div class="nav-footer-right"> 839 <ul class="footer-items list-unstyled"> 840 <li class="nav-item"> 841 <a class="nav-link" href="../funding.html"> 842<p><i class="fa-solid fa-coins" aria-label="coins"></i> Funding supporting the hubverse</p> 843</a> 844 </li> 845 <li class="nav-item"> 846 <a class="nav-link" href="../contact.html"> 847<p><i class="fa-solid fa-address-card" aria-label="address-card"></i> Contact</p> 848</a> 849 </li> 850 <li class="nav-item"> 851 <a class="nav-link" href="../about.html"> 852<p><i class="bi bi-info-circle-fill"></i> About the hubverse</p> 853</a> 854 </li> 855</ul> 856 </div> 857 </div> 858</footer> 859 860 861 862 863</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.