├── .gitignore ├── _extensions ├── jjallaire │ └── code-visibility │ │ ├── _extension.yml │ │ └── code-visibility.lua └── quarto-ext │ └── lightbox │ ├── _extension.yml │ ├── lightbox.css │ ├── lightbox.lua │ └── resources │ ├── css │ └── glightbox.min.css │ └── js │ └── glightbox.min.js ├── basic-plot.png ├── cararquarto.scss ├── cloud-workspace ├── fonts │ └── Poppins-Bold.ttf ├── penguin-bakeoff.R ├── penguin-bakeoff.png ├── project.Rproj └── reference-scripts │ ├── 01_installing-the-packages.R │ ├── 02_setting-up-fonts.R │ ├── 03_using-your-own-data.R │ ├── basic_plot.R │ ├── part-1_level-up-with-colours.R │ ├── part-2_level-up-with-text-hierarchy.R │ └── part-3_level-up-with-annotations.R ├── fonts └── BrandonText-Regular.ttf ├── images ├── clapping-pingu.gif ├── dark-background.png ├── dark-logo.png ├── light-logo.png ├── machine.gif └── penguin-bakeoff.png ├── level-up-your-plots_nhsr.html ├── level-up-your-plots_nhsr.qmd ├── level-up-your-plots_nhsr_files ├── figure-revealjs │ ├── unnamed-chunk-1-1.png │ ├── unnamed-chunk-10-1.png │ ├── unnamed-chunk-11-1.png │ ├── unnamed-chunk-12-1.png │ ├── unnamed-chunk-13-1.png │ ├── unnamed-chunk-14-1.png │ ├── unnamed-chunk-15-1.png │ ├── unnamed-chunk-16-1.png │ ├── unnamed-chunk-17-1.png │ ├── unnamed-chunk-18-1.png │ ├── unnamed-chunk-19-1.png │ ├── unnamed-chunk-2-1.png │ ├── unnamed-chunk-20-1.png │ ├── unnamed-chunk-21-1.png │ ├── unnamed-chunk-22-1.png │ ├── unnamed-chunk-23-1.png │ ├── unnamed-chunk-26-1.png │ ├── unnamed-chunk-27-1.png │ ├── unnamed-chunk-28-1.png │ ├── unnamed-chunk-29-1.png │ ├── unnamed-chunk-3-1.png │ ├── unnamed-chunk-30-1.png │ ├── unnamed-chunk-31-1.png │ ├── unnamed-chunk-32-1.png │ ├── unnamed-chunk-33-1.png │ ├── unnamed-chunk-34-1.png │ ├── unnamed-chunk-36-1.png │ ├── unnamed-chunk-37-1.png │ ├── unnamed-chunk-38-1.png │ ├── unnamed-chunk-39-1.png │ ├── unnamed-chunk-4-1.png │ ├── unnamed-chunk-41-1.png │ ├── unnamed-chunk-43-1.png │ ├── unnamed-chunk-44-1.png │ ├── unnamed-chunk-45-1.png │ ├── unnamed-chunk-46-1.png │ ├── unnamed-chunk-47-1.png │ ├── unnamed-chunk-48-1.png │ ├── unnamed-chunk-5-1.png │ ├── unnamed-chunk-53-1.png │ ├── unnamed-chunk-55-1.png │ ├── unnamed-chunk-56-1.png │ ├── unnamed-chunk-57-1.png │ ├── unnamed-chunk-58-1.png │ ├── unnamed-chunk-59-1.png │ ├── unnamed-chunk-6-1.png │ ├── unnamed-chunk-60-1.png │ ├── unnamed-chunk-61-1.png │ ├── unnamed-chunk-62-1.png │ ├── unnamed-chunk-63-1.png │ ├── unnamed-chunk-64-1.png │ ├── unnamed-chunk-65-1.png │ ├── unnamed-chunk-66-1.png │ ├── unnamed-chunk-68-1.png │ ├── unnamed-chunk-69-1.png │ ├── unnamed-chunk-7-1.png │ └── unnamed-chunk-9-1.png └── libs │ ├── clipboard │ └── clipboard.min.js │ ├── countdown-0.4.0 │ ├── countdown.css │ ├── countdown.js │ └── smb_stage_clear.mp3 │ ├── quarto-contrib │ └── glightbox │ │ ├── glightbox.min.css │ │ ├── glightbox.min.js │ │ └── lightbox.css │ ├── quarto-html │ ├── light-border.css │ ├── popper.min.js │ ├── quarto-html.min.css │ ├── quarto-syntax-highlighting.css │ ├── tabby.min.js │ ├── tippy.css │ └── tippy.umd.min.js │ └── revealjs │ ├── dist │ ├── reset.css │ ├── reveal.css │ ├── reveal.esm.js │ ├── reveal.esm.js.map │ ├── reveal.js │ ├── reveal.js.map │ └── theme │ │ ├── fonts │ │ ├── league-gothic │ │ │ ├── LICENSE │ │ │ ├── league-gothic.css │ │ │ ├── league-gothic.eot │ │ │ ├── league-gothic.ttf │ │ │ └── league-gothic.woff │ │ └── source-sans-pro │ │ │ ├── LICENSE │ │ │ ├── source-sans-pro-italic.eot │ │ │ ├── source-sans-pro-italic.ttf │ │ │ ├── source-sans-pro-italic.woff │ │ │ ├── source-sans-pro-regular.eot │ │ │ ├── source-sans-pro-regular.ttf │ │ │ ├── source-sans-pro-regular.woff │ │ │ ├── source-sans-pro-semibold.eot │ │ │ ├── source-sans-pro-semibold.ttf │ │ │ ├── source-sans-pro-semibold.woff │ │ │ ├── source-sans-pro-semibolditalic.eot │ │ │ ├── source-sans-pro-semibolditalic.ttf │ │ │ ├── source-sans-pro-semibolditalic.woff │ │ │ └── source-sans-pro.css │ │ └── quarto.css │ └── plugin │ ├── highlight │ ├── highlight.esm.js │ ├── highlight.js │ ├── monokai.css │ ├── plugin.js │ └── zenburn.css │ ├── markdown │ ├── markdown.esm.js │ ├── markdown.js │ └── plugin.js │ ├── math │ ├── katex.js │ ├── math.esm.js │ ├── math.js │ ├── mathjax2.js │ ├── mathjax3.js │ └── plugin.js │ ├── notes │ ├── notes.esm.js │ ├── notes.js │ ├── plugin.js │ └── speaker-view.html │ ├── pdf-export │ ├── pdfexport.js │ └── plugin.yml │ ├── quarto-line-highlight │ ├── line-highlight.css │ ├── line-highlight.js │ └── plugin.yml │ ├── quarto-support │ ├── footer.css │ ├── plugin.yml │ └── support.js │ ├── reveal-chalkboard │ ├── README.md │ ├── font-awesome │ │ ├── LICENSE.txt │ │ ├── css │ │ │ ├── all.css │ │ │ ├── brands.css │ │ │ ├── fontawesome.css │ │ │ ├── regular.css │ │ │ ├── solid.css │ │ │ ├── svg-with-js.css │ │ │ ├── v4-shims.css │ │ │ └── v4-shims.min.css │ │ └── webfonts │ │ │ ├── fa-brands-400.eot │ │ │ ├── fa-brands-400.svg │ │ │ ├── fa-brands-400.ttf │ │ │ ├── fa-brands-400.woff │ │ │ ├── fa-brands-400.woff2 │ │ │ ├── fa-regular-400.eot │ │ │ ├── fa-regular-400.svg │ │ │ ├── fa-regular-400.ttf │ │ │ ├── fa-regular-400.woff │ │ │ ├── fa-regular-400.woff2 │ │ │ ├── fa-solid-900.eot │ │ │ ├── fa-solid-900.svg │ │ │ ├── fa-solid-900.ttf │ │ │ ├── fa-solid-900.woff │ │ │ └── fa-solid-900.woff2 │ ├── img │ │ ├── blackboard.png │ │ ├── boardmarker-black.png │ │ ├── boardmarker-blue.png │ │ ├── boardmarker-green.png │ │ ├── boardmarker-orange.png │ │ ├── boardmarker-purple.png │ │ ├── boardmarker-red.png │ │ ├── boardmarker-yellow.png │ │ ├── chalk-blue.png │ │ ├── chalk-green.png │ │ ├── chalk-orange.png │ │ ├── chalk-purple.png │ │ ├── chalk-red.png │ │ ├── chalk-white.png │ │ ├── chalk-yellow.png │ │ ├── sponge.png │ │ └── whiteboard.png │ ├── plugin.js │ ├── plugin.yml │ └── style.css │ ├── reveal-menu │ ├── menu.css │ ├── menu.js │ ├── plugin.yml │ ├── quarto-menu.css │ └── quarto-menu.js │ ├── search │ ├── plugin.js │ ├── search.esm.js │ └── search.js │ └── zoom │ ├── plugin.js │ ├── zoom.esm.js │ └── zoom.js └── level-up_workshop.Rproj /.gitignore: -------------------------------------------------------------------------------- 1 | .Rproj.user 2 | .Rhistory 3 | .RData 4 | .Ruserdata 5 | -------------------------------------------------------------------------------- /_extensions/jjallaire/code-visibility/_extension.yml: -------------------------------------------------------------------------------- 1 | title: Code Visibility 2 | author: fast.ai 3 | version: 1.0.0 4 | contributes: 5 | filters: 6 | - code-visibility.lua 7 | -------------------------------------------------------------------------------- /_extensions/jjallaire/code-visibility/code-visibility.lua: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -- remove any lines with the hide_line directive. 5 | function CodeBlock(el) 6 | if el.classes:includes('cell-code') then 7 | el.text = filter_lines(el.text, function(line) 8 | return not line:match("#| ?hide_line%s*$") 9 | end) 10 | return el 11 | end 12 | end 13 | 14 | -- apply filter_stream directive to cells 15 | function Div(el) 16 | if el.classes:includes("cell") then 17 | local filters = el.attributes["filter_stream"] 18 | if filters then 19 | -- process cell-code 20 | return pandoc.walk_block(el, { 21 | CodeBlock = function(el) 22 | -- CodeBlock that isn't `cell-code` is output 23 | if not el.classes:includes("cell-code") then 24 | for filter in filters:gmatch("[^%s,]+") do 25 | el.text = filter_lines(el.text, function(line) 26 | return not line:find(filter, 1, true) 27 | end) 28 | end 29 | return el 30 | end 31 | end 32 | }) 33 | 34 | end 35 | 36 | end 37 | 38 | end 39 | 40 | function filter_lines(text, filter) 41 | local lines = pandoc.List() 42 | local code = text .. "\n" 43 | for line in code:gmatch("([^\r\n]*)[\r\n]") do 44 | if filter(line) then 45 | lines:insert(line) 46 | end 47 | end 48 | return table.concat(lines, "\n") 49 | end 50 | 51 | 52 | -------------------------------------------------------------------------------- /_extensions/quarto-ext/lightbox/_extension.yml: -------------------------------------------------------------------------------- 1 | name: Lightbox 2 | author: RStudio, PBC 3 | version: 0.1.1 4 | contributes: 5 | filters: 6 | - lightbox.lua 7 | -------------------------------------------------------------------------------- /_extensions/quarto-ext/lightbox/lightbox.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | div.gslide div.gslide-description, 5 | div.gslide-description .gslide-title, 6 | div.gslide-description .gslide-desc { 7 | color: var(--quarto-body-color); 8 | background-color: var(--quarto-body-bg); 9 | } -------------------------------------------------------------------------------- /_extensions/quarto-ext/lightbox/lightbox.lua: -------------------------------------------------------------------------------- 1 | -- whether we're automatically lightboxing 2 | local auto = false 3 | 4 | -- whether we need lightbox dependencies added 5 | local needsLightbox = false 6 | 7 | -- a counter used to ensure each image is in its own gallery 8 | local imgCount = 0 9 | 10 | -- attributes to forward from the image to the newly created link 11 | local kForwardedAttr = { 12 | "title", "description", "desc-position", 13 | "type", "effect", "zoomable", "draggable" 14 | } 15 | 16 | local kLightboxClass = "lightbox" 17 | local kNoLightboxClass = "nolightbox" 18 | local kGalleryPrefix = "quarto-lightbox-gallery-" 19 | 20 | -- A list of images already within links that we can use to filter 21 | local imagesWithinLinks = pandoc.List({}) 22 | 23 | return { 24 | { 25 | Meta = function(meta) 26 | 27 | -- If the mode is auto, we need go ahead and 28 | -- run if there are any images (ideally we would) 29 | -- filter to images in the body, but that can be 30 | -- left for future me to deal with 31 | -- supports: 32 | -- lightbox: auto 33 | -- or 34 | -- lightbox: 35 | -- match: auto 36 | local lbMeta = meta.lightbox 37 | if lbMeta ~= nil and type(lbMeta) == 'table' then 38 | if lbMeta[1] ~= nil then 39 | if lbMeta[1].text == "auto" then 40 | auto = true 41 | end 42 | elseif lbMeta.match ~= nil and pandoc.utils.stringify(lbMeta.match) == 'auto' then 43 | auto = true 44 | elseif lbMeta == true then 45 | auto = true 46 | end 47 | end 48 | end, 49 | -- Find images that are already within links 50 | -- we'll use this to filter out these images if 51 | -- the most is auto 52 | Link = function(linkEl) 53 | pandoc.walk_inline(linkEl, { 54 | Image = function(imageEl) 55 | imagesWithinLinks[#imagesWithinLinks + 1] = imageEl 56 | end 57 | }) 58 | end 59 | }, 60 | { 61 | Image = function(imgEl) 62 | if quarto.doc.isFormat("html:js") then 63 | local isAlreadyLinked = imagesWithinLinks:includes(imgEl) 64 | if (not isAlreadyLinked and auto and not imgEl.classes:includes(kNoLightboxClass)) 65 | or imgEl.classes:includes('lightbox') then 66 | -- note that we need to include the dependency for lightbox 67 | needsLightbox = true 68 | imgCount = imgCount + 1 69 | 70 | -- remove the class from the image 71 | imgEl.attr.classes = imgEl.attr.classes:filter(function(clz) 72 | return clz ~= kLightboxClass 73 | end) 74 | 75 | -- attributes for the link 76 | local linkAttributes = {} 77 | 78 | -- mark this image as a lightbox target 79 | linkAttributes.class = kLightboxClass 80 | 81 | -- get the alt text from image and use that as title 82 | local title = nil 83 | if imgEl.caption ~= nil and #imgEl.caption > 0 then 84 | linkAttributes.title = pandoc.utils.stringify(imgEl.caption) 85 | end 86 | 87 | -- move a group attribute to the link, if present 88 | if imgEl.attr.attributes.group ~= nil then 89 | linkAttributes.gallery = imgEl.attr.attributes.group 90 | imgEl.attr.attributes.group = nil 91 | else 92 | linkAttributes.gallery = kGalleryPrefix .. imgCount 93 | end 94 | 95 | -- forward any other known attributes 96 | for i, v in ipairs(kForwardedAttr) do 97 | if imgEl.attr.attributes[v] ~= nil then 98 | -- forward the attribute 99 | linkAttributes[v] = imgEl.attr.attributes[v] 100 | 101 | -- clear the attribute 102 | imgEl.attr.attributes[v] = nil 103 | end 104 | 105 | -- clear the title 106 | if (imgEl.title == 'fig:') then 107 | imgEl.title = "" 108 | end 109 | 110 | end 111 | 112 | -- wrap decorated images in a link with appropriate attrs 113 | local link = pandoc.Link({imgEl}, imgEl.src, nil, linkAttributes) 114 | return link 115 | end 116 | end 117 | end, 118 | Meta = function(meta) 119 | -- If we discovered lightbox-able images 120 | -- we need to include the dependencies 121 | if needsLightbox then 122 | -- add the dependency 123 | quarto.doc.addHtmlDependency({ 124 | name = 'glightbox', 125 | scripts = {'resources/js/glightbox.min.js'}, 126 | stylesheets = {'resources/css/glightbox.min.css', 'lightbox.css'} 127 | }) 128 | 129 | -- read lightbox options 130 | local lbMeta = meta.lightbox 131 | local lbOptions = {} 132 | local readEffect = function(el) 133 | local val = pandoc.utils.stringify(el) 134 | if val == "fade" or val == "zoom" or val == "none" then 135 | return val 136 | else 137 | error("Invalid effect " + val) 138 | end 139 | end 140 | 141 | -- permitted options include: 142 | -- lightbox: 143 | -- effect: zoom | fade | none 144 | -- desc-position: top | bottom | left |right 145 | -- loop: true | false 146 | -- class: 147 | local effect = "zoom" 148 | local descPosition = "bottom" 149 | local loop = true 150 | local skin = nil 151 | 152 | -- The selector controls which elements are targeted. 153 | -- currently, it always targets .lightbox elements 154 | -- and there is no way for the user to change this 155 | local selector = "." .. kLightboxClass 156 | 157 | if lbMeta ~= nil and type(lbMeta) == 'table' then 158 | if lbMeta.effect ~= nil then 159 | effect = readEffect(lbMeta.effect) 160 | end 161 | 162 | if lbMeta['desc-position'] ~= nil then 163 | descPosition = pandoc.utils.stringify(lbMeta['desc-position']) 164 | end 165 | 166 | if lbMeta['css-class'] ~= nil then 167 | skin = pandoc.utils.stringify(lbMeta['css-class']) 168 | end 169 | 170 | if lbMeta.loop ~= nil then 171 | loop = lbMeta.loop 172 | end 173 | end 174 | 175 | -- Generate the options to configure lightbox 176 | local options = { 177 | selector = selector, 178 | closeEffect = effect, 179 | openEffect = effect, 180 | descPosition = descPosition, 181 | loop = loop, 182 | } 183 | if skin ~= nil then 184 | options.skin = skin 185 | end 186 | local optionsJson = quarto.json.encode(options) 187 | 188 | -- generate the initialization script with the correct options 189 | local scriptTag = "" 190 | 191 | -- inject the rendering code 192 | quarto.doc.includeText("after-body", scriptTag) 193 | 194 | end 195 | end 196 | }} 197 | -------------------------------------------------------------------------------- /basic-plot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/basic-plot.png -------------------------------------------------------------------------------- /cararquarto.scss: -------------------------------------------------------------------------------- 1 | /*-- scss:defaults --*/ 2 | 3 | // override root variables 4 | :root { 5 | --r-link-color: #28A569; 6 | } 7 | 8 | // fonts 9 | @import url('https://fonts.googleapis.com/css2?family=Enriqueta:wght@500&display=swap'); 10 | @import url('https://fonts.googleapis.com/css2?family=Anonymous+Pro:wght@700&display=swap'); 11 | 12 | // to work locally 13 | @font-face { 14 | font-family: 'brandon-text'; 15 | src: url("/fonts/BrandonText-Regular.ttf") format('truetype'); 16 | } 17 | 18 | // to create a url that will work on GitHub Pages 19 | @font-face { 20 | font-family: 'brandon-text'; 21 | src: url("/hdsi_rug/fonts/BrandonText-Regular.ttf") format('truetype'); 22 | } 23 | 24 | 25 | $font-family-sans-serif: "brandon-text", Palatino, 26 | FreeSerif, serif !default; 27 | $font-family-monospace: "Anonymous Pro", monospace !default; 28 | 29 | // headings 30 | $presentation-heading-font: "Enriqueta", "Book Antiqua", Palatino, 31 | FreeSerif, serif !default; 32 | $presentation-heading-color: #2C3D4F !default; 33 | 34 | // other variables 35 | $body-bg: #ffffff; 36 | $body-color: #1A242F; 37 | $highlight-color: #28A569; 38 | /* sets color of controls*/ 39 | $link-color: #28A569; 40 | $presentation-font-size-root: 24pt; 41 | $selection-bg: #4076AE; 42 | 43 | /*-- scss:rules --*/ 44 | 45 | .reveal .slide blockquote { 46 | border-left: 3px solid $text-muted; 47 | padding-left: 0.6em; 48 | background: #F6F7F7; 49 | } 50 | 51 | .reveal h2 { 52 | padding-bottom: 0.3em; 53 | } 54 | 55 | .reveal .footer { 56 | color: #ffffff; 57 | background-color: $presentation-heading-color; 58 | display: block; 59 | position: fixed; 60 | padding-bottom: 12px; 61 | padding-top: 12px; 62 | width: 100%; 63 | text-align: center; 64 | font-size: 18px; 65 | z-index: 2; 66 | } 67 | 68 | 69 | .reveal .controls { 70 | color: $highlight-color; 71 | } 72 | 73 | .reveal .progress { 74 | background: $presentation-heading-color; 75 | color: $highlight-color 76 | } 77 | 78 | .reveal a { 79 | color: #11559A; 80 | } 81 | 82 | .reveal a:hover { 83 | color: #4076AE; 84 | } 85 | 86 | .reveal .footer a { 87 | color: #F6F7F7; 88 | } 89 | 90 | .reveal .footer a:hover { 91 | color: #FFFFFF; 92 | } 93 | 94 | .reveal .slide ul li { 95 | list-style: none; /* Remove default bullets */ 96 | } 97 | 98 | .reveal .slide ul li::before { 99 | content: "\25FC"; /* Add content: \2022 is the CSS Code/unicode for a bullet; add a space for easier alignment! */ 100 | color: $highlight-color; /* Change the color */ 101 | display: inline-block; /* Needed to add space between the bullet and the text */ 102 | width: 1.5em; /* Also needed for space (tweak if needed) */ 103 | margin-left: -1.5em; /* Also needed for space (tweak if needed) */ 104 | font-size: 66%; 105 | } 106 | 107 | .reveal .panel-tabset ul li::before { 108 | content: ""; /* Remove default bullets */ 109 | } 110 | 111 | .reveal .monospace{ 112 | font-size: 36pt; 113 | } 114 | 115 | .reveal .faded{ 116 | opacity: 0.4; 117 | } 118 | 119 | 120 | .reveal .faded-small{ 121 | opacity: 0.4; 122 | font-size: 0.8em; 123 | } 124 | 125 | 126 | .reveal .imitate-title{ 127 | font-size: 2em; 128 | } 129 | -------------------------------------------------------------------------------- /cloud-workspace/fonts/Poppins-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/cloud-workspace/fonts/Poppins-Bold.ttf -------------------------------------------------------------------------------- /cloud-workspace/penguin-bakeoff.R: -------------------------------------------------------------------------------- 1 | # Libraries ---- 2 | library(tidyverse) 3 | 4 | # Fonts ---- 5 | # Registering a variant 6 | # First, download the font file the font file to the project using the "Files" tab. 7 | # Then call systemfonts::register_font() as in the example below 8 | systemfonts::register_font(name = "Poppins", 9 | # This is the path to the font I have already uploaded 10 | plain = "fonts/Poppins-Bold.ttf") 11 | 12 | # Data ---- 13 | penguins <- palmerpenguins::penguins %>% 14 | filter(!is.na(bill_length_mm)) %>% 15 | mutate(banana_quantity = case_when(species == "Adelie" & island == "Biscoe" ~ 1, 16 | species == "Adelie" & island == "Dream" ~ 0.5, 17 | species == "Adelie" & island == "Torgersen" ~ 0.1, 18 | TRUE ~ 1)) 19 | 20 | # |- Summaries ---- 21 | penguin_summaries <- palmerpenguins::penguins %>% 22 | group_by(species) %>% 23 | summarise(bill_depth_mm = mean(bill_depth_mm, na.rm = TRUE), 24 | bill_length_mm = mean(bill_length_mm, na.rm = TRUE)) %>% 25 | mutate(commentary = case_when(species == "Adelie" ~ 26 | "The Adelie penguins tried varying the amount of banana in the mix. 27 | Turns out, even a hint of green banana is detrimental to yumminess!", 28 | species == "Gentoo" ~ 29 | "Over-ripe bananas and typically shorter baking times.", 30 | TRUE ~ "Ripe bananas and slightly longer cooking times.")) 31 | 32 | # |- Highlights ---- 33 | penguin_highlights <- palmerpenguins::penguins_raw %>% 34 | janitor::clean_names() %>% 35 | rename(bill_depth_mm = culmen_depth_mm, 36 | bill_length_mm = culmen_length_mm) %>% 37 | filter(bill_length_mm %in% c(max(bill_length_mm, na.rm = TRUE), 38 | sort(bill_length_mm, decreasing = TRUE)[2], 39 | min(bill_length_mm, na.rm = TRUE))) %>% 40 | mutate(species = gsub("(.) (.*)", "\\1", species), 41 | commentary = case_when(bill_length_mm == max(bill_length_mm) ~ 42 | paste0("Our star baker is **", individual_id, 43 | "**, a ", species, " from ", island, 44 | ". Congratulations, ", individual_id, "!"), 45 | bill_length_mm == sort(bill_length_mm, decreasing = TRUE)[2] ~ 46 | paste0("Our runner up is a ", species, 47 | " from ", island, ": **", individual_id, 48 | "**, proving that ripe and over-ripe bananas are both good options!"), 49 | TRUE ~ paste0("**", individual_id, 50 | "**, did not have a good baking day. The combination of short cooking time and green bananas probably didn't help!"))) %>% 51 | arrange(bill_length_mm) %>% 52 | mutate(label_x = c(15, 18.15, 16.45), 53 | label_y = c(34, 57, 59), 54 | left_to_right = case_when(label_x < bill_depth_mm ~ 1, 55 | TRUE ~ 0), 56 | arrow_x_end = case_when(label_x < bill_depth_mm ~ bill_depth_mm - 0.1, 57 | TRUE ~ bill_depth_mm + 0.1), 58 | arrow_y_end = case_when(label_y < bill_length_mm ~ bill_length_mm - 0.1, 59 | TRUE ~ bill_length_mm + 0.1)) 60 | 61 | 62 | # Colour scheme ---- 63 | banana_colours <- list("Adelie" = "#89973d", 64 | "Chinstrap" = "#e8b92f", 65 | "Gentoo" = "#a45e41") 66 | 67 | dark_text <- monochromeR::generate_palette(banana_colours$Chinstrap, 68 | "go_darker", 69 | n_colours = 2)[2] 70 | 71 | light_text <- monochromeR::generate_palette(dark_text, 72 | "go_lighter", 73 | n_colours = 3)[2] 74 | 75 | banana_colours <- list("Adelie" = "#89973d", 76 | "Chinstrap" = "#e8b92f", 77 | "Gentoo" = "#a45e41", 78 | "light_text" = light_text, 79 | "dark_text" = dark_text) 80 | 81 | # Plot ---- 82 | basic_plot <- ggplot(penguins, 83 | aes(x = bill_depth_mm, 84 | y = bill_length_mm, 85 | colour = species)) + 86 | geom_point(aes(alpha = banana_quantity)) + 87 | scale_alpha(range = c(0.2, 1), 88 | breaks = c(0.1, 0.5, 1)) + 89 | labs(title = "Banana loaf tastes best when baked with ripe or over-ripe bananas", 90 | subtitle = "The Palmer Penguins carried out an experiment using bananas of different ripeness. 91 | The Adelie penguins were given unripe bananas, Gentoos were given over-ripe 92 | bananas and Chinstraps were given yellow bananas. 93 | Each penguin was left to choose their own cooking time.", 94 | x = "Baking time", 95 | y = "Yumminess", 96 | caption = "Data from {palmerpenguins}; misused for illustration purposes.") + 97 | theme_minimal(base_size = 12) 98 | 99 | # |- Level up! ---- 100 | basic_plot + 101 | scale_colour_manual(values = banana_colours, 102 | limits = force) + 103 | labs(title = paste0("Banana loaf tastes best when baked with ", 104 | "**ripe** or
**over-ripe** bananas"), 107 | subtitle = "The Palmer Penguins carried out an experiment using bananas of different ripeness. 108 | Each penguin was left to choose their own cooking time.") + 109 | ggtext::geom_textbox(data = penguin_summaries, 110 | aes(label = paste0("**Team ", species, "**", 111 | "
", commentary, "")), 114 | family = "Cabin", 115 | size = 3.5, 116 | width = unit(9, "line"), 117 | alpha = 0.9, 118 | box.colour = NA) + 119 | ggtext::geom_textbox(data = penguin_highlights, 120 | aes(x = label_x, 121 | y = label_y, 122 | label = commentary, 123 | hjust = left_to_right, 124 | halign = left_to_right), 125 | family = "Cabin", 126 | size = 3, 127 | fill = NA, 128 | box.colour = NA) + 129 | geom_curve(data = penguin_highlights, 130 | aes(x = label_x, xend = arrow_x_end, 131 | y = label_y, yend = arrow_y_end), 132 | curvature = 0.15, 133 | arrow = arrow(length = unit(0.1, "cm")), 134 | alpha = 0.5) + 135 | scale_x_continuous(expand = expansion(mult = c(0.2, 0.02))) + 136 | theme(text = element_text(colour = banana_colours$light_text, 137 | family = "Cabin", 138 | lineheight = 1.2), 139 | plot.title = ggtext::element_markdown(colour = banana_colours$dark_text, 140 | family = "Poppins", 141 | size = 18), 142 | axis.text = element_text(size = 6, colour = banana_colours$light_text), 143 | plot.caption = element_text(size = 6), 144 | panel.grid = element_line(colour = "#F6F6F5"), 145 | legend.position = "none") 146 | 147 | # Export ---- 148 | ggsave(filename = "penguin-bakeoff.png", 149 | width = 8, height = 7.5, dpi = 400, 150 | bg = "#FFFFFF") 151 | 152 | -------------------------------------------------------------------------------- /cloud-workspace/penguin-bakeoff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/cloud-workspace/penguin-bakeoff.png -------------------------------------------------------------------------------- /cloud-workspace/project.Rproj: -------------------------------------------------------------------------------- 1 | Version: 1.0 2 | 3 | RestoreWorkspace: Default 4 | SaveWorkspace: Default 5 | AlwaysSaveHistory: No 6 | 7 | EnableCodeIndexing: Yes 8 | UseSpacesForTab: Yes 9 | NumSpacesForTab: 2 10 | Encoding: UTF-8 11 | 12 | RnwWeave: Sweave 13 | LaTeX: pdfLaTeX 14 | -------------------------------------------------------------------------------- /cloud-workspace/reference-scripts/01_installing-the-packages.R: -------------------------------------------------------------------------------- 1 | # Here are the libraries we'll be using ---- 2 | # |- For creating our plot ---- 3 | install.packages("palmerpenguins") 4 | install.packages("tidyverse") 5 | 6 | # |- For tidying data ---- 7 | install.packages("janitor") 8 | 9 | # |- For manipulating colours and adding text hierarchy ---- 10 | install.packages("monochromeR") 11 | 12 | # |- For working with fonts ---- 13 | install.packages("ragg") 14 | 15 | # |- For creating annotations ---- 16 | install.packages("ggtext") 17 | 18 | # |- For taking a quick look at points we want to annotate ---- 19 | install.packages("plotly") 20 | 21 | -------------------------------------------------------------------------------- /cloud-workspace/reference-scripts/02_setting-up-fonts.R: -------------------------------------------------------------------------------- 1 | # Set the graphics device to AGG in the Global Options and install {ragg} ---- 2 | # This should ensure fonts play nicely within the Viewer and any outputs 3 | 4 | # Check which fonts are already installed ---- 5 | systemfonts::system_fonts() %>% View("fonts") 6 | 7 | # Register a font variant ---- 8 | # Here we register the Ultrabold version of Lato 9 | systemfonts::register_variant("Lato Megabold", # Pick a name, any name! 10 | family = "Lato", 11 | weight = "ultrabold") 12 | 13 | # Registering a new font within the project ---- 14 | # First, upload the font file to the project using the "Files" tab. 15 | # Then call systemfonts::register_font() as in the example below 16 | systemfonts::register_font(name = "Poppins", 17 | # This is the path to the font I have already uploaded 18 | plain = "fonts/Poppins-Bold.ttf") 19 | 20 | # To check which fonts you have registered ---- 21 | systemfonts::registry_fonts() 22 | -------------------------------------------------------------------------------- /cloud-workspace/reference-scripts/03_using-your-own-data.R: -------------------------------------------------------------------------------- 1 | # To use your own data, upload it to the "data" folder 2 | # using the "Upload" button in the Files tab in the bottom 3 | # right corner of the interface. Then work on it as you 4 | # would do normally! 5 | my_data <- readxl::read_excel("data/my-data.xlsx") 6 | 7 | # If you prefer to use data stored somewhere online as your 8 | # starting point, you can do that too! 9 | # Here's an example using the GBBO dataset from a recent TidyTuesday challenge. 10 | my_data <- read.csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2022/2022-10-25/episodes.csv") 11 | 12 | -------------------------------------------------------------------------------- /cloud-workspace/reference-scripts/basic_plot.R: -------------------------------------------------------------------------------- 1 | # Libraries 2 | library(tidyverse) 3 | 4 | # Setting up the data ---- 5 | penguins <- palmerpenguins::penguins %>% 6 | # To vary the banana quantity (if you're reading this before the workshop, 7 | # trust me this will make sense...!) 8 | mutate(banana_quantity = case_when(species == "Adelie" & island == "Biscoe" ~ 1, 9 | species == "Adelie" & island == "Dream" ~ 0.5, 10 | species == "Adelie" & island == "Torgersen" ~ 0.1, 11 | TRUE ~ 1)) 12 | 13 | # Building the plot ---- 14 | ggplot(penguins, 15 | aes(x = bill_depth_mm, 16 | y = bill_length_mm, 17 | colour = species)) + 18 | geom_point(aes(alpha = banana_quantity)) + 19 | labs(title = "Banana loaf tastes best when baked with ripe or over-ripe bananas", 20 | subtitle = "The Palmer Penguins carried out an experiment using bananas of different ripeness. 21 | The Adelie penguins were given unripe bananas, Gentoos were given over-ripe 22 | bananas and Chinstraps were given yellow bananas. 23 | Each penguin was left to choose their own cooking time.", 24 | x = "Baking time", 25 | y = "Yumminess", 26 | caption = "Data from {palmerpenguins}; misused for illustration purposes.") 27 | 28 | -------------------------------------------------------------------------------- /cloud-workspace/reference-scripts/part-1_level-up-with-colours.R: -------------------------------------------------------------------------------- 1 | # Libraries 2 | library(tidyverse) 3 | 4 | # Setting up the data ---- 5 | penguins <- palmerpenguins::penguins %>% 6 | filter(!is.na(bill_length_mm)) %>% 7 | mutate(banana_quantity = case_when(species == "Adelie" & island == "Biscoe" ~ 1, 8 | species == "Adelie" & island == "Dream" ~ 0.5, 9 | species == "Adelie" & island == "Torgersen" ~ 0.1, 10 | TRUE ~ 1)) 11 | 12 | # Creating a colour scheme ---- 13 | banana_colours <- list("Adelie" = "#89973d", 14 | "Chinstrap" = "#e8b92f", 15 | "Gentoo" = "#a45e41") 16 | 17 | # Building the plot ---- 18 | ggplot(penguins, 19 | # aesthetics that apply to all sets of data 20 | aes(x = bill_depth_mm, 21 | y = bill_length_mm, 22 | colour = species)) + 23 | geom_point(aes(alpha = banana_quantity)) + 24 | scale_colour_manual(values = banana_colours) + 25 | scale_alpha(range = c(0.2, 0.9)) + 26 | labs(title = paste0("Banana loaf tastes best when baked with ripe or over-ripe bananas"), 27 | subtitle = "The Palmer Penguins carried out an experiment using bananas of different ripeness. 28 | The Adelie penguins were given unripe bananas, Gentoos were given over-ripe 29 | bananas and Chinstraps were given yellow bananas. 30 | Each penguin was left to choose their own cooking time.", 31 | x = "Baking time", 32 | y = "Yumminess", 33 | caption = "Data from {palmerpenguins}; misused for illustration purposes.") + 34 | theme_minimal(base_size = 12) 35 | -------------------------------------------------------------------------------- /cloud-workspace/reference-scripts/part-2_level-up-with-text-hierarchy.R: -------------------------------------------------------------------------------- 1 | # Libraries 2 | library(tidyverse) 3 | 4 | # Setting up the data ---- 5 | penguins <- palmerpenguins::penguins %>% 6 | filter(!is.na(bill_length_mm)) %>% 7 | mutate(banana_quantity = case_when(species == "Adelie" & island == "Biscoe" ~ 1, 8 | species == "Adelie" & island == "Dream" ~ 0.5, 9 | species == "Adelie" & island == "Torgersen" ~ 0.1, 10 | TRUE ~ 1)) 11 | 12 | penguin_summaries <- palmerpenguins::penguins %>% 13 | group_by(species) %>% 14 | summarise(bill_depth_mm = mean(bill_depth_mm, na.rm = TRUE), 15 | bill_length_mm = mean(bill_length_mm, na.rm = TRUE)) %>% 16 | mutate(commentary = case_when(species == "Adelie" ~ 17 | "The Adelie penguins tried varying the amount of banana in the mix. Turns out, even a hint of green banana is detrimental to yumminess!", 18 | species == "Gentoo" ~ 19 | "Over-ripe bananas and typically shorter baking times.", 20 | TRUE ~ "Ripe bananas and slightly longer cooking times.")) 21 | 22 | 23 | # Establish a colour scheme ---- 24 | banana_colours <- list("Adelie" = "#89973d", 25 | "Chinstrap" = "#e8b92f", 26 | "Gentoo" = "#a45e41") 27 | 28 | 29 | # |- Build on it to add light and dark text colours ---- 30 | dark_text <- monochromeR::generate_palette( 31 | banana_colours$Chinstrap, "go_darker", 32 | n_colours = 2)[2] 33 | 34 | light_text <- monochromeR::generate_palette( 35 | dark_text, "go_lighter", 36 | n_colours = 3)[2] 37 | 38 | banana_colours <- list("Adelie" = "#89973d", 39 | "Chinstrap" = "#e8b92f", 40 | "Gentoo" = "#a45e41", 41 | "dark_text" = dark_text, 42 | "light_text" = light_text) 43 | 44 | # Plot it! ---- 45 | ggplot(penguins, 46 | # aesthetics that apply to all sets of data 47 | aes(x = bill_depth_mm, 48 | y = bill_length_mm, 49 | colour = species)) + 50 | geom_point(aes(alpha = banana_quantity)) + 51 | ggtext::geom_textbox(data = penguin_summaries, 52 | aes(label = paste0("**Team ", species, "**", 53 | "
", commentary, "")), 56 | family = "Cabin", 57 | size = 4, 58 | width = unit(12, "line"), 59 | alpha = 0.9, 60 | box.colour = NA) + 61 | scale_colour_manual(values = banana_colours) + 62 | scale_alpha(range = c(0.2, 0.9)) + 63 | labs(title = paste0("Banana loaf tastes best when baked with ripe or
over-ripe bananas"), 66 | subtitle = "The Palmer Penguins carried out an experiment using bananas of different ripeness. \nEach penguin was left to choose their own cooking time.", 67 | x = "Baking time", 68 | y = "Yumminess", 69 | caption = "Data from {palmerpenguins}; misused for illustration purposes.") + 70 | guides("none") + 71 | theme_minimal(base_size = 12) + 72 | theme(text = element_text(family = "Cabin", colour = banana_colours$light_text), 73 | plot.title = ggtext::element_markdown(size = 18, family = "Poppins", 74 | colour = banana_colours$dark_text, face = "bold"), 75 | panel.grid = element_line(colour = "#F6F6F5"), 76 | axis.text = element_text(size = 6, 77 | colour = banana_colours$light_text), 78 | plot.caption = element_text(size = 6), 79 | legend.position="none") 80 | 81 | # Exporting the plot ---- 82 | ggsave(filename = "penguin-bakeoff.png", 83 | width = 8.5, height = 7.5, dpi = 400, bg = "#FFFFFF") 84 | 85 | -------------------------------------------------------------------------------- /cloud-workspace/reference-scripts/part-3_level-up-with-annotations.R: -------------------------------------------------------------------------------- 1 | # Libraries 2 | library(tidyverse) 3 | # library(ggtext) 4 | 5 | # Setting up the data ---- 6 | penguins <- palmerpenguins::penguins %>% 7 | filter(!is.na(bill_length_mm)) %>% 8 | mutate(banana_quantity = case_when(species == "Adelie" & island == "Biscoe" ~ 1, 9 | species == "Adelie" & island == "Dream" ~ 0.5, 10 | species == "Adelie" & island == "Torgersen" ~ 0.1, 11 | TRUE ~ 1)) 12 | 13 | penguin_summaries <- palmerpenguins::penguins %>% 14 | group_by(species) %>% 15 | summarise(bill_depth_mm = mean(bill_depth_mm, na.rm = TRUE), 16 | bill_length_mm = mean(bill_length_mm, na.rm = TRUE)) %>% 17 | mutate(commentary = case_when(species == "Adelie" ~ 18 | "The Adelie penguins tried varying the amount of banana in the mix. Turns out, even a hint of green banana is detrimental to yumminess!", 19 | species == "Gentoo" ~ 20 | "Over-ripe bananas and typically shorter baking times.", 21 | TRUE ~ "Ripe bananas and slightly longer cooking times.")) 22 | 23 | # We are renaming variables here so that they match what's inside our main aes() call at the start of our plot 24 | penguin_highlights <- palmerpenguins::penguins_raw %>% 25 | janitor::clean_names() %>% 26 | rename(bill_depth_mm = culmen_depth_mm, 27 | bill_length_mm = culmen_length_mm) %>% 28 | filter(bill_length_mm %in% c(max(bill_length_mm, na.rm = TRUE), 29 | sort(bill_length_mm, decreasing = TRUE)[2], 30 | min(bill_length_mm, na.rm = TRUE))) %>% 31 | arrange(bill_length_mm) %>% 32 | mutate(species = gsub("(.) (.*)", "\\1", species), 33 | commentary = case_when(bill_length_mm == max(bill_length_mm) ~ 34 | paste0("Our star baker is **", individual_id, 35 | "**, a ", species, " from ", island, 36 | ". Congratulations, ", individual_id, "!"), 37 | bill_length_mm == sort(bill_length_mm, decreasing = TRUE)[2] ~ 38 | paste0("Our runner up is a ", species, 39 | " from ", island, ": **", individual_id, 40 | "**, proving that ripe and over-ripe bananas are both good options!"), 41 | TRUE ~ paste0("**", individual_id, 42 | "**, did not have a good baking day. The combination of short cooking time and green bananas probably didn't help!")), 43 | label_x = c(15, 18.15, 16.45), 44 | label_y = c(34, 57, 59), 45 | h_align = case_when(label_x < bill_depth_mm ~ 1, 46 | TRUE ~ 0), 47 | arrow_x_end = case_when(label_x < bill_depth_mm ~ bill_depth_mm - 0.1, 48 | TRUE ~ bill_depth_mm + 0.1), 49 | arrow_y_end = case_when(label_y < bill_length_mm ~ bill_length_mm - 0.1, 50 | TRUE ~ bill_length_mm + 0.1)) 51 | 52 | # Creating a colour scheme ---- 53 | banana_colours <- list("Adelie" = "#89973d", 54 | "Chinstrap" = "#e8b92f", 55 | "Gentoo" = "#a45e41") 56 | 57 | # Build on it to add light and dark text colours 58 | dark_text <- monochromeR::generate_palette( 59 | banana_colours$Chinstrap, "go_darker", 60 | n_colours = 2)[2] 61 | 62 | light_text <- monochromeR::generate_palette( 63 | dark_text, "go_lighter", 64 | n_colours = 3)[2] 65 | 66 | banana_colours <- list("Adelie" = "#89973d", 67 | "Chinstrap" = "#e8b92f", 68 | "Gentoo" = "#a45e41", 69 | "dark_text" = dark_text, 70 | "light_text" = light_text) 71 | 72 | # Plot it! ---- 73 | ggplot(penguins, 74 | # aesthetics that apply to all sets of data 75 | aes(x = bill_depth_mm, 76 | y = bill_length_mm, 77 | colour = species)) + 78 | geom_point(aes(alpha = banana_quantity)) + 79 | ggtext::geom_textbox(data = penguin_summaries, 80 | aes(label = paste0("**Team ", species, "**", 81 | "
", commentary, "")), 84 | family = "DM Sans", 85 | size = 4, 86 | width = unit(12, "line"), 87 | alpha = 0.9, 88 | box.colour = NA) + 89 | ggtext::geom_textbox(data = penguin_highlights, 90 | aes(label = commentary, 91 | x = label_x, 92 | y = label_y, 93 | halign = h_align, 94 | hjust = h_align), 95 | show.legend = FALSE, 96 | family = "DM Sans", 97 | size = 3.2, 98 | fill = NA, 99 | box.colour = NA) + 100 | geom_curve(data = penguin_highlights, 101 | aes(x = label_x, xend = arrow_x_end, 102 | y = label_y, yend = arrow_y_end), 103 | arrow = arrow(length = unit(0.1, "cm")), 104 | curvature = 0.15, 105 | alpha = 0.5) + 106 | scale_colour_manual(values = banana_colours) + 107 | scale_alpha(range = c(0.2, 0.9)) + 108 | labs(title = paste0("Banana loaf tastes best when baked with ripe or
over-ripe bananas"), 111 | subtitle = "The Palmer Penguins carried out an experiment using bananas of different ripeness. \nEach penguin was left to choose their own cooking time.", 112 | x = "Baking time", 113 | y = "Yumminess", 114 | caption = "Data from {palmerpenguins}; misused for illustration purposes.") + 115 | guides("none") + 116 | theme_minimal(base_size = 12) + 117 | theme(text = element_text(family = "DM Sans", colour = banana_colours$light_text, 118 | lineheight = 1.2), 119 | plot.title = ggtext::element_markdown(size = 18, family = "Poppins", colour = banana_colours$dark_text, face = "bold"), 120 | panel.grid = element_line(colour = "#F6F6F5"), 121 | axis.text = element_text(size = 6, 122 | colour = banana_colours$light_text), 123 | plot.caption = element_text(size = 6), 124 | legend.position="none") 125 | 126 | # Exporting the plot ---- 127 | ggsave(filename = "penguin-bakeoff.png", 128 | width = 8.5, height = 7.5, dpi = 400, bg = "#FFFFFF") 129 | 130 | -------------------------------------------------------------------------------- /fonts/BrandonText-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/fonts/BrandonText-Regular.ttf -------------------------------------------------------------------------------- /images/clapping-pingu.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/images/clapping-pingu.gif -------------------------------------------------------------------------------- /images/dark-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/images/dark-background.png -------------------------------------------------------------------------------- /images/dark-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/images/dark-logo.png -------------------------------------------------------------------------------- /images/light-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/images/light-logo.png -------------------------------------------------------------------------------- /images/machine.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/images/machine.gif -------------------------------------------------------------------------------- /images/penguin-bakeoff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/images/penguin-bakeoff.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-1-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-10-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-10-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-11-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-11-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-12-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-12-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-13-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-13-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-14-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-14-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-15-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-15-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-16-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-16-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-17-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-17-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-18-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-18-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-19-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-19-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-2-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-20-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-20-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-21-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-21-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-22-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-22-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-23-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-23-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-26-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-26-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-27-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-27-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-28-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-28-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-29-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-29-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-3-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-3-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-30-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-30-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-31-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-31-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-32-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-32-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-33-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-33-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-34-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-34-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-36-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-36-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-37-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-37-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-38-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-38-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-39-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-39-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-4-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-4-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-41-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-41-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-43-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-43-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-44-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-44-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-45-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-45-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-46-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-46-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-47-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-47-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-48-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-48-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-5-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-5-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-53-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-53-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-55-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-55-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-56-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-56-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-57-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-57-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-58-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-58-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-59-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-59-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-6-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-6-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-60-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-60-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-61-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-61-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-62-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-62-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-63-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-63-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-64-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-64-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-65-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-65-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-66-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-66-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-68-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-68-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-69-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-69-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-7-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-7-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-9-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/figure-revealjs/unnamed-chunk-9-1.png -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/clipboard/clipboard.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * clipboard.js v2.0.11 3 | * https://clipboardjs.com/ 4 | * 5 | * Licensed MIT © Zeno Rocha 6 | */ 7 | !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return b}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),r=n.n(e);function c(t){try{return document.execCommand(t)}catch(t){return}}var a=function(t){t=r()(t);return c("cut"),t};function o(t,e){var n,o,t=(n=t,o="rtl"===document.documentElement.getAttribute("dir"),(t=document.createElement("textarea")).style.fontSize="12pt",t.style.border="0",t.style.padding="0",t.style.margin="0",t.style.position="absolute",t.style[o?"right":"left"]="-9999px",o=window.pageYOffset||document.documentElement.scrollTop,t.style.top="".concat(o,"px"),t.setAttribute("readonly",""),t.value=n,t);return e.container.appendChild(t),e=r()(t),c("copy"),t.remove(),e}var f=function(t){var e=1 button { 78 | font-size: 1.5rem; 79 | width: 1rem; 80 | height: 1rem; 81 | display: inline-block; 82 | display: flex; 83 | flex-direction: column; 84 | align-items: center; 85 | justify-content: center; 86 | font-family: monospace; 87 | padding: 10px; 88 | margin: 0; 89 | background: inherit; 90 | border: 2px solid; 91 | border-radius: 100%; 92 | transition: 50ms transform ease-in-out, 150ms opacity ease-in; 93 | --countdown-transition-distance: 10px; 94 | } 95 | 96 | .countdown .countdown-controls > button:last-child { 97 | transform: translate(calc(-1 * var(--countdown-transition-distance)), var(--countdown-transition-distance)); 98 | opacity: 0; 99 | color: #002F14FF; 100 | background-color: #43AC6A; 101 | border-color: #2A9B59FF; 102 | } 103 | 104 | .countdown .countdown-controls > button:first-child { 105 | transform: translate(var(--countdown-transition-distance), var(--countdown-transition-distance)); 106 | opacity: 0; 107 | color: #4A0900FF; 108 | background-color: #F04124; 109 | border-color: #DE3000FF; 110 | } 111 | 112 | .countdown.running:hover .countdown-controls > button, 113 | .countdown.running:focus-within .countdown-controls > button{ 114 | transform: translate(0, 0); 115 | opacity: 1; 116 | } 117 | 118 | .countdown.running:hover .countdown-controls > button:hover, 119 | .countdown.running:focus-within .countdown-controls > button:hover{ 120 | transform: translate(0, calc(var(--countdown-transition-distance) / -2)); 121 | box-shadow: 0px 2px 5px 0px rgba(50, 50, 50, 0.4); 122 | -webkit-box-shadow: 0px 2px 5px 0px rgba(50, 50, 50, 0.4); 123 | } 124 | 125 | .countdown.running:hover .countdown-controls > button:active, 126 | .countdown.running:focus-within .countdown-controls > button:active{ 127 | transform: translate(0, calc(var(--coutndown-transition-distance) / -5)); 128 | } 129 | 130 | /* ----- Fullscreen ----- */ 131 | .countdown.countdown-fullscreen { 132 | z-index: 0; 133 | } 134 | 135 | .countdown-fullscreen.running .countdown-controls { 136 | top: 1rem; 137 | left: 0; 138 | right: 0; 139 | justify-content: center; 140 | } 141 | 142 | .countdown-fullscreen.running .countdown-controls > button + button { 143 | margin-left: 1rem; 144 | } 145 | -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/countdown-0.4.0/smb_stage_clear.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/countdown-0.4.0/smb_stage_clear.mp3 -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/quarto-contrib/glightbox/lightbox.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | div.gslide div.gslide-description, 5 | div.gslide-description .gslide-title, 6 | div.gslide-description .gslide-desc { 7 | color: var(--quarto-body-color); 8 | background-color: var(--quarto-body-bg); 9 | } -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/quarto-html/light-border.css: -------------------------------------------------------------------------------- 1 | .tippy-box[data-theme~=light-border]{background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,8,16,.15);color:#333;box-shadow:0 4px 14px -2px rgba(0,8,16,.08)}.tippy-box[data-theme~=light-border]>.tippy-backdrop{background-color:#fff}.tippy-box[data-theme~=light-border]>.tippy-arrow:after,.tippy-box[data-theme~=light-border]>.tippy-svg-arrow:after{content:"";position:absolute;z-index:-1}.tippy-box[data-theme~=light-border]>.tippy-arrow:after{border-color:transparent;border-style:solid}.tippy-box[data-theme~=light-border][data-placement^=top]>.tippy-arrow:before{border-top-color:#fff}.tippy-box[data-theme~=light-border][data-placement^=top]>.tippy-arrow:after{border-top-color:rgba(0,8,16,.2);border-width:7px 7px 0;top:17px;left:1px}.tippy-box[data-theme~=light-border][data-placement^=top]>.tippy-svg-arrow>svg{top:16px}.tippy-box[data-theme~=light-border][data-placement^=top]>.tippy-svg-arrow:after{top:17px}.tippy-box[data-theme~=light-border][data-placement^=bottom]>.tippy-arrow:before{border-bottom-color:#fff;bottom:16px}.tippy-box[data-theme~=light-border][data-placement^=bottom]>.tippy-arrow:after{border-bottom-color:rgba(0,8,16,.2);border-width:0 7px 7px;bottom:17px;left:1px}.tippy-box[data-theme~=light-border][data-placement^=bottom]>.tippy-svg-arrow>svg{bottom:16px}.tippy-box[data-theme~=light-border][data-placement^=bottom]>.tippy-svg-arrow:after{bottom:17px}.tippy-box[data-theme~=light-border][data-placement^=left]>.tippy-arrow:before{border-left-color:#fff}.tippy-box[data-theme~=light-border][data-placement^=left]>.tippy-arrow:after{border-left-color:rgba(0,8,16,.2);border-width:7px 0 7px 7px;left:17px;top:1px}.tippy-box[data-theme~=light-border][data-placement^=left]>.tippy-svg-arrow>svg{left:11px}.tippy-box[data-theme~=light-border][data-placement^=left]>.tippy-svg-arrow:after{left:12px}.tippy-box[data-theme~=light-border][data-placement^=right]>.tippy-arrow:before{border-right-color:#fff;right:16px}.tippy-box[data-theme~=light-border][data-placement^=right]>.tippy-arrow:after{border-width:7px 7px 7px 0;right:17px;top:1px;border-right-color:rgba(0,8,16,.2)}.tippy-box[data-theme~=light-border][data-placement^=right]>.tippy-svg-arrow>svg{right:11px}.tippy-box[data-theme~=light-border][data-placement^=right]>.tippy-svg-arrow:after{right:12px}.tippy-box[data-theme~=light-border]>.tippy-svg-arrow{fill:#fff}.tippy-box[data-theme~=light-border]>.tippy-svg-arrow:after{background-image:url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iNiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMCA2czEuNzk2LS4wMTMgNC42Ny0zLjYxNUM1Ljg1MS45IDYuOTMuMDA2IDggMGMxLjA3LS4wMDYgMi4xNDguODg3IDMuMzQzIDIuMzg1QzE0LjIzMyA2LjAwNSAxNiA2IDE2IDZIMHoiIGZpbGw9InJnYmEoMCwgOCwgMTYsIDAuMikiLz48L3N2Zz4=);background-size:16px 6px;width:16px;height:6px} -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/quarto-html/quarto-html.min.css: -------------------------------------------------------------------------------- 1 | /*# sourceMappingURL=0a6b880beb84f9b6f36107a76f82c5b1.css.map */ 2 | -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/quarto-html/quarto-syntax-highlighting.css: -------------------------------------------------------------------------------- 1 | /* quarto syntax highlight colors */ 2 | :root { 3 | --quarto-hl-ot-color: #003B4F; 4 | --quarto-hl-at-color: #657422; 5 | --quarto-hl-ss-color: #20794D; 6 | --quarto-hl-an-color: #5E5E5E; 7 | --quarto-hl-fu-color: #4758AB; 8 | --quarto-hl-st-color: #20794D; 9 | --quarto-hl-cf-color: #003B4F; 10 | --quarto-hl-op-color: #5E5E5E; 11 | --quarto-hl-er-color: #AD0000; 12 | --quarto-hl-bn-color: #AD0000; 13 | --quarto-hl-al-color: #AD0000; 14 | --quarto-hl-va-color: #111111; 15 | --quarto-hl-bu-color: inherit; 16 | --quarto-hl-ex-color: inherit; 17 | --quarto-hl-pp-color: #AD0000; 18 | --quarto-hl-in-color: #5E5E5E; 19 | --quarto-hl-vs-color: #20794D; 20 | --quarto-hl-wa-color: #5E5E5E; 21 | --quarto-hl-do-color: #5E5E5E; 22 | --quarto-hl-im-color: #00769E; 23 | --quarto-hl-ch-color: #20794D; 24 | --quarto-hl-dt-color: #AD0000; 25 | --quarto-hl-fl-color: #AD0000; 26 | --quarto-hl-co-color: #5E5E5E; 27 | --quarto-hl-cv-color: #5E5E5E; 28 | --quarto-hl-cn-color: #8f5902; 29 | --quarto-hl-sc-color: #5E5E5E; 30 | --quarto-hl-dv-color: #AD0000; 31 | --quarto-hl-kw-color: #003B4F; 32 | } 33 | 34 | /* other quarto variables */ 35 | :root { 36 | --quarto-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 37 | } 38 | 39 | pre > code.sourceCode > span { 40 | color: #003B4F; 41 | } 42 | 43 | code span { 44 | color: #003B4F; 45 | } 46 | 47 | code.sourceCode > span { 48 | color: #003B4F; 49 | } 50 | 51 | div.sourceCode, 52 | div.sourceCode pre.sourceCode { 53 | color: #003B4F; 54 | } 55 | 56 | code span.ot { 57 | color: #003B4F; 58 | font-style: inherit; 59 | } 60 | 61 | code span.at { 62 | color: #657422; 63 | font-style: inherit; 64 | } 65 | 66 | code span.ss { 67 | color: #20794D; 68 | font-style: inherit; 69 | } 70 | 71 | code span.an { 72 | color: #5E5E5E; 73 | font-style: inherit; 74 | } 75 | 76 | code span.fu { 77 | color: #4758AB; 78 | font-style: inherit; 79 | } 80 | 81 | code span.st { 82 | color: #20794D; 83 | font-style: inherit; 84 | } 85 | 86 | code span.cf { 87 | color: #003B4F; 88 | font-style: inherit; 89 | } 90 | 91 | code span.op { 92 | color: #5E5E5E; 93 | font-style: inherit; 94 | } 95 | 96 | code span.er { 97 | color: #AD0000; 98 | font-style: inherit; 99 | } 100 | 101 | code span.bn { 102 | color: #AD0000; 103 | font-style: inherit; 104 | } 105 | 106 | code span.al { 107 | color: #AD0000; 108 | font-style: inherit; 109 | } 110 | 111 | code span.va { 112 | color: #111111; 113 | font-style: inherit; 114 | } 115 | 116 | code span.bu { 117 | font-style: inherit; 118 | } 119 | 120 | code span.ex { 121 | font-style: inherit; 122 | } 123 | 124 | code span.pp { 125 | color: #AD0000; 126 | font-style: inherit; 127 | } 128 | 129 | code span.in { 130 | color: #5E5E5E; 131 | font-style: inherit; 132 | } 133 | 134 | code span.vs { 135 | color: #20794D; 136 | font-style: inherit; 137 | } 138 | 139 | code span.wa { 140 | color: #5E5E5E; 141 | font-style: italic; 142 | } 143 | 144 | code span.do { 145 | color: #5E5E5E; 146 | font-style: italic; 147 | } 148 | 149 | code span.im { 150 | color: #00769E; 151 | font-style: inherit; 152 | } 153 | 154 | code span.ch { 155 | color: #20794D; 156 | font-style: inherit; 157 | } 158 | 159 | code span.dt { 160 | color: #AD0000; 161 | font-style: inherit; 162 | } 163 | 164 | code span.fl { 165 | color: #AD0000; 166 | font-style: inherit; 167 | } 168 | 169 | code span.co { 170 | color: #5E5E5E; 171 | font-style: inherit; 172 | } 173 | 174 | code span.cv { 175 | color: #5E5E5E; 176 | font-style: italic; 177 | } 178 | 179 | code span.cn { 180 | color: #8f5902; 181 | font-style: inherit; 182 | } 183 | 184 | code span.sc { 185 | color: #5E5E5E; 186 | font-style: inherit; 187 | } 188 | 189 | code span.dv { 190 | color: #AD0000; 191 | font-style: inherit; 192 | } 193 | 194 | code span.kw { 195 | color: #003B4F; 196 | font-style: inherit; 197 | } 198 | 199 | .prevent-inlining { 200 | content: ".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} -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/reset.css: -------------------------------------------------------------------------------- 1 | /* http://meyerweb.com/eric/tools/css/reset/ 2 | v4.0 | 20180602 3 | License: none (public domain) 4 | */ 5 | 6 | html, body, div, span, applet, object, iframe, 7 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 8 | a, abbr, acronym, address, big, cite, code, 9 | del, dfn, em, img, ins, kbd, q, s, samp, 10 | small, strike, strong, sub, sup, tt, var, 11 | b, u, i, center, 12 | dl, dt, dd, ol, ul, li, 13 | fieldset, form, label, legend, 14 | table, caption, tbody, tfoot, thead, tr, th, td, 15 | article, aside, canvas, details, embed, 16 | figure, figcaption, footer, header, hgroup, 17 | main, menu, nav, output, ruby, section, summary, 18 | time, mark, audio, video { 19 | margin: 0; 20 | padding: 0; 21 | border: 0; 22 | font-size: 100%; 23 | font: inherit; 24 | vertical-align: baseline; 25 | } 26 | /* HTML5 display-role reset for older browsers */ 27 | article, aside, details, figcaption, figure, 28 | footer, header, hgroup, main, menu, nav, section { 29 | display: block; 30 | } -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/league-gothic/LICENSE: -------------------------------------------------------------------------------- 1 | SIL Open Font License (OFL) 2 | http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL 3 | -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'League Gothic'; 3 | src: url('./league-gothic.eot'); 4 | src: url('./league-gothic.eot?#iefix') format('embedded-opentype'), 5 | url('./league-gothic.woff') format('woff'), 6 | url('./league-gothic.ttf') format('truetype'); 7 | 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.eot -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.ttf -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/league-gothic/league-gothic.woff -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/LICENSE: -------------------------------------------------------------------------------- 1 | SIL Open Font License 2 | 3 | Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name ‘Source’. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. 4 | 5 | This Font Software is licensed under the SIL Open Font License, Version 1.1. 6 | This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL 7 | 8 | —————————————————————————————- 9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 10 | —————————————————————————————- 11 | 12 | PREAMBLE 13 | The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. 14 | 15 | The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. 16 | 17 | DEFINITIONS 18 | “Font Software” refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. 19 | 20 | “Reserved Font Name” refers to any names specified as such after the copyright statement(s). 21 | 22 | “Original Version” refers to the collection of Font Software components as distributed by the Copyright Holder(s). 23 | 24 | “Modified Version” refers to any derivative made by adding to, deleting, or substituting—in part or in whole—any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. 25 | 26 | “Author” refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. 27 | 28 | PERMISSION & CONDITIONS 29 | Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: 30 | 31 | 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. 32 | 33 | 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. 34 | 35 | 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. 36 | 37 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. 38 | 39 | 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. 40 | 41 | TERMINATION 42 | This license becomes null and void if any of the above conditions are not met. 43 | 44 | DISCLAIMER 45 | THE FONT SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.eot -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.ttf -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-italic.woff -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.eot -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.ttf -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-regular.woff -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.eot -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.ttf -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibold.woff -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.eot -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.ttf -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro-semibolditalic.woff -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/dist/theme/fonts/source-sans-pro/source-sans-pro.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Source Sans Pro'; 3 | src: url('./source-sans-pro-regular.eot'); 4 | src: url('./source-sans-pro-regular.eot?#iefix') format('embedded-opentype'), 5 | url('./source-sans-pro-regular.woff') format('woff'), 6 | url('./source-sans-pro-regular.ttf') format('truetype'); 7 | font-weight: normal; 8 | font-style: normal; 9 | } 10 | 11 | @font-face { 12 | font-family: 'Source Sans Pro'; 13 | src: url('./source-sans-pro-italic.eot'); 14 | src: url('./source-sans-pro-italic.eot?#iefix') format('embedded-opentype'), 15 | url('./source-sans-pro-italic.woff') format('woff'), 16 | url('./source-sans-pro-italic.ttf') format('truetype'); 17 | font-weight: normal; 18 | font-style: italic; 19 | } 20 | 21 | @font-face { 22 | font-family: 'Source Sans Pro'; 23 | src: url('./source-sans-pro-semibold.eot'); 24 | src: url('./source-sans-pro-semibold.eot?#iefix') format('embedded-opentype'), 25 | url('./source-sans-pro-semibold.woff') format('woff'), 26 | url('./source-sans-pro-semibold.ttf') format('truetype'); 27 | font-weight: 600; 28 | font-style: normal; 29 | } 30 | 31 | @font-face { 32 | font-family: 'Source Sans Pro'; 33 | src: url('./source-sans-pro-semibolditalic.eot'); 34 | src: url('./source-sans-pro-semibolditalic.eot?#iefix') format('embedded-opentype'), 35 | url('./source-sans-pro-semibolditalic.woff') format('woff'), 36 | url('./source-sans-pro-semibolditalic.ttf') format('truetype'); 37 | font-weight: 600; 38 | font-style: italic; 39 | } 40 | -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/plugin/highlight/monokai.css: -------------------------------------------------------------------------------- 1 | /* 2 | Monokai style - ported by Luigi Maselli - http://grigio.org 3 | */ 4 | 5 | .hljs { 6 | display: block; 7 | overflow-x: auto; 8 | padding: 0.5em; 9 | background: #272822; 10 | color: #ddd; 11 | } 12 | 13 | .hljs-tag, 14 | .hljs-keyword, 15 | .hljs-selector-tag, 16 | .hljs-literal, 17 | .hljs-strong, 18 | .hljs-name { 19 | color: #f92672; 20 | } 21 | 22 | .hljs-code { 23 | color: #66d9ef; 24 | } 25 | 26 | .hljs-class .hljs-title { 27 | color: white; 28 | } 29 | 30 | .hljs-attribute, 31 | .hljs-symbol, 32 | .hljs-regexp, 33 | .hljs-link { 34 | color: #bf79db; 35 | } 36 | 37 | .hljs-string, 38 | .hljs-bullet, 39 | .hljs-subst, 40 | .hljs-title, 41 | .hljs-section, 42 | .hljs-emphasis, 43 | .hljs-type, 44 | .hljs-built_in, 45 | .hljs-builtin-name, 46 | .hljs-selector-attr, 47 | .hljs-selector-pseudo, 48 | .hljs-addition, 49 | .hljs-variable, 50 | .hljs-template-tag, 51 | .hljs-template-variable { 52 | color: #a6e22e; 53 | } 54 | 55 | .hljs-comment, 56 | .hljs-quote, 57 | .hljs-deletion, 58 | .hljs-meta { 59 | color: #75715e; 60 | } 61 | 62 | .hljs-keyword, 63 | .hljs-selector-tag, 64 | .hljs-literal, 65 | .hljs-doctag, 66 | .hljs-title, 67 | .hljs-section, 68 | .hljs-type, 69 | .hljs-selector-id { 70 | font-weight: bold; 71 | } 72 | -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/plugin/highlight/zenburn.css: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | Zenburn style from voldmar.ru (c) Vladimir Epifanov 4 | based on dark.css by Ivan Sagalaev 5 | 6 | */ 7 | 8 | .hljs { 9 | display: block; 10 | overflow-x: auto; 11 | padding: 0.5em; 12 | background: #3f3f3f; 13 | color: #dcdcdc; 14 | } 15 | 16 | .hljs-keyword, 17 | .hljs-selector-tag, 18 | .hljs-tag { 19 | color: #e3ceab; 20 | } 21 | 22 | .hljs-template-tag { 23 | color: #dcdcdc; 24 | } 25 | 26 | .hljs-number { 27 | color: #8cd0d3; 28 | } 29 | 30 | .hljs-variable, 31 | .hljs-template-variable, 32 | .hljs-attribute { 33 | color: #efdcbc; 34 | } 35 | 36 | .hljs-literal { 37 | color: #efefaf; 38 | } 39 | 40 | .hljs-subst { 41 | color: #8f8f8f; 42 | } 43 | 44 | .hljs-title, 45 | .hljs-name, 46 | .hljs-selector-id, 47 | .hljs-selector-class, 48 | .hljs-section, 49 | .hljs-type { 50 | color: #efef8f; 51 | } 52 | 53 | .hljs-symbol, 54 | .hljs-bullet, 55 | .hljs-link { 56 | color: #dca3a3; 57 | } 58 | 59 | .hljs-deletion, 60 | .hljs-string, 61 | .hljs-built_in, 62 | .hljs-builtin-name { 63 | color: #cc9393; 64 | } 65 | 66 | .hljs-addition, 67 | .hljs-comment, 68 | .hljs-quote, 69 | .hljs-meta { 70 | color: #7f9f7f; 71 | } 72 | 73 | 74 | .hljs-emphasis { 75 | font-style: italic; 76 | } 77 | 78 | .hljs-strong { 79 | font-weight: bold; 80 | } 81 | -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/plugin/math/katex.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A plugin which enables rendering of math equations inside 3 | * of reveal.js slides. Essentially a thin wrapper for KaTeX. 4 | * 5 | * @author Hakim El Hattab 6 | * @author Gerhard Burger 7 | */ 8 | export const KaTeX = () => { 9 | let deck; 10 | 11 | let defaultOptions = { 12 | version: 'latest', 13 | delimiters: [ 14 | {left: '$$', right: '$$', display: true}, // Note: $$ has to come before $ 15 | {left: '$', right: '$', display: false}, 16 | {left: '\\(', right: '\\)', display: false}, 17 | {left: '\\[', right: '\\]', display: true} 18 | ], 19 | ignoredTags: ['script', 'noscript', 'style', 'textarea', 'pre'] 20 | } 21 | 22 | const loadCss = src => { 23 | let link = document.createElement('link'); 24 | link.rel = 'stylesheet'; 25 | link.href = src; 26 | document.head.appendChild(link); 27 | }; 28 | 29 | /** 30 | * Loads a JavaScript file and returns a Promise for when it is loaded 31 | * Credits: https://aaronsmith.online/easily-load-an-external-script-using-javascript/ 32 | */ 33 | const loadScript = src => { 34 | return new Promise((resolve, reject) => { 35 | const script = document.createElement('script') 36 | script.type = 'text/javascript' 37 | script.onload = resolve 38 | script.onerror = reject 39 | script.src = src 40 | document.head.append(script) 41 | }) 42 | }; 43 | 44 | async function loadScripts(urls) { 45 | for(const url of urls) { 46 | await loadScript(url); 47 | } 48 | } 49 | 50 | return { 51 | id: 'katex', 52 | 53 | init: function (reveal) { 54 | 55 | deck = reveal; 56 | 57 | let revealOptions = deck.getConfig().katex || {}; 58 | 59 | let options = {...defaultOptions, ...revealOptions}; 60 | const {local, version, extensions, ...katexOptions} = options; 61 | 62 | let baseUrl = options.local || 'https://cdn.jsdelivr.net/npm/katex'; 63 | let versionString = options.local ? '' : '@' + options.version; 64 | 65 | let cssUrl = baseUrl + versionString + '/dist/katex.min.css'; 66 | let katexUrl = baseUrl + versionString + '/dist/katex.min.js'; 67 | let mhchemUrl = baseUrl + versionString + '/dist/contrib/mhchem.min.js' 68 | let karUrl = baseUrl + versionString + '/dist/contrib/auto-render.min.js'; 69 | 70 | let katexScripts = [katexUrl]; 71 | if(options.extensions && options.extensions.includes("mhchem")) { 72 | katexScripts.push(mhchemUrl); 73 | } 74 | katexScripts.push(karUrl); 75 | 76 | const renderMath = () => { 77 | renderMathInElement(reveal.getSlidesElement(), katexOptions); 78 | deck.layout(); 79 | } 80 | 81 | loadCss(cssUrl); 82 | 83 | // For some reason dynamically loading with defer attribute doesn't result in the expected behavior, the below code does 84 | loadScripts(katexScripts).then(() => { 85 | if( deck.isReady() ) { 86 | renderMath(); 87 | } 88 | else { 89 | deck.on( 'ready', renderMath.bind( this ) ); 90 | } 91 | }); 92 | 93 | } 94 | } 95 | 96 | }; 97 | -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/plugin/math/mathjax2.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A plugin which enables rendering of math equations inside 3 | * of reveal.js slides. Essentially a thin wrapper for MathJax. 4 | * 5 | * @author Hakim El Hattab 6 | */ 7 | export const MathJax2 = () => { 8 | 9 | // The reveal.js instance this plugin is attached to 10 | let deck; 11 | 12 | let defaultOptions = { 13 | messageStyle: 'none', 14 | tex2jax: { 15 | inlineMath: [ [ '$', '$' ], [ '\\(', '\\)' ] ], 16 | skipTags: [ 'script', 'noscript', 'style', 'textarea', 'pre' ] 17 | }, 18 | skipStartupTypeset: true 19 | }; 20 | 21 | function loadScript( url, callback ) { 22 | 23 | let head = document.querySelector( 'head' ); 24 | let script = document.createElement( 'script' ); 25 | script.type = 'text/javascript'; 26 | script.src = url; 27 | 28 | // Wrapper for callback to make sure it only fires once 29 | let finish = () => { 30 | if( typeof callback === 'function' ) { 31 | callback.call(); 32 | callback = null; 33 | } 34 | } 35 | 36 | script.onload = finish; 37 | 38 | // IE 39 | script.onreadystatechange = () => { 40 | if ( this.readyState === 'loaded' ) { 41 | finish(); 42 | } 43 | } 44 | 45 | // Normal browsers 46 | head.appendChild( script ); 47 | 48 | } 49 | 50 | return { 51 | id: 'mathjax2', 52 | 53 | init: function( reveal ) { 54 | 55 | deck = reveal; 56 | 57 | let revealOptions = deck.getConfig().mathjax2 || deck.getConfig().math || {}; 58 | 59 | let options = { ...defaultOptions, ...revealOptions }; 60 | let mathjax = options.mathjax || 'https://cdn.jsdelivr.net/npm/mathjax@2/MathJax.js'; 61 | let config = options.config || 'TeX-AMS_HTML-full'; 62 | let url = mathjax + '?config=' + config; 63 | 64 | options.tex2jax = { ...defaultOptions.tex2jax, ...revealOptions.tex2jax }; 65 | 66 | options.mathjax = options.config = null; 67 | 68 | loadScript( url, function() { 69 | 70 | MathJax.Hub.Config( options ); 71 | 72 | // Typeset followed by an immediate reveal.js layout since 73 | // the typesetting process could affect slide height 74 | MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub, deck.getRevealElement() ] ); 75 | MathJax.Hub.Queue( deck.layout ); 76 | 77 | // Reprocess equations in slides when they turn visible 78 | deck.on( 'slidechanged', function( event ) { 79 | 80 | MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub, event.currentSlide ] ); 81 | 82 | } ); 83 | 84 | } ); 85 | 86 | } 87 | } 88 | 89 | }; 90 | -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/plugin/math/mathjax3.js: -------------------------------------------------------------------------------- 1 | /** 2 | * A plugin which enables rendering of math equations inside 3 | * of reveal.js slides. Essentially a thin wrapper for MathJax 3 4 | * 5 | * @author Hakim El Hattab 6 | * @author Gerhard Burger 7 | */ 8 | export const MathJax3 = () => { 9 | 10 | // The reveal.js instance this plugin is attached to 11 | let deck; 12 | 13 | let defaultOptions = { 14 | tex: { 15 | inlineMath: [ [ '$', '$' ], [ '\\(', '\\)' ] ] 16 | }, 17 | options: { 18 | skipHtmlTags: [ 'script', 'noscript', 'style', 'textarea', 'pre' ] 19 | }, 20 | startup: { 21 | ready: () => { 22 | MathJax.startup.defaultReady(); 23 | MathJax.startup.promise.then(() => { 24 | Reveal.layout(); 25 | }); 26 | } 27 | } 28 | }; 29 | 30 | function loadScript( url, callback ) { 31 | 32 | let script = document.createElement( 'script' ); 33 | script.type = "text/javascript" 34 | script.id = "MathJax-script" 35 | script.src = url; 36 | script.async = true 37 | 38 | // Wrapper for callback to make sure it only fires once 39 | script.onload = () => { 40 | if (typeof callback === 'function') { 41 | callback.call(); 42 | callback = null; 43 | } 44 | }; 45 | 46 | document.head.appendChild( script ); 47 | 48 | } 49 | 50 | return { 51 | id: 'mathjax3', 52 | init: function(reveal) { 53 | 54 | deck = reveal; 55 | 56 | let revealOptions = deck.getConfig().mathjax3 || {}; 57 | let options = {...defaultOptions, ...revealOptions}; 58 | options.tex = {...defaultOptions.tex, ...revealOptions.tex} 59 | options.options = {...defaultOptions.options, ...revealOptions.options} 60 | options.startup = {...defaultOptions.startup, ...revealOptions.startup} 61 | 62 | let url = options.mathjax || 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js'; 63 | options.mathjax = null; 64 | 65 | window.MathJax = options; 66 | 67 | loadScript( url, function() { 68 | // Reprocess equations in slides when they turn visible 69 | Reveal.addEventListener( 'slidechanged', function( event ) { 70 | MathJax.typeset(); 71 | } ); 72 | } ); 73 | 74 | } 75 | } 76 | 77 | }; 78 | -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/plugin/math/plugin.js: -------------------------------------------------------------------------------- 1 | import {KaTeX} from "./katex"; 2 | import {MathJax2} from "./mathjax2"; 3 | import {MathJax3} from "./mathjax3"; 4 | 5 | const defaultTypesetter = MathJax2; 6 | 7 | /*! 8 | * This plugin is a wrapper for the MathJax2, 9 | * MathJax3 and KaTeX typesetter plugins. 10 | */ 11 | export default Plugin = Object.assign( defaultTypesetter(), { 12 | KaTeX, 13 | MathJax2, 14 | MathJax3 15 | } ); -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/plugin/notes/plugin.js: -------------------------------------------------------------------------------- 1 | import speakerViewHTML from './speaker-view.html'; 2 | 3 | import { marked } from 'marked'; 4 | 5 | /** 6 | * Handles opening of and synchronization with the reveal.js 7 | * notes window. 8 | * 9 | * Handshake process: 10 | * 1. This window posts 'connect' to notes window 11 | * - Includes URL of presentation to show 12 | * 2. Notes window responds with 'connected' when it is available 13 | * 3. This window proceeds to send the current presentation state 14 | * to the notes window 15 | */ 16 | const Plugin = () => { 17 | 18 | let connectInterval; 19 | let speakerWindow = null; 20 | let deck; 21 | 22 | /** 23 | * Opens a new speaker view window. 24 | */ 25 | function openSpeakerWindow() { 26 | 27 | // If a window is already open, focus it 28 | if( speakerWindow && !speakerWindow.closed ) { 29 | speakerWindow.focus(); 30 | } 31 | else { 32 | speakerWindow = window.open( 'about:blank', 'reveal.js - Notes', 'width=1100,height=700' ); 33 | speakerWindow.marked = marked; 34 | speakerWindow.document.write( speakerViewHTML ); 35 | 36 | if( !speakerWindow ) { 37 | alert( 'Speaker view popup failed to open. Please make sure popups are allowed and reopen the speaker view.' ); 38 | return; 39 | } 40 | 41 | connect(); 42 | } 43 | 44 | } 45 | 46 | /** 47 | * Reconnect with an existing speaker view window. 48 | */ 49 | function reconnectSpeakerWindow( reconnectWindow ) { 50 | 51 | if( speakerWindow && !speakerWindow.closed ) { 52 | speakerWindow.focus(); 53 | } 54 | else { 55 | speakerWindow = reconnectWindow; 56 | window.addEventListener( 'message', onPostMessage ); 57 | onConnected(); 58 | } 59 | 60 | } 61 | 62 | /** 63 | * Connect to the notes window through a postmessage handshake. 64 | * Using postmessage enables us to work in situations where the 65 | * origins differ, such as a presentation being opened from the 66 | * file system. 67 | */ 68 | function connect() { 69 | 70 | const presentationURL = deck.getConfig().url; 71 | 72 | const url = typeof presentationURL === 'string' ? presentationURL : 73 | window.location.protocol + '//' + window.location.host + window.location.pathname + window.location.search; 74 | 75 | // Keep trying to connect until we get a 'connected' message back 76 | connectInterval = setInterval( function() { 77 | speakerWindow.postMessage( JSON.stringify( { 78 | namespace: 'reveal-notes', 79 | type: 'connect', 80 | state: deck.getState(), 81 | url 82 | } ), '*' ); 83 | }, 500 ); 84 | 85 | window.addEventListener( 'message', onPostMessage ); 86 | 87 | } 88 | 89 | /** 90 | * Calls the specified Reveal.js method with the provided argument 91 | * and then pushes the result to the notes frame. 92 | */ 93 | function callRevealApi( methodName, methodArguments, callId ) { 94 | 95 | let result = deck[methodName].apply( deck, methodArguments ); 96 | speakerWindow.postMessage( JSON.stringify( { 97 | namespace: 'reveal-notes', 98 | type: 'return', 99 | result, 100 | callId 101 | } ), '*' ); 102 | 103 | } 104 | 105 | /** 106 | * Posts the current slide data to the notes window. 107 | */ 108 | function post( event ) { 109 | 110 | let slideElement = deck.getCurrentSlide(), 111 | notesElement = slideElement.querySelector( 'aside.notes' ), 112 | fragmentElement = slideElement.querySelector( '.current-fragment' ); 113 | 114 | let messageData = { 115 | namespace: 'reveal-notes', 116 | type: 'state', 117 | notes: '', 118 | markdown: false, 119 | whitespace: 'normal', 120 | state: deck.getState() 121 | }; 122 | 123 | // Look for notes defined in a slide attribute 124 | if( slideElement.hasAttribute( 'data-notes' ) ) { 125 | messageData.notes = slideElement.getAttribute( 'data-notes' ); 126 | messageData.whitespace = 'pre-wrap'; 127 | } 128 | 129 | // Look for notes defined in a fragment 130 | if( fragmentElement ) { 131 | let fragmentNotes = fragmentElement.querySelector( 'aside.notes' ); 132 | if( fragmentNotes ) { 133 | notesElement = fragmentNotes; 134 | } 135 | else if( fragmentElement.hasAttribute( 'data-notes' ) ) { 136 | messageData.notes = fragmentElement.getAttribute( 'data-notes' ); 137 | messageData.whitespace = 'pre-wrap'; 138 | 139 | // In case there are slide notes 140 | notesElement = null; 141 | } 142 | } 143 | 144 | // Look for notes defined in an aside element 145 | if( notesElement ) { 146 | messageData.notes = notesElement.innerHTML; 147 | messageData.markdown = typeof notesElement.getAttribute( 'data-markdown' ) === 'string'; 148 | } 149 | 150 | speakerWindow.postMessage( JSON.stringify( messageData ), '*' ); 151 | 152 | } 153 | 154 | function onPostMessage( event ) { 155 | 156 | let data = JSON.parse( event.data ); 157 | if( data && data.namespace === 'reveal-notes' && data.type === 'connected' ) { 158 | clearInterval( connectInterval ); 159 | onConnected(); 160 | } 161 | else if( data && data.namespace === 'reveal-notes' && data.type === 'call' ) { 162 | callRevealApi( data.methodName, data.arguments, data.callId ); 163 | } 164 | 165 | } 166 | 167 | /** 168 | * Called once we have established a connection to the notes 169 | * window. 170 | */ 171 | function onConnected() { 172 | 173 | // Monitor events that trigger a change in state 174 | deck.on( 'slidechanged', post ); 175 | deck.on( 'fragmentshown', post ); 176 | deck.on( 'fragmenthidden', post ); 177 | deck.on( 'overviewhidden', post ); 178 | deck.on( 'overviewshown', post ); 179 | deck.on( 'paused', post ); 180 | deck.on( 'resumed', post ); 181 | 182 | // Post the initial state 183 | post(); 184 | 185 | } 186 | 187 | return { 188 | id: 'notes', 189 | 190 | init: function( reveal ) { 191 | 192 | deck = reveal; 193 | 194 | if( !/receiver/i.test( window.location.search ) ) { 195 | 196 | // If the there's a 'notes' query set, open directly 197 | if( window.location.search.match( /(\?|\&)notes/gi ) !== null ) { 198 | openSpeakerWindow(); 199 | } 200 | else { 201 | // Keep listening for speaker view hearbeats. If we receive a 202 | // heartbeat from an orphaned window, reconnect it. This ensures 203 | // that we remain connected to the notes even if the presentation 204 | // is reloaded. 205 | window.addEventListener( 'message', event => { 206 | 207 | if( !speakerWindow && typeof event.data === 'string' ) { 208 | let data; 209 | 210 | try { 211 | data = JSON.parse( event.data ); 212 | } 213 | catch( error ) {} 214 | 215 | if( data && data.namespace === 'reveal-notes' && data.type === 'heartbeat' ) { 216 | reconnectSpeakerWindow( event.source ); 217 | } 218 | } 219 | }); 220 | } 221 | 222 | // Open the notes when the 's' key is hit 223 | deck.addKeyBinding({keyCode: 83, key: 'S', description: 'Speaker notes view'}, function() { 224 | openSpeakerWindow(); 225 | } ); 226 | 227 | } 228 | 229 | }, 230 | 231 | open: openSpeakerWindow 232 | }; 233 | 234 | }; 235 | 236 | export default Plugin; 237 | -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/plugin/pdf-export/pdfexport.js: -------------------------------------------------------------------------------- 1 | var PdfExport = ( function( _Reveal ){ 2 | 3 | var Reveal = _Reveal; 4 | var setStylesheet = null; 5 | var installAltKeyBindings = null; 6 | 7 | function getRevealJsPath(){ 8 | var regex = /\b[^/]+\/reveal.css$/i; 9 | var script = Array.from( document.querySelectorAll( 'link' ) ).find( function( e ){ 10 | return e.attributes.href && e.attributes.href.value.search( regex ) >= 0; 11 | }); 12 | if( !script ){ 13 | console.error( 'reveal.css could not be found in included elements. Did you rename this file?' ); 14 | return ''; 15 | } 16 | return script.attributes.href.value.replace( regex, '' ); 17 | } 18 | 19 | function setStylesheet3( pdfExport ){ 20 | var link = document.querySelector( '#print' ); 21 | if( !link ){ 22 | link = document.createElement( 'link' ); 23 | link.rel = 'stylesheet'; 24 | link.id = 'print'; 25 | document.querySelector( 'head' ).appendChild( link ); 26 | } 27 | var style = 'paper'; 28 | if( pdfExport ){ 29 | style = 'pdf'; 30 | } 31 | link.href = getRevealJsPath() + 'css/print/' + style + '.css'; 32 | } 33 | 34 | function setStylesheet4( pdfExport ){ 35 | } 36 | 37 | function installAltKeyBindings3(){ 38 | } 39 | 40 | function installAltKeyBindings4(){ 41 | if( isPrintingPDF() ){ 42 | var config = Reveal.getConfig(); 43 | var shortcut = config.pdfExportShortcut || 'E'; 44 | window.addEventListener( 'keydown', function( e ){ 45 | if( e.target.nodeName.toUpperCase() == 'BODY' 46 | && ( e.key.toUpperCase() == shortcut.toUpperCase() || e.keyCode == shortcut.toUpperCase().charCodeAt( 0 ) ) ){ 47 | e.preventDefault(); 48 | togglePdfExport(); 49 | return false; 50 | } 51 | }, true ); 52 | } 53 | } 54 | 55 | function isPrintingPDF(){ 56 | return ( /print-pdf/gi ).test( window.location.search ); 57 | } 58 | 59 | function togglePdfExport(){ 60 | var url_doc = new URL( document.URL ); 61 | var query_doc = new URLSearchParams( url_doc.searchParams ); 62 | if( isPrintingPDF() ){ 63 | query_doc.delete( 'print-pdf' ); 64 | }else{ 65 | query_doc.set( 'print-pdf', '' ); 66 | } 67 | url_doc.search = ( query_doc.toString() ? '?' + query_doc.toString() : '' ); 68 | window.location.href = url_doc.toString(); 69 | } 70 | 71 | function installKeyBindings(){ 72 | var config = Reveal.getConfig(); 73 | var shortcut = config.pdfExportShortcut || 'E'; 74 | Reveal.addKeyBinding({ 75 | keyCode: shortcut.toUpperCase().charCodeAt( 0 ), 76 | key: shortcut.toUpperCase(), 77 | description: 'PDF export mode' 78 | }, togglePdfExport ); 79 | installAltKeyBindings(); 80 | } 81 | 82 | function install(){ 83 | installKeyBindings(); 84 | setStylesheet( isPrintingPDF() ); 85 | } 86 | 87 | var Plugin = { 88 | } 89 | 90 | if( Reveal && Reveal.VERSION && Reveal.VERSION.length && Reveal.VERSION[ 0 ] == '3' ){ 91 | // reveal 3.x 92 | setStylesheet = setStylesheet3; 93 | installAltKeyBindings = installAltKeyBindings3; 94 | install(); 95 | }else{ 96 | // must be reveal 4.x 97 | setStylesheet = setStylesheet4; 98 | installAltKeyBindings = installAltKeyBindings4; 99 | Plugin.id = 'pdf-export'; 100 | Plugin.init = function( _Reveal ){ 101 | Reveal = _Reveal; 102 | install(); 103 | }; 104 | Plugin.togglePdfExport = function () { 105 | togglePdfExport(); 106 | }; 107 | } 108 | 109 | return Plugin; 110 | 111 | })( Reveal ); 112 | -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/plugin/pdf-export/plugin.yml: -------------------------------------------------------------------------------- 1 | name: PdfExport 2 | script: pdfexport.js 3 | -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/plugin/quarto-line-highlight/line-highlight.css: -------------------------------------------------------------------------------- 1 | .reveal 2 | div.sourceCode 3 | pre 4 | code.has-line-highlights 5 | > span:not(.highlight-line) { 6 | opacity: 0.4; 7 | } 8 | 9 | .reveal pre.numberSource { 10 | padding-left: 0; 11 | } 12 | 13 | .reveal pre.numberSource code > span { 14 | left: -2.1em; 15 | } 16 | 17 | pre.numberSource code > span > a:first-child::before { 18 | left: -0.7em; 19 | } 20 | 21 | .reveal pre > code:not(:first-child).fragment { 22 | position: absolute; 23 | top: 0; 24 | left: 0; 25 | width: 100%; 26 | box-sizing: border-box; 27 | } 28 | 29 | .reveal div.sourceCode pre code { 30 | min-height: 100%; 31 | } 32 | -------------------------------------------------------------------------------- /level-up-your-plots_nhsr_files/libs/revealjs/plugin/quarto-line-highlight/line-highlight.js: -------------------------------------------------------------------------------- 1 | window.QuartoLineHighlight = function () { 2 | function isPrintView() { 3 | return /print-pdf/gi.test(window.location.search); 4 | } 5 | 6 | const delimiters = { 7 | step: "|", 8 | line: ",", 9 | lineRange: "-", 10 | }; 11 | 12 | const regex = new RegExp( 13 | "^[\\d" + Object.values(delimiters).join("") + "]+$" 14 | ); 15 | 16 | function handleLinesSelector(deck, attr) { 17 | // if we are in printview with pdfSeparateFragments: false 18 | // then we'll also want to supress 19 | if (regex.test(attr)) { 20 | if (isPrintView() && deck.getConfig().pdfSeparateFragments !== true) { 21 | return false; 22 | } else { 23 | return true; 24 | } 25 | } else { 26 | return false; 27 | } 28 | } 29 | 30 | const kCodeLineNumbersAttr = "data-code-line-numbers"; 31 | const kFragmentIndex = "data-fragment-index"; 32 | 33 | function initQuartoLineHighlight(deck) { 34 | const divSourceCode = deck 35 | .getRevealElement() 36 | .querySelectorAll("div.sourceCode"); 37 | // Process each div created by Pandoc highlighting - numbered line are already included. 38 | divSourceCode.forEach((el) => { 39 | if (el.hasAttribute(kCodeLineNumbersAttr)) { 40 | const codeLineAttr = el.getAttribute(kCodeLineNumbersAttr); 41 | el.removeAttribute("data-code-line-numbers"); 42 | if (handleLinesSelector(deck, codeLineAttr)) { 43 | // Only process if attr is a string to select lines to highlights 44 | // e.g "1|3,6|8-11" 45 | const codeBlock = el.querySelectorAll("pre code"); 46 | codeBlock.forEach((code) => { 47 | // move attributes on code block 48 | code.setAttribute(kCodeLineNumbersAttr, codeLineAttr); 49 | 50 | const scrollState = { currentBlock: code }; 51 | 52 | // Check if there are steps and duplicate code block accordingly 53 | const highlightSteps = splitLineNumbers(codeLineAttr); 54 | if (highlightSteps.length > 1) { 55 | // If the original code block has a fragment-index, 56 | // each clone should follow in an incremental sequence 57 | let fragmentIndex = parseInt( 58 | code.getAttribute(kFragmentIndex), 59 | 10 60 | ); 61 | fragmentIndex = 62 | typeof fragmentIndex !== "number" || isNaN(fragmentIndex) 63 | ? null 64 | : fragmentIndex; 65 | 66 | let stepN = 1; 67 | highlightSteps.slice(1).forEach( 68 | // Generate fragments for all steps except the original block 69 | (step) => { 70 | var fragmentBlock = code.cloneNode(true); 71 | fragmentBlock.setAttribute( 72 | "data-code-line-numbers", 73 | joinLineNumbers([step]) 74 | ); 75 | fragmentBlock.classList.add("fragment"); 76 | 77 | // Pandoc sets id on spans we need to keep unique 78 | fragmentBlock 79 | .querySelectorAll(":scope > span") 80 | .forEach((span) => { 81 | if (span.hasAttribute("id")) { 82 | span.setAttribute( 83 | "id", 84 | span.getAttribute("id").concat("-" + stepN) 85 | ); 86 | } 87 | }); 88 | stepN = ++stepN; 89 | 90 | // Add duplicated element after existing one 91 | code.parentNode.appendChild(fragmentBlock); 92 | 93 | // Each new element is highlighted based on the new attributes value 94 | highlightCodeBlock(fragmentBlock); 95 | 96 | if (typeof fragmentIndex === "number") { 97 | fragmentBlock.setAttribute(kFragmentIndex, fragmentIndex); 98 | fragmentIndex += 1; 99 | } else { 100 | fragmentBlock.removeAttribute(kFragmentIndex); 101 | } 102 | 103 | // Scroll highlights into view as we step through them 104 | fragmentBlock.addEventListener( 105 | "visible", 106 | scrollHighlightedLineIntoView.bind( 107 | this, 108 | fragmentBlock, 109 | scrollState 110 | ) 111 | ); 112 | fragmentBlock.addEventListener( 113 | "hidden", 114 | scrollHighlightedLineIntoView.bind( 115 | this, 116 | fragmentBlock.previousSibling, 117 | scrollState 118 | ) 119 | ); 120 | } 121 | ); 122 | code.removeAttribute(kFragmentIndex); 123 | code.setAttribute( 124 | kCodeLineNumbersAttr, 125 | joinLineNumbers([highlightSteps[0]]) 126 | ); 127 | } 128 | 129 | // Scroll the first highlight into view when the slide becomes visible. 130 | const slide = 131 | typeof code.closest === "function" 132 | ? code.closest("section:not(.stack)") 133 | : null; 134 | if (slide) { 135 | const scrollFirstHighlightIntoView = function () { 136 | scrollHighlightedLineIntoView(code, scrollState, true); 137 | slide.removeEventListener( 138 | "visible", 139 | scrollFirstHighlightIntoView 140 | ); 141 | }; 142 | slide.addEventListener("visible", scrollFirstHighlightIntoView); 143 | } 144 | 145 | highlightCodeBlock(code); 146 | }); 147 | } 148 | } 149 | }); 150 | } 151 | 152 | function highlightCodeBlock(codeBlock) { 153 | const highlightSteps = splitLineNumbers( 154 | codeBlock.getAttribute(kCodeLineNumbersAttr) 155 | ); 156 | 157 | if (highlightSteps.length) { 158 | // If we have at least one step, we generate fragments 159 | highlightSteps[0].forEach((highlight) => { 160 | // Add expected class on
 for reveal CSS
161 |         codeBlock.parentNode.classList.add("code-wrapper");
162 | 
163 |         // Select lines to highlight
164 |         spanToHighlight = [];
165 |         if (typeof highlight.last === "number") {
166 |           spanToHighlight = [].slice.call(
167 |             codeBlock.querySelectorAll(
168 |               ":scope > span:nth-child(n+" +
169 |                 highlight.first +
170 |                 "):nth-child(-n+" +
171 |                 highlight.last +
172 |                 ")"
173 |             )
174 |           );
175 |         } else if (typeof highlight.first === "number") {
176 |           spanToHighlight = [].slice.call(
177 |             codeBlock.querySelectorAll(
178 |               ":scope > span:nth-child(" + highlight.first + ")"
179 |             )
180 |           );
181 |         }
182 |         if (spanToHighlight.length) {
183 |           // Add a class on  and  to select line to highlight
184 |           spanToHighlight.forEach((span) =>
185 |             span.classList.add("highlight-line")
186 |           );
187 |           codeBlock.classList.add("has-line-highlights");
188 |         }
189 |       });
190 |     }
191 |   }
192 | 
193 |   /**
194 |    * Animates scrolling to the first highlighted line
195 |    * in the given code block.
196 |    */
197 |   function scrollHighlightedLineIntoView(block, scrollState, skipAnimation) {
198 |     window.cancelAnimationFrame(scrollState.animationFrameID);
199 | 
200 |     // Match the scroll position of the currently visible
201 |     // code block
202 |     if (scrollState.currentBlock) {
203 |       block.scrollTop = scrollState.currentBlock.scrollTop;
204 |     }
205 | 
206 |     // Remember the current code block so that we can match
207 |     // its scroll position when showing/hiding fragments
208 |     scrollState.currentBlock = block;
209 | 
210 |     const highlightBounds = getHighlightedLineBounds(block);
211 |     let viewportHeight = block.offsetHeight;
212 | 
213 |     // Subtract padding from the viewport height
214 |     const blockStyles = window.getComputedStyle(block);
215 |     viewportHeight -=
216 |       parseInt(blockStyles.paddingTop) + parseInt(blockStyles.paddingBottom);
217 | 
218 |     // Scroll position which centers all highlights
219 |     const startTop = block.scrollTop;
220 |     let targetTop =
221 |       highlightBounds.top +
222 |       (Math.min(highlightBounds.bottom - highlightBounds.top, viewportHeight) -
223 |         viewportHeight) /
224 |         2;
225 | 
226 |     // Make sure the scroll target is within bounds
227 |     targetTop = Math.max(
228 |       Math.min(targetTop, block.scrollHeight - viewportHeight),
229 |       0
230 |     );
231 | 
232 |     if (skipAnimation === true || startTop === targetTop) {
233 |       block.scrollTop = targetTop;
234 |     } else {
235 |       // Don't attempt to scroll if there is no overflow
236 |       if (block.scrollHeight <= viewportHeight) return;
237 | 
238 |       let time = 0;
239 | 
240 |       const animate = function () {
241 |         time = Math.min(time + 0.02, 1);
242 | 
243 |         // Update our eased scroll position
244 |         block.scrollTop =
245 |           startTop + (targetTop - startTop) * easeInOutQuart(time);
246 | 
247 |         // Keep animating unless we've reached the end
248 |         if (time < 1) {
249 |           scrollState.animationFrameID = requestAnimationFrame(animate);
250 |         }
251 |       };
252 | 
253 |       animate();
254 |     }
255 |   }
256 | 
257 |   function getHighlightedLineBounds(block) {
258 |     const highlightedLines = block.querySelectorAll(".highlight-line");
259 |     if (highlightedLines.length === 0) {
260 |       return { top: 0, bottom: 0 };
261 |     } else {
262 |       const firstHighlight = highlightedLines[0];
263 |       const lastHighlight = highlightedLines[highlightedLines.length - 1];
264 | 
265 |       return {
266 |         top: firstHighlight.offsetTop,
267 |         bottom: lastHighlight.offsetTop + lastHighlight.offsetHeight,
268 |       };
269 |     }
270 |   }
271 | 
272 |   /**
273 |    * The easing function used when scrolling.
274 |    */
275 |   function easeInOutQuart(t) {
276 |     // easeInOutQuart
277 |     return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t;
278 |   }
279 | 
280 |   function splitLineNumbers(lineNumbersAttr) {
281 |     // remove space
282 |     lineNumbersAttr = lineNumbersAttr.replace("/s/g", "");
283 |     // seperate steps (for fragment)
284 |     lineNumbersAttr = lineNumbersAttr.split(delimiters.step);
285 | 
286 |     // for each step, calculate first and last line, if any
287 |     return lineNumbersAttr.map((highlights) => {
288 |       // detect lines
289 |       const lines = highlights.split(delimiters.line);
290 |       return lines.map((range) => {
291 |         if (/^[\d-]+$/.test(range)) {
292 |           range = range.split(delimiters.lineRange);
293 |           const firstLine = parseInt(range[0], 10);
294 |           const lastLine = range[1] ? parseInt(range[1], 10) : undefined;
295 |           return {
296 |             first: firstLine,
297 |             last: lastLine,
298 |           };
299 |         } else {
300 |           return {};
301 |         }
302 |       });
303 |     });
304 |   }
305 | 
306 |   function joinLineNumbers(splittedLineNumbers) {
307 |     return splittedLineNumbers
308 |       .map(function (highlights) {
309 |         return highlights
310 |           .map(function (highlight) {
311 |             // Line range
312 |             if (typeof highlight.last === "number") {
313 |               return highlight.first + delimiters.lineRange + highlight.last;
314 |             }
315 |             // Single line
316 |             else if (typeof highlight.first === "number") {
317 |               return highlight.first;
318 |             }
319 |             // All lines
320 |             else {
321 |               return "";
322 |             }
323 |           })
324 |           .join(delimiters.line);
325 |       })
326 |       .join(delimiters.step);
327 |   }
328 | 
329 |   return {
330 |     id: "quarto-line-highlight",
331 |     init: function (deck) {
332 |       initQuartoLineHighlight(deck);
333 | 
334 |       // If we're printing to PDF, scroll the code highlights of
335 |       // all blocks in the deck into view at once
336 |       deck.on("pdf-ready", function () {
337 |         [].slice
338 |           .call(
339 |             deck
340 |               .getRevealElement()
341 |               .querySelectorAll(
342 |                 "pre code[data-code-line-numbers].current-fragment"
343 |               )
344 |           )
345 |           .forEach(function (block) {
346 |             scrollHighlightedLineIntoView(block, {}, true);
347 |           });
348 |       });
349 |     },
350 |   };
351 | };
352 | 


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/quarto-line-highlight/plugin.yml:
--------------------------------------------------------------------------------
1 | # adapted from https://github.com/hakimel/reveal.js/tree/master/plugin/highlight
2 | name: QuartoLineHighlight
3 | script: line-highlight.js
4 | stylesheet: line-highlight.css
5 | 


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/quarto-support/footer.css:
--------------------------------------------------------------------------------
  1 | .reveal .slide-logo {
  2 |   display: block;
  3 |   position: fixed;
  4 |   bottom: 0;
  5 |   right: 12px;
  6 |   margin-bottom: 8px;
  7 |   max-height: 2.2rem;
  8 |   height: 100%;
  9 |   width: auto;
 10 |   z-index: 5;
 11 | }
 12 | 
 13 | .reveal .footer {
 14 |   display: block;
 15 |   position: fixed;
 16 |   bottom: 0px;
 17 |   width: 100%;
 18 |   margin: 0 auto;
 19 |   text-align: center;
 20 |   font-size: 15pt;
 21 | }
 22 | 
 23 | .reveal .footer > * {
 24 |   margin-top: 0;
 25 |   margin-bottom: 0;
 26 | }
 27 | 
 28 | .reveal .slide .footer {
 29 |   display: none;
 30 | }
 31 | 
 32 | .reveal .slide-number {
 33 |   bottom: 10px;
 34 |   right: 10px;
 35 |   font-size: 16px;
 36 |   background-color: transparent;
 37 | }
 38 | 
 39 | .reveal.has-logo .slide-number {
 40 |   bottom: initial;
 41 |   top: 8px;
 42 |   right: 8px;
 43 | }
 44 | 
 45 | .reveal .slide-number .slide-number-delimiter {
 46 |   margin: 0;
 47 | }
 48 | 
 49 | .reveal .slide-menu-button {
 50 |   left: 8px;
 51 |   bottom: 8px;
 52 | }
 53 | 
 54 | .reveal .slide-chalkboard-buttons {
 55 |   position: fixed;
 56 |   left: 12px;
 57 |   bottom: 8px;
 58 |   z-index: 30;
 59 |   font-size: 24px;
 60 | }
 61 | 
 62 | .reveal .slide-chalkboard-buttons.slide-menu-offset {
 63 |   left: 54px;
 64 | }
 65 | 
 66 | .reveal .slide-chalkboard-buttons > span {
 67 |   margin-right: 14px;
 68 |   cursor: pointer;
 69 | }
 70 | 
 71 | @media screen and (max-width: 800px) {
 72 |   .reveal .slide-logo {
 73 |     max-height: 1.2rem;
 74 |     margin-bottom: 0px;
 75 |     right: 10px;
 76 |     padding-bottom: 6px;
 77 |   }
 78 |   .reveal .footer {
 79 |     font-size: 10pt;
 80 |     bottom: 0px;
 81 |     padding-top: 8px;
 82 |     padding-bottom: 6px;
 83 |   }
 84 |   .reveal .slide-number {
 85 |     font-size: 12px;
 86 |     bottom: 7px;
 87 |   }
 88 |   .reveal .slide-menu-button .fas::before {
 89 |     height: 1.3rem;
 90 |     width: 1.3rem;
 91 |     vertical-align: -1em;
 92 |     background-size: 1.3rem 1.3rem;
 93 | 	padding-bottom: 6px;
 94 | 	margin-bottom: -0.35em;
 95 |   }
 96 | 
 97 |   .reveal .slide-chalkboard-buttons .fas::before {
 98 |     height: 0.95rem;
 99 |     width: 0.95rem;
100 |     background-size: 0.95rem 0.95rem;
101 |     vertical-align: -0em;
102 |   }
103 | 
104 |   .reveal .slide-chalkboard-buttons.slide-menu-offset {
105 |     left: 36px;
106 |   }
107 |   .reveal .slide-chalkboard-buttons > span {
108 |     margin-right: 9px;
109 |   }
110 | }
111 | 
112 | html.print-pdf .reveal .slide-menu-button,
113 | html.print-pdf .reveal .slide-chalkboard-buttons {
114 |   display: none;
115 | }
116 | 


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/quarto-support/plugin.yml:
--------------------------------------------------------------------------------
1 | name: QuartoSupport
2 | script: support.js
3 | stylesheet: footer.css
4 | config:
5 |   smaller: false
6 | 


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/quarto-support/support.js:
--------------------------------------------------------------------------------
  1 | // catch all plugin for various quarto features
  2 | window.QuartoSupport = function () {
  3 |   function isPrintView() {
  4 |     return /print-pdf/gi.test(window.location.search);
  5 |   }
  6 | 
  7 |   // implement controlsAudo
  8 |   function controlsAuto(deck) {
  9 |     const config = deck.getConfig();
 10 |     if (config.controlsAuto === true) {
 11 |       const iframe = window.location !== window.parent.location;
 12 |       const localhost =
 13 |         window.location.hostname === "localhost" ||
 14 |         window.location.hostname === "127.0.0.1";
 15 |       deck.configure({
 16 |         controls:
 17 |           (iframe && !localhost) ||
 18 |           (deck.hasVerticalSlides() && config.navigationMode !== "linear"),
 19 |       });
 20 |     }
 21 |   }
 22 | 
 23 |   // helper to provide event handlers for all links in a container
 24 |   function handleLinkClickEvents(deck, container) {
 25 |     Array.from(container.querySelectorAll("a")).forEach((el) => {
 26 |       const url = el.getAttribute("href");
 27 |       if (/^(http|www)/gi.test(url)) {
 28 |         el.addEventListener(
 29 |           "click",
 30 |           (ev) => {
 31 |             const fullscreen = !!window.document.fullscreen;
 32 |             const dataPreviewLink = el.getAttribute("data-preview-link");
 33 | 
 34 |             // if there is a local specifcation then use that
 35 |             if (dataPreviewLink) {
 36 |               if (
 37 |                 dataPreviewLink === "true" ||
 38 |                 (dataPreviewLink === "auto" && fullscreen)
 39 |               ) {
 40 |                 ev.preventDefault();
 41 |                 deck.showPreview(url);
 42 |                 return false;
 43 |               }
 44 |             } else {
 45 |               const previewLinks = !!deck.getConfig().previewLinks;
 46 |               const previewLinksAuto =
 47 |                 deck.getConfig().previewLinksAuto === true;
 48 |               if (previewLinks == true || (previewLinksAuto && fullscreen)) {
 49 |                 ev.preventDefault();
 50 |                 deck.showPreview(url);
 51 |                 return false;
 52 |               }
 53 |             }
 54 | 
 55 |             // if the deck is in an iframe we want to open it externally
 56 |             // (don't do this when in vscode though as it has its own
 57 |             // handler for opening links externally that will be play)
 58 |             const iframe = window.location !== window.parent.location;
 59 |             if (
 60 |               iframe &&
 61 |               !window.location.search.includes("quartoPreviewReqId=")
 62 |             ) {
 63 |               ev.preventDefault();
 64 |               ev.stopImmediatePropagation();
 65 |               window.open(url, "_blank");
 66 |               return false;
 67 |             }
 68 | 
 69 |             // if the user has set data-preview-link to "auto" we need to handle the event
 70 |             // (because reveal will interpret "auto" as true)
 71 |             if (dataPreviewLink === "auto") {
 72 |               ev.preventDefault();
 73 |               ev.stopImmediatePropagation();
 74 |               const target =
 75 |                 el.getAttribute("target") ||
 76 |                 (ev.ctrlKey || ev.metaKey ? "_blank" : "");
 77 |               if (target) {
 78 |                 window.open(url, target);
 79 |               } else {
 80 |                 window.location.href = url;
 81 |               }
 82 |               return false;
 83 |             }
 84 |           },
 85 |           false
 86 |         );
 87 |       }
 88 |     });
 89 |   }
 90 | 
 91 |   // implement previewLinksAuto
 92 |   function previewLinksAuto(deck) {
 93 |     handleLinkClickEvents(deck, deck.getRevealElement());
 94 |   }
 95 | 
 96 |   // apply styles
 97 |   function applyGlobalStyles(deck) {
 98 |     if (deck.getConfig()["smaller"] === true) {
 99 |       const revealParent = deck.getRevealElement();
100 |       revealParent.classList.add("smaller");
101 |     }
102 |   }
103 | 
104 |   // add logo image
105 |   function addLogoImage(deck) {
106 |     const revealParent = deck.getRevealElement();
107 |     const logoImg = document.querySelector(".slide-logo");
108 |     if (logoImg) {
109 |       revealParent.appendChild(logoImg);
110 |       revealParent.classList.add("has-logo");
111 |     }
112 |   }
113 | 
114 |   // add footer text
115 |   function addFooter(deck) {
116 |     const revealParent = deck.getRevealElement();
117 |     const defaultFooterDiv = document.querySelector(".footer-default");
118 |     if (defaultFooterDiv) {
119 |       revealParent.appendChild(defaultFooterDiv);
120 |       handleLinkClickEvents(deck, defaultFooterDiv);
121 |       if (!isPrintView()) {
122 |         deck.on("slidechanged", function (ev) {
123 |           const prevSlideFooter = document.querySelector(
124 |             ".reveal > .footer:not(.footer-default)"
125 |           );
126 |           if (prevSlideFooter) {
127 |             prevSlideFooter.remove();
128 |           }
129 |           const currentSlideFooter = ev.currentSlide.querySelector(".footer");
130 |           if (currentSlideFooter) {
131 |             defaultFooterDiv.style.display = "none";
132 |             const slideFooter = currentSlideFooter.cloneNode(true);
133 |             handleLinkClickEvents(deck, slideFooter);
134 |             deck.getRevealElement().appendChild(slideFooter);
135 |           } else {
136 |             defaultFooterDiv.style.display = "block";
137 |           }
138 |         });
139 |       }
140 |     }
141 |   }
142 | 
143 |   // add chalkboard buttons
144 |   function addChalkboardButtons(deck) {
145 |     const chalkboard = deck.getPlugin("RevealChalkboard");
146 |     if (chalkboard && !isPrintView()) {
147 |       const revealParent = deck.getRevealElement();
148 |       const chalkboardDiv = document.createElement("div");
149 |       chalkboardDiv.classList.add("slide-chalkboard-buttons");
150 |       if (document.querySelector(".slide-menu-button")) {
151 |         chalkboardDiv.classList.add("slide-menu-offset");
152 |       }
153 |       // add buttons
154 |       const buttons = [
155 |         {
156 |           icon: "easel2",
157 |           title: "Toggle Chalkboard (b)",
158 |           onclick: chalkboard.toggleChalkboard,
159 |         },
160 |         {
161 |           icon: "brush",
162 |           title: "Toggle Notes Canvas (c)",
163 |           onclick: chalkboard.toggleNotesCanvas,
164 |         },
165 |       ];
166 |       buttons.forEach(function (button) {
167 |         const span = document.createElement("span");
168 |         span.title = button.title;
169 |         const icon = document.createElement("i");
170 |         icon.classList.add("fas");
171 |         icon.classList.add("fa-" + button.icon);
172 |         span.appendChild(icon);
173 |         span.onclick = function (event) {
174 |           event.preventDefault();
175 |           button.onclick();
176 |         };
177 |         chalkboardDiv.appendChild(span);
178 |       });
179 |       revealParent.appendChild(chalkboardDiv);
180 |       const config = deck.getConfig();
181 |       if (!config.chalkboard.buttons) {
182 |         chalkboardDiv.classList.add("hidden");
183 |       }
184 | 
185 |       // show and hide chalkboard buttons on slidechange
186 |       deck.on("slidechanged", function (ev) {
187 |         const config = deck.getConfig();
188 |         let buttons = !!config.chalkboard.buttons;
189 |         const slideButtons = ev.currentSlide.getAttribute(
190 |           "data-chalkboard-buttons"
191 |         );
192 |         if (slideButtons) {
193 |           if (slideButtons === "true" || slideButtons === "1") {
194 |             buttons = true;
195 |           } else if (slideButtons === "false" || slideButtons === "0") {
196 |             buttons = false;
197 |           }
198 |         }
199 |         if (buttons) {
200 |           chalkboardDiv.classList.remove("hidden");
201 |         } else {
202 |           chalkboardDiv.classList.add("hidden");
203 |         }
204 |       });
205 |     }
206 |   }
207 | 
208 |   function handleTabbyClicks() {
209 |     const tabs = document.querySelectorAll(".panel-tabset-tabby > li > a");
210 |     for (let i = 0; i < tabs.length; i++) {
211 |       const tab = tabs[i];
212 |       tab.onclick = function (ev) {
213 |         ev.preventDefault();
214 |         ev.stopPropagation();
215 |         return false;
216 |       };
217 |     }
218 |   }
219 | 
220 |   function fixupForPrint(deck) {
221 |     if (isPrintView()) {
222 |       const slides = deck.getSlides();
223 |       slides.forEach(function (slide) {
224 |         slide.removeAttribute("data-auto-animate");
225 |       });
226 |       window.document.querySelectorAll(".hljs").forEach(function (el) {
227 |         el.classList.remove("hljs");
228 |       });
229 |       window.document.querySelectorAll(".hljs-ln-code").forEach(function (el) {
230 |         el.classList.remove("hljs-ln-code");
231 |       });
232 |     }
233 |   }
234 | 
235 |   function handleSlideChanges(deck) {
236 |     // dispatch for htmlwidgets
237 |     const fireSlideEnter = () => {
238 |       const event = window.document.createEvent("Event");
239 |       event.initEvent("slideenter", true, true);
240 |       window.document.dispatchEvent(event);
241 |     };
242 | 
243 |     const fireSlideChanged = (previousSlide, currentSlide) => {
244 |       fireSlideEnter();
245 | 
246 |       // dispatch for shiny
247 |       if (window.jQuery) {
248 |         if (previousSlide) {
249 |           window.jQuery(previousSlide).trigger("hidden");
250 |         }
251 |         if (currentSlide) {
252 |           window.jQuery(currentSlide).trigger("shown");
253 |         }
254 |       }
255 |     };
256 | 
257 |     // fire slideEnter for tabby tab activations (for htmlwidget resize behavior)
258 |     document.addEventListener("tabby", fireSlideEnter, false);
259 | 
260 |     deck.on("slidechanged", function (event) {
261 |       fireSlideChanged(event.previousSlide, event.currentSlide);
262 |     });
263 |   }
264 | 
265 |   function workaroundMermaidDistance(deck) {
266 |     if (window.document.querySelector("pre.mermaid-js")) {
267 |       const slideCount = deck.getTotalSlides();
268 |       deck.configure({
269 |         mobileViewDistance: slideCount,
270 |         viewDistance: slideCount,
271 |       });
272 |     }
273 |   }
274 | 
275 |   return {
276 |     id: "quarto-support",
277 |     init: function (deck) {
278 |       controlsAuto(deck);
279 |       previewLinksAuto(deck);
280 |       fixupForPrint(deck);
281 |       applyGlobalStyles(deck);
282 |       addLogoImage(deck);
283 |       addFooter(deck);
284 |       addChalkboardButtons(deck);
285 |       handleTabbyClicks();
286 |       handleSlideChanges(deck);
287 |       workaroundMermaidDistance(deck);
288 |     },
289 |   };
290 | };
291 | 


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/README.md:
--------------------------------------------------------------------------------
  1 | # Chalkboard
  2 | 
  3 | With this plugin you can add a chalkboard to reveal.js. The plugin provides two possibilities to include handwritten notes to your presentation:
  4 | 
  5 | - you can make notes directly on the slides, e.g. to comment on certain aspects,
  6 | - you can open a chalkboard or whiteboard on which you can make notes.
  7 | 
  8 | The main use case in mind when implementing the plugin is classroom usage in which you may want to explain some course content and quickly need to make some notes.
  9 | 
 10 | The plugin records all drawings made so that they can be play backed using the `autoSlide` feature or the `audio-slideshow` plugin.
 11 | 
 12 | [Check out the live demo](https://rajgoel.github.io/reveal.js-demos/chalkboard-demo.html)
 13 | 
 14 | The chalkboard effect is based on [Chalkboard](https://github.com/mmoustafa/Chalkboard) by Mohamed Moustafa.
 15 | 
 16 | ## Installation
 17 | 
 18 | Copy the file `plugin.js` and the  `img` directory into the plugin folder of your reveal.js presentation, i.e. `plugin/chalkboard` and load the plugin as shown below.
 19 | 
 20 | ```html
 21 | 
 22 | 
 23 | 
 24 | 
 31 | ```
 32 | 
 33 | The following stylesheet
 34 | ```html
 35 | 
 36 | 
 37 | ```
 38 | has to be included to the `head` section of you HTML-file.
 39 | 
 40 | 
 41 | In order to include buttons for opening and closing the notes canvas or the chalkboard you should make sure that `font-awesome` is available. The easiest way is to include
 42 | ```
 43 | 
 44 | ```
 45 | to the ```head``` section of you HTML-file.
 46 | 
 47 | ## Usage
 48 | 
 49 | ### Mouse or touch
 50 | - Click on the pen symbols at the bottom left to toggle the notes canvas or chalkboard
 51 | - Click on the color picker at the left to change the color (the color picker is only visible if the notes canvas or chalkboard is active)
 52 | - Click on the up/down arrows on the left to the switch among multiple chalkboardd (the up/down arrows are only available for the chlakboard)
 53 | - Click the left mouse button and drag to write on notes canvas or chalkboard
 54 | - Click the right mouse button and drag to wipe away previous drawings
 55 | - Touch and move to write on notes canvas or chalkboard
 56 | - Touch and hold for half a second, then move to wipe away previous drawings
 57 | 
 58 | ### Keyboard
 59 | - Press the 'BACKSPACE' key to delete all chalkboard drawings
 60 | - Press the 'DEL' key to clear the notes canvas or chalkboard
 61 | - Press the 'c' key to toggle the notes canvas
 62 | - Press the 'b' key to toggle the chalkboard
 63 | - Press the 'd' key to download drawings
 64 | - Press the 'x' key to cycle colors forward
 65 | - Press the 'y' key to cycle colors backward
 66 | 
 67 | ## Playback
 68 | 
 69 | If the `autoSlide` feature is set or if the `audio-slideshow` plugin is used, pre-recorded chalkboard drawings can be played. The slideshow plays back the user interaction with the chalkboard in the same way as it was conducted when recording the data.
 70 | 
 71 | ## Multiplexing
 72 | 
 73 | The plugin supports multiplexing via the [`multiplex` plugin](https://github.com/reveal/multiplex) or the [`seminar` plugin](https://github.com/rajgoel/reveal.js-plugins/tree/master/seminar).
 74 | 
 75 | ## PDF-Export
 76 | 
 77 | If the slideshow is opened in [print mode](https://revealjs.com/pdf-export/), the chalkboard drawings in the session storage (see `storage` option - print version must be opened in the same tab or window as the original slideshow) or provided in a file (see `src` option) are included in the PDF-file. Each drawing on the chalkboard is added after the slide that was shown when opening the chalkboard. Drawings on the notes canvas are not included in the PDF-file.
 78 | 
 79 | 
 80 | ## Configuration
 81 | 
 82 | The plugin has several configuration options:
 83 | 
 84 | - ```boardmarkerWidth```: an integer, the drawing width of the boardmarker; larger values draw thicker lines.
 85 | - ```chalkWidth```: an integer, the drawing width of the chalk; larger values draw thicker lines.
 86 | - ```chalkEffect```: a float in the range ```[0.0, 1.0]```, the intesity of the chalk effect on the chalk board. Full effect (default) ```1.0```, no effect ```0.0```.
 87 | - ```storage```: Optional variable name for session storage of drawings.
 88 | - ```src```: Optional filename for pre-recorded drawings.
 89 | - ```readOnly```: Configuation option allowing to prevent changes to existing drawings. If set to ```true``` no changes can be made, if set to false ```false``` changes can be made, if unset or set to ```undefined``` no changes to the drawings can be made after returning to a slide or fragment for which drawings had been recorded before. In any case the recorded drawings for a slide or fragment can be cleared by pressing the 'DEL' key (i.e. by using the ```RevealChalkboard.clear()``` function).
 90 | - ```transition```: Gives the duration (in milliseconds) of the transition for a slide change, so that the notes canvas is drawn after the transition is completed.
 91 | - ```theme```: Can be set to either ```"chalkboard"``` or ```"whiteboard"```.
 92 | 
 93 | The following configuration options allow to change the appearance of the notes canvas and the chalkboard. All of these options require two values, the first gives the value for the notes canvas, the second for the chalkboard.
 94 | 
 95 | - ```background```: The first value expects a (semi-)transparent color which is used to provide visual feedback that the notes canvas is enabled, the second value expects a filename to a background image for the chalkboard.
 96 | - ```grid```: By default whiteboard and chalkboard themes include a grid pattern on the background. This pattern can be modified by setting the color, the distance between lines, and the line width, e.g. ```{ color: 'rgb(127,127,255,0.1)', distance: 40, width: 2}```. Alternatively, the grid can be removed by setting the value to ```false```.
 97 | - ```eraser```: An image path and radius for the eraser.
 98 | - ```boardmarkers```: A list of boardmarkers with given color and cursor.
 99 | - ```chalks```: A list of chalks with given color and cursor.
100 | - ```rememberColor```: Whether to remember the last selected color for the slide canvas or the board.
101 | 
102 | All of the configurations are optional and the default values shown below are used if the options are not provided.
103 | 
104 | ```javascript
105 | Reveal.initialize({
106 | 	// ...
107 |     chalkboard: {
108 |         boardmarkerWidth: 3,
109 |         chalkWidth: 7,
110 |         chalkEffect: 1.0,
111 |         storage: null,
112 |         src: null,
113 |         readOnly: undefined,
114 |         transition: 800,
115 |         theme: "chalkboard",
116 |         background: [ 'rgba(127,127,127,.1)' , path + 'img/blackboard.png' ],
117 |         grid: { color: 'rgb(50,50,10,0.5)', distance: 80, width: 2},
118 |         eraser: { src: path + 'img/sponge.png', radius: 20},
119 |         boardmarkers : [
120 |                 { color: 'rgba(100,100,100,1)', cursor: 'url(' + path + 'img/boardmarker-black.png), auto'},
121 |                 { color: 'rgba(30,144,255, 1)', cursor: 'url(' + path + 'img/boardmarker-blue.png), auto'},
122 |                 { color: 'rgba(220,20,60,1)', cursor: 'url(' + path + 'img/boardmarker-red.png), auto'},
123 |                 { color: 'rgba(50,205,50,1)', cursor: 'url(' + path + 'img/boardmarker-green.png), auto'},
124 |                 { color: 'rgba(255,140,0,1)', cursor: 'url(' + path + 'img/boardmarker-orange.png), auto'},
125 |                 { color: 'rgba(150,0,20150,1)', cursor: 'url(' + path + 'img/boardmarker-purple.png), auto'},
126 |                 { color: 'rgba(255,220,0,1)', cursor: 'url(' + path + 'img/boardmarker-yellow.png), auto'}
127 |         ],
128 |         chalks: [
129 |                 { color: 'rgba(255,255,255,0.5)', cursor: 'url(' + path + 'img/chalk-white.png), auto'},
130 |                 { color: 'rgba(96, 154, 244, 0.5)', cursor: 'url(' + path + 'img/chalk-blue.png), auto'},
131 |                 { color: 'rgba(237, 20, 28, 0.5)', cursor: 'url(' + path + 'img/chalk-red.png), auto'},
132 |                 { color: 'rgba(20, 237, 28, 0.5)', cursor: 'url(' + path + 'img/chalk-green.png), auto'},
133 |                 { color: 'rgba(220, 133, 41, 0.5)', cursor: 'url(' + path + 'img/chalk-orange.png), auto'},
134 |                 { color: 'rgba(220,0,220,0.5)', cursor: 'url(' + path + 'img/chalk-purple.png), auto'},
135 |                 { color: 'rgba(255,220,0,0.5)', cursor: 'url(' + path + 'img/chalk-yellow.png), auto'}
136 |         ]
137 |     },
138 |     customcontrols: {
139 |   		controls: [
140 |   			{ icon: '',
141 |   			  title: 'Toggle chalkboard (B)',
142 |   			  action: 'RevealChalkboard.toggleChalkboard();'
143 |   			},
144 |   			{ icon: '',
145 |   			  title: 'Toggle notes canvas (C)',
146 |   			  action: 'RevealChalkboard.toggleNotesCanvas();'
147 |   			}
148 |   		]
149 |     },
150 |     // ...
151 | 
152 | });
153 | ```
154 | 
155 | 
156 | ## License
157 | 
158 | MIT licensed
159 | 
160 | Copyright (C) 2021 Asvin Goel
161 | 


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/LICENSE.txt:
--------------------------------------------------------------------------------
 1 | Font Awesome Free License
 2 | -------------------------
 3 | 
 4 | Font Awesome Free is free, open source, and GPL friendly. You can use it for
 5 | commercial projects, open source projects, or really almost whatever you want.
 6 | Full Font Awesome Free license: https://fontawesome.com/license.
 7 | 
 8 | # Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/)
 9 | In the Font Awesome Free download, the CC BY 4.0 license applies to all icons
10 | packaged as SVG and JS file types.
11 | 
12 | # Fonts: SIL OFL 1.1 License (https://scripts.sil.org/OFL)
13 | In the Font Awesome Free download, the SIL OLF license applies to all icons
14 | packaged as web and desktop font files.
15 | 
16 | # Code: MIT License (https://opensource.org/licenses/MIT)
17 | In the Font Awesome Free download, the MIT license applies to all non-font and
18 | non-icon files.
19 | 
20 | # Attribution
21 | Attribution is required by MIT, SIL OLF, and CC BY licenses. Downloaded Font
22 | Awesome Free files already contain embedded comments with sufficient
23 | attribution, so you shouldn't need to do anything additional when using these
24 | files normally.
25 | 
26 | We've kept attribution comments terse, so we ask that you do not actively work
27 | to remove them from files, especially code. They're a great way for folks to 
28 | learn about Font Awesome.
29 | 
30 | # Brand Icons
31 | All brand icons are trademarks of their respective owners. The use of these
32 | trademarks does not indicate endorsement of the trademark holder by Font
33 | Awesome, nor vice versa. **Please do not use brand logos for any purpose except
34 | to represent the company, product, or service to which they refer.**
35 | 


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/brands.css:
--------------------------------------------------------------------------------
1 | /*!
2 |  * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com
3 |  * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 |  */
5 | @font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/regular.css:
--------------------------------------------------------------------------------
1 | /*!
2 |  * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com
3 |  * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 |  */
5 | @font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:"Font Awesome 5 Free";font-weight:400}


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/solid.css:
--------------------------------------------------------------------------------
1 | /*!
2 |  * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com
3 |  * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 |  */
5 | @font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900}


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/css/svg-with-js.css:
--------------------------------------------------------------------------------
1 | /*!
2 |  * Font Awesome Free 5.1.0 by @fontawesome - https://fontawesome.com
3 |  * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
4 |  */
5 | .svg-inline--fa,svg:not(:root).svg-inline--fa{overflow:visible}.svg-inline--fa{display:inline-block;font-size:inherit;height:1em;vertical-align:-.125em}.svg-inline--fa.fa-lg{vertical-align:-.225em}.svg-inline--fa.fa-w-1{width:.0625em}.svg-inline--fa.fa-w-2{width:.125em}.svg-inline--fa.fa-w-3{width:.1875em}.svg-inline--fa.fa-w-4{width:.25em}.svg-inline--fa.fa-w-5{width:.3125em}.svg-inline--fa.fa-w-6{width:.375em}.svg-inline--fa.fa-w-7{width:.4375em}.svg-inline--fa.fa-w-8{width:.5em}.svg-inline--fa.fa-w-9{width:.5625em}.svg-inline--fa.fa-w-10{width:.625em}.svg-inline--fa.fa-w-11{width:.6875em}.svg-inline--fa.fa-w-12{width:.75em}.svg-inline--fa.fa-w-13{width:.8125em}.svg-inline--fa.fa-w-14{width:.875em}.svg-inline--fa.fa-w-15{width:.9375em}.svg-inline--fa.fa-w-16{width:1em}.svg-inline--fa.fa-w-17{width:1.0625em}.svg-inline--fa.fa-w-18{width:1.125em}.svg-inline--fa.fa-w-19{width:1.1875em}.svg-inline--fa.fa-w-20{width:1.25em}.svg-inline--fa.fa-pull-left{margin-right:.3em;width:auto}.svg-inline--fa.fa-pull-right{margin-left:.3em;width:auto}.svg-inline--fa.fa-border{height:1.5em}.svg-inline--fa.fa-li{width:2em}.svg-inline--fa.fa-fw{width:1.25em}.fa-layers svg.svg-inline--fa{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.fa-layers{display:inline-block;height:1em;position:relative;text-align:center;vertical-align:-.125em;width:1em}.fa-layers svg.svg-inline--fa{transform-origin:center center}.fa-layers-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.fa-layers-text{left:50%;top:50%;transform:translate(-50%,-50%);transform-origin:center center}.fa-layers-counter{background-color:#ff253a;border-radius:1em;box-sizing:border-box;color:#fff;height:1.5em;line-height:1;max-width:5em;min-width:1.5em;overflow:hidden;padding:.25em;right:0;text-overflow:ellipsis;top:0;transform:scale(.25);transform-origin:top right}.fa-layers-bottom-right{bottom:0;right:0;top:auto;transform:scale(.25);transform-origin:bottom right}.fa-layers-bottom-left{bottom:0;left:0;right:auto;top:auto;transform:scale(.25);transform-origin:bottom left}.fa-layers-top-right{right:0;top:0;transform:scale(.25);transform-origin:top right}.fa-layers-top-left{left:0;right:auto;top:0;transform:scale(.25);transform-origin:top left}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:a 2s infinite linear}.fa-pulse{animation:a 1s infinite steps(8)}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;position:relative;width:2em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.svg-inline--fa.fa-stack-1x{height:1em;width:1em}.svg-inline--fa.fa-stack-2x{height:2em;width:2em}.fa-inverse{color:#fff}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.eot


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.ttf


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.woff


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-brands-400.woff2


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.eot


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.ttf


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.woff


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-regular-400.woff2


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.eot


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.ttf


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.woff


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/font-awesome/webfonts/fa-solid-900.woff2


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/blackboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/blackboard.png


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-black.png


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-blue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-blue.png


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-green.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-green.png


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-orange.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-orange.png


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-purple.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-purple.png


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-red.png


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-yellow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/boardmarker-yellow.png


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-blue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-blue.png


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-green.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-green.png


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-orange.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-orange.png


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-purple.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-purple.png


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-red.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-red.png


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-white.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-white.png


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-yellow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/chalk-yellow.png


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/sponge.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/sponge.png


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/whiteboard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/cararthompson/nhsr2022_level-up-your-plots/e186624a113b5f1764b38883de15ae8a9f736875/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/img/whiteboard.png


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/plugin.yml:
--------------------------------------------------------------------------------
1 | name: RevealChalkboard
2 | script: plugin.js
3 | stylesheet: ["font-awesome/css/all.css", "style.css"]
4 | self-contained: false
5 | config:
6 |   chalkboard:
7 |     buttons: true
8 | 


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-chalkboard/style.css:
--------------------------------------------------------------------------------
 1 | div.palette, div.boardhandle {
 2 |   position: absolute;
 3 | /*
 4 |   height: 260px;
 5 |   margin: -130px 0 0 0px;
 6 | */  
 7 |   top: 50%;
 8 |   transform: translateY(-50%);
 9 |   font-size: 24px;
10 |   border-radius: 10px;
11 |   border-top:    4px solid #222; 
12 |   border-right:  4px solid #222; 
13 |   border-bottom: 4px solid #222;
14 |   background: black;
15 |   transition: transform 0.3s;
16 | }
17 | 
18 | div.palette  {
19 |   left: -10px;
20 |   padding-left:10px;
21 | }
22 | 
23 | div.boardhandle {
24 |   right: -10px;
25 |   padding-right:10px;
26 | }
27 | 
28 | div.palette > ul,
29 | div.boardhandle > ul {
30 |   list-style-type: none;
31 |   margin: 0;
32 |   padding: 0;
33 | }
34 | 
35 | div.palette > ul > li,
36 | div.boardhandle > ul > li {
37 |   margin: 10px;
38 | }
39 | 
40 | @media print {
41 | 	div.palette, div.boardhandle, .chalkboard-button { 
42 | 		display: none!important; 
43 | 	}
44 | }
45 | 


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-menu/menu.css:
--------------------------------------------------------------------------------
  1 | .slide-menu-wrapper {
  2 |   font-family: 'Source Sans Pro', Helvetica, sans-serif;
  3 | }
  4 | 
  5 | .slide-menu-wrapper .slide-menu {
  6 |   background-color: #333;
  7 |   z-index: 200;
  8 |   position: fixed;
  9 |   top: 0;
 10 |   width: 300px;
 11 |   height: 100%;
 12 |   /*overflow-y: scroll;*/
 13 |   transition: transform 0.3s;
 14 |   font-size: 16px;
 15 |   font-weight: normal;
 16 | }
 17 | 
 18 | .slide-menu-wrapper .slide-menu.slide-menu--wide {
 19 |   width: 500px;
 20 | }
 21 | 
 22 | .slide-menu-wrapper .slide-menu.slide-menu--third {
 23 |   width: 33%;
 24 | }
 25 | 
 26 | .slide-menu-wrapper .slide-menu.slide-menu--half {
 27 |   width: 50%;
 28 | }
 29 | 
 30 | .slide-menu-wrapper .slide-menu.slide-menu--full {
 31 |   width: 95%;
 32 | }
 33 | 
 34 | /*
 35 |  * Slides menu
 36 |  */
 37 | 
 38 | .slide-menu-wrapper .slide-menu-items {
 39 |   margin: 0;
 40 |   padding: 0;
 41 |   width: 100%;
 42 |   border-bottom: solid 1px #555;
 43 | }
 44 | 
 45 | .slide-menu-wrapper .slide-menu-item,
 46 | .slide-menu-wrapper .slide-menu-item-vertical {
 47 |   display: block;
 48 |   text-align: left;
 49 |   padding: 10px 18px;
 50 |   color: #aaa;
 51 |   cursor: pointer;
 52 | }
 53 | 
 54 | .slide-menu-wrapper .slide-menu-item-vertical {
 55 |   padding-left: 30px;
 56 | }
 57 | 
 58 | .slide-menu-wrapper .slide-menu--wide .slide-menu-item-vertical,
 59 | .slide-menu-wrapper .slide-menu--third .slide-menu-item-vertical,
 60 | .slide-menu-wrapper .slide-menu--half .slide-menu-item-vertical,
 61 | .slide-menu-wrapper .slide-menu--full .slide-menu-item-vertical,
 62 | .slide-menu-wrapper .slide-menu--custom .slide-menu-item-vertical {
 63 |   padding-left: 50px;
 64 | }
 65 | 
 66 | .slide-menu-wrapper .slide-menu-item {
 67 |   border-top: solid 1px #555;
 68 | }
 69 | 
 70 | .slide-menu-wrapper .active-menu-panel li.selected {
 71 |   background-color: #222;
 72 |   color: white;
 73 | }
 74 | 
 75 | .slide-menu-wrapper .active-menu-panel li.active {
 76 |   color: #eee;
 77 | }
 78 | 
 79 | .slide-menu-wrapper .slide-menu-item.no-title .slide-menu-item-title,
 80 | .slide-menu-wrapper .slide-menu-item-vertical.no-title .slide-menu-item-title {
 81 |   font-style: italic;
 82 | }
 83 | 
 84 | .slide-menu-wrapper .slide-menu-item-number {
 85 |   color: #999;
 86 |   padding-right: 6px;
 87 | }
 88 | 
 89 | .slide-menu-wrapper .slide-menu-item i.far,
 90 | .slide-menu-wrapper .slide-menu-item i.fas,
 91 | .slide-menu-wrapper .slide-menu-item-vertical i.far,
 92 | .slide-menu-wrapper .slide-menu-item-vertical i.fas,
 93 | .slide-menu-wrapper .slide-menu-item svg.svg-inline--fa,
 94 | .slide-menu-wrapper .slide-menu-item-vertical svg.svg-inline--fa {
 95 |   padding-right: 12px;
 96 |   display: none;
 97 | }
 98 | 
 99 | .slide-menu-wrapper .slide-menu-item.past i.fas.past,
100 | .slide-menu-wrapper .slide-menu-item-vertical.past i.fas.past,
101 | .slide-menu-wrapper .slide-menu-item.active i.fas.active,
102 | .slide-menu-wrapper .slide-menu-item-vertical.active i.fas.active,
103 | .slide-menu-wrapper .slide-menu-item.future i.far.future,
104 | .slide-menu-wrapper .slide-menu-item-vertical.future i.far.future,
105 | .slide-menu-wrapper .slide-menu-item.past svg.svg-inline--fa.past,
106 | .slide-menu-wrapper .slide-menu-item-vertical.past svg.svg-inline--fa.past,
107 | .slide-menu-wrapper .slide-menu-item.active svg.svg-inline--fa.active,
108 | .slide-menu-wrapper .slide-menu-item-vertical.active svg.svg-inline--fa.active,
109 | .slide-menu-wrapper .slide-menu-item.future svg.svg-inline--fa.future,
110 | .slide-menu-wrapper .slide-menu-item-vertical.future svg.svg-inline--fa.future {
111 |   display: inline-block;
112 | }
113 | 
114 | .slide-menu-wrapper .slide-menu-item.past i.fas.past,
115 | .slide-menu-wrapper .slide-menu-item-vertical.past i.fas.past,
116 | .slide-menu-wrapper .slide-menu-item.future i.far.future,
117 | .slide-menu-wrapper .slide-menu-item-vertical.future i.far.future,
118 | .slide-menu-wrapper .slide-menu-item.past svg.svg-inline--fa.past,
119 | .slide-menu-wrapper .slide-menu-item-vertical.past svg.svg-inline--fa.past,
120 | .slide-menu-wrapper .slide-menu-item.future svg.svg-inline--fa.future,
121 | .slide-menu-wrapper .slide-menu-item-vertical.future svg.svg-inline--fa.future {
122 |   opacity: 0.4;
123 | }
124 | 
125 | .slide-menu-wrapper .slide-menu-item.active i.fas.active,
126 | .slide-menu-wrapper .slide-menu-item-vertical.active i.fas.active,
127 | .slide-menu-wrapper .slide-menu-item.active svg.svg-inline--fa.active,
128 | .slide-menu-wrapper .slide-menu-item-vertical.active svg.svg-inline--fa.active {
129 |   opacity: 0.8;
130 | }
131 | 
132 | .slide-menu-wrapper .slide-menu--left {
133 |   left: 0;
134 |   -webkit-transform: translateX(-100%);
135 |   -ms-transform: translateX(-100%);
136 |   transform: translateX(-100%);
137 | }
138 | 
139 | .slide-menu-wrapper .slide-menu--left.active {
140 |   -webkit-transform: translateX(0);
141 |   -ms-transform: translateX(0);
142 |   transform: translateX(0);
143 | }
144 | 
145 | .slide-menu-wrapper .slide-menu--right {
146 |   right: 0;
147 |   -webkit-transform: translateX(100%);
148 |   -ms-transform: translateX(100%);
149 |   transform: translateX(100%);
150 | }
151 | 
152 | .slide-menu-wrapper .slide-menu--right.active {
153 |   -webkit-transform: translateX(0);
154 |   -ms-transform: translateX(0);
155 |   transform: translateX(0);
156 | }
157 | 
158 | .slide-menu-wrapper {
159 |   transition: transform 0.3s;
160 | }
161 | 
162 | /*
163 |  * Toolbar
164 |  */
165 | .slide-menu-wrapper .slide-menu-toolbar {
166 |   height: 60px;
167 |   width: 100%;
168 |   font-size: 12px;
169 |   display: table;
170 |   table-layout: fixed; /* ensures equal width */
171 |   margin: 0;
172 |   padding: 0;
173 |   border-bottom: solid 2px #666;
174 | }
175 | 
176 | .slide-menu-wrapper .slide-menu-toolbar > li {
177 |   display: table-cell;
178 |   line-height: 150%;
179 |   text-align: center;
180 |   vertical-align: middle;
181 |   cursor: pointer;
182 |   color: #aaa;
183 |   border-radius: 3px;
184 | }
185 | 
186 | .slide-menu-wrapper .slide-menu-toolbar > li.toolbar-panel-button i,
187 | .slide-menu-wrapper
188 |   .slide-menu-toolbar
189 |   > li.toolbar-panel-button
190 |   svg.svg-inline--fa {
191 |   font-size: 1.7em;
192 | }
193 | 
194 | .slide-menu-wrapper .slide-menu-toolbar > li.active-toolbar-button {
195 |   color: white;
196 |   text-shadow: 0 1px black;
197 |   text-decoration: underline;
198 | }
199 | 
200 | .slide-menu-toolbar > li.toolbar-panel-button:hover {
201 |   color: white;
202 | }
203 | 
204 | .slide-menu-toolbar
205 |   > li.toolbar-panel-button:hover
206 |   span.slide-menu-toolbar-label,
207 | .slide-menu-wrapper
208 |   .slide-menu-toolbar
209 |   > li.active-toolbar-button
210 |   span.slide-menu-toolbar-label {
211 |   visibility: visible;
212 | }
213 | 
214 | /*
215 |  * Panels
216 |  */
217 | .slide-menu-wrapper .slide-menu-panel {
218 |   position: absolute;
219 |   width: 100%;
220 |   visibility: hidden;
221 |   height: calc(100% - 60px);
222 |   overflow-x: hidden;
223 |   overflow-y: auto;
224 |   color: #aaa;
225 | }
226 | 
227 | .slide-menu-wrapper .slide-menu-panel.active-menu-panel {
228 |   visibility: visible;
229 | }
230 | 
231 | .slide-menu-wrapper .slide-menu-panel h1,
232 | .slide-menu-wrapper .slide-menu-panel h2,
233 | .slide-menu-wrapper .slide-menu-panel h3,
234 | .slide-menu-wrapper .slide-menu-panel h4,
235 | .slide-menu-wrapper .slide-menu-panel h5,
236 | .slide-menu-wrapper .slide-menu-panel h6 {
237 |   margin: 20px 0 10px 0;
238 |   color: #fff;
239 |   line-height: 1.2;
240 |   letter-spacing: normal;
241 |   text-shadow: none;
242 | }
243 | 
244 | .slide-menu-wrapper .slide-menu-panel h1 {
245 |   font-size: 1.6em;
246 | }
247 | .slide-menu-wrapper .slide-menu-panel h2 {
248 |   font-size: 1.4em;
249 | }
250 | .slide-menu-wrapper .slide-menu-panel h3 {
251 |   font-size: 1.3em;
252 | }
253 | .slide-menu-wrapper .slide-menu-panel h4 {
254 |   font-size: 1.1em;
255 | }
256 | .slide-menu-wrapper .slide-menu-panel h5 {
257 |   font-size: 1em;
258 | }
259 | .slide-menu-wrapper .slide-menu-panel h6 {
260 |   font-size: 0.9em;
261 | }
262 | 
263 | .slide-menu-wrapper .slide-menu-panel p {
264 |   margin: 10px 0 5px 0;
265 | }
266 | 
267 | .slide-menu-wrapper .slide-menu-panel a {
268 |   color: #ccc;
269 |   text-decoration: underline;
270 | }
271 | 
272 | .slide-menu-wrapper .slide-menu-panel a:hover {
273 |   color: white;
274 | }
275 | 
276 | .slide-menu-wrapper .slide-menu-item a {
277 |   text-decoration: none;
278 | }
279 | 
280 | .slide-menu-wrapper .slide-menu-custom-panel {
281 |   width: calc(100% - 20px);
282 |   padding-left: 10px;
283 |   padding-right: 10px;
284 | }
285 | 
286 | .slide-menu-wrapper .slide-menu-custom-panel .slide-menu-items {
287 |   width: calc(100% + 20px);
288 |   margin-left: -10px;
289 |   margin-right: 10px;
290 | }
291 | 
292 | /*
293 |  * Theme and Transitions buttons
294 |  */
295 | 
296 | .slide-menu-wrapper div[data-panel='Themes'] li,
297 | .slide-menu-wrapper div[data-panel='Transitions'] li {
298 |   display: block;
299 |   text-align: left;
300 |   cursor: pointer;
301 |   color: #848484;
302 | }
303 | 
304 | /*
305 |  * Menu controls
306 |  */
307 | .reveal .slide-menu-button {
308 |   position: fixed;
309 |   left: 30px;
310 |   bottom: 30px;
311 |   z-index: 30;
312 |   font-size: 24px;
313 | }
314 | 
315 | /*
316 |  * Menu overlay
317 |  */
318 | 
319 | .slide-menu-wrapper .slide-menu-overlay {
320 |   position: fixed;
321 |   z-index: 199;
322 |   top: 0;
323 |   left: 0;
324 |   overflow: hidden;
325 |   width: 0;
326 |   height: 0;
327 |   background-color: #000;
328 |   opacity: 0;
329 |   transition: opacity 0.3s, width 0s 0.3s, height 0s 0.3s;
330 | }
331 | 
332 | .slide-menu-wrapper .slide-menu-overlay.active {
333 |   width: 100%;
334 |   height: 100%;
335 |   opacity: 0.7;
336 |   transition: opacity 0.3s;
337 | }
338 | 
339 | /*
340 |  * Hide menu for pdf printing
341 |  */
342 | body.print-pdf .slide-menu-wrapper .slide-menu,
343 | body.print-pdf .reveal .slide-menu-button,
344 | body.print-pdf .slide-menu-wrapper .slide-menu-overlay {
345 |   display: none;
346 | }
347 | 


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-menu/plugin.yml:
--------------------------------------------------------------------------------
 1 | name: RevealMenu
 2 | script: [menu.js, quarto-menu.js]
 3 | stylesheet: [menu.css, quarto-menu.css]
 4 | config:
 5 |   menu:
 6 |     side: "left"
 7 |     useTextContentForMissingTitles: true
 8 |     markers: false
 9 |     loadIcons: false
10 | 


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-menu/quarto-menu.css:
--------------------------------------------------------------------------------
 1 | .slide-menu-wrapper .slide-tool-item {
 2 |   display: block;
 3 |   text-align: left;
 4 |   padding: 10px 18px;
 5 |   color: #aaa;
 6 |   cursor: pointer;
 7 |   border-top: solid 1px #555;
 8 | }
 9 | 
10 | .slide-menu-wrapper .slide-tool-item a {
11 |   text-decoration: none;
12 | }
13 | 
14 | .slide-menu-wrapper .slide-tool-item kbd {
15 |   font-family: monospace;
16 |   margin-right: 10px;
17 |   padding: 3px 8px;
18 |   color: inherit;
19 |   border: 1px solid;
20 |   border-radius: 5px;
21 |   border-color: #555;
22 | }
23 | 
24 | .slide-menu-wrapper .slide-menu-toolbar > li.active-toolbar-button {
25 |   text-decoration: none;
26 | }
27 | 
28 | .reveal .slide-menu-button {
29 |   left: 8px;
30 |   bottom: 8px;
31 | }
32 | 
33 | .reveal .slide-menu-button .fas::before,
34 | .reveal .slide-chalkboard-buttons .fas::before,
35 | .slide-menu-wrapper .slide-menu-toolbar .fas::before {
36 |   display: inline-block;
37 |   height: 2.2rem;
38 |   width: 2.2rem;
39 |   content: "";
40 |   vertical-align: -0.125em;
41 |   background-repeat: no-repeat;
42 |   background-size: 2.2rem 2.2rem;
43 | }
44 | 
45 | .reveal .slide-chalkboard-buttons .fas::before {
46 |   height: 1.45rem;
47 |   width: 1.45rem;
48 |   background-size: 1.45rem 1.45rem;
49 |   vertical-align: 0.1em;
50 | }
51 | 
52 | .slide-menu-wrapper .slide-menu-toolbar .fas::before {
53 |   height: 1.8rem;
54 |   width: 1.8rem;
55 |   background-size: 1.8rem 1.8rem;
56 | }
57 | 
58 | .slide-menu-wrapper .slide-menu-toolbar .fa-images::before {
59 |   background-image: url('data:image/svg+xml,');
60 | }
61 | 
62 | .slide-menu-wrapper .slide-menu-toolbar .fa-gear::before {
63 |   background-image: url('data:image/svg+xml,');
64 | }
65 | 
66 | .slide-menu-wrapper .slide-menu-toolbar .fa-times::before {
67 |   background-image: url('data:image/svg+xml,');
68 | }
69 | 


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/reveal-menu/quarto-menu.js:
--------------------------------------------------------------------------------
 1 | window.revealMenuToolHandler = function (handler) {
 2 |   return function (event) {
 3 |     event.preventDefault();
 4 |     handler();
 5 |     Reveal.getPlugin("menu").closeMenu();
 6 |   };
 7 | };
 8 | 
 9 | window.RevealMenuToolHandlers = {
10 |   fullscreen: revealMenuToolHandler(function () {
11 |     const element = document.documentElement;
12 |     const requestMethod =
13 |       element.requestFullscreen ||
14 |       element.webkitRequestFullscreen ||
15 |       element.webkitRequestFullScreen ||
16 |       element.mozRequestFullScreen ||
17 |       element.msRequestFullscreen;
18 |     if (requestMethod) {
19 |       requestMethod.apply(element);
20 |     }
21 |   }),
22 |   speakerMode: revealMenuToolHandler(function () {
23 |     Reveal.getPlugin("notes").open();
24 |   }),
25 |   keyboardHelp: revealMenuToolHandler(function () {
26 |     Reveal.toggleHelp(true);
27 |   }),
28 |   overview: revealMenuToolHandler(function () {
29 |     Reveal.toggleOverview(true);
30 |   }),
31 |   toggleChalkboard: revealMenuToolHandler(function () {
32 |     RevealChalkboard.toggleChalkboard();
33 |   }),
34 |   toggleNotesCanvas: revealMenuToolHandler(function () {
35 |     RevealChalkboard.toggleNotesCanvas();
36 |   }),
37 |   downloadDrawings: revealMenuToolHandler(function () {
38 |     RevealChalkboard.download();
39 |   }),
40 |   togglePdfExport: revealMenuToolHandler(function () {
41 |     PdfExport.togglePdfExport();
42 |   }),
43 | };
44 | 


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/search/plugin.js:
--------------------------------------------------------------------------------
  1 | /*!
  2 |  * Handles finding a text string anywhere in the slides and showing the next occurrence to the user
  3 |  * by navigatating to that slide and highlighting it.
  4 |  *
  5 |  * @author Jon Snyder , February 2013
  6 |  */
  7 | 
  8 | const Plugin = () => {
  9 | 
 10 | 	// The reveal.js instance this plugin is attached to
 11 | 	let deck;
 12 | 
 13 | 	let searchElement;
 14 | 	let searchButton;
 15 | 	let searchInput;
 16 | 
 17 | 	let matchedSlides;
 18 | 	let currentMatchedIndex;
 19 | 	let searchboxDirty;
 20 | 	let hilitor;
 21 | 
 22 | 	function render() {
 23 | 
 24 | 		searchElement = document.createElement( 'div' );
 25 | 		searchElement.classList.add( 'searchbox' );
 26 | 		searchElement.style.position = 'absolute';
 27 | 		searchElement.style.top = '10px';
 28 | 		searchElement.style.right = '10px';
 29 | 		searchElement.style.zIndex = 10;
 30 | 
 31 | 		//embedded base64 search icon Designed by Sketchdock - http://www.sketchdock.com/:
 32 | 		searchElement.innerHTML = `
 33 | 		`;
 34 | 
 35 | 		searchInput = searchElement.querySelector( '.searchinput' );
 36 | 		searchInput.style.width = '240px';
 37 | 		searchInput.style.fontSize = '14px';
 38 | 		searchInput.style.padding = '4px 6px';
 39 | 		searchInput.style.color = '#000';
 40 | 		searchInput.style.background = '#fff';
 41 | 		searchInput.style.borderRadius = '2px';
 42 | 		searchInput.style.border = '0';
 43 | 		searchInput.style.outline = '0';
 44 | 		searchInput.style.boxShadow = '0 2px 18px rgba(0, 0, 0, 0.2)';
 45 | 		searchInput.style['-webkit-appearance']  = 'none';
 46 | 
 47 | 		deck.getRevealElement().appendChild( searchElement );
 48 | 
 49 | 		// searchButton.addEventListener( 'click', function(event) {
 50 | 		// 	doSearch();
 51 | 		// }, false );
 52 | 
 53 | 		searchInput.addEventListener( 'keyup', function( event ) {
 54 | 			switch (event.keyCode) {
 55 | 				case 13:
 56 | 					event.preventDefault();
 57 | 					doSearch();
 58 | 					searchboxDirty = false;
 59 | 					break;
 60 | 				default:
 61 | 					searchboxDirty = true;
 62 | 			}
 63 | 		}, false );
 64 | 
 65 | 		closeSearch();
 66 | 
 67 | 	}
 68 | 
 69 | 	function openSearch() {
 70 | 		if( !searchElement ) render();
 71 | 
 72 | 		searchElement.style.display = 'inline';
 73 | 		searchInput.focus();
 74 | 		searchInput.select();
 75 | 	}
 76 | 
 77 | 	function closeSearch() {
 78 | 		if( !searchElement ) render();
 79 | 
 80 | 		searchElement.style.display = 'none';
 81 | 		if(hilitor) hilitor.remove();
 82 | 	}
 83 | 
 84 | 	function toggleSearch() {
 85 | 		if( !searchElement ) render();
 86 | 
 87 | 		if (searchElement.style.display !== 'inline') {
 88 | 			openSearch();
 89 | 		}
 90 | 		else {
 91 | 			closeSearch();
 92 | 		}
 93 | 	}
 94 | 
 95 | 	function doSearch() {
 96 | 		//if there's been a change in the search term, perform a new search:
 97 | 		if (searchboxDirty) {
 98 | 			var searchstring = searchInput.value;
 99 | 
100 | 			if (searchstring === '') {
101 | 				if(hilitor) hilitor.remove();
102 | 				matchedSlides = null;
103 | 			}
104 | 			else {
105 | 				//find the keyword amongst the slides
106 | 				hilitor = new Hilitor("slidecontent");
107 | 				matchedSlides = hilitor.apply(searchstring);
108 | 				currentMatchedIndex = 0;
109 | 			}
110 | 		}
111 | 
112 | 		if (matchedSlides) {
113 | 			//navigate to the next slide that has the keyword, wrapping to the first if necessary
114 | 			if (matchedSlides.length && (matchedSlides.length <= currentMatchedIndex)) {
115 | 				currentMatchedIndex = 0;
116 | 			}
117 | 			if (matchedSlides.length > currentMatchedIndex) {
118 | 				deck.slide(matchedSlides[currentMatchedIndex].h, matchedSlides[currentMatchedIndex].v);
119 | 				currentMatchedIndex++;
120 | 			}
121 | 		}
122 | 	}
123 | 
124 | 	// Original JavaScript code by Chirp Internet: www.chirp.com.au
125 | 	// Please acknowledge use of this code by including this header.
126 | 	// 2/2013 jon: modified regex to display any match, not restricted to word boundaries.
127 | 	function Hilitor(id, tag) {
128 | 
129 | 		var targetNode = document.getElementById(id) || document.body;
130 | 		var hiliteTag = tag || "EM";
131 | 		var skipTags = new RegExp("^(?:" + hiliteTag + "|SCRIPT|FORM)$");
132 | 		var colors = ["#ff6", "#a0ffff", "#9f9", "#f99", "#f6f"];
133 | 		var wordColor = [];
134 | 		var colorIdx = 0;
135 | 		var matchRegex = "";
136 | 		var matchingSlides = [];
137 | 
138 | 		this.setRegex = function(input)
139 | 		{
140 | 			input = input.replace(/^[^\w]+|[^\w]+$/g, "").replace(/[^\w'-]+/g, "|");
141 | 			matchRegex = new RegExp("(" + input + ")","i");
142 | 		}
143 | 
144 | 		this.getRegex = function()
145 | 		{
146 | 			return matchRegex.toString().replace(/^\/\\b\(|\)\\b\/i$/g, "").replace(/\|/g, " ");
147 | 		}
148 | 
149 | 		// recursively apply word highlighting
150 | 		this.hiliteWords = function(node)
151 | 		{
152 | 			if(node == undefined || !node) return;
153 | 			if(!matchRegex) return;
154 | 			if(skipTags.test(node.nodeName)) return;
155 | 
156 | 			if(node.hasChildNodes()) {
157 | 				for(var i=0; i < node.childNodes.length; i++)
158 | 					this.hiliteWords(node.childNodes[i]);
159 | 			}
160 | 			if(node.nodeType == 3) { // NODE_TEXT
161 | 				var nv, regs;
162 | 				if((nv = node.nodeValue) && (regs = matchRegex.exec(nv))) {
163 | 					//find the slide's section element and save it in our list of matching slides
164 | 					var secnode = node;
165 | 					while (secnode != null && secnode.nodeName != 'SECTION') {
166 | 						secnode = secnode.parentNode;
167 | 					}
168 | 
169 | 					var slideIndex = deck.getIndices(secnode);
170 | 					var slidelen = matchingSlides.length;
171 | 					var alreadyAdded = false;
172 | 					for (var i=0; i < slidelen; i++) {
173 | 						if ( (matchingSlides[i].h === slideIndex.h) && (matchingSlides[i].v === slideIndex.v) ) {
174 | 							alreadyAdded = true;
175 | 						}
176 | 					}
177 | 					if (! alreadyAdded) {
178 | 						matchingSlides.push(slideIndex);
179 | 					}
180 | 
181 | 					if(!wordColor[regs[0].toLowerCase()]) {
182 | 						wordColor[regs[0].toLowerCase()] = colors[colorIdx++ % colors.length];
183 | 					}
184 | 
185 | 					var match = document.createElement(hiliteTag);
186 | 					match.appendChild(document.createTextNode(regs[0]));
187 | 					match.style.backgroundColor = wordColor[regs[0].toLowerCase()];
188 | 					match.style.fontStyle = "inherit";
189 | 					match.style.color = "#000";
190 | 
191 | 					var after = node.splitText(regs.index);
192 | 					after.nodeValue = after.nodeValue.substring(regs[0].length);
193 | 					node.parentNode.insertBefore(match, after);
194 | 				}
195 | 			}
196 | 		};
197 | 
198 | 		// remove highlighting
199 | 		this.remove = function()
200 | 		{
201 | 			var arr = document.getElementsByTagName(hiliteTag);
202 | 			var el;
203 | 			while(arr.length && (el = arr[0])) {
204 | 				el.parentNode.replaceChild(el.firstChild, el);
205 | 			}
206 | 		};
207 | 
208 | 		// start highlighting at target node
209 | 		this.apply = function(input)
210 | 		{
211 | 			if(input == undefined || !input) return;
212 | 			this.remove();
213 | 			this.setRegex(input);
214 | 			this.hiliteWords(targetNode);
215 | 			return matchingSlides;
216 | 		};
217 | 
218 | 	}
219 | 
220 | 	return {
221 | 
222 | 		id: 'search',
223 | 
224 | 		init: reveal => {
225 | 
226 | 			deck = reveal;
227 | 			deck.registerKeyboardShortcut( 'CTRL + Shift + F', 'Search' );
228 | 
229 | 			document.addEventListener( 'keydown', function( event ) {
230 | 				if( event.key == "F" && (event.ctrlKey || event.metaKey) ) { //Control+Shift+f
231 | 					event.preventDefault();
232 | 					toggleSearch();
233 | 				}
234 | 			}, false );
235 | 
236 | 		},
237 | 
238 | 		open: openSearch
239 | 
240 | 	}
241 | };
242 | 
243 | export default Plugin;


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/zoom/plugin.js:
--------------------------------------------------------------------------------
  1 | /*!
  2 |  * reveal.js Zoom plugin
  3 |  */
  4 | const Plugin = {
  5 | 
  6 | 	id: 'zoom',
  7 | 
  8 | 	init: function( reveal ) {
  9 | 
 10 | 		reveal.getRevealElement().addEventListener( 'mousedown', function( event ) {
 11 | 			var defaultModifier = /Linux/.test( window.navigator.platform ) ? 'ctrl' : 'alt';
 12 | 
 13 | 			var modifier = ( reveal.getConfig().zoomKey ? reveal.getConfig().zoomKey : defaultModifier ) + 'Key';
 14 | 			var zoomLevel = ( reveal.getConfig().zoomLevel ? reveal.getConfig().zoomLevel : 2 );
 15 | 
 16 | 			if( event[ modifier ] && !reveal.isOverview() ) {
 17 | 				event.preventDefault();
 18 | 
 19 | 				zoom.to({
 20 | 					x: event.clientX,
 21 | 					y: event.clientY,
 22 | 					scale: zoomLevel,
 23 | 					pan: false
 24 | 				});
 25 | 			}
 26 | 		} );
 27 | 
 28 | 	},
 29 | 
 30 | 	destroy: () => {
 31 | 
 32 | 		zoom.reset();
 33 | 
 34 | 	}
 35 | 
 36 | };
 37 | 
 38 | export default () => Plugin;
 39 | 
 40 | /*!
 41 |  * zoom.js 0.3 (modified for use with reveal.js)
 42 |  * http://lab.hakim.se/zoom-js
 43 |  * MIT licensed
 44 |  *
 45 |  * Copyright (C) 2011-2014 Hakim El Hattab, http://hakim.se
 46 |  */
 47 | var zoom = (function(){
 48 | 
 49 | 	// The current zoom level (scale)
 50 | 	var level = 1;
 51 | 
 52 | 	// The current mouse position, used for panning
 53 | 	var mouseX = 0,
 54 | 		mouseY = 0;
 55 | 
 56 | 	// Timeout before pan is activated
 57 | 	var panEngageTimeout = -1,
 58 | 		panUpdateInterval = -1;
 59 | 
 60 | 	// Check for transform support so that we can fallback otherwise
 61 | 	var supportsTransforms = 	'transform' in document.body.style;
 62 | 
 63 | 	if( supportsTransforms ) {
 64 | 		// The easing that will be applied when we zoom in/out
 65 | 		document.body.style.transition = 'transform 0.8s ease';
 66 | 	}
 67 | 
 68 | 	// Zoom out if the user hits escape
 69 | 	document.addEventListener( 'keyup', function( event ) {
 70 | 		if( level !== 1 && event.keyCode === 27 ) {
 71 | 			zoom.out();
 72 | 		}
 73 | 	} );
 74 | 
 75 | 	// Monitor mouse movement for panning
 76 | 	document.addEventListener( 'mousemove', function( event ) {
 77 | 		if( level !== 1 ) {
 78 | 			mouseX = event.clientX;
 79 | 			mouseY = event.clientY;
 80 | 		}
 81 | 	} );
 82 | 
 83 | 	/**
 84 | 	 * Applies the CSS required to zoom in, prefers the use of CSS3
 85 | 	 * transforms but falls back on zoom for IE.
 86 | 	 *
 87 | 	 * @param {Object} rect
 88 | 	 * @param {Number} scale
 89 | 	 */
 90 | 	function magnify( rect, scale ) {
 91 | 
 92 | 		var scrollOffset = getScrollOffset();
 93 | 
 94 | 		// Ensure a width/height is set
 95 | 		rect.width = rect.width || 1;
 96 | 		rect.height = rect.height || 1;
 97 | 
 98 | 		// Center the rect within the zoomed viewport
 99 | 		rect.x -= ( window.innerWidth - ( rect.width * scale ) ) / 2;
100 | 		rect.y -= ( window.innerHeight - ( rect.height * scale ) ) / 2;
101 | 
102 | 		if( supportsTransforms ) {
103 | 			// Reset
104 | 			if( scale === 1 ) {
105 | 				document.body.style.transform = '';
106 | 			}
107 | 			// Scale
108 | 			else {
109 | 				var origin = scrollOffset.x +'px '+ scrollOffset.y +'px',
110 | 					transform = 'translate('+ -rect.x +'px,'+ -rect.y +'px) scale('+ scale +')';
111 | 
112 | 				document.body.style.transformOrigin = origin;
113 | 				document.body.style.transform = transform;
114 | 			}
115 | 		}
116 | 		else {
117 | 			// Reset
118 | 			if( scale === 1 ) {
119 | 				document.body.style.position = '';
120 | 				document.body.style.left = '';
121 | 				document.body.style.top = '';
122 | 				document.body.style.width = '';
123 | 				document.body.style.height = '';
124 | 				document.body.style.zoom = '';
125 | 			}
126 | 			// Scale
127 | 			else {
128 | 				document.body.style.position = 'relative';
129 | 				document.body.style.left = ( - ( scrollOffset.x + rect.x ) / scale ) + 'px';
130 | 				document.body.style.top = ( - ( scrollOffset.y + rect.y ) / scale ) + 'px';
131 | 				document.body.style.width = ( scale * 100 ) + '%';
132 | 				document.body.style.height = ( scale * 100 ) + '%';
133 | 				document.body.style.zoom = scale;
134 | 			}
135 | 		}
136 | 
137 | 		level = scale;
138 | 
139 | 		if( document.documentElement.classList ) {
140 | 			if( level !== 1 ) {
141 | 				document.documentElement.classList.add( 'zoomed' );
142 | 			}
143 | 			else {
144 | 				document.documentElement.classList.remove( 'zoomed' );
145 | 			}
146 | 		}
147 | 	}
148 | 
149 | 	/**
150 | 	 * Pan the document when the mosue cursor approaches the edges
151 | 	 * of the window.
152 | 	 */
153 | 	function pan() {
154 | 		var range = 0.12,
155 | 			rangeX = window.innerWidth * range,
156 | 			rangeY = window.innerHeight * range,
157 | 			scrollOffset = getScrollOffset();
158 | 
159 | 		// Up
160 | 		if( mouseY < rangeY ) {
161 | 			window.scroll( scrollOffset.x, scrollOffset.y - ( 1 - ( mouseY / rangeY ) ) * ( 14 / level ) );
162 | 		}
163 | 		// Down
164 | 		else if( mouseY > window.innerHeight - rangeY ) {
165 | 			window.scroll( scrollOffset.x, scrollOffset.y + ( 1 - ( window.innerHeight - mouseY ) / rangeY ) * ( 14 / level ) );
166 | 		}
167 | 
168 | 		// Left
169 | 		if( mouseX < rangeX ) {
170 | 			window.scroll( scrollOffset.x - ( 1 - ( mouseX / rangeX ) ) * ( 14 / level ), scrollOffset.y );
171 | 		}
172 | 		// Right
173 | 		else if( mouseX > window.innerWidth - rangeX ) {
174 | 			window.scroll( scrollOffset.x + ( 1 - ( window.innerWidth - mouseX ) / rangeX ) * ( 14 / level ), scrollOffset.y );
175 | 		}
176 | 	}
177 | 
178 | 	function getScrollOffset() {
179 | 		return {
180 | 			x: window.scrollX !== undefined ? window.scrollX : window.pageXOffset,
181 | 			y: window.scrollY !== undefined ? window.scrollY : window.pageYOffset
182 | 		}
183 | 	}
184 | 
185 | 	return {
186 | 		/**
187 | 		 * Zooms in on either a rectangle or HTML element.
188 | 		 *
189 | 		 * @param {Object} options
190 | 		 *   - element: HTML element to zoom in on
191 | 		 *   OR
192 | 		 *   - x/y: coordinates in non-transformed space to zoom in on
193 | 		 *   - width/height: the portion of the screen to zoom in on
194 | 		 *   - scale: can be used instead of width/height to explicitly set scale
195 | 		 */
196 | 		to: function( options ) {
197 | 
198 | 			// Due to an implementation limitation we can't zoom in
199 | 			// to another element without zooming out first
200 | 			if( level !== 1 ) {
201 | 				zoom.out();
202 | 			}
203 | 			else {
204 | 				options.x = options.x || 0;
205 | 				options.y = options.y || 0;
206 | 
207 | 				// If an element is set, that takes precedence
208 | 				if( !!options.element ) {
209 | 					// Space around the zoomed in element to leave on screen
210 | 					var padding = 20;
211 | 					var bounds = options.element.getBoundingClientRect();
212 | 
213 | 					options.x = bounds.left - padding;
214 | 					options.y = bounds.top - padding;
215 | 					options.width = bounds.width + ( padding * 2 );
216 | 					options.height = bounds.height + ( padding * 2 );
217 | 				}
218 | 
219 | 				// If width/height values are set, calculate scale from those values
220 | 				if( options.width !== undefined && options.height !== undefined ) {
221 | 					options.scale = Math.max( Math.min( window.innerWidth / options.width, window.innerHeight / options.height ), 1 );
222 | 				}
223 | 
224 | 				if( options.scale > 1 ) {
225 | 					options.x *= options.scale;
226 | 					options.y *= options.scale;
227 | 
228 | 					magnify( options, options.scale );
229 | 
230 | 					if( options.pan !== false ) {
231 | 
232 | 						// Wait with engaging panning as it may conflict with the
233 | 						// zoom transition
234 | 						panEngageTimeout = setTimeout( function() {
235 | 							panUpdateInterval = setInterval( pan, 1000 / 60 );
236 | 						}, 800 );
237 | 
238 | 					}
239 | 				}
240 | 			}
241 | 		},
242 | 
243 | 		/**
244 | 		 * Resets the document zoom state to its default.
245 | 		 */
246 | 		out: function() {
247 | 			clearTimeout( panEngageTimeout );
248 | 			clearInterval( panUpdateInterval );
249 | 
250 | 			magnify( { x: 0, y: 0 }, 1 );
251 | 
252 | 			level = 1;
253 | 		},
254 | 
255 | 		// Alias
256 | 		magnify: function( options ) { this.to( options ) },
257 | 		reset: function() { this.out() },
258 | 
259 | 		zoomLevel: function() {
260 | 			return level;
261 | 		}
262 | 	}
263 | 
264 | })();
265 | 


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/zoom/zoom.esm.js:
--------------------------------------------------------------------------------
1 | /*!
2 |  * reveal.js Zoom plugin
3 |  */
4 | var e={id:"zoom",init:function(e){e.getRevealElement().addEventListener("mousedown",(function(n){var o=/Linux/.test(window.navigator.platform)?"ctrl":"alt",i=(e.getConfig().zoomKey?e.getConfig().zoomKey:o)+"Key",d=e.getConfig().zoomLevel?e.getConfig().zoomLevel:2;n[i]&&!e.isOverview()&&(n.preventDefault(),t.to({x:n.clientX,y:n.clientY,scale:d,pan:!1}))}))},destroy:function(){t.reset()}},t=function(){var e=1,n=0,o=0,i=-1,d=-1,l="transform"in document.body.style;function s(t,n){var o=r();if(t.width=t.width||1,t.height=t.height||1,t.x-=(window.innerWidth-t.width*n)/2,t.y-=(window.innerHeight-t.height*n)/2,l)if(1===n)document.body.style.transform="";else{var i=o.x+"px "+o.y+"px",d="translate("+-t.x+"px,"+-t.y+"px) scale("+n+")";document.body.style.transformOrigin=i,document.body.style.transform=d}else 1===n?(document.body.style.position="",document.body.style.left="",document.body.style.top="",document.body.style.width="",document.body.style.height="",document.body.style.zoom=""):(document.body.style.position="relative",document.body.style.left=-(o.x+t.x)/n+"px",document.body.style.top=-(o.y+t.y)/n+"px",document.body.style.width=100*n+"%",document.body.style.height=100*n+"%",document.body.style.zoom=n);e=n,document.documentElement.classList&&(1!==e?document.documentElement.classList.add("zoomed"):document.documentElement.classList.remove("zoomed"))}function c(){var t=.12*window.innerWidth,i=.12*window.innerHeight,d=r();owindow.innerHeight-i&&window.scroll(d.x,d.y+(1-(window.innerHeight-o)/i)*(14/e)),nwindow.innerWidth-t&&window.scroll(d.x+(1-(window.innerWidth-n)/t)*(14/e),d.y)}function r(){return{x:void 0!==window.scrollX?window.scrollX:window.pageXOffset,y:void 0!==window.scrollY?window.scrollY:window.pageYOffset}}return l&&(document.body.style.transition="transform 0.8s ease"),document.addEventListener("keyup",(function(n){1!==e&&27===n.keyCode&&t.out()})),document.addEventListener("mousemove",(function(t){1!==e&&(n=t.clientX,o=t.clientY)})),{to:function(n){if(1!==e)t.out();else{if(n.x=n.x||0,n.y=n.y||0,n.element){var o=n.element.getBoundingClientRect();n.x=o.left-20,n.y=o.top-20,n.width=o.width+40,n.height=o.height+40}void 0!==n.width&&void 0!==n.height&&(n.scale=Math.max(Math.min(window.innerWidth/n.width,window.innerHeight/n.height),1)),n.scale>1&&(n.x*=n.scale,n.y*=n.scale,s(n,n.scale),!1!==n.pan&&(i=setTimeout((function(){d=setInterval(c,1e3/60)}),800)))}},out:function(){clearTimeout(i),clearInterval(d),s({x:0,y:0},1),e=1},magnify:function(e){this.to(e)},reset:function(){this.out()},zoomLevel:function(){return e}}}();export default function(){return e}
5 | 


--------------------------------------------------------------------------------
/level-up-your-plots_nhsr_files/libs/revealjs/plugin/zoom/zoom.js:
--------------------------------------------------------------------------------
1 | !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).RevealZoom=t()}(this,(function(){"use strict";
2 | /*!
3 | 	 * reveal.js Zoom plugin
4 | 	 */var e={id:"zoom",init:function(e){e.getRevealElement().addEventListener("mousedown",(function(o){var n=/Linux/.test(window.navigator.platform)?"ctrl":"alt",i=(e.getConfig().zoomKey?e.getConfig().zoomKey:n)+"Key",d=e.getConfig().zoomLevel?e.getConfig().zoomLevel:2;o[i]&&!e.isOverview()&&(o.preventDefault(),t.to({x:o.clientX,y:o.clientY,scale:d,pan:!1}))}))},destroy:function(){t.reset()}},t=function(){var e=1,o=0,n=0,i=-1,d=-1,l="transform"in document.body.style;function s(t,o){var n=r();if(t.width=t.width||1,t.height=t.height||1,t.x-=(window.innerWidth-t.width*o)/2,t.y-=(window.innerHeight-t.height*o)/2,l)if(1===o)document.body.style.transform="";else{var i=n.x+"px "+n.y+"px",d="translate("+-t.x+"px,"+-t.y+"px) scale("+o+")";document.body.style.transformOrigin=i,document.body.style.transform=d}else 1===o?(document.body.style.position="",document.body.style.left="",document.body.style.top="",document.body.style.width="",document.body.style.height="",document.body.style.zoom=""):(document.body.style.position="relative",document.body.style.left=-(n.x+t.x)/o+"px",document.body.style.top=-(n.y+t.y)/o+"px",document.body.style.width=100*o+"%",document.body.style.height=100*o+"%",document.body.style.zoom=o);e=o,document.documentElement.classList&&(1!==e?document.documentElement.classList.add("zoomed"):document.documentElement.classList.remove("zoomed"))}function c(){var t=.12*window.innerWidth,i=.12*window.innerHeight,d=r();nwindow.innerHeight-i&&window.scroll(d.x,d.y+(1-(window.innerHeight-n)/i)*(14/e)),owindow.innerWidth-t&&window.scroll(d.x+(1-(window.innerWidth-o)/t)*(14/e),d.y)}function r(){return{x:void 0!==window.scrollX?window.scrollX:window.pageXOffset,y:void 0!==window.scrollY?window.scrollY:window.pageYOffset}}return l&&(document.body.style.transition="transform 0.8s ease"),document.addEventListener("keyup",(function(o){1!==e&&27===o.keyCode&&t.out()})),document.addEventListener("mousemove",(function(t){1!==e&&(o=t.clientX,n=t.clientY)})),{to:function(o){if(1!==e)t.out();else{if(o.x=o.x||0,o.y=o.y||0,o.element){var n=o.element.getBoundingClientRect();o.x=n.left-20,o.y=n.top-20,o.width=n.width+40,o.height=n.height+40}void 0!==o.width&&void 0!==o.height&&(o.scale=Math.max(Math.min(window.innerWidth/o.width,window.innerHeight/o.height),1)),o.scale>1&&(o.x*=o.scale,o.y*=o.scale,s(o,o.scale),!1!==o.pan&&(i=setTimeout((function(){d=setInterval(c,1e3/60)}),800)))}},out:function(){clearTimeout(i),clearInterval(d),s({x:0,y:0},1),e=1},magnify:function(e){this.to(e)},reset:function(){this.out()},zoomLevel:function(){return e}}}();return function(){return e}}));
5 | 


--------------------------------------------------------------------------------
/level-up_workshop.Rproj:
--------------------------------------------------------------------------------
 1 | Version: 1.0
 2 | 
 3 | RestoreWorkspace: Default
 4 | SaveWorkspace: Default
 5 | AlwaysSaveHistory: Default
 6 | 
 7 | EnableCodeIndexing: Yes
 8 | UseSpacesForTab: Yes
 9 | NumSpacesForTab: 2
10 | Encoding: UTF-8
11 | 
12 | RnwWeave: Sweave
13 | LaTeX: pdfLaTeX
14 | 


--------------------------------------------------------------------------------