mirror of
https://github.com/dwinkler1/dwinkler1.github.io.git
synced 2026-02-19 14:40:57 -05:00
remove old files
This commit is contained in:
parent
0c69d28753
commit
9ce1157398
25 changed files with 0 additions and 7884 deletions
86
search.json
86
search.json
|
|
@ -1,86 +0,0 @@
|
|||
[
|
||||
{
|
||||
"objectID": "software.html",
|
||||
"href": "software.html",
|
||||
"title": "Software",
|
||||
"section": "",
|
||||
"text": "Software\n shrinkDSM: Efficient Bayesian Inference for Dynamic Survival Models with Shrinkage RClickhouse: Database interface for ClickHouse Chartmetric.jl: Scraping library for the Chartmetric API JSONLines.jl: Memory efficient, parallel JSONLines reader for larger-than-memory files"
|
||||
},
|
||||
{
|
||||
"objectID": "teaching.html",
|
||||
"href": "teaching.html",
|
||||
"title": "Teaching",
|
||||
"section": "",
|
||||
"text": "Marketing Analytics\nData-based Storytelling\n\n\n\n\n\nData-based Storytelling\nMarketing Research\n\n\n\n\n\nData Literacy\n\n\n\n\n\nDifference-in-Differences\nWeb & API Scraping"
|
||||
},
|
||||
{
|
||||
"objectID": "teaching.html#masters-level-courses",
|
||||
"href": "teaching.html#masters-level-courses",
|
||||
"title": "Teaching",
|
||||
"section": "",
|
||||
"text": "Marketing Analytics\nData-based Storytelling"
|
||||
},
|
||||
{
|
||||
"objectID": "teaching.html#undergraduate-level-courses",
|
||||
"href": "teaching.html#undergraduate-level-courses",
|
||||
"title": "Teaching",
|
||||
"section": "",
|
||||
"text": "Data-based Storytelling\nMarketing Research"
|
||||
},
|
||||
{
|
||||
"objectID": "teaching.html#electives",
|
||||
"href": "teaching.html#electives",
|
||||
"title": "Teaching",
|
||||
"section": "",
|
||||
"text": "Data Literacy"
|
||||
},
|
||||
{
|
||||
"objectID": "teaching.html#academic-workshops",
|
||||
"href": "teaching.html#academic-workshops",
|
||||
"title": "Teaching",
|
||||
"section": "",
|
||||
"text": "Difference-in-Differences\nWeb & API Scraping"
|
||||
},
|
||||
{
|
||||
"objectID": "about.html",
|
||||
"href": "about.html",
|
||||
"title": "About",
|
||||
"section": "",
|
||||
"text": "About this site"
|
||||
},
|
||||
{
|
||||
"objectID": "index.html",
|
||||
"href": "index.html",
|
||||
"title": "Hello and Welcome!",
|
||||
"section": "",
|
||||
"text": "Hello and Welcome!\n\n\n\nDepartment of Marketing Vienna University of Economics and Business Building D2, Entrance A Welthandelsplatz 1 1020, Vienna\ndw@dwinkler.org\n\n\nI am a PhD Candidate in Economics at the Vienna University of Economics and Business and a research associate in the Marketing Department at the Institute for Retailing & Data Science. \nMy research focuses on Quantitative Marketing, Platform and Social Media Analytics, and the Economics of the Music Industry. I explore how key stakeholders—such as streaming platforms, social media, activist groups, and technological innovations in content delivery and promotion—affect the dynamics of the music industry. \nMethodologically, I am interested in advancing applied econometrics, particularly in developing new difference-in-differences estimators and integrating machine learning with traditional econometric techniques.\n\nCurriculum Vitae"
|
||||
},
|
||||
{
|
||||
"objectID": "research.html",
|
||||
"href": "research.html",
|
||||
"title": "Research",
|
||||
"section": "",
|
||||
"text": "Separating the Artist from the Art: Social Media Boycotts, Platform Sanctions, and Music Consumption with Nils Wlömert and Jūra Liaukonytė\nThe Impact of Social Media on Music Demand: Evidence from a Quasi-Natural Experiment with Christian Hotz-Behofsits, Nils Wlömert, Dominik Papies, and Jūra Liaukonytė\nNegative Spillover Effects of Opt-out Defaults: Evidence from Organ Donation Policies with Pascal Güntürkün, Sinika Studte, Michel Clement, Eva-Maria Merz, Jonathan Tan, Elisabeth Huis in ’t Veld, and Eamonn Ferguson\nA Bayesian Survival Model for Time Varying Coefficients and Unobserved Heterogeneity\nwith Peter Knaus\n\n\n\n\nThe Personal Side of Human Brands: How Human Brand Messages on Social Media Drive Brand Consumption and Engagement\nwith Christian Hotz-Behofsits, Nils Wlömert, and Harald van Heerde\nThe Hot 100 - The Influence of Weather patterns and Music Consumption\nwith Vartan Bal and Valentyna Melnyk\nThe Path to Fame - Exploiting Curator Networks to Predict Human Brand Success\n(presented at the Workshop for Information Systems and Economics, Marketing Science Conference, EMAC Doctoral Colloquium, EMAC Annual Conference, and Economics of the Music Industry)\nwith Nils Wlömert, Lev Muchnik, and Jacob Goldenberg\nPolitical Polarization Indices for Top Music Artists\nwith Jūra Liaukonytė and Nils Wlömert\nB-DiD - A Dynamic Bayesian Approach to Difference-in-Differences\n(presented at Marketing Science Conference)\nwith Peter Knaus and Pascal Güntürkün\n\n\n\nSystemic Immune-Inflammation Index (SII) Predicts Poor Survival in Pancreatic Cancer Patients Undergoing Resection (Journal of Gastrointestinal Surgery)\nwith Gerd Jomrich, Elisabeth S. Gruber, Marlene Hollenstein, Michael Gnantand, Klaus Sahora, and Martin Schindl, 2020\nExpression of FGF8, FGF18, and FGFR4 in Gastroesophageal Adenocarcinomas (Cells)\nwith Gerd Jomrich, Xenia Hudec, Felix Harpain, Gerald Timelthaler, Thomas Mohr, Brigitte Marian, and Sebastian F. Schoppmann, 2019\nMK2 and ETV1 Are Prgonistic Factors in Esophageal Adenocarcinomas (Journal of Cancer)\nwith Gerd Jomrich, Florian Maroske, Jasmin Stieger, Matthias Preusser, Aysegül Ilhan-Mutlu, Ivan Kristo, Matthias Paireder, and Sebastian F. Schoppmann, 2018"
|
||||
},
|
||||
{
|
||||
"objectID": "research.html#working-papers",
|
||||
"href": "research.html#working-papers",
|
||||
"title": "Research",
|
||||
"section": "",
|
||||
"text": "Separating the Artist from the Art: Social Media Boycotts, Platform Sanctions, and Music Consumption with Nils Wlömert and Jūra Liaukonytė\nThe Impact of Social Media on Music Demand: Evidence from a Quasi-Natural Experiment with Christian Hotz-Behofsits, Nils Wlömert, Dominik Papies, and Jūra Liaukonytė\nNegative Spillover Effects of Opt-out Defaults: Evidence from Organ Donation Policies with Pascal Güntürkün, Sinika Studte, Michel Clement, Eva-Maria Merz, Jonathan Tan, Elisabeth Huis in ’t Veld, and Eamonn Ferguson\nA Bayesian Survival Model for Time Varying Coefficients and Unobserved Heterogeneity\nwith Peter Knaus"
|
||||
},
|
||||
{
|
||||
"objectID": "research.html#work-in-progress",
|
||||
"href": "research.html#work-in-progress",
|
||||
"title": "Research",
|
||||
"section": "",
|
||||
"text": "The Personal Side of Human Brands: How Human Brand Messages on Social Media Drive Brand Consumption and Engagement\nwith Christian Hotz-Behofsits, Nils Wlömert, and Harald van Heerde\nThe Hot 100 - The Influence of Weather patterns and Music Consumption\nwith Vartan Bal and Valentyna Melnyk\nThe Path to Fame - Exploiting Curator Networks to Predict Human Brand Success\n(presented at the Workshop for Information Systems and Economics, Marketing Science Conference, EMAC Doctoral Colloquium, EMAC Annual Conference, and Economics of the Music Industry)\nwith Nils Wlömert, Lev Muchnik, and Jacob Goldenberg\nPolitical Polarization Indices for Top Music Artists\nwith Jūra Liaukonytė and Nils Wlömert\nB-DiD - A Dynamic Bayesian Approach to Difference-in-Differences\n(presented at Marketing Science Conference)\nwith Peter Knaus and Pascal Güntürkün"
|
||||
},
|
||||
{
|
||||
"objectID": "research.html#non-marketing-publications",
|
||||
"href": "research.html#non-marketing-publications",
|
||||
"title": "Research",
|
||||
"section": "",
|
||||
"text": "Systemic Immune-Inflammation Index (SII) Predicts Poor Survival in Pancreatic Cancer Patients Undergoing Resection (Journal of Gastrointestinal Surgery)\nwith Gerd Jomrich, Elisabeth S. Gruber, Marlene Hollenstein, Michael Gnantand, Klaus Sahora, and Martin Schindl, 2020\nExpression of FGF8, FGF18, and FGFR4 in Gastroesophageal Adenocarcinomas (Cells)\nwith Gerd Jomrich, Xenia Hudec, Felix Harpain, Gerald Timelthaler, Thomas Mohr, Brigitte Marian, and Sebastian F. Schoppmann, 2019\nMK2 and ETV1 Are Prgonistic Factors in Esophageal Adenocarcinomas (Journal of Cancer)\nwith Gerd Jomrich, Florian Maroske, Jasmin Stieger, Matthias Preusser, Aysegül Ilhan-Mutlu, Ivan Kristo, Matthias Paireder, and Sebastian F. Schoppmann, 2018"
|
||||
}
|
||||
]
|
||||
File diff suppressed because one or more lines are too long
2078
site_libs/bootstrap/bootstrap-icons.css
vendored
2078
site_libs/bootstrap/bootstrap-icons.css
vendored
File diff suppressed because it is too large
Load diff
Binary file not shown.
12
site_libs/bootstrap/bootstrap.min.css
vendored
12
site_libs/bootstrap/bootstrap.min.css
vendored
File diff suppressed because one or more lines are too long
7
site_libs/bootstrap/bootstrap.min.js
vendored
7
site_libs/bootstrap/bootstrap.min.js
vendored
File diff suppressed because one or more lines are too long
7
site_libs/clipboard/clipboard.min.js
vendored
7
site_libs/clipboard/clipboard.min.js
vendored
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because it is too large
Load diff
|
Before Width: | Height: | Size: 379 KiB |
Binary file not shown.
Binary file not shown.
|
|
@ -1,738 +0,0 @@
|
|||
/*
|
||||
* Academicons 1.9.4 by James Walsh (https://github.com/jpswalsh) and Katja Bercic (https://github.com/katjabercic)
|
||||
* Fonts generated using FontForge - https://fontforge.org
|
||||
* Square icons designed to be used alongside Font Awesome square icons - https://fortawesome.github.io/Font-Awesome/
|
||||
* Licenses - Font: SIL OFL 1.1, CSS: MIT License
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Academicons';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: block;
|
||||
src: url('1e21o67/academicons.eot');
|
||||
src: url('1e21o67/academicons.eot') format('embedded-opentype'),
|
||||
url('1e21o67/academicons.ttf') format('truetype'),
|
||||
url('1e21o67/academicons.woff') format('woff'),
|
||||
url('1e21o67/academicons.svg') format('svg');
|
||||
}
|
||||
|
||||
.ai {
|
||||
font-family: 'Academicons';
|
||||
font-weight: 400;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
display: inline-block;
|
||||
font-style: normal;
|
||||
font-variant: normal;
|
||||
text-rendering: auto;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.ai-academia:before {
|
||||
content: "\e9af";
|
||||
}
|
||||
|
||||
.ai-academia-square:before {
|
||||
content: "\e93d";
|
||||
}
|
||||
|
||||
.ai-acclaim:before {
|
||||
content: "\e92e";
|
||||
}
|
||||
|
||||
.ai-acclaim-square:before {
|
||||
content: "\e93a";
|
||||
}
|
||||
|
||||
.ai-acm:before {
|
||||
content: "\e93c";
|
||||
}
|
||||
|
||||
.ai-acm-square:before {
|
||||
content: "\e95d";
|
||||
}
|
||||
|
||||
.ai-acmdl:before {
|
||||
content: "\e96a";
|
||||
}
|
||||
|
||||
.ai-acmdl-square:before {
|
||||
content: "\e9d3";
|
||||
}
|
||||
|
||||
.ai-ads:before {
|
||||
content: "\e9cb";
|
||||
}
|
||||
|
||||
.ai-ads-square:before {
|
||||
content: "\e94a";
|
||||
}
|
||||
|
||||
.ai-africarxiv:before {
|
||||
content: "\e91b";
|
||||
}
|
||||
|
||||
.ai-africarxiv-square:before {
|
||||
content: "\e90b";
|
||||
}
|
||||
|
||||
.ai-archive:before {
|
||||
content: "\e955";
|
||||
}
|
||||
|
||||
.ai-archive-square:before {
|
||||
content: "\e956";
|
||||
}
|
||||
|
||||
.ai-arxiv:before {
|
||||
content: "\e974";
|
||||
}
|
||||
|
||||
.ai-arxiv-square:before {
|
||||
content: "\e9a6";
|
||||
}
|
||||
|
||||
.ai-biorxiv:before {
|
||||
content: "\e9a2";
|
||||
}
|
||||
|
||||
.ai-biorxiv-square:before {
|
||||
content: "\e98b";
|
||||
}
|
||||
|
||||
.ai-ceur:before {
|
||||
content: "\e96d";
|
||||
}
|
||||
|
||||
.ai-ceur-square:before {
|
||||
content: "\e92f";
|
||||
}
|
||||
|
||||
.ai-ciencia-vitae:before {
|
||||
content: "\e912";
|
||||
}
|
||||
|
||||
.ai-ciencia-vitae-square:before {
|
||||
content: "\e913";
|
||||
}
|
||||
|
||||
.ai-clarivate:before {
|
||||
content: "\e924";
|
||||
}
|
||||
|
||||
.ai-clarivate-square:before {
|
||||
content: "\e925";
|
||||
}
|
||||
|
||||
.ai-closed-access:before {
|
||||
content: "\e942";
|
||||
}
|
||||
|
||||
.ai-closed-access-square:before {
|
||||
content: "\e943";
|
||||
}
|
||||
|
||||
.ai-conversation:before {
|
||||
content: "\e94c";
|
||||
}
|
||||
|
||||
.ai-conversation-square:before {
|
||||
content: "\e915";
|
||||
}
|
||||
|
||||
.ai-coursera:before {
|
||||
content: "\e95f";
|
||||
}
|
||||
|
||||
.ai-coursera-square:before {
|
||||
content: "\e97f";
|
||||
}
|
||||
|
||||
.ai-crossref:before {
|
||||
content: "\e918";
|
||||
}
|
||||
|
||||
.ai-crossref-square:before {
|
||||
content: "\e919";
|
||||
}
|
||||
|
||||
.ai-cv:before {
|
||||
content: "\e9a5";
|
||||
}
|
||||
|
||||
.ai-cv-square:before {
|
||||
content: "\e90a";
|
||||
}
|
||||
|
||||
.ai-datacite:before {
|
||||
content: "\e91c";
|
||||
}
|
||||
|
||||
.ai-datacite-square:before {
|
||||
content: "\e91d";
|
||||
}
|
||||
|
||||
.ai-dataverse:before {
|
||||
content: "\e9f7";
|
||||
}
|
||||
|
||||
.ai-dataverse-square:before {
|
||||
content: "\e9e4";
|
||||
}
|
||||
|
||||
.ai-dblp:before {
|
||||
content: "\e94f";
|
||||
}
|
||||
|
||||
.ai-dblp-square:before {
|
||||
content: "\e93f";
|
||||
}
|
||||
|
||||
.ai-depsy:before {
|
||||
content: "\e97a";
|
||||
}
|
||||
|
||||
.ai-depsy-square:before {
|
||||
content: "\e94b";
|
||||
}
|
||||
|
||||
.ai-doi:before {
|
||||
content: "\e97e";
|
||||
}
|
||||
|
||||
.ai-doi-square:before {
|
||||
content: "\e98f";
|
||||
}
|
||||
|
||||
.ai-dryad:before {
|
||||
content: "\e97c";
|
||||
}
|
||||
|
||||
.ai-dryad-square:before {
|
||||
content: "\e98c";
|
||||
}
|
||||
|
||||
.ai-elsevier:before {
|
||||
content: "\e961";
|
||||
}
|
||||
|
||||
.ai-elsevier-square:before {
|
||||
content: "\e910";
|
||||
}
|
||||
|
||||
.ai-figshare:before {
|
||||
content: "\e981";
|
||||
}
|
||||
|
||||
.ai-figshare-square:before {
|
||||
content: "\e9e7";
|
||||
}
|
||||
|
||||
.ai-google-scholar:before {
|
||||
content: "\e9d4";
|
||||
}
|
||||
|
||||
.ai-google-scholar-square:before {
|
||||
content: "\e9f9";
|
||||
}
|
||||
|
||||
.ai-hal:before {
|
||||
content: "\e92c";
|
||||
}
|
||||
|
||||
.ai-hal-square:before {
|
||||
content: "\e92d";
|
||||
}
|
||||
|
||||
.ai-hypothesis:before {
|
||||
content: "\e95a";
|
||||
}
|
||||
|
||||
.ai-hypothesis-square:before {
|
||||
content: "\e95b";
|
||||
}
|
||||
|
||||
.ai-ideas-repec:before {
|
||||
content: "\e9ed";
|
||||
}
|
||||
|
||||
.ai-ideas-repec-square:before {
|
||||
content: "\e9f8";
|
||||
}
|
||||
|
||||
.ai-ieee:before {
|
||||
content: "\e929";
|
||||
}
|
||||
|
||||
.ai-ieee-square:before {
|
||||
content: "\e9b9";
|
||||
}
|
||||
|
||||
.ai-impactstory:before {
|
||||
content: "\e9cf";
|
||||
}
|
||||
|
||||
.ai-impactstory-square:before {
|
||||
content: "\e9aa";
|
||||
}
|
||||
|
||||
.ai-inaturalist:before {
|
||||
content: "\e900";
|
||||
}
|
||||
|
||||
.ai-inaturalist-square:before {
|
||||
content: "\e901";
|
||||
}
|
||||
|
||||
.ai-inpn:before {
|
||||
content: "\e902";
|
||||
}
|
||||
|
||||
.ai-inpn-square:before {
|
||||
content: "\e903";
|
||||
}
|
||||
|
||||
.ai-inspire:before {
|
||||
content: "\e9e9";
|
||||
}
|
||||
|
||||
.ai-inspire-square:before {
|
||||
content: "\e9fe";
|
||||
}
|
||||
|
||||
.ai-isidore:before {
|
||||
content: "\e936";
|
||||
}
|
||||
|
||||
.ai-isidore-square:before {
|
||||
content: "\e954";
|
||||
}
|
||||
|
||||
.ai-isni:before {
|
||||
content: "\e957";
|
||||
}
|
||||
|
||||
.ai-isni-square:before {
|
||||
content: "\e958";
|
||||
}
|
||||
|
||||
.ai-jstor:before {
|
||||
content: "\e938";
|
||||
}
|
||||
|
||||
.ai-jstor-square:before {
|
||||
content: "\e944";
|
||||
}
|
||||
|
||||
.ai-lattes:before {
|
||||
content: "\e9b3";
|
||||
}
|
||||
|
||||
.ai-lattes-square:before {
|
||||
content: "\e99c";
|
||||
}
|
||||
|
||||
.ai-mathoverflow:before {
|
||||
content: "\e9f6";
|
||||
}
|
||||
|
||||
.ai-mathoverflow-square:before {
|
||||
content: "\e97b";
|
||||
}
|
||||
|
||||
.ai-mendeley:before {
|
||||
content: "\e9f0";
|
||||
}
|
||||
|
||||
.ai-mendeley-square:before {
|
||||
content: "\e9f3";
|
||||
}
|
||||
|
||||
.ai-moodle:before {
|
||||
content: "\e907";
|
||||
}
|
||||
|
||||
.ai-moodle-square:before {
|
||||
content: "\e908";
|
||||
}
|
||||
|
||||
.ai-mtmt:before {
|
||||
content: "\e950";
|
||||
}
|
||||
|
||||
.ai-mtmt-square:before {
|
||||
content: "\e951";
|
||||
}
|
||||
|
||||
.ai-nakala:before {
|
||||
content: "\e940";
|
||||
}
|
||||
|
||||
.ai-nakala-square:before {
|
||||
content: "\e941";
|
||||
}
|
||||
|
||||
.ai-obp:before {
|
||||
content: "\e92a";
|
||||
}
|
||||
|
||||
.ai-obp-square:before {
|
||||
content: "\e92b";
|
||||
}
|
||||
|
||||
.ai-open-access:before {
|
||||
content: "\e939";
|
||||
}
|
||||
|
||||
.ai-open-access-square:before {
|
||||
content: "\e9f4";
|
||||
}
|
||||
|
||||
.ai-open-data:before {
|
||||
content: "\e966";
|
||||
}
|
||||
|
||||
.ai-open-data-square:before {
|
||||
content: "\e967";
|
||||
}
|
||||
|
||||
.ai-open-materials:before {
|
||||
content: "\e968";
|
||||
}
|
||||
|
||||
.ai-open-materials-square:before {
|
||||
content: "\e969";
|
||||
}
|
||||
|
||||
.ai-openedition:before {
|
||||
content: "\e946";
|
||||
}
|
||||
|
||||
.ai-openedition-square:before {
|
||||
content: "\e947";
|
||||
}
|
||||
|
||||
.ai-orcid:before {
|
||||
content: "\e9d9";
|
||||
}
|
||||
|
||||
.ai-orcid-square:before {
|
||||
content: "\e9c3";
|
||||
}
|
||||
|
||||
.ai-osf:before {
|
||||
content: "\e9ef";
|
||||
}
|
||||
|
||||
.ai-osf-square:before {
|
||||
content: "\e931";
|
||||
}
|
||||
|
||||
.ai-overleaf:before {
|
||||
content: "\e914";
|
||||
}
|
||||
|
||||
.ai-overleaf-square:before {
|
||||
content: "\e98d";
|
||||
}
|
||||
|
||||
.ai-philpapers:before {
|
||||
content: "\e98a";
|
||||
}
|
||||
|
||||
.ai-philpapers-square:before {
|
||||
content: "\e96f";
|
||||
}
|
||||
|
||||
.ai-piazza:before {
|
||||
content: "\e99a";
|
||||
}
|
||||
|
||||
.ai-piazza-square:before {
|
||||
content: "\e90c";
|
||||
}
|
||||
|
||||
.ai-preregistered:before {
|
||||
content: "\e906";
|
||||
}
|
||||
|
||||
.ai-preregistered-square:before {
|
||||
content: "\e96b";
|
||||
}
|
||||
|
||||
.ai-protocols:before {
|
||||
content: "\e952";
|
||||
}
|
||||
|
||||
.ai-protocols-square:before {
|
||||
content: "\e953";
|
||||
}
|
||||
|
||||
.ai-psyarxiv:before {
|
||||
content: "\e90e";
|
||||
}
|
||||
|
||||
.ai-psyarxiv-square:before {
|
||||
content: "\e90f";
|
||||
}
|
||||
|
||||
.ai-publons:before {
|
||||
content: "\e937";
|
||||
}
|
||||
|
||||
.ai-publons-square:before {
|
||||
content: "\e94e";
|
||||
}
|
||||
|
||||
.ai-pubmed:before {
|
||||
content: "\e99f";
|
||||
}
|
||||
|
||||
.ai-pubmed-square:before {
|
||||
content: "\e97d";
|
||||
}
|
||||
|
||||
.ai-pubpeer:before {
|
||||
content: "\e922";
|
||||
}
|
||||
|
||||
.ai-pubpeer-square:before {
|
||||
content: "\e923";
|
||||
}
|
||||
|
||||
.ai-researcherid:before {
|
||||
content: "\e91a";
|
||||
}
|
||||
|
||||
.ai-researcherid-square:before {
|
||||
content: "\e95c";
|
||||
}
|
||||
|
||||
.ai-researchgate:before {
|
||||
content: "\e95e";
|
||||
}
|
||||
|
||||
.ai-researchgate-square:before {
|
||||
content: "\e99e";
|
||||
}
|
||||
|
||||
.ai-ror:before {
|
||||
content: "\e948";
|
||||
}
|
||||
|
||||
.ai-ror-square:before {
|
||||
content: "\e949";
|
||||
}
|
||||
|
||||
.ai-sci-hub:before {
|
||||
content: "\e959";
|
||||
}
|
||||
|
||||
.ai-sci-hub-square:before {
|
||||
content: "\e905";
|
||||
}
|
||||
|
||||
.ai-scirate:before {
|
||||
content: "\e98e";
|
||||
}
|
||||
|
||||
.ai-scirate-square:before {
|
||||
content: "\e99d";
|
||||
}
|
||||
|
||||
.ai-scopus:before {
|
||||
content: "\e91e";
|
||||
}
|
||||
|
||||
.ai-scopus-square:before {
|
||||
content: "\e91f";
|
||||
}
|
||||
|
||||
.ai-semantic-scholar:before {
|
||||
content: "\e96e";
|
||||
}
|
||||
|
||||
.ai-semantic-scholar-square:before {
|
||||
content: "\e96c";
|
||||
}
|
||||
|
||||
.ai-springer:before {
|
||||
content: "\e928";
|
||||
}
|
||||
|
||||
.ai-springer-square:before {
|
||||
content: "\e99b";
|
||||
}
|
||||
|
||||
.ai-ssrn:before {
|
||||
content: "\e916";
|
||||
}
|
||||
|
||||
.ai-ssrn-square:before {
|
||||
content: "\e917";
|
||||
}
|
||||
|
||||
.ai-stackoverflow:before {
|
||||
content: "\e920";
|
||||
}
|
||||
|
||||
.ai-stackoverflow-square:before {
|
||||
content: "\e921";
|
||||
}
|
||||
|
||||
.ai-viaf:before {
|
||||
content: "\e933";
|
||||
}
|
||||
|
||||
.ai-viaf-square:before {
|
||||
content: "\e934";
|
||||
}
|
||||
|
||||
.ai-wiley:before {
|
||||
content: "\e926";
|
||||
}
|
||||
|
||||
.ai-wiley-square:before {
|
||||
content: "\e927";
|
||||
}
|
||||
|
||||
.ai-zenodo:before {
|
||||
content: "\e911";
|
||||
}
|
||||
|
||||
.ai-zotero:before {
|
||||
content: "\e962";
|
||||
}
|
||||
|
||||
.ai-zotero-square:before {
|
||||
content: "\e932";
|
||||
}
|
||||
|
||||
/* Duplication of the FontAwesome style classes using 'ai' in place of 'fa'. */
|
||||
.ai-lg {
|
||||
font-size: 1.33333em;
|
||||
line-height: 0.75em;
|
||||
vertical-align: -.0667em;
|
||||
}
|
||||
|
||||
.ai-xs {
|
||||
font-size: .75em;
|
||||
}
|
||||
|
||||
.ai-sm {
|
||||
font-size: .875em;
|
||||
}
|
||||
|
||||
.ai-1x {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
.ai-2x {
|
||||
font-size: 2em;
|
||||
}
|
||||
|
||||
.ai-3x {
|
||||
font-size: 3em;
|
||||
}
|
||||
|
||||
.ai-4x {
|
||||
font-size: 4em;
|
||||
}
|
||||
|
||||
.ai-5x {
|
||||
font-size: 5em;
|
||||
}
|
||||
|
||||
.ai-6x {
|
||||
font-size: 6em;
|
||||
}
|
||||
|
||||
.ai-7x {
|
||||
font-size: 7em;
|
||||
}
|
||||
|
||||
.ai-8x {
|
||||
font-size: 8em;
|
||||
}
|
||||
|
||||
.ai-9x {
|
||||
font-size: 9em;
|
||||
}
|
||||
|
||||
.ai-10x {
|
||||
font-size: 10em;
|
||||
}
|
||||
|
||||
.ai-fw {
|
||||
text-align: center;
|
||||
width: 1.25em;
|
||||
}
|
||||
|
||||
.ai-ul {
|
||||
list-style-type: none;
|
||||
margin-left: 2.5em;
|
||||
padding-left: 0;
|
||||
}
|
||||
|
||||
.ai-ul>li {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.ai-li {
|
||||
left: -2em;
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
width: 2em;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
.ai-border {
|
||||
border: solid 0.08em #eee;
|
||||
border-radius: .1em;
|
||||
padding: .2em .25em .15em;
|
||||
}
|
||||
|
||||
.ai-pull-left {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.ai-pull-right {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.ai.ai-pull-left {
|
||||
margin-right: .3em;
|
||||
}
|
||||
|
||||
.ai.ai-pull-right {
|
||||
margin-right: .3em;
|
||||
}
|
||||
|
||||
.ai-stack {
|
||||
display: inline-block;
|
||||
height: 2em;
|
||||
line-height: 2em;
|
||||
position: relative;
|
||||
vertical-align: middle;
|
||||
width: 2.5em;
|
||||
}
|
||||
|
||||
.ai-stack-1x,
|
||||
.ai-stack-2x {
|
||||
left: 0;
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.ai-stack-1x {
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
.ai-stack-2x {
|
||||
font-size: 2em;
|
||||
}
|
||||
|
||||
.ai-inverse {
|
||||
color: #fff;
|
||||
}
|
||||
|
|
@ -1,115 +0,0 @@
|
|||
.ai-tiny {
|
||||
font-size: 0.5em;
|
||||
}
|
||||
|
||||
.ai-scriptsize {
|
||||
font-size: 0.7em;
|
||||
}
|
||||
|
||||
.ai-footnotesize {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
.ai-small {
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
.ai-normalsize {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
.ai-large {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
.ai-Large {
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
||||
.ai-LARGE {
|
||||
font-size: 1.75em;
|
||||
}
|
||||
|
||||
.ai-huge {
|
||||
font-size: 2em;
|
||||
}
|
||||
|
||||
.ai-Huge {
|
||||
font-size: 2.5em;
|
||||
}
|
||||
|
||||
.ai-1x {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
.ai-2x {
|
||||
font-size: 2em;
|
||||
}
|
||||
|
||||
.ai-3x {
|
||||
font-size: 3em;
|
||||
}
|
||||
|
||||
.ai-4x {
|
||||
font-size: 4em;
|
||||
}
|
||||
|
||||
.ai-5x {
|
||||
font-size: 5em;
|
||||
}
|
||||
|
||||
.ai-6x {
|
||||
font-size: 6em;
|
||||
}
|
||||
|
||||
.ai-7x {
|
||||
font-size: 7em;
|
||||
}
|
||||
|
||||
.ai-8x {
|
||||
font-size: 8em;
|
||||
}
|
||||
|
||||
.ai-9x {
|
||||
font-size: 9em;
|
||||
}
|
||||
|
||||
.ai-10x {
|
||||
font-size: 10em;
|
||||
}
|
||||
|
||||
.ai-2xs {
|
||||
font-size: 0.625em;
|
||||
line-height: 0.1em;
|
||||
vertical-align: 0.225em;
|
||||
}
|
||||
|
||||
.ai-xs {
|
||||
font-size: 0.75em;
|
||||
line-height: 0.08333em;
|
||||
vertical-align: 0.125em;
|
||||
}
|
||||
|
||||
.ai-sm {
|
||||
font-size: 0.875em;
|
||||
line-height: 0.07143em;
|
||||
vertical-align: 0.05357em;
|
||||
}
|
||||
|
||||
.ai-lg {
|
||||
font-size: 1.25em;
|
||||
line-height: 0.05em;
|
||||
vertical-align: -0.075em;
|
||||
}
|
||||
|
||||
.ai-xl {
|
||||
font-size: 1.5em;
|
||||
line-height: 0.04167em;
|
||||
vertical-align: -0.125em;
|
||||
}
|
||||
|
||||
.ai-2xl {
|
||||
font-size: 2em;
|
||||
line-height: 0.03125em;
|
||||
vertical-align: -0.1875em;
|
||||
}
|
||||
9
site_libs/quarto-html/anchor.min.js
vendored
9
site_libs/quarto-html/anchor.min.js
vendored
File diff suppressed because one or more lines are too long
6
site_libs/quarto-html/popper.min.js
vendored
6
site_libs/quarto-html/popper.min.js
vendored
File diff suppressed because one or more lines are too long
|
|
@ -1,205 +0,0 @@
|
|||
/* quarto syntax highlight colors */
|
||||
:root {
|
||||
--quarto-hl-ot-color: #003B4F;
|
||||
--quarto-hl-at-color: #657422;
|
||||
--quarto-hl-ss-color: #20794D;
|
||||
--quarto-hl-an-color: #5E5E5E;
|
||||
--quarto-hl-fu-color: #4758AB;
|
||||
--quarto-hl-st-color: #20794D;
|
||||
--quarto-hl-cf-color: #003B4F;
|
||||
--quarto-hl-op-color: #5E5E5E;
|
||||
--quarto-hl-er-color: #AD0000;
|
||||
--quarto-hl-bn-color: #AD0000;
|
||||
--quarto-hl-al-color: #AD0000;
|
||||
--quarto-hl-va-color: #111111;
|
||||
--quarto-hl-bu-color: inherit;
|
||||
--quarto-hl-ex-color: inherit;
|
||||
--quarto-hl-pp-color: #AD0000;
|
||||
--quarto-hl-in-color: #5E5E5E;
|
||||
--quarto-hl-vs-color: #20794D;
|
||||
--quarto-hl-wa-color: #5E5E5E;
|
||||
--quarto-hl-do-color: #5E5E5E;
|
||||
--quarto-hl-im-color: #00769E;
|
||||
--quarto-hl-ch-color: #20794D;
|
||||
--quarto-hl-dt-color: #AD0000;
|
||||
--quarto-hl-fl-color: #AD0000;
|
||||
--quarto-hl-co-color: #5E5E5E;
|
||||
--quarto-hl-cv-color: #5E5E5E;
|
||||
--quarto-hl-cn-color: #8f5902;
|
||||
--quarto-hl-sc-color: #5E5E5E;
|
||||
--quarto-hl-dv-color: #AD0000;
|
||||
--quarto-hl-kw-color: #003B4F;
|
||||
}
|
||||
|
||||
/* other quarto variables */
|
||||
:root {
|
||||
--quarto-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||
}
|
||||
|
||||
pre > code.sourceCode > span {
|
||||
color: #003B4F;
|
||||
}
|
||||
|
||||
code span {
|
||||
color: #003B4F;
|
||||
}
|
||||
|
||||
code.sourceCode > span {
|
||||
color: #003B4F;
|
||||
}
|
||||
|
||||
div.sourceCode,
|
||||
div.sourceCode pre.sourceCode {
|
||||
color: #003B4F;
|
||||
}
|
||||
|
||||
code span.ot {
|
||||
color: #003B4F;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.at {
|
||||
color: #657422;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.ss {
|
||||
color: #20794D;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.an {
|
||||
color: #5E5E5E;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.fu {
|
||||
color: #4758AB;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.st {
|
||||
color: #20794D;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.cf {
|
||||
color: #003B4F;
|
||||
font-weight: bold;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.op {
|
||||
color: #5E5E5E;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.er {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.bn {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.al {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.va {
|
||||
color: #111111;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.bu {
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.ex {
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.pp {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.in {
|
||||
color: #5E5E5E;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.vs {
|
||||
color: #20794D;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.wa {
|
||||
color: #5E5E5E;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
code span.do {
|
||||
color: #5E5E5E;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
code span.im {
|
||||
color: #00769E;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.ch {
|
||||
color: #20794D;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.dt {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.fl {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.co {
|
||||
color: #5E5E5E;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.cv {
|
||||
color: #5E5E5E;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
code span.cn {
|
||||
color: #8f5902;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.sc {
|
||||
color: #5E5E5E;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.dv {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.kw {
|
||||
color: #003B4F;
|
||||
font-weight: bold;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
.prevent-inlining {
|
||||
content: "</";
|
||||
}
|
||||
|
||||
/*# sourceMappingURL=59aff86612b78cc2e8585904e2f27617.css.map */
|
||||
|
|
@ -1,205 +0,0 @@
|
|||
/* quarto syntax highlight colors */
|
||||
:root {
|
||||
--quarto-hl-ot-color: #003B4F;
|
||||
--quarto-hl-at-color: #657422;
|
||||
--quarto-hl-ss-color: #20794D;
|
||||
--quarto-hl-an-color: #5E5E5E;
|
||||
--quarto-hl-fu-color: #4758AB;
|
||||
--quarto-hl-st-color: #20794D;
|
||||
--quarto-hl-cf-color: #003B4F;
|
||||
--quarto-hl-op-color: #5E5E5E;
|
||||
--quarto-hl-er-color: #AD0000;
|
||||
--quarto-hl-bn-color: #AD0000;
|
||||
--quarto-hl-al-color: #AD0000;
|
||||
--quarto-hl-va-color: #111111;
|
||||
--quarto-hl-bu-color: inherit;
|
||||
--quarto-hl-ex-color: inherit;
|
||||
--quarto-hl-pp-color: #AD0000;
|
||||
--quarto-hl-in-color: #5E5E5E;
|
||||
--quarto-hl-vs-color: #20794D;
|
||||
--quarto-hl-wa-color: #5E5E5E;
|
||||
--quarto-hl-do-color: #5E5E5E;
|
||||
--quarto-hl-im-color: #00769E;
|
||||
--quarto-hl-ch-color: #20794D;
|
||||
--quarto-hl-dt-color: #AD0000;
|
||||
--quarto-hl-fl-color: #AD0000;
|
||||
--quarto-hl-co-color: #5E5E5E;
|
||||
--quarto-hl-cv-color: #5E5E5E;
|
||||
--quarto-hl-cn-color: #8f5902;
|
||||
--quarto-hl-sc-color: #5E5E5E;
|
||||
--quarto-hl-dv-color: #AD0000;
|
||||
--quarto-hl-kw-color: #003B4F;
|
||||
}
|
||||
|
||||
/* other quarto variables */
|
||||
:root {
|
||||
--quarto-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
|
||||
}
|
||||
|
||||
pre > code.sourceCode > span {
|
||||
color: #003B4F;
|
||||
}
|
||||
|
||||
code span {
|
||||
color: #003B4F;
|
||||
}
|
||||
|
||||
code.sourceCode > span {
|
||||
color: #003B4F;
|
||||
}
|
||||
|
||||
div.sourceCode,
|
||||
div.sourceCode pre.sourceCode {
|
||||
color: #003B4F;
|
||||
}
|
||||
|
||||
code span.ot {
|
||||
color: #003B4F;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.at {
|
||||
color: #657422;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.ss {
|
||||
color: #20794D;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.an {
|
||||
color: #5E5E5E;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.fu {
|
||||
color: #4758AB;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.st {
|
||||
color: #20794D;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.cf {
|
||||
color: #003B4F;
|
||||
font-weight: bold;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.op {
|
||||
color: #5E5E5E;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.er {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.bn {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.al {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.va {
|
||||
color: #111111;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.bu {
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.ex {
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.pp {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.in {
|
||||
color: #5E5E5E;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.vs {
|
||||
color: #20794D;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.wa {
|
||||
color: #5E5E5E;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
code span.do {
|
||||
color: #5E5E5E;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
code span.im {
|
||||
color: #00769E;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.ch {
|
||||
color: #20794D;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.dt {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.fl {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.co {
|
||||
color: #5E5E5E;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.cv {
|
||||
color: #5E5E5E;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
code span.cn {
|
||||
color: #8f5902;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.sc {
|
||||
color: #5E5E5E;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.dv {
|
||||
color: #AD0000;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
code span.kw {
|
||||
color: #003B4F;
|
||||
font-weight: bold;
|
||||
font-style: inherit;
|
||||
}
|
||||
|
||||
.prevent-inlining {
|
||||
content: "</";
|
||||
}
|
||||
|
||||
/*# sourceMappingURL=debc5d5d77c3f9108843748ff7464032.css.map */
|
||||
|
|
@ -1,908 +0,0 @@
|
|||
const sectionChanged = new CustomEvent("quarto-sectionChanged", {
|
||||
detail: {},
|
||||
bubbles: true,
|
||||
cancelable: false,
|
||||
composed: false,
|
||||
});
|
||||
|
||||
const layoutMarginEls = () => {
|
||||
// Find any conflicting margin elements and add margins to the
|
||||
// top to prevent overlap
|
||||
const marginChildren = window.document.querySelectorAll(
|
||||
".column-margin.column-container > *, .margin-caption, .aside"
|
||||
);
|
||||
|
||||
let lastBottom = 0;
|
||||
for (const marginChild of marginChildren) {
|
||||
if (marginChild.offsetParent !== null) {
|
||||
// clear the top margin so we recompute it
|
||||
marginChild.style.marginTop = null;
|
||||
const top = marginChild.getBoundingClientRect().top + window.scrollY;
|
||||
if (top < lastBottom) {
|
||||
const marginChildStyle = window.getComputedStyle(marginChild);
|
||||
const marginBottom = parseFloat(marginChildStyle["marginBottom"]);
|
||||
const margin = lastBottom - top + marginBottom;
|
||||
marginChild.style.marginTop = `${margin}px`;
|
||||
}
|
||||
const styles = window.getComputedStyle(marginChild);
|
||||
const marginTop = parseFloat(styles["marginTop"]);
|
||||
lastBottom = top + marginChild.getBoundingClientRect().height + marginTop;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
window.document.addEventListener("DOMContentLoaded", function (_event) {
|
||||
// Recompute the position of margin elements anytime the body size changes
|
||||
if (window.ResizeObserver) {
|
||||
const resizeObserver = new window.ResizeObserver(
|
||||
throttle(() => {
|
||||
layoutMarginEls();
|
||||
if (
|
||||
window.document.body.getBoundingClientRect().width < 990 &&
|
||||
isReaderMode()
|
||||
) {
|
||||
quartoToggleReader();
|
||||
}
|
||||
}, 50)
|
||||
);
|
||||
resizeObserver.observe(window.document.body);
|
||||
}
|
||||
|
||||
const tocEl = window.document.querySelector('nav.toc-active[role="doc-toc"]');
|
||||
const sidebarEl = window.document.getElementById("quarto-sidebar");
|
||||
const leftTocEl = window.document.getElementById("quarto-sidebar-toc-left");
|
||||
const marginSidebarEl = window.document.getElementById(
|
||||
"quarto-margin-sidebar"
|
||||
);
|
||||
// function to determine whether the element has a previous sibling that is active
|
||||
const prevSiblingIsActiveLink = (el) => {
|
||||
const sibling = el.previousElementSibling;
|
||||
if (sibling && sibling.tagName === "A") {
|
||||
return sibling.classList.contains("active");
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
// fire slideEnter for bootstrap tab activations (for htmlwidget resize behavior)
|
||||
function fireSlideEnter(e) {
|
||||
const event = window.document.createEvent("Event");
|
||||
event.initEvent("slideenter", true, true);
|
||||
window.document.dispatchEvent(event);
|
||||
}
|
||||
const tabs = window.document.querySelectorAll('a[data-bs-toggle="tab"]');
|
||||
tabs.forEach((tab) => {
|
||||
tab.addEventListener("shown.bs.tab", fireSlideEnter);
|
||||
});
|
||||
|
||||
// fire slideEnter for tabby tab activations (for htmlwidget resize behavior)
|
||||
document.addEventListener("tabby", fireSlideEnter, false);
|
||||
|
||||
// Track scrolling and mark TOC links as active
|
||||
// get table of contents and sidebar (bail if we don't have at least one)
|
||||
const tocLinks = tocEl
|
||||
? [...tocEl.querySelectorAll("a[data-scroll-target]")]
|
||||
: [];
|
||||
const makeActive = (link) => tocLinks[link].classList.add("active");
|
||||
const removeActive = (link) => tocLinks[link].classList.remove("active");
|
||||
const removeAllActive = () =>
|
||||
[...Array(tocLinks.length).keys()].forEach((link) => removeActive(link));
|
||||
|
||||
// activate the anchor for a section associated with this TOC entry
|
||||
tocLinks.forEach((link) => {
|
||||
link.addEventListener("click", () => {
|
||||
if (link.href.indexOf("#") !== -1) {
|
||||
const anchor = link.href.split("#")[1];
|
||||
const heading = window.document.querySelector(
|
||||
`[data-anchor-id="${anchor}"]`
|
||||
);
|
||||
if (heading) {
|
||||
// Add the class
|
||||
heading.classList.add("reveal-anchorjs-link");
|
||||
|
||||
// function to show the anchor
|
||||
const handleMouseout = () => {
|
||||
heading.classList.remove("reveal-anchorjs-link");
|
||||
heading.removeEventListener("mouseout", handleMouseout);
|
||||
};
|
||||
|
||||
// add a function to clear the anchor when the user mouses out of it
|
||||
heading.addEventListener("mouseout", handleMouseout);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
const sections = tocLinks.map((link) => {
|
||||
const target = link.getAttribute("data-scroll-target");
|
||||
if (target.startsWith("#")) {
|
||||
return window.document.getElementById(decodeURI(`${target.slice(1)}`));
|
||||
} else {
|
||||
return window.document.querySelector(decodeURI(`${target}`));
|
||||
}
|
||||
});
|
||||
|
||||
const sectionMargin = 200;
|
||||
let currentActive = 0;
|
||||
// track whether we've initialized state the first time
|
||||
let init = false;
|
||||
|
||||
const updateActiveLink = () => {
|
||||
// The index from bottom to top (e.g. reversed list)
|
||||
let sectionIndex = -1;
|
||||
if (
|
||||
window.innerHeight + window.pageYOffset >=
|
||||
window.document.body.offsetHeight
|
||||
) {
|
||||
// This is the no-scroll case where last section should be the active one
|
||||
sectionIndex = 0;
|
||||
} else {
|
||||
// This finds the last section visible on screen that should be made active
|
||||
sectionIndex = [...sections].reverse().findIndex((section) => {
|
||||
if (section) {
|
||||
return window.pageYOffset >= section.offsetTop - sectionMargin;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
if (sectionIndex > -1) {
|
||||
const current = sections.length - sectionIndex - 1;
|
||||
if (current !== currentActive) {
|
||||
removeAllActive();
|
||||
currentActive = current;
|
||||
makeActive(current);
|
||||
if (init) {
|
||||
window.dispatchEvent(sectionChanged);
|
||||
}
|
||||
init = true;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const inHiddenRegion = (top, bottom, hiddenRegions) => {
|
||||
for (const region of hiddenRegions) {
|
||||
if (top <= region.bottom && bottom >= region.top) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
const categorySelector = "header.quarto-title-block .quarto-category";
|
||||
const activateCategories = (href) => {
|
||||
// Find any categories
|
||||
// Surround them with a link pointing back to:
|
||||
// #category=Authoring
|
||||
try {
|
||||
const categoryEls = window.document.querySelectorAll(categorySelector);
|
||||
for (const categoryEl of categoryEls) {
|
||||
const categoryText = categoryEl.textContent;
|
||||
if (categoryText) {
|
||||
const link = `${href}#category=${encodeURIComponent(categoryText)}`;
|
||||
const linkEl = window.document.createElement("a");
|
||||
linkEl.setAttribute("href", link);
|
||||
for (const child of categoryEl.childNodes) {
|
||||
linkEl.append(child);
|
||||
}
|
||||
categoryEl.appendChild(linkEl);
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
// Ignore errors
|
||||
}
|
||||
};
|
||||
function hasTitleCategories() {
|
||||
return window.document.querySelector(categorySelector) !== null;
|
||||
}
|
||||
|
||||
function offsetRelativeUrl(url) {
|
||||
const offset = getMeta("quarto:offset");
|
||||
return offset ? offset + url : url;
|
||||
}
|
||||
|
||||
function offsetAbsoluteUrl(url) {
|
||||
const offset = getMeta("quarto:offset");
|
||||
const baseUrl = new URL(offset, window.location);
|
||||
|
||||
const projRelativeUrl = url.replace(baseUrl, "");
|
||||
if (projRelativeUrl.startsWith("/")) {
|
||||
return projRelativeUrl;
|
||||
} else {
|
||||
return "/" + projRelativeUrl;
|
||||
}
|
||||
}
|
||||
|
||||
// read a meta tag value
|
||||
function getMeta(metaName) {
|
||||
const metas = window.document.getElementsByTagName("meta");
|
||||
for (let i = 0; i < metas.length; i++) {
|
||||
if (metas[i].getAttribute("name") === metaName) {
|
||||
return metas[i].getAttribute("content");
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
async function findAndActivateCategories() {
|
||||
const currentPagePath = offsetAbsoluteUrl(window.location.href);
|
||||
const response = await fetch(offsetRelativeUrl("listings.json"));
|
||||
if (response.status == 200) {
|
||||
return response.json().then(function (listingPaths) {
|
||||
const listingHrefs = [];
|
||||
for (const listingPath of listingPaths) {
|
||||
const pathWithoutLeadingSlash = listingPath.listing.substring(1);
|
||||
for (const item of listingPath.items) {
|
||||
if (
|
||||
item === currentPagePath ||
|
||||
item === currentPagePath + "index.html"
|
||||
) {
|
||||
// Resolve this path against the offset to be sure
|
||||
// we already are using the correct path to the listing
|
||||
// (this adjusts the listing urls to be rooted against
|
||||
// whatever root the page is actually running against)
|
||||
const relative = offsetRelativeUrl(pathWithoutLeadingSlash);
|
||||
const baseUrl = window.location;
|
||||
const resolvedPath = new URL(relative, baseUrl);
|
||||
listingHrefs.push(resolvedPath.pathname);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Look up the tree for a nearby linting and use that if we find one
|
||||
const nearestListing = findNearestParentListing(
|
||||
offsetAbsoluteUrl(window.location.pathname),
|
||||
listingHrefs
|
||||
);
|
||||
if (nearestListing) {
|
||||
activateCategories(nearestListing);
|
||||
} else {
|
||||
// See if the referrer is a listing page for this item
|
||||
const referredRelativePath = offsetAbsoluteUrl(document.referrer);
|
||||
const referrerListing = listingHrefs.find((listingHref) => {
|
||||
const isListingReferrer =
|
||||
listingHref === referredRelativePath ||
|
||||
listingHref === referredRelativePath + "index.html";
|
||||
return isListingReferrer;
|
||||
});
|
||||
|
||||
if (referrerListing) {
|
||||
// Try to use the referrer if possible
|
||||
activateCategories(referrerListing);
|
||||
} else if (listingHrefs.length > 0) {
|
||||
// Otherwise, just fall back to the first listing
|
||||
activateCategories(listingHrefs[0]);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
if (hasTitleCategories()) {
|
||||
findAndActivateCategories();
|
||||
}
|
||||
|
||||
const findNearestParentListing = (href, listingHrefs) => {
|
||||
if (!href || !listingHrefs) {
|
||||
return undefined;
|
||||
}
|
||||
// Look up the tree for a nearby linting and use that if we find one
|
||||
const relativeParts = href.substring(1).split("/");
|
||||
while (relativeParts.length > 0) {
|
||||
const path = relativeParts.join("/");
|
||||
for (const listingHref of listingHrefs) {
|
||||
if (listingHref.startsWith(path)) {
|
||||
return listingHref;
|
||||
}
|
||||
}
|
||||
relativeParts.pop();
|
||||
}
|
||||
|
||||
return undefined;
|
||||
};
|
||||
|
||||
const manageSidebarVisiblity = (el, placeholderDescriptor) => {
|
||||
let isVisible = true;
|
||||
let elRect;
|
||||
|
||||
return (hiddenRegions) => {
|
||||
if (el === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Find the last element of the TOC
|
||||
const lastChildEl = el.lastElementChild;
|
||||
|
||||
if (lastChildEl) {
|
||||
// Converts the sidebar to a menu
|
||||
const convertToMenu = () => {
|
||||
for (const child of el.children) {
|
||||
child.style.opacity = 0;
|
||||
child.style.overflow = "hidden";
|
||||
child.style.pointerEvents = "none";
|
||||
}
|
||||
|
||||
nexttick(() => {
|
||||
const toggleContainer = window.document.createElement("div");
|
||||
toggleContainer.style.width = "100%";
|
||||
toggleContainer.classList.add("zindex-over-content");
|
||||
toggleContainer.classList.add("quarto-sidebar-toggle");
|
||||
toggleContainer.classList.add("headroom-target"); // Marks this to be managed by headeroom
|
||||
toggleContainer.id = placeholderDescriptor.id;
|
||||
toggleContainer.style.position = "fixed";
|
||||
|
||||
const toggleIcon = window.document.createElement("i");
|
||||
toggleIcon.classList.add("quarto-sidebar-toggle-icon");
|
||||
toggleIcon.classList.add("bi");
|
||||
toggleIcon.classList.add("bi-caret-down-fill");
|
||||
|
||||
const toggleTitle = window.document.createElement("div");
|
||||
const titleEl = window.document.body.querySelector(
|
||||
placeholderDescriptor.titleSelector
|
||||
);
|
||||
if (titleEl) {
|
||||
toggleTitle.append(
|
||||
titleEl.textContent || titleEl.innerText,
|
||||
toggleIcon
|
||||
);
|
||||
}
|
||||
toggleTitle.classList.add("zindex-over-content");
|
||||
toggleTitle.classList.add("quarto-sidebar-toggle-title");
|
||||
toggleContainer.append(toggleTitle);
|
||||
|
||||
const toggleContents = window.document.createElement("div");
|
||||
toggleContents.classList = el.classList;
|
||||
toggleContents.classList.add("zindex-over-content");
|
||||
toggleContents.classList.add("quarto-sidebar-toggle-contents");
|
||||
for (const child of el.children) {
|
||||
if (child.id === "toc-title") {
|
||||
continue;
|
||||
}
|
||||
|
||||
const clone = child.cloneNode(true);
|
||||
clone.style.opacity = 1;
|
||||
clone.style.pointerEvents = null;
|
||||
clone.style.display = null;
|
||||
toggleContents.append(clone);
|
||||
}
|
||||
toggleContents.style.height = "0px";
|
||||
const positionToggle = () => {
|
||||
// position the element (top left of parent, same width as parent)
|
||||
if (!elRect) {
|
||||
elRect = el.getBoundingClientRect();
|
||||
}
|
||||
toggleContainer.style.left = `${elRect.left}px`;
|
||||
toggleContainer.style.top = `${elRect.top}px`;
|
||||
toggleContainer.style.width = `${elRect.width}px`;
|
||||
};
|
||||
positionToggle();
|
||||
|
||||
toggleContainer.append(toggleContents);
|
||||
el.parentElement.prepend(toggleContainer);
|
||||
|
||||
// Process clicks
|
||||
let tocShowing = false;
|
||||
// Allow the caller to control whether this is dismissed
|
||||
// when it is clicked (e.g. sidebar navigation supports
|
||||
// opening and closing the nav tree, so don't dismiss on click)
|
||||
const clickEl = placeholderDescriptor.dismissOnClick
|
||||
? toggleContainer
|
||||
: toggleTitle;
|
||||
|
||||
const closeToggle = () => {
|
||||
if (tocShowing) {
|
||||
toggleContainer.classList.remove("expanded");
|
||||
toggleContents.style.height = "0px";
|
||||
tocShowing = false;
|
||||
}
|
||||
};
|
||||
|
||||
// Get rid of any expanded toggle if the user scrolls
|
||||
window.document.addEventListener(
|
||||
"scroll",
|
||||
throttle(() => {
|
||||
closeToggle();
|
||||
}, 50)
|
||||
);
|
||||
|
||||
// Handle positioning of the toggle
|
||||
window.addEventListener(
|
||||
"resize",
|
||||
throttle(() => {
|
||||
elRect = undefined;
|
||||
positionToggle();
|
||||
}, 50)
|
||||
);
|
||||
|
||||
window.addEventListener("quarto-hrChanged", () => {
|
||||
elRect = undefined;
|
||||
});
|
||||
|
||||
// Process the click
|
||||
clickEl.onclick = () => {
|
||||
if (!tocShowing) {
|
||||
toggleContainer.classList.add("expanded");
|
||||
toggleContents.style.height = null;
|
||||
tocShowing = true;
|
||||
} else {
|
||||
closeToggle();
|
||||
}
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
// Converts a sidebar from a menu back to a sidebar
|
||||
const convertToSidebar = () => {
|
||||
for (const child of el.children) {
|
||||
child.style.opacity = 1;
|
||||
child.style.overflow = null;
|
||||
child.style.pointerEvents = null;
|
||||
}
|
||||
|
||||
const placeholderEl = window.document.getElementById(
|
||||
placeholderDescriptor.id
|
||||
);
|
||||
if (placeholderEl) {
|
||||
placeholderEl.remove();
|
||||
}
|
||||
|
||||
el.classList.remove("rollup");
|
||||
};
|
||||
|
||||
if (isReaderMode()) {
|
||||
convertToMenu();
|
||||
isVisible = false;
|
||||
} else {
|
||||
// Find the top and bottom o the element that is being managed
|
||||
const elTop = el.offsetTop;
|
||||
const elBottom =
|
||||
elTop + lastChildEl.offsetTop + lastChildEl.offsetHeight;
|
||||
|
||||
if (!isVisible) {
|
||||
// If the element is current not visible reveal if there are
|
||||
// no conflicts with overlay regions
|
||||
if (!inHiddenRegion(elTop, elBottom, hiddenRegions)) {
|
||||
convertToSidebar();
|
||||
isVisible = true;
|
||||
}
|
||||
} else {
|
||||
// If the element is visible, hide it if it conflicts with overlay regions
|
||||
// and insert a placeholder toggle (or if we're in reader mode)
|
||||
if (inHiddenRegion(elTop, elBottom, hiddenRegions)) {
|
||||
convertToMenu();
|
||||
isVisible = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
const tabEls = document.querySelectorAll('a[data-bs-toggle="tab"]');
|
||||
for (const tabEl of tabEls) {
|
||||
const id = tabEl.getAttribute("data-bs-target");
|
||||
if (id) {
|
||||
const columnEl = document.querySelector(
|
||||
`${id} .column-margin, .tabset-margin-content`
|
||||
);
|
||||
if (columnEl)
|
||||
tabEl.addEventListener("shown.bs.tab", function (event) {
|
||||
const el = event.srcElement;
|
||||
if (el) {
|
||||
const visibleCls = `${el.id}-margin-content`;
|
||||
// walk up until we find a parent tabset
|
||||
let panelTabsetEl = el.parentElement;
|
||||
while (panelTabsetEl) {
|
||||
if (panelTabsetEl.classList.contains("panel-tabset")) {
|
||||
break;
|
||||
}
|
||||
panelTabsetEl = panelTabsetEl.parentElement;
|
||||
}
|
||||
|
||||
if (panelTabsetEl) {
|
||||
const prevSib = panelTabsetEl.previousElementSibling;
|
||||
if (
|
||||
prevSib &&
|
||||
prevSib.classList.contains("tabset-margin-container")
|
||||
) {
|
||||
const childNodes = prevSib.querySelectorAll(
|
||||
".tabset-margin-content"
|
||||
);
|
||||
for (const childEl of childNodes) {
|
||||
if (childEl.classList.contains(visibleCls)) {
|
||||
childEl.classList.remove("collapse");
|
||||
} else {
|
||||
childEl.classList.add("collapse");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
layoutMarginEls();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Manage the visibility of the toc and the sidebar
|
||||
const marginScrollVisibility = manageSidebarVisiblity(marginSidebarEl, {
|
||||
id: "quarto-toc-toggle",
|
||||
titleSelector: "#toc-title",
|
||||
dismissOnClick: true,
|
||||
});
|
||||
const sidebarScrollVisiblity = manageSidebarVisiblity(sidebarEl, {
|
||||
id: "quarto-sidebarnav-toggle",
|
||||
titleSelector: ".title",
|
||||
dismissOnClick: false,
|
||||
});
|
||||
let tocLeftScrollVisibility;
|
||||
if (leftTocEl) {
|
||||
tocLeftScrollVisibility = manageSidebarVisiblity(leftTocEl, {
|
||||
id: "quarto-lefttoc-toggle",
|
||||
titleSelector: "#toc-title",
|
||||
dismissOnClick: true,
|
||||
});
|
||||
}
|
||||
|
||||
// Find the first element that uses formatting in special columns
|
||||
const conflictingEls = window.document.body.querySelectorAll(
|
||||
'[class^="column-"], [class*=" column-"], aside, [class*="margin-caption"], [class*=" margin-caption"], [class*="margin-ref"], [class*=" margin-ref"]'
|
||||
);
|
||||
|
||||
// Filter all the possibly conflicting elements into ones
|
||||
// the do conflict on the left or ride side
|
||||
const arrConflictingEls = Array.from(conflictingEls);
|
||||
const leftSideConflictEls = arrConflictingEls.filter((el) => {
|
||||
if (el.tagName === "ASIDE") {
|
||||
return false;
|
||||
}
|
||||
return Array.from(el.classList).find((className) => {
|
||||
return (
|
||||
className !== "column-body" &&
|
||||
className.startsWith("column-") &&
|
||||
!className.endsWith("right") &&
|
||||
!className.endsWith("container") &&
|
||||
className !== "column-margin"
|
||||
);
|
||||
});
|
||||
});
|
||||
const rightSideConflictEls = arrConflictingEls.filter((el) => {
|
||||
if (el.tagName === "ASIDE") {
|
||||
return true;
|
||||
}
|
||||
|
||||
const hasMarginCaption = Array.from(el.classList).find((className) => {
|
||||
return className == "margin-caption";
|
||||
});
|
||||
if (hasMarginCaption) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return Array.from(el.classList).find((className) => {
|
||||
return (
|
||||
className !== "column-body" &&
|
||||
!className.endsWith("container") &&
|
||||
className.startsWith("column-") &&
|
||||
!className.endsWith("left")
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
const kOverlapPaddingSize = 10;
|
||||
function toRegions(els) {
|
||||
return els.map((el) => {
|
||||
const boundRect = el.getBoundingClientRect();
|
||||
const top =
|
||||
boundRect.top +
|
||||
document.documentElement.scrollTop -
|
||||
kOverlapPaddingSize;
|
||||
return {
|
||||
top,
|
||||
bottom: top + el.scrollHeight + 2 * kOverlapPaddingSize,
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
let hasObserved = false;
|
||||
const visibleItemObserver = (els) => {
|
||||
let visibleElements = [...els];
|
||||
const intersectionObserver = new IntersectionObserver(
|
||||
(entries, _observer) => {
|
||||
entries.forEach((entry) => {
|
||||
if (entry.isIntersecting) {
|
||||
if (visibleElements.indexOf(entry.target) === -1) {
|
||||
visibleElements.push(entry.target);
|
||||
}
|
||||
} else {
|
||||
visibleElements = visibleElements.filter((visibleEntry) => {
|
||||
return visibleEntry !== entry;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
if (!hasObserved) {
|
||||
hideOverlappedSidebars();
|
||||
}
|
||||
hasObserved = true;
|
||||
},
|
||||
{}
|
||||
);
|
||||
els.forEach((el) => {
|
||||
intersectionObserver.observe(el);
|
||||
});
|
||||
|
||||
return {
|
||||
getVisibleEntries: () => {
|
||||
return visibleElements;
|
||||
},
|
||||
};
|
||||
};
|
||||
|
||||
const rightElementObserver = visibleItemObserver(rightSideConflictEls);
|
||||
const leftElementObserver = visibleItemObserver(leftSideConflictEls);
|
||||
|
||||
const hideOverlappedSidebars = () => {
|
||||
marginScrollVisibility(toRegions(rightElementObserver.getVisibleEntries()));
|
||||
sidebarScrollVisiblity(toRegions(leftElementObserver.getVisibleEntries()));
|
||||
if (tocLeftScrollVisibility) {
|
||||
tocLeftScrollVisibility(
|
||||
toRegions(leftElementObserver.getVisibleEntries())
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
window.quartoToggleReader = () => {
|
||||
// Applies a slow class (or removes it)
|
||||
// to update the transition speed
|
||||
const slowTransition = (slow) => {
|
||||
const manageTransition = (id, slow) => {
|
||||
const el = document.getElementById(id);
|
||||
if (el) {
|
||||
if (slow) {
|
||||
el.classList.add("slow");
|
||||
} else {
|
||||
el.classList.remove("slow");
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
manageTransition("TOC", slow);
|
||||
manageTransition("quarto-sidebar", slow);
|
||||
};
|
||||
const readerMode = !isReaderMode();
|
||||
setReaderModeValue(readerMode);
|
||||
|
||||
// If we're entering reader mode, slow the transition
|
||||
if (readerMode) {
|
||||
slowTransition(readerMode);
|
||||
}
|
||||
highlightReaderToggle(readerMode);
|
||||
hideOverlappedSidebars();
|
||||
|
||||
// If we're exiting reader mode, restore the non-slow transition
|
||||
if (!readerMode) {
|
||||
slowTransition(!readerMode);
|
||||
}
|
||||
};
|
||||
|
||||
const highlightReaderToggle = (readerMode) => {
|
||||
const els = document.querySelectorAll(".quarto-reader-toggle");
|
||||
if (els) {
|
||||
els.forEach((el) => {
|
||||
if (readerMode) {
|
||||
el.classList.add("reader");
|
||||
} else {
|
||||
el.classList.remove("reader");
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
const setReaderModeValue = (val) => {
|
||||
if (window.location.protocol !== "file:") {
|
||||
window.localStorage.setItem("quarto-reader-mode", val);
|
||||
} else {
|
||||
localReaderMode = val;
|
||||
}
|
||||
};
|
||||
|
||||
const isReaderMode = () => {
|
||||
if (window.location.protocol !== "file:") {
|
||||
return window.localStorage.getItem("quarto-reader-mode") === "true";
|
||||
} else {
|
||||
return localReaderMode;
|
||||
}
|
||||
};
|
||||
let localReaderMode = null;
|
||||
|
||||
const tocOpenDepthStr = tocEl?.getAttribute("data-toc-expanded");
|
||||
const tocOpenDepth = tocOpenDepthStr ? Number(tocOpenDepthStr) : 1;
|
||||
|
||||
// Walk the TOC and collapse/expand nodes
|
||||
// Nodes are expanded if:
|
||||
// - they are top level
|
||||
// - they have children that are 'active' links
|
||||
// - they are directly below an link that is 'active'
|
||||
const walk = (el, depth) => {
|
||||
// Tick depth when we enter a UL
|
||||
if (el.tagName === "UL") {
|
||||
depth = depth + 1;
|
||||
}
|
||||
|
||||
// It this is active link
|
||||
let isActiveNode = false;
|
||||
if (el.tagName === "A" && el.classList.contains("active")) {
|
||||
isActiveNode = true;
|
||||
}
|
||||
|
||||
// See if there is an active child to this element
|
||||
let hasActiveChild = false;
|
||||
for (child of el.children) {
|
||||
hasActiveChild = walk(child, depth) || hasActiveChild;
|
||||
}
|
||||
|
||||
// Process the collapse state if this is an UL
|
||||
if (el.tagName === "UL") {
|
||||
if (tocOpenDepth === -1 && depth > 1) {
|
||||
// toc-expand: false
|
||||
el.classList.add("collapse");
|
||||
} else if (
|
||||
depth <= tocOpenDepth ||
|
||||
hasActiveChild ||
|
||||
prevSiblingIsActiveLink(el)
|
||||
) {
|
||||
el.classList.remove("collapse");
|
||||
} else {
|
||||
el.classList.add("collapse");
|
||||
}
|
||||
|
||||
// untick depth when we leave a UL
|
||||
depth = depth - 1;
|
||||
}
|
||||
return hasActiveChild || isActiveNode;
|
||||
};
|
||||
|
||||
// walk the TOC and expand / collapse any items that should be shown
|
||||
if (tocEl) {
|
||||
updateActiveLink();
|
||||
walk(tocEl, 0);
|
||||
}
|
||||
|
||||
// Throttle the scroll event and walk peridiocally
|
||||
window.document.addEventListener(
|
||||
"scroll",
|
||||
throttle(() => {
|
||||
if (tocEl) {
|
||||
updateActiveLink();
|
||||
walk(tocEl, 0);
|
||||
}
|
||||
if (!isReaderMode()) {
|
||||
hideOverlappedSidebars();
|
||||
}
|
||||
}, 5)
|
||||
);
|
||||
window.addEventListener(
|
||||
"resize",
|
||||
throttle(() => {
|
||||
if (tocEl) {
|
||||
updateActiveLink();
|
||||
walk(tocEl, 0);
|
||||
}
|
||||
if (!isReaderMode()) {
|
||||
hideOverlappedSidebars();
|
||||
}
|
||||
}, 10)
|
||||
);
|
||||
hideOverlappedSidebars();
|
||||
highlightReaderToggle(isReaderMode());
|
||||
});
|
||||
|
||||
// grouped tabsets
|
||||
window.addEventListener("pageshow", (_event) => {
|
||||
function getTabSettings() {
|
||||
const data = localStorage.getItem("quarto-persistent-tabsets-data");
|
||||
if (!data) {
|
||||
localStorage.setItem("quarto-persistent-tabsets-data", "{}");
|
||||
return {};
|
||||
}
|
||||
if (data) {
|
||||
return JSON.parse(data);
|
||||
}
|
||||
}
|
||||
|
||||
function setTabSettings(data) {
|
||||
localStorage.setItem(
|
||||
"quarto-persistent-tabsets-data",
|
||||
JSON.stringify(data)
|
||||
);
|
||||
}
|
||||
|
||||
function setTabState(groupName, groupValue) {
|
||||
const data = getTabSettings();
|
||||
data[groupName] = groupValue;
|
||||
setTabSettings(data);
|
||||
}
|
||||
|
||||
function toggleTab(tab, active) {
|
||||
const tabPanelId = tab.getAttribute("aria-controls");
|
||||
const tabPanel = document.getElementById(tabPanelId);
|
||||
if (active) {
|
||||
tab.classList.add("active");
|
||||
tabPanel.classList.add("active");
|
||||
} else {
|
||||
tab.classList.remove("active");
|
||||
tabPanel.classList.remove("active");
|
||||
}
|
||||
}
|
||||
|
||||
function toggleAll(selectedGroup, selectorsToSync) {
|
||||
for (const [thisGroup, tabs] of Object.entries(selectorsToSync)) {
|
||||
const active = selectedGroup === thisGroup;
|
||||
for (const tab of tabs) {
|
||||
toggleTab(tab, active);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function findSelectorsToSyncByLanguage() {
|
||||
const result = {};
|
||||
const tabs = Array.from(
|
||||
document.querySelectorAll(`div[data-group] a[id^='tabset-']`)
|
||||
);
|
||||
for (const item of tabs) {
|
||||
const div = item.parentElement.parentElement.parentElement;
|
||||
const group = div.getAttribute("data-group");
|
||||
if (!result[group]) {
|
||||
result[group] = {};
|
||||
}
|
||||
const selectorsToSync = result[group];
|
||||
const value = item.innerHTML;
|
||||
if (!selectorsToSync[value]) {
|
||||
selectorsToSync[value] = [];
|
||||
}
|
||||
selectorsToSync[value].push(item);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function setupSelectorSync() {
|
||||
const selectorsToSync = findSelectorsToSyncByLanguage();
|
||||
Object.entries(selectorsToSync).forEach(([group, tabSetsByValue]) => {
|
||||
Object.entries(tabSetsByValue).forEach(([value, items]) => {
|
||||
items.forEach((item) => {
|
||||
item.addEventListener("click", (_event) => {
|
||||
setTabState(group, value);
|
||||
toggleAll(value, selectorsToSync[group]);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
return selectorsToSync;
|
||||
}
|
||||
|
||||
const selectorsToSync = setupSelectorSync();
|
||||
for (const [group, selectedName] of Object.entries(getTabSettings())) {
|
||||
const selectors = selectorsToSync[group];
|
||||
// it's possible that stale state gives us empty selections, so we explicitly check here.
|
||||
if (selectors) {
|
||||
toggleAll(selectedName, selectors);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function throttle(func, wait) {
|
||||
let waiting = false;
|
||||
return function () {
|
||||
if (!waiting) {
|
||||
func.apply(this, arguments);
|
||||
waiting = true;
|
||||
setTimeout(function () {
|
||||
waiting = false;
|
||||
}, wait);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function nexttick(func) {
|
||||
return setTimeout(func, 0);
|
||||
}
|
||||
|
|
@ -1 +0,0 @@
|
|||
.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}
|
||||
2
site_libs/quarto-html/tippy.umd.min.js
vendored
2
site_libs/quarto-html/tippy.umd.min.js
vendored
File diff suppressed because one or more lines are too long
7
site_libs/quarto-nav/headroom.min.js
vendored
7
site_libs/quarto-nav/headroom.min.js
vendored
|
|
@ -1,7 +0,0 @@
|
|||
/*!
|
||||
* headroom.js v0.12.0 - Give your page some headroom. Hide your header until you need it
|
||||
* Copyright (c) 2020 Nick Williams - http://wicky.nillia.ms/headroom.js
|
||||
* License: MIT
|
||||
*/
|
||||
|
||||
!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t=t||self).Headroom=n()}(this,function(){"use strict";function t(){return"undefined"!=typeof window}function d(t){return function(t){return t&&t.document&&function(t){return 9===t.nodeType}(t.document)}(t)?function(t){var n=t.document,o=n.body,s=n.documentElement;return{scrollHeight:function(){return Math.max(o.scrollHeight,s.scrollHeight,o.offsetHeight,s.offsetHeight,o.clientHeight,s.clientHeight)},height:function(){return t.innerHeight||s.clientHeight||o.clientHeight},scrollY:function(){return void 0!==t.pageYOffset?t.pageYOffset:(s||o.parentNode||o).scrollTop}}}(t):function(t){return{scrollHeight:function(){return Math.max(t.scrollHeight,t.offsetHeight,t.clientHeight)},height:function(){return Math.max(t.offsetHeight,t.clientHeight)},scrollY:function(){return t.scrollTop}}}(t)}function n(t,s,e){var n,o=function(){var n=!1;try{var t={get passive(){n=!0}};window.addEventListener("test",t,t),window.removeEventListener("test",t,t)}catch(t){n=!1}return n}(),i=!1,r=d(t),l=r.scrollY(),a={};function c(){var t=Math.round(r.scrollY()),n=r.height(),o=r.scrollHeight();a.scrollY=t,a.lastScrollY=l,a.direction=l<t?"down":"up",a.distance=Math.abs(t-l),a.isOutOfBounds=t<0||o<t+n,a.top=t<=s.offset[a.direction],a.bottom=o<=t+n,a.toleranceExceeded=a.distance>s.tolerance[a.direction],e(a),l=t,i=!1}function h(){i||(i=!0,n=requestAnimationFrame(c))}var u=!!o&&{passive:!0,capture:!1};return t.addEventListener("scroll",h,u),c(),{destroy:function(){cancelAnimationFrame(n),t.removeEventListener("scroll",h,u)}}}function o(t){return t===Object(t)?t:{down:t,up:t}}function s(t,n){n=n||{},Object.assign(this,s.options,n),this.classes=Object.assign({},s.options.classes,n.classes),this.elem=t,this.tolerance=o(this.tolerance),this.offset=o(this.offset),this.initialised=!1,this.frozen=!1}return s.prototype={constructor:s,init:function(){return s.cutsTheMustard&&!this.initialised&&(this.addClass("initial"),this.initialised=!0,setTimeout(function(t){t.scrollTracker=n(t.scroller,{offset:t.offset,tolerance:t.tolerance},t.update.bind(t))},100,this)),this},destroy:function(){this.initialised=!1,Object.keys(this.classes).forEach(this.removeClass,this),this.scrollTracker.destroy()},unpin:function(){!this.hasClass("pinned")&&this.hasClass("unpinned")||(this.addClass("unpinned"),this.removeClass("pinned"),this.onUnpin&&this.onUnpin.call(this))},pin:function(){this.hasClass("unpinned")&&(this.addClass("pinned"),this.removeClass("unpinned"),this.onPin&&this.onPin.call(this))},freeze:function(){this.frozen=!0,this.addClass("frozen")},unfreeze:function(){this.frozen=!1,this.removeClass("frozen")},top:function(){this.hasClass("top")||(this.addClass("top"),this.removeClass("notTop"),this.onTop&&this.onTop.call(this))},notTop:function(){this.hasClass("notTop")||(this.addClass("notTop"),this.removeClass("top"),this.onNotTop&&this.onNotTop.call(this))},bottom:function(){this.hasClass("bottom")||(this.addClass("bottom"),this.removeClass("notBottom"),this.onBottom&&this.onBottom.call(this))},notBottom:function(){this.hasClass("notBottom")||(this.addClass("notBottom"),this.removeClass("bottom"),this.onNotBottom&&this.onNotBottom.call(this))},shouldUnpin:function(t){return"down"===t.direction&&!t.top&&t.toleranceExceeded},shouldPin:function(t){return"up"===t.direction&&t.toleranceExceeded||t.top},addClass:function(t){this.elem.classList.add.apply(this.elem.classList,this.classes[t].split(" "))},removeClass:function(t){this.elem.classList.remove.apply(this.elem.classList,this.classes[t].split(" "))},hasClass:function(t){return this.classes[t].split(" ").every(function(t){return this.classList.contains(t)},this.elem)},update:function(t){t.isOutOfBounds||!0!==this.frozen&&(t.top?this.top():this.notTop(),t.bottom?this.bottom():this.notBottom(),this.shouldUnpin(t)?this.unpin():this.shouldPin(t)&&this.pin())}},s.options={tolerance:{up:0,down:0},offset:0,scroller:t()?window:null,classes:{frozen:"headroom--frozen",pinned:"headroom--pinned",unpinned:"headroom--unpinned",top:"headroom--top",notTop:"headroom--not-top",bottom:"headroom--bottom",notBottom:"headroom--not-bottom",initial:"headroom"}},s.cutsTheMustard=!!(t()&&function(){}.bind&&"classList"in document.documentElement&&Object.assign&&Object.keys&&requestAnimationFrame),s});
|
||||
|
|
@ -1,325 +0,0 @@
|
|||
const headroomChanged = new CustomEvent("quarto-hrChanged", {
|
||||
detail: {},
|
||||
bubbles: true,
|
||||
cancelable: false,
|
||||
composed: false,
|
||||
});
|
||||
|
||||
const announceDismiss = () => {
|
||||
const annEl = window.document.getElementById("quarto-announcement");
|
||||
if (annEl) {
|
||||
annEl.remove();
|
||||
|
||||
const annId = annEl.getAttribute("data-announcement-id");
|
||||
window.localStorage.setItem(`quarto-announce-${annId}`, "true");
|
||||
}
|
||||
};
|
||||
|
||||
const announceRegister = () => {
|
||||
const annEl = window.document.getElementById("quarto-announcement");
|
||||
if (annEl) {
|
||||
const annId = annEl.getAttribute("data-announcement-id");
|
||||
const isDismissed =
|
||||
window.localStorage.getItem(`quarto-announce-${annId}`) || false;
|
||||
if (isDismissed) {
|
||||
announceDismiss();
|
||||
return;
|
||||
} else {
|
||||
annEl.classList.remove("hidden");
|
||||
}
|
||||
|
||||
const actionEl = annEl.querySelector(".quarto-announcement-action");
|
||||
if (actionEl) {
|
||||
actionEl.addEventListener("click", function (e) {
|
||||
e.preventDefault();
|
||||
// Hide the bar immediately
|
||||
announceDismiss();
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
window.document.addEventListener("DOMContentLoaded", function () {
|
||||
let init = false;
|
||||
|
||||
announceRegister();
|
||||
|
||||
// Manage the back to top button, if one is present.
|
||||
let lastScrollTop = window.pageYOffset || document.documentElement.scrollTop;
|
||||
const scrollDownBuffer = 5;
|
||||
const scrollUpBuffer = 35;
|
||||
const btn = document.getElementById("quarto-back-to-top");
|
||||
const hideBackToTop = () => {
|
||||
btn.style.display = "none";
|
||||
};
|
||||
const showBackToTop = () => {
|
||||
btn.style.display = "inline-block";
|
||||
};
|
||||
if (btn) {
|
||||
window.document.addEventListener(
|
||||
"scroll",
|
||||
function () {
|
||||
const currentScrollTop =
|
||||
window.pageYOffset || document.documentElement.scrollTop;
|
||||
|
||||
// Shows and hides the button 'intelligently' as the user scrolls
|
||||
if (currentScrollTop - scrollDownBuffer > lastScrollTop) {
|
||||
hideBackToTop();
|
||||
lastScrollTop = currentScrollTop <= 0 ? 0 : currentScrollTop;
|
||||
} else if (currentScrollTop < lastScrollTop - scrollUpBuffer) {
|
||||
showBackToTop();
|
||||
lastScrollTop = currentScrollTop <= 0 ? 0 : currentScrollTop;
|
||||
}
|
||||
|
||||
// Show the button at the bottom, hides it at the top
|
||||
if (currentScrollTop <= 0) {
|
||||
hideBackToTop();
|
||||
} else if (
|
||||
window.innerHeight + currentScrollTop >=
|
||||
document.body.offsetHeight
|
||||
) {
|
||||
showBackToTop();
|
||||
}
|
||||
},
|
||||
false
|
||||
);
|
||||
}
|
||||
|
||||
function throttle(func, wait) {
|
||||
var timeout;
|
||||
return function () {
|
||||
const context = this;
|
||||
const args = arguments;
|
||||
const later = function () {
|
||||
clearTimeout(timeout);
|
||||
timeout = null;
|
||||
func.apply(context, args);
|
||||
};
|
||||
|
||||
if (!timeout) {
|
||||
timeout = setTimeout(later, wait);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
function headerOffset() {
|
||||
// Set an offset if there is are fixed top navbar
|
||||
const headerEl = window.document.querySelector("header.fixed-top");
|
||||
if (headerEl) {
|
||||
return headerEl.clientHeight;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
function footerOffset() {
|
||||
const footerEl = window.document.querySelector("footer.footer");
|
||||
if (footerEl) {
|
||||
return footerEl.clientHeight;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
function dashboardOffset() {
|
||||
const dashboardNavEl = window.document.getElementById(
|
||||
"quarto-dashboard-header"
|
||||
);
|
||||
if (dashboardNavEl !== null) {
|
||||
return dashboardNavEl.clientHeight;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
function updateDocumentOffsetWithoutAnimation() {
|
||||
updateDocumentOffset(false);
|
||||
}
|
||||
|
||||
function updateDocumentOffset(animated) {
|
||||
// set body offset
|
||||
const topOffset = headerOffset();
|
||||
const bodyOffset = topOffset + footerOffset() + dashboardOffset();
|
||||
const bodyEl = window.document.body;
|
||||
bodyEl.setAttribute("data-bs-offset", topOffset);
|
||||
bodyEl.style.paddingTop = topOffset + "px";
|
||||
|
||||
// deal with sidebar offsets
|
||||
const sidebars = window.document.querySelectorAll(
|
||||
".sidebar, .headroom-target"
|
||||
);
|
||||
sidebars.forEach((sidebar) => {
|
||||
if (!animated) {
|
||||
sidebar.classList.add("notransition");
|
||||
// Remove the no transition class after the animation has time to complete
|
||||
setTimeout(function () {
|
||||
sidebar.classList.remove("notransition");
|
||||
}, 201);
|
||||
}
|
||||
|
||||
if (window.Headroom && sidebar.classList.contains("sidebar-unpinned")) {
|
||||
sidebar.style.top = "0";
|
||||
sidebar.style.maxHeight = "100vh";
|
||||
} else {
|
||||
sidebar.style.top = topOffset + "px";
|
||||
sidebar.style.maxHeight = "calc(100vh - " + topOffset + "px)";
|
||||
}
|
||||
});
|
||||
|
||||
// allow space for footer
|
||||
const mainContainer = window.document.querySelector(".quarto-container");
|
||||
if (mainContainer) {
|
||||
mainContainer.style.minHeight = "calc(100vh - " + bodyOffset + "px)";
|
||||
}
|
||||
|
||||
// link offset
|
||||
let linkStyle = window.document.querySelector("#quarto-target-style");
|
||||
if (!linkStyle) {
|
||||
linkStyle = window.document.createElement("style");
|
||||
linkStyle.setAttribute("id", "quarto-target-style");
|
||||
window.document.head.appendChild(linkStyle);
|
||||
}
|
||||
while (linkStyle.firstChild) {
|
||||
linkStyle.removeChild(linkStyle.firstChild);
|
||||
}
|
||||
if (topOffset > 0) {
|
||||
linkStyle.appendChild(
|
||||
window.document.createTextNode(`
|
||||
section:target::before {
|
||||
content: "";
|
||||
display: block;
|
||||
height: ${topOffset}px;
|
||||
margin: -${topOffset}px 0 0;
|
||||
}`)
|
||||
);
|
||||
}
|
||||
if (init) {
|
||||
window.dispatchEvent(headroomChanged);
|
||||
}
|
||||
init = true;
|
||||
}
|
||||
|
||||
// initialize headroom
|
||||
var header = window.document.querySelector("#quarto-header");
|
||||
if (header && window.Headroom) {
|
||||
const headroom = new window.Headroom(header, {
|
||||
tolerance: 5,
|
||||
onPin: function () {
|
||||
const sidebars = window.document.querySelectorAll(
|
||||
".sidebar, .headroom-target"
|
||||
);
|
||||
sidebars.forEach((sidebar) => {
|
||||
sidebar.classList.remove("sidebar-unpinned");
|
||||
});
|
||||
updateDocumentOffset();
|
||||
},
|
||||
onUnpin: function () {
|
||||
const sidebars = window.document.querySelectorAll(
|
||||
".sidebar, .headroom-target"
|
||||
);
|
||||
sidebars.forEach((sidebar) => {
|
||||
sidebar.classList.add("sidebar-unpinned");
|
||||
});
|
||||
updateDocumentOffset();
|
||||
},
|
||||
});
|
||||
headroom.init();
|
||||
|
||||
let frozen = false;
|
||||
window.quartoToggleHeadroom = function () {
|
||||
if (frozen) {
|
||||
headroom.unfreeze();
|
||||
frozen = false;
|
||||
} else {
|
||||
headroom.freeze();
|
||||
frozen = true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
window.addEventListener(
|
||||
"hashchange",
|
||||
function (e) {
|
||||
if (
|
||||
getComputedStyle(document.documentElement).scrollBehavior !== "smooth"
|
||||
) {
|
||||
window.scrollTo(0, window.pageYOffset - headerOffset());
|
||||
}
|
||||
},
|
||||
false
|
||||
);
|
||||
|
||||
// Observe size changed for the header
|
||||
const headerEl = window.document.querySelector("header.fixed-top");
|
||||
if (headerEl && window.ResizeObserver) {
|
||||
const observer = new window.ResizeObserver(() => {
|
||||
setTimeout(updateDocumentOffsetWithoutAnimation, 0);
|
||||
});
|
||||
observer.observe(headerEl, {
|
||||
attributes: true,
|
||||
childList: true,
|
||||
characterData: true,
|
||||
});
|
||||
} else {
|
||||
window.addEventListener(
|
||||
"resize",
|
||||
throttle(updateDocumentOffsetWithoutAnimation, 50)
|
||||
);
|
||||
}
|
||||
setTimeout(updateDocumentOffsetWithoutAnimation, 250);
|
||||
|
||||
// fixup index.html links if we aren't on the filesystem
|
||||
if (window.location.protocol !== "file:") {
|
||||
const links = window.document.querySelectorAll("a");
|
||||
for (let i = 0; i < links.length; i++) {
|
||||
if (links[i].href) {
|
||||
links[i].dataset.originalHref = links[i].href;
|
||||
links[i].href = links[i].href.replace(/\/index\.html/, "/");
|
||||
}
|
||||
}
|
||||
|
||||
// Fixup any sharing links that require urls
|
||||
// Append url to any sharing urls
|
||||
const sharingLinks = window.document.querySelectorAll(
|
||||
"a.sidebar-tools-main-item, a.quarto-navigation-tool, a.quarto-navbar-tools, a.quarto-navbar-tools-item"
|
||||
);
|
||||
for (let i = 0; i < sharingLinks.length; i++) {
|
||||
const sharingLink = sharingLinks[i];
|
||||
const href = sharingLink.getAttribute("href");
|
||||
if (href) {
|
||||
sharingLink.setAttribute(
|
||||
"href",
|
||||
href.replace("|url|", window.location.href)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Scroll the active navigation item into view, if necessary
|
||||
const navSidebar = window.document.querySelector("nav#quarto-sidebar");
|
||||
if (navSidebar) {
|
||||
// Find the active item
|
||||
const activeItem = navSidebar.querySelector("li.sidebar-item a.active");
|
||||
if (activeItem) {
|
||||
// Wait for the scroll height and height to resolve by observing size changes on the
|
||||
// nav element that is scrollable
|
||||
const resizeObserver = new ResizeObserver((_entries) => {
|
||||
// The bottom of the element
|
||||
const elBottom = activeItem.offsetTop;
|
||||
const viewBottom = navSidebar.scrollTop + navSidebar.clientHeight;
|
||||
|
||||
// The element height and scroll height are the same, then we are still loading
|
||||
if (viewBottom !== navSidebar.scrollHeight) {
|
||||
// Determine if the item isn't visible and scroll to it
|
||||
if (elBottom >= viewBottom) {
|
||||
navSidebar.scrollTop = elBottom;
|
||||
}
|
||||
|
||||
// stop observing now since we've completed the scroll
|
||||
resizeObserver.unobserve(navSidebar);
|
||||
}
|
||||
});
|
||||
resizeObserver.observe(navSidebar);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
File diff suppressed because one or more lines are too long
9
site_libs/quarto-search/fuse.min.js
vendored
9
site_libs/quarto-search/fuse.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue