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> 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="#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 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.