diff --git a/.buildinfo b/.buildinfo index 445dbb6..dbd2768 100644 --- a/.buildinfo +++ b/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 6b1f964971c10eed1035b081deb3c52d +config: 94d250ba7429ff31e08a1571e1a197ad tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle index 676f611..2c42c81 100644 Binary files a/.doctrees/environment.pickle and b/.doctrees/environment.pickle differ diff --git a/.doctrees/programming/SSH-SWC-cluster.doctree b/.doctrees/programming/SSH-SWC-cluster.doctree index 03c173d..b829c9c 100644 Binary files a/.doctrees/programming/SSH-SWC-cluster.doctree and b/.doctrees/programming/SSH-SWC-cluster.doctree differ diff --git a/_images/ssh_flowchart_full.png b/_images/ssh_flowchart_full.png new file mode 100644 index 0000000..8414d9d Binary files /dev/null and b/_images/ssh_flowchart_full.png differ diff --git a/_images/ssh_flowchart_unmanaged.png b/_images/ssh_flowchart_unmanaged.png new file mode 100644 index 0000000..bd34418 Binary files /dev/null and b/_images/ssh_flowchart_unmanaged.png differ diff --git a/_images/swc_hpc_access_flowchart.png b/_images/swc_hpc_access_flowchart.png deleted file mode 100644 index 8594302..0000000 Binary files a/_images/swc_hpc_access_flowchart.png and /dev/null differ diff --git a/_sources/programming/SSH-SWC-cluster.md.txt b/_sources/programming/SSH-SWC-cluster.md.txt index 610d377..755a1f9 100644 --- a/_sources/programming/SSH-SWC-cluster.md.txt +++ b/_sources/programming/SSH-SWC-cluster.md.txt @@ -1,7 +1,12 @@ (ssh-cluster-target)= # Set up SSH for the SWC HPC cluster -This guide explains how to connect to the SWC's HPC cluster via SSH. +This guide explains how to connect to the SWC's HPC cluster via SSH from +any personal computer. + +If you have access to a desktop managed by the SWC's IT team +the connection is much more straightforward than described here +(see the [note on managed desktops](ssh-managed-target)). ```{include} ../_static/swc-wiki-warning.md ``` @@ -12,10 +17,11 @@ This guide explains how to connect to the SWC's HPC cluster via SSH. ## Abbreviations | Acronym | Meaning | | ----------------------------------------------------------------------- | -------------------------------------------- | +| [SSH](https://en.wikipedia.org/wiki/Secure_Shell) | Secure (Socket) Shell protocol | | [SWC](https://www.sainsburywellcome.org/web/) | Sainsbury Wellcome Centre | | [HPC](https://en.wikipedia.org/wiki/High-performance_computing) | High Performance Computing | +| [IT](https://en.wikipedia.org/wiki/Information_technology) | Information Technology | | [SLURM](https://slurm.schedmd.com/) | Simple Linux Utility for Resource Management | -| [SSH](https://en.wikipedia.org/wiki/Secure_Shell) | Secure (Socket) Shell protocol | | [IDE](https://en.wikipedia.org/wiki/Integrated_development_environment) | Integrated Development Environment | | [GUI](https://en.wikipedia.org/wiki/Graphical_user_interface) | Graphical User Interface | @@ -70,19 +76,17 @@ You have now successfully logged into the cluster 🎉. You may stop reading her If you want to learn more about why we had to SSH twice, read the [next section](#why-do-we-ssh-twice). If you want to make you life easier, you can set yourself up with an [SSH config file](#ssh-config-file) -and some [SSH keys](#ssh-keys). Trust us, it's worth the effort. For example, one -benefit is that you will be able to use [Visual Studio Code](https://code.visualstudio.com/) -on your PC/laptop to edit files on the cluster (see the [last section](#remote-development)). +and some [SSH keys](#ssh-keys). ::: ## Why do we SSH twice? We first need to distinguish the different types of nodes on the SWC HPC system: -- the *bastion* node (or "jump host") - `ssh.swc.ucl.ac.uk`. This serves as a single entry point to the cluster from external networks. By funneling all external SSH connections through this node, it's easier to monitor, log, and control access, reducing the attack surface. The *bastion* node has very little processing power. It can be used to submit and monitor SLURM jobs, but it shouldn't be used for anything else. +- the *bastion* node (or *login node*) - `ssh.swc.ucl.ac.uk`. This serves as a single entry point to the cluster from external networks. By funneling all external SSH connections through this node, it's easier to monitor, log, and control access, reducing the attack surface. The *bastion* node has very little processing power. It can be used to submit and monitor SLURM jobs, but it shouldn't be used for anything else. - the *gateway* node - `hpc-gw1`. This is a more powerful machine and can be used for light processing, such as editing your scripts, creating and copying files etc. However don't use it for anything computationally intensive, since this node's resources are shared across all users. - the *compute* nodes - `enc1-node10`, `gpu-sr670-21`, etc. These are the machinces that actually run the jobs we submit, either interactively via `srun` or via batch scripts submitted with `sbatch`. -![](../_static/swc_hpc_access_flowchart.png) +![](../_static/ssh_flowchart_unmanaged.png) Your home directory, as well as the locations where filesystems like `ceph` are mounted, are shared across all of the nodes. @@ -92,11 +96,61 @@ Similarly, if you are on the *gateway* node, typing `logout` once will only get The *compute* nodes should only be accessed via the SLURM `srun` or `sbatch` commands. This can be done from either the *bastion* or the *gateway* nodes. If you are running an interactive job on one of the *compute* nodes, you can terminate it by typing `exit`. This will return you to the node from which you entered. +:::{dropdown} Be mindful of node usage +:color: warning +:icon: alert + +Avoid running heavy computations on the *bastion* or *gateway* nodes, as +they are meant for light tasks like text editing or job submissions to SLURM. + +For quick tasks that may burden these nodes, +request an interactive session on a *compute* node using the `srun` command. +Here's an example for creating a new conda environment: + +```{code-block} console +$ srun -p fast -n 4 --mem 8G --pty bash -i +$ module load miniconda +$ conda create -n myenv python=3.10 +``` + +The first command requests 4 cores and 8GB of memory on a node of the `fast` +partition, meant for jobs up to 3 hours long. The `--pty bash -i` part specifies +an interactive bash shell. The following two commands are run in this shell, +on the assigned *compute* node. + +Type `exit` to leave the interactive session when finished. +Avoid keeping sessions open when not in use. +::: + +(ssh-managed-target)= +## Note on managed desktops + +The SWC's IT team offers managed desktop computers equipped with either +a Windows or a Linux image. These machines are already part of the SWC's +trusted network domain, meaning you can access the HPC cluster without +having to go through the *bastion* node. + +- If you are using a [managed Windows desktop](https://wiki.ucl.ac.uk/display/SSC/SWC+Desktops), +you can SSH directly into the *gateway* node with `ssh hpc-gw1` from the +Windows `cmd` or PowerShell. +You may use that node to prepare your scripts and submit SLURM jobs. +- If you are using a [managed Linux desktop](https://wiki.ucl.ac.uk/display/SSC/Managed+Linux+Desktop), +you can even bypass the *gateway* node. In fact, you may directly submit SLURM jobs +from your terminal, without having to SSH at all. That's because managed Linux desktops +use the same platform as the HPC nodes +and are already equipped with the SLURM job scheduler. + +A modified version of the flowchart found above, including managed desktops: + +![](../_static/ssh_flowchart_full.png) + + ## SSH config file -If you find yourself typing the above commands over and over again, you can make -your life easier by editing the SSH config file. -This is a text file that lives in your home directory and contains a list of aliases -for SSH connections. +If you are frequently accessing the cluster from an unmanaged machine, +you may find yourself typing the same SSH commands over and over again. +You can make your life easier by editing the SSH config file. +This is a text file that lives in your home directory and contains +a list of aliases for SSH connections. On your local PC/Laptop, navigate to the `.ssh` folder in your user's home `~` directory: ```{code-block} console @@ -256,19 +310,3 @@ In case you want to SSH into the *bastion* node, you can do so by typing: ```{code-block} console $ ssh swc-bastion ``` - -## Remote development -One benefit of setting your SSH config and SSH keys is that you can now easily use -[Visual Studio Code](https://code.visualstudio.com/) to edit files on remote machines. -This is especially useful for editing scripts on the *gateway* node that you want to -run on the *compute* nodes of the cluster. - -To do this, you need to install the [Remote - SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh) extension in VS Code. Then, when you -click on the "Open a Remote Window" button in the bottom left corner of the VS Code window, -you will see a list of the SSH hosts you have configured in your `~/.ssh/config` file. -You can then select the host you want to connect to - e.g. `swc-gateway` - and VS Code -will open a new window with a terminal connected to that host. You can then use the -VS Code GUI to navigate the file system and edit files on the remote machine. - -Other IDEs like [PyCharm](https://www.jetbrains.com/pycharm/) also offer -[similar functionality](https://www.jetbrains.com/help/pycharm/remote-development-overview.html). diff --git a/_static/scripts/pydata-sphinx-theme.js b/_static/scripts/pydata-sphinx-theme.js index 920b186..9aac46d 100644 --- a/_static/scripts/pydata-sphinx-theme.js +++ b/_static/scripts/pydata-sphinx-theme.js @@ -1,2 +1,2 @@ -(()=>{"use strict";function e(e){"loading"!=document.readyState?e():document.addEventListener("DOMContentLoaded",e)}const t=e=>"string"==typeof e&&/^[v\d]/.test(e)&&o.test(e),n=(e,t,n)=>{u(n);const o=((e,t)=>{const n=r(e),o=r(t),a=n.pop(),c=o.pop(),s=i(n,o);return 0!==s?s:a&&c?i(a.split("."),c.split(".")):a||c?a?-1:1:0})(e,t);return d[n].includes(o)},o=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i,r=e=>{if("string"!=typeof e)throw new TypeError("Invalid argument expected string");const t=e.match(o);if(!t)throw new Error(`Invalid argument not valid semver ('${e}' received)`);return t.shift(),t},a=e=>"*"===e||"x"===e||"X"===e,c=e=>{const t=parseInt(e,10);return isNaN(t)?e:t},s=(e,t)=>{if(a(e)||a(t))return 0;const[n,o]=((e,t)=>typeof e!=typeof t?[String(e),String(t)]:[e,t])(c(e),c(t));return n>o?1:n{for(let n=0;n":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1]},l=Object.keys(d),u=e=>{if("string"!=typeof e)throw new TypeError("Invalid operator type, expected string but got "+typeof e);if(-1===l.indexOf(e))throw new Error(`Invalid operator, expected one of ${l.join("|")}`)};var m=window.matchMedia("(prefers-color-scheme: dark)");function h(e){document.documentElement.dataset.theme=m.matches?"dark":"light"}function p(e){"light"!==e&&"dark"!==e&&"auto"!==e&&(console.error(`Got invalid theme mode: ${e}. Resetting to auto.`),e="auto");var t=m.matches?"dark":"light";document.documentElement.dataset.mode=e;var n="auto"==e?t:e;document.documentElement.dataset.theme=n,document.querySelectorAll(".dropdown-menu").forEach((e=>{"dark"===n?e.classList.add("dropdown-menu-dark"):e.classList.remove("dropdown-menu-dark")})),localStorage.setItem("mode",e),localStorage.setItem("theme",n),console.log(`[PST]: Changed to ${e} mode using the ${n} theme.`),m.onchange="auto"==e?h:""}function f(){const e=document.documentElement.dataset.defaultMode||"auto",t=localStorage.getItem("mode")||e;var n,o;p(((o=(n=m.matches?["auto","light","dark"]:["auto","dark","light"]).indexOf(t)+1)===n.length&&(o=0),n[o]))}var g=()=>{let e=document.querySelectorAll("form.bd-search");return e.length?(1==e.length?e[0]:document.querySelector("div:not(.search-button__search-container) > form.bd-search")).querySelector("input"):void 0},v=()=>{let e=g(),t=document.querySelector(".search-button__wrapper");e===t.querySelector("input")&&t.classList.toggle("show"),document.activeElement===e?e.blur():(e.focus(),e.select(),e.scrollIntoView({block:"center"}))},y=0===navigator.platform.indexOf("Mac")||"iPhone"===navigator.platform,b=()=>"dirhtml"==DOCUMENTATION_OPTIONS.BUILDER?"index"==DOCUMENTATION_OPTIONS.pagename?"/":`${DOCUMENTATION_OPTIONS.pagename}/`:`${DOCUMENTATION_OPTIONS.pagename}.html`;async function w(e){document.querySelector("#bd-header-version-warning").remove();const t=DOCUMENTATION_OPTIONS.VERSION,n=new Date,o=JSON.parse(localStorage.getItem("pst_banner_pref")||"{}");console.debug(`[PST] Dismissing the version warning banner on ${t} starting ${n}.`),o[t]=n,localStorage.setItem("pst_banner_pref",JSON.stringify(o))}async function E(e){e.preventDefault();const t=b();let n=e.currentTarget.getAttribute("href"),o=n.replace(t,"");try{(await fetch(n,{method:"HEAD"})).ok?location.href=n:location.href=o}catch(e){location.href=o}}async function S(){var e=document.querySelectorAll(".version-switcher__button");const o=e.length>0,r=DOCUMENTATION_OPTIONS.hasOwnProperty("theme_switcher_json_url"),a=DOCUMENTATION_OPTIONS.show_version_warning_banner;if(r&&(o||a)){const o=await async function(e){try{var t=new URL(e)}catch(n){if(!(n instanceof TypeError))throw n;{if(!window.location.origin)return null;const n=await fetch(window.location.origin,{method:"HEAD"});t=new URL(e,n.url)}}const n=await fetch(t);return await n.json()}(DOCUMENTATION_OPTIONS.theme_switcher_json_url);o&&(function(e,t){const n=b();t.forEach((e=>{e.dataset.activeVersionName="",e.dataset.activeVersion=""}));const o=(e=e.map((e=>(e.match=e.version==DOCUMENTATION_OPTIONS.theme_switcher_version_match,e.preferred=e.preferred||!1,"name"in e||(e.name=e.version),e)))).map((e=>e.preferred&&e.match)).some(Boolean);var r=!1;e.forEach((e=>{const a=document.createElement("a");a.setAttribute("class","dropdown-item list-group-item list-group-item-action py-1"),a.setAttribute("href",`${e.url}${n}`),a.setAttribute("role","option");const c=document.createElement("span");c.textContent=`${e.name}`,a.appendChild(c),a.dataset.versionName=e.name,a.dataset.version=e.version;let s=o&&e.preferred,i=!o&&!r&&e.match;(s||i)&&(a.classList.add("active"),t.forEach((t=>{t.innerText=e.name,t.dataset.activeVersionName=e.name,t.dataset.activeVersion=e.version})),r=!0),document.querySelectorAll(".version-switcher__menu").forEach((e=>{let t=a.cloneNode(!0);t.onclick=E,e.append(t)}))}))}(o,e),a&&function(e){var o=DOCUMENTATION_OPTIONS.VERSION,r=e.filter((e=>e.preferred));if(1!==r.length){const e=0==r.length?"No":"Multiple";return void console.log(`[PST] ${e} versions marked "preferred" found in versions JSON, ignoring.`)}const a=r[0].version,c=r[0].url,s=t(o)&&t(a);if(s&&n(o,a,"="))return void console.log("This is the prefered version of the docs, not showing the warning banner.");const i=JSON.parse(localStorage.getItem("pst_banner_pref")||"{}")[o];if(null!=i){const e=new Date(i),t=(new Date-e)/864e5;if(t<14)return void console.info(`[PST] Suppressing version warning banner; was dismissed ${Math.floor(t)} day(s) ago`)}const d=document.querySelector("#bd-header-version-warning"),l=document.createElement("div"),u=document.createElement("div"),m=document.createElement("strong"),h=document.createElement("a"),p=document.createElement("a");l.classList="bd-header-announcement__content ms-auto me-auto",u.classList="sidebar-message",h.classList="btn text-wrap font-weight-bold ms-3 my-1 align-baseline pst-button-link-to-stable-version",h.href=`${c}${b()}`,h.innerText="Switch to stable version",h.onclick=E,p.classList="ms-3 my-1 align-baseline";const f=document.createElement("i");p.append(f),f.classList="fa-solid fa-xmark",p.onclick=w,u.innerText="This is documentation for ";const g=o.includes("dev")||o.includes("rc")||o.includes("pre"),v=s&&n(o,a,">");g||v?m.innerText="an unstable development version":s&&n(o,a,"<")?m.innerText=`an old version (${o})`:m.innerText=o?`version ${o}`:"an unknown version",d.appendChild(l),d.append(p),l.appendChild(u),u.appendChild(m),u.appendChild(document.createTextNode(".")),u.appendChild(h),d.classList.remove("d-none")}(o))}}function T(){const e=()=>{document.querySelectorAll("pre, .nboutput > .output_area, .cell_output > .output, .jp-RenderedHTMLCommon").forEach((e=>{e.tabIndex=e.scrollWidth>e.clientWidth||e.scrollHeight>e.clientHeight?0:-1}))},t=function(e,t){let n=null;return(...t)=>{clearTimeout(n),n=setTimeout((()=>{e(...t)}),300)}}(e);window.addEventListener("resize",t),new MutationObserver(t).observe(document.getElementById("main-content"),{subtree:!0,childList:!0}),e()}async function O(){const e=document.querySelector(".bd-header-announcement"),{pstAnnouncementUrl:t}=e.dataset;if(t)try{const n=await fetch(t);if(!n.ok)throw new Error(`[PST]: HTTP response status not ok: ${n.status} ${n.statusText}`);const o=await n.text();if(0===o.length)return void console.log(`[PST]: Empty announcement at: ${t}`);e.innerHTML=`
${o}
`,e.classList.remove("d-none")}catch(e){console.log(`[PST]: Failed to load announcement at: ${t}`),console.error(e)}}e((async function(){await Promise.allSettled([S(),O()]);const e=document.querySelector(".pst-async-banner-revealer");e.classList.remove("d-none");const t=Array.from(e.children).reduce(((e,t)=>e+t.offsetHeight),0);e.style.setProperty("height",`${t}px`),setTimeout((()=>{e.style.setProperty("height","auto")}),320)})),e((function(){p(document.documentElement.dataset.mode),document.querySelectorAll(".theme-switch-button").forEach((e=>{e.addEventListener("click",f)}))})),e((function(){if(!document.querySelector(".bd-docs-nav"))return;var e=document.querySelector("div.bd-sidebar");let t=parseInt(sessionStorage.getItem("sidebar-scroll-top"),10);if(isNaN(t)){var n=document.querySelector(".bd-docs-nav").querySelectorAll(".active");if(n.length>0){var o=n[n.length-1],r=o.getBoundingClientRect().y-e.getBoundingClientRect().y;if(o.getBoundingClientRect().y>.5*window.innerHeight){let t=.25;e.scrollTop=r-e.clientHeight*t,console.log("[PST]: Scrolled sidebar using last active link...")}}}else e.scrollTop=t,console.log("[PST]: Scrolled sidebar using stored browser position...");window.addEventListener("beforeunload",(()=>{sessionStorage.setItem("sidebar-scroll-top",e.scrollTop)}))})),e((function(){window.addEventListener("activate.bs.scrollspy",(function(){document.querySelectorAll(".bd-toc-nav a").forEach((e=>{e.parentElement.classList.remove("active")})),document.querySelectorAll(".bd-toc-nav a.active").forEach((e=>{e.parentElement.classList.add("active")}))}))})),e((()=>{(()=>{let e=document.querySelectorAll(".search-button__kbd-shortcut");y&&e.forEach((e=>e.querySelector("kbd.kbd-shortcut__modifier").innerText="⌘"))})(),window.addEventListener("keydown",(e=>{let t=g();e.shiftKey||e.altKey||(y?!e.metaKey||e.ctrlKey:e.metaKey||!e.ctrlKey)||!/^k$/i.test(e.key)?document.activeElement===t&&/Escape/i.test(e.key)&&v():(e.preventDefault(),v())}),!0),document.querySelectorAll(".search-button__button").forEach((e=>{e.onclick=v}));let e=document.querySelector(".search-button__overlay");e&&(e.onclick=v)})),e((function(){new MutationObserver(((e,t)=>{e.forEach((e=>{0!==e.addedNodes.length&&void 0!==e.addedNodes[0].data&&-1!=e.addedNodes[0].data.search("Inserted RTD Footer")&&e.addedNodes.forEach((e=>{document.getElementById("rtd-footer-container").append(e)}))}))})).observe(document.body,{childList:!0})})),e((function(){const e=document.getElementById("pst-primary-sidebar-checkbox"),t=document.getElementById("pst-secondary-sidebar-checkbox"),n=document.querySelector(".bd-sidebar-primary"),o=document.querySelector(".bd-sidebar-secondary"),r=document.querySelector(".primary-toggle"),a=document.querySelector(".secondary-toggle");[[r,e,n],[a,t,o]].forEach((([e,t,n])=>{e&&e.addEventListener("click",(e=>{if(e.preventDefault(),e.stopPropagation(),t.checked=!t.checked,t.checked){const e=n.querySelector("a, button");setTimeout((()=>e.focus()),100)}}))})),[[n,e,r],[o,t,a]].forEach((([e,t,n])=>{e&&e.addEventListener("keydown",(e=>{"Escape"===e.key&&(e.preventDefault(),e.stopPropagation(),t.checked=!1,n.focus())}))})),[[e,r],[t,a]].forEach((([e,t])=>{e.addEventListener("change",(e=>{e.currentTarget.checked||t.focus()}))}))})),"complete"===document.readyState?T():window.addEventListener("load",T)})(); +(()=>{"use strict";function e(e){"loading"!=document.readyState?e():document.addEventListener("DOMContentLoaded",e)}const t=e=>"string"==typeof e&&/^[v\d]/.test(e)&&o.test(e),n=(e,t,n)=>{u(n);const o=((e,t)=>{const n=r(e),o=r(t),a=n.pop(),c=o.pop(),s=i(n,o);return 0!==s?s:a&&c?i(a.split("."),c.split(".")):a||c?a?-1:1:0})(e,t);return d[n].includes(o)},o=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i,r=e=>{if("string"!=typeof e)throw new TypeError("Invalid argument expected string");const t=e.match(o);if(!t)throw new Error(`Invalid argument not valid semver ('${e}' received)`);return t.shift(),t},a=e=>"*"===e||"x"===e||"X"===e,c=e=>{const t=parseInt(e,10);return isNaN(t)?e:t},s=(e,t)=>{if(a(e)||a(t))return 0;const[n,o]=((e,t)=>typeof e!=typeof t?[String(e),String(t)]:[e,t])(c(e),c(t));return n>o?1:n{for(let n=0;n":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1]},l=Object.keys(d),u=e=>{if("string"!=typeof e)throw new TypeError("Invalid operator type, expected string but got "+typeof e);if(-1===l.indexOf(e))throw new Error(`Invalid operator, expected one of ${l.join("|")}`)};var m=window.matchMedia("(prefers-color-scheme: dark)");function h(e){document.documentElement.dataset.theme=m.matches?"dark":"light"}function p(e){"light"!==e&&"dark"!==e&&"auto"!==e&&(console.error(`Got invalid theme mode: ${e}. Resetting to auto.`),e="auto");var t=m.matches?"dark":"light";document.documentElement.dataset.mode=e;var n="auto"==e?t:e;document.documentElement.dataset.theme=n,document.querySelectorAll(".dropdown-menu").forEach((e=>{"dark"===n?e.classList.add("dropdown-menu-dark"):e.classList.remove("dropdown-menu-dark")})),localStorage.setItem("mode",e),localStorage.setItem("theme",n),console.log(`[PST]: Changed to ${e} mode using the ${n} theme.`),m.onchange="auto"==e?h:""}function f(){const e=document.documentElement.dataset.defaultMode||"auto",t=localStorage.getItem("mode")||e;var n,o;p(((o=(n=m.matches?["auto","light","dark"]:["auto","dark","light"]).indexOf(t)+1)===n.length&&(o=0),n[o]))}var g=()=>{let e=document.querySelectorAll("form.bd-search");return e.length?(1==e.length?e[0]:document.querySelector("div:not(.search-button__search-container) > form.bd-search")).querySelector("input"):void 0},v=()=>{let e=g(),t=document.querySelector(".search-button__wrapper");e===t.querySelector("input")&&t.classList.toggle("show"),document.activeElement===e?e.blur():(e.focus(),e.select(),e.scrollIntoView({block:"center"}))},y=0===navigator.platform.indexOf("Mac")||"iPhone"===navigator.platform,b=()=>"dirhtml"==DOCUMENTATION_OPTIONS.BUILDER?"index"==DOCUMENTATION_OPTIONS.pagename?"/":`${DOCUMENTATION_OPTIONS.pagename}/`:`${DOCUMENTATION_OPTIONS.pagename}.html`;async function w(e){document.querySelector("#bd-header-version-warning").remove();const t=DOCUMENTATION_OPTIONS.VERSION,n=new Date,o=JSON.parse(localStorage.getItem("pst_banner_pref")||"{}");console.debug(`[PST] Dismissing the version warning banner on ${t} starting ${n}.`),o[t]=n,localStorage.setItem("pst_banner_pref",JSON.stringify(o))}async function E(e){e.preventDefault();const t=b();let n=e.currentTarget.getAttribute("href"),o=n.replace(t,"");try{(await fetch(n,{method:"HEAD"})).ok?location.href=n:location.href=o}catch(e){location.href=o}}async function S(){var e=document.querySelectorAll(".version-switcher__button");const o=e.length>0,r=DOCUMENTATION_OPTIONS.hasOwnProperty("theme_switcher_json_url"),a=DOCUMENTATION_OPTIONS.show_version_warning_banner;if(r&&(o||a)){const o=await async function(e){try{var t=new URL(e)}catch(n){if(!(n instanceof TypeError))throw n;{if(!window.location.origin)return null;const n=await fetch(window.location.origin,{method:"HEAD"});t=new URL(e,n.url)}}const n=await fetch(t);return await n.json()}(DOCUMENTATION_OPTIONS.theme_switcher_json_url);o&&(function(e,t){const n=b();t.forEach((e=>{e.dataset.activeVersionName="",e.dataset.activeVersion=""}));const o=(e=e.map((e=>(e.match=e.version==DOCUMENTATION_OPTIONS.theme_switcher_version_match,e.preferred=e.preferred||!1,"name"in e||(e.name=e.version),e)))).map((e=>e.preferred&&e.match)).some(Boolean);var r=!1;e.forEach((e=>{const a=document.createElement("a");a.setAttribute("class","dropdown-item list-group-item list-group-item-action py-1"),a.setAttribute("href",`${e.url}${n}`),a.setAttribute("role","option");const c=document.createElement("span");c.textContent=`${e.name}`,a.appendChild(c),a.dataset.versionName=e.name,a.dataset.version=e.version;let s=o&&e.preferred,i=!o&&!r&&e.match;(s||i)&&(a.classList.add("active"),t.forEach((t=>{t.innerText=e.name,t.dataset.activeVersionName=e.name,t.dataset.activeVersion=e.version})),r=!0),document.querySelectorAll(".version-switcher__menu").forEach((e=>{let t=a.cloneNode(!0);t.onclick=E,e.append(t)}))}))}(o,e),a&&function(e){var o=DOCUMENTATION_OPTIONS.VERSION,r=e.filter((e=>e.preferred));if(1!==r.length){const e=0==r.length?"No":"Multiple";return void console.log(`[PST] ${e} versions marked "preferred" found in versions JSON, ignoring.`)}const a=r[0].version,c=r[0].url,s=t(o)&&t(a);if(s&&n(o,a,"="))return void console.log("This is the prefered version of the docs, not showing the warning banner.");const i=JSON.parse(localStorage.getItem("pst_banner_pref")||"{}")[o];if(null!=i){const e=new Date(i),t=(new Date-e)/864e5;if(t<14)return void console.info(`[PST] Suppressing version warning banner; was dismissed ${Math.floor(t)} day(s) ago`)}const d=document.querySelector("#bd-header-version-warning"),l=document.createElement("div"),u=document.createElement("div"),m=document.createElement("strong"),h=document.createElement("a"),p=document.createElement("a");l.classList="bd-header-announcement__content ms-auto me-auto",u.classList="sidebar-message",h.classList="btn text-wrap font-weight-bold ms-3 my-1 align-baseline pst-button-link-to-stable-version",h.href=`${c}${b()}`,h.innerText="Switch to stable version",h.onclick=E,p.classList="ms-3 my-1 align-baseline";const f=document.createElement("i");p.append(f),f.classList="fa-solid fa-xmark",p.onclick=w,u.innerText="This is documentation for ";const g=o.includes("dev")||o.includes("rc")||o.includes("pre"),v=s&&n(o,a,">");g||v?m.innerText="an unstable development version":s&&n(o,a,"<")?m.innerText=`an old version (${o})`:m.innerText=o?`version ${o}`:"an unknown version",d.appendChild(l),d.append(p),l.appendChild(u),u.appendChild(m),u.appendChild(document.createTextNode(".")),u.appendChild(h),d.classList.remove("d-none")}(o))}}function T(){const e=()=>{document.querySelectorAll("pre, .nboutput > .output_area, .cell_output > .output, .jp-RenderedHTMLCommon").forEach((e=>{e.tabIndex=e.scrollWidth>e.clientWidth||e.scrollHeight>e.clientHeight?0:-1}))},t=function(e,t){let n=null;return(...t)=>{clearTimeout(n),n=setTimeout((()=>{e(...t)}),300)}}(e);window.addEventListener("resize",t),new MutationObserver(t).observe(document.getElementById("main-content"),{subtree:!0,childList:!0}),e()}async function O(){const e=document.querySelector(".bd-header-announcement"),{pstAnnouncementUrl:t}=e?e.dataset:null;if(t)try{const n=await fetch(t);if(!n.ok)throw new Error(`[PST]: HTTP response status not ok: ${n.status} ${n.statusText}`);const o=await n.text();if(0===o.length)return void console.log(`[PST]: Empty announcement at: ${t}`);e.innerHTML=`
${o}
`,e.classList.remove("d-none")}catch(e){console.log(`[PST]: Failed to load announcement at: ${t}`),console.error(e)}}e((async function(){await Promise.allSettled([S(),O()]);const e=document.querySelector(".pst-async-banner-revealer");if(!e)return;e.classList.remove("d-none");const t=Array.from(e.children).reduce(((e,t)=>e+t.offsetHeight),0);e.style.setProperty("height",`${t}px`),setTimeout((()=>{e.style.setProperty("height","auto")}),320)})),e((function(){p(document.documentElement.dataset.mode),document.querySelectorAll(".theme-switch-button").forEach((e=>{e.addEventListener("click",f)}))})),e((function(){if(!document.querySelector(".bd-docs-nav"))return;var e=document.querySelector("div.bd-sidebar");let t=parseInt(sessionStorage.getItem("sidebar-scroll-top"),10);if(isNaN(t)){var n=document.querySelector(".bd-docs-nav").querySelectorAll(".active");if(n.length>0){var o=n[n.length-1],r=o.getBoundingClientRect().y-e.getBoundingClientRect().y;if(o.getBoundingClientRect().y>.5*window.innerHeight){let t=.25;e.scrollTop=r-e.clientHeight*t,console.log("[PST]: Scrolled sidebar using last active link...")}}}else e.scrollTop=t,console.log("[PST]: Scrolled sidebar using stored browser position...");window.addEventListener("beforeunload",(()=>{sessionStorage.setItem("sidebar-scroll-top",e.scrollTop)}))})),e((function(){window.addEventListener("activate.bs.scrollspy",(function(){document.querySelectorAll(".bd-toc-nav a").forEach((e=>{e.parentElement.classList.remove("active")})),document.querySelectorAll(".bd-toc-nav a.active").forEach((e=>{e.parentElement.classList.add("active")}))}))})),e((()=>{(()=>{let e=document.querySelectorAll(".search-button__kbd-shortcut");y&&e.forEach((e=>e.querySelector("kbd.kbd-shortcut__modifier").innerText="⌘"))})(),window.addEventListener("keydown",(e=>{let t=g();e.shiftKey||e.altKey||(y?!e.metaKey||e.ctrlKey:e.metaKey||!e.ctrlKey)||!/^k$/i.test(e.key)?document.activeElement===t&&/Escape/i.test(e.key)&&v():(e.preventDefault(),v())}),!0),document.querySelectorAll(".search-button__button").forEach((e=>{e.onclick=v}));let e=document.querySelector(".search-button__overlay");e&&(e.onclick=v)})),e((function(){new MutationObserver(((e,t)=>{e.forEach((e=>{0!==e.addedNodes.length&&void 0!==e.addedNodes[0].data&&-1!=e.addedNodes[0].data.search("Inserted RTD Footer")&&e.addedNodes.forEach((e=>{document.getElementById("rtd-footer-container").append(e)}))}))})).observe(document.body,{childList:!0})})),e((function(){const e=document.getElementById("pst-primary-sidebar-checkbox"),t=document.getElementById("pst-secondary-sidebar-checkbox"),n=document.querySelector(".bd-sidebar-primary"),o=document.querySelector(".bd-sidebar-secondary"),r=document.querySelector(".primary-toggle"),a=document.querySelector(".secondary-toggle");[[r,e,n],[a,t,o]].forEach((([e,t,n])=>{e&&e.addEventListener("click",(e=>{if(e.preventDefault(),e.stopPropagation(),t.checked=!t.checked,t.checked){const e=n.querySelector("a, button");setTimeout((()=>e.focus()),100)}}))})),[[n,e,r],[o,t,a]].forEach((([e,t,n])=>{e&&e.addEventListener("keydown",(e=>{"Escape"===e.key&&(e.preventDefault(),e.stopPropagation(),t.checked=!1,n.focus())}))})),[[e,r],[t,a]].forEach((([e,t])=>{e.addEventListener("change",(e=>{e.currentTarget.checked||t.focus()}))}))})),"complete"===document.readyState?T():window.addEventListener("load",T)})(); //# sourceMappingURL=pydata-sphinx-theme.js.map \ No newline at end of file diff --git a/_static/scripts/pydata-sphinx-theme.js.map b/_static/scripts/pydata-sphinx-theme.js.map index 50e7fef..410fe68 100644 --- a/_static/scripts/pydata-sphinx-theme.js.map +++ b/_static/scripts/pydata-sphinx-theme.js.map @@ -1 +1 @@ -{"version":3,"file":"scripts/pydata-sphinx-theme.js","mappings":"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","sources":["webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/mixin.js","webpack://pydata_sphinx_theme/./node_modules/compare-versions/lib/esm/index.js","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/scripts/pydata-sphinx-theme.js"],"sourcesContent":["/* define several functions to replace jQuery methods\n * inspired by https://tobiasahlin.com/blog/move-from-jquery-to-vanilla-javascript/\n */\n\n/**\n * Execute a method if DOM has finished loading\n *\n * @param {function} callback the method to execute\n */\nexport function documentReady(callback) {\n if (document.readyState != \"loading\") callback();\n else document.addEventListener(\"DOMContentLoaded\", callback);\n}\n","/**\n * Compare [semver](https://semver.org/) version strings to find greater, equal or lesser.\n * This library supports the full semver specification, including comparing versions with different number of digits like `1.0.0`, `1.0`, `1`, and pre-release versions like `1.0.0-alpha`.\n * @param v1 - First version to compare\n * @param v2 - Second version to compare\n * @returns Numeric value compatible with the [Array.sort(fn) interface](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters).\n */\nexport const compareVersions = (v1, v2) => {\n // validate input and split into segments\n const n1 = validateAndParse(v1);\n const n2 = validateAndParse(v2);\n // pop off the patch\n const p1 = n1.pop();\n const p2 = n2.pop();\n // validate numbers\n const r = compareSegments(n1, n2);\n if (r !== 0)\n return r;\n // validate pre-release\n if (p1 && p2) {\n return compareSegments(p1.split('.'), p2.split('.'));\n }\n else if (p1 || p2) {\n return p1 ? -1 : 1;\n }\n return 0;\n};\n/**\n * Validate [semver](https://semver.org/) version strings.\n *\n * @param version Version number to validate\n * @returns `true` if the version number is a valid semver version number, `false` otherwise.\n *\n * @example\n * ```\n * validate('1.0.0-rc.1'); // return true\n * validate('1.0-rc.1'); // return false\n * validate('foo'); // return false\n * ```\n */\nexport const validate = (version) => typeof version === 'string' && /^[v\\d]/.test(version) && semver.test(version);\n/**\n * Compare [semver](https://semver.org/) version strings using the specified operator.\n *\n * @param v1 First version to compare\n * @param v2 Second version to compare\n * @param operator Allowed arithmetic operator to use\n * @returns `true` if the comparison between the firstVersion and the secondVersion satisfies the operator, `false` otherwise.\n *\n * @example\n * ```\n * compare('10.1.8', '10.0.4', '>'); // return true\n * compare('10.0.1', '10.0.1', '='); // return true\n * compare('10.1.1', '10.2.2', '<'); // return true\n * compare('10.1.1', '10.2.2', '<='); // return true\n * compare('10.1.1', '10.2.2', '>='); // return false\n * ```\n */\nexport const compare = (v1, v2, operator) => {\n // validate input operator\n assertValidOperator(operator);\n // since result of compareVersions can only be -1 or 0 or 1\n // a simple map can be used to replace switch\n const res = compareVersions(v1, v2);\n return operatorResMap[operator].includes(res);\n};\n/**\n * Match [npm semver](https://docs.npmjs.com/cli/v6/using-npm/semver) version range.\n *\n * @param version Version number to match\n * @param range Range pattern for version\n * @returns `true` if the version number is within the range, `false` otherwise.\n *\n * @example\n * ```\n * satisfies('1.1.0', '^1.0.0'); // return true\n * satisfies('1.1.0', '~1.0.0'); // return false\n * ```\n */\nexport const satisfies = (version, range) => {\n // if no range operator then \"=\"\n const m = range.match(/^([<>=~^]+)/);\n const op = m ? m[1] : '=';\n // if gt/lt/eq then operator compare\n if (op !== '^' && op !== '~')\n return compare(version, range, op);\n // else range of either \"~\" or \"^\" is assumed\n const [v1, v2, v3, , vp] = validateAndParse(version);\n const [r1, r2, r3, , rp] = validateAndParse(range);\n const v = [v1, v2, v3];\n const r = [r1, r2 !== null && r2 !== void 0 ? r2 : 'x', r3 !== null && r3 !== void 0 ? r3 : 'x'];\n // validate pre-release\n if (rp) {\n if (!vp)\n return false;\n if (compareSegments(v, r) !== 0)\n return false;\n if (compareSegments(vp.split('.'), rp.split('.')) === -1)\n return false;\n }\n // first non-zero number\n const nonZero = r.findIndex((v) => v !== '0') + 1;\n // pointer to where segments can be >=\n const i = op === '~' ? 2 : nonZero > 1 ? nonZero : 1;\n // before pointer must be equal\n if (compareSegments(v.slice(0, i), r.slice(0, i)) !== 0)\n return false;\n // after pointer must be >=\n if (compareSegments(v.slice(i), r.slice(i)) === -1)\n return false;\n return true;\n};\nconst semver = /^[v^~<>=]*?(\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+))?(?:-([\\da-z\\-]+(?:\\.[\\da-z\\-]+)*))?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?)?)?$/i;\nconst validateAndParse = (version) => {\n if (typeof version !== 'string') {\n throw new TypeError('Invalid argument expected string');\n }\n const match = version.match(semver);\n if (!match) {\n throw new Error(`Invalid argument not valid semver ('${version}' received)`);\n }\n match.shift();\n return match;\n};\nconst isWildcard = (s) => s === '*' || s === 'x' || s === 'X';\nconst tryParse = (v) => {\n const n = parseInt(v, 10);\n return isNaN(n) ? v : n;\n};\nconst forceType = (a, b) => typeof a !== typeof b ? [String(a), String(b)] : [a, b];\nconst compareStrings = (a, b) => {\n if (isWildcard(a) || isWildcard(b))\n return 0;\n const [ap, bp] = forceType(tryParse(a), tryParse(b));\n if (ap > bp)\n return 1;\n if (ap < bp)\n return -1;\n return 0;\n};\nconst compareSegments = (a, b) => {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const r = compareStrings(a[i] || '0', b[i] || '0');\n if (r !== 0)\n return r;\n }\n return 0;\n};\nconst operatorResMap = {\n '>': [1],\n '>=': [0, 1],\n '=': [0],\n '<=': [-1, 0],\n '<': [-1],\n};\nconst allowedOperators = Object.keys(operatorResMap);\nconst assertValidOperator = (op) => {\n if (typeof op !== 'string') {\n throw new TypeError(`Invalid operator type, expected string but got ${typeof op}`);\n }\n if (allowedOperators.indexOf(op) === -1) {\n throw new Error(`Invalid operator, expected one of ${allowedOperators.join('|')}`);\n }\n};\n//# sourceMappingURL=index.js.map","// Define the custom behavior of the page\nimport { documentReady } from \"./mixin\";\nimport { compare, validate } from \"compare-versions\";\n\nimport \"../styles/pydata-sphinx-theme.scss\";\n\n/*******************************************************************************\n * Theme interaction\n */\n\nvar prefersDark = window.matchMedia(\"(prefers-color-scheme: dark)\");\n\n/**\n * set the the body theme to the one specified by the user browser\n *\n * @param {event} e\n */\nfunction autoTheme(e) {\n document.documentElement.dataset.theme = prefersDark.matches\n ? \"dark\"\n : \"light\";\n}\n\n/**\n * Set the theme using the specified mode.\n * It can be one of [\"auto\", \"dark\", \"light\"]\n *\n * @param {str} mode\n */\nfunction setTheme(mode) {\n if (mode !== \"light\" && mode !== \"dark\" && mode !== \"auto\") {\n console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`);\n mode = \"auto\";\n }\n\n // get the theme\n var colorScheme = prefersDark.matches ? \"dark\" : \"light\";\n document.documentElement.dataset.mode = mode;\n var theme = mode == \"auto\" ? colorScheme : mode;\n document.documentElement.dataset.theme = theme;\n // TODO: remove this line after Bootstrap upgrade\n // v5.3 has a colors mode: https://getbootstrap.com/docs/5.3/customize/color-modes/\n document.querySelectorAll(\".dropdown-menu\").forEach((el) => {\n if (theme === \"dark\") {\n el.classList.add(\"dropdown-menu-dark\");\n } else {\n el.classList.remove(\"dropdown-menu-dark\");\n }\n });\n\n // save mode and theme\n localStorage.setItem(\"mode\", mode);\n localStorage.setItem(\"theme\", theme);\n console.log(`[PST]: Changed to ${mode} mode using the ${theme} theme.`);\n\n // add a listener if set on auto\n prefersDark.onchange = mode == \"auto\" ? autoTheme : \"\";\n}\n\n/**\n * Change the theme option order so that clicking on the btn is always a change\n * from \"auto\"\n */\nfunction cycleMode() {\n const defaultMode = document.documentElement.dataset.defaultMode || \"auto\";\n const currentMode = localStorage.getItem(\"mode\") || defaultMode;\n\n var loopArray = (arr, current) => {\n var nextPosition = arr.indexOf(current) + 1;\n if (nextPosition === arr.length) {\n nextPosition = 0;\n }\n return arr[nextPosition];\n };\n\n // make sure the next theme after auto is always a change\n var modeList = prefersDark.matches\n ? [\"auto\", \"light\", \"dark\"]\n : [\"auto\", \"dark\", \"light\"];\n var newMode = loopArray(modeList, currentMode);\n setTheme(newMode);\n}\n\n/**\n * add the theme listener on the btns of the navbar\n */\nfunction addModeListener() {\n // the theme was set a first time using the initial mini-script\n // running setMode will ensure the use of the dark mode if auto is selected\n setTheme(document.documentElement.dataset.mode);\n\n // Attach event handlers for toggling themes colors\n document.querySelectorAll(\".theme-switch-button\").forEach((el) => {\n el.addEventListener(\"click\", cycleMode);\n });\n}\n\n/*******************************************************************************\n * TOC interactivity\n */\n\n/**\n * TOC sidebar - add \"active\" class to parent list\n *\n * Bootstrap's scrollspy adds the active class to the link,\n * but for the automatic collapsing we need this on the parent list item.\n *\n * The event is triggered on \"window\" (and not the nav item as documented),\n * see https://github.com/twbs/bootstrap/issues/20086\n */\nfunction addTOCInteractivity() {\n window.addEventListener(\"activate.bs.scrollspy\", function () {\n const navLinks = document.querySelectorAll(\".bd-toc-nav a\");\n\n navLinks.forEach((navLink) => {\n navLink.parentElement.classList.remove(\"active\");\n });\n\n const activeNavLinks = document.querySelectorAll(\".bd-toc-nav a.active\");\n activeNavLinks.forEach((navLink) => {\n navLink.parentElement.classList.add(\"active\");\n });\n });\n}\n\n/*******************************************************************************\n * Scroll\n */\n\n/**\n * Navigation sidebar scrolling to active page\n */\nfunction scrollToActive() {\n // If the docs nav doesn't exist, do nothing (e.g., on search page)\n if (!document.querySelector(\".bd-docs-nav\")) {\n return;\n }\n\n var sidebar = document.querySelector(\"div.bd-sidebar\");\n\n // Remember the sidebar scroll position between page loads\n // Inspired on source of revealjs.com\n let storedScrollTop = parseInt(\n sessionStorage.getItem(\"sidebar-scroll-top\"),\n 10,\n );\n\n if (!isNaN(storedScrollTop)) {\n // If we've got a saved scroll position, just use that\n sidebar.scrollTop = storedScrollTop;\n console.log(\"[PST]: Scrolled sidebar using stored browser position...\");\n } else {\n // Otherwise, calculate a position to scroll to based on the lowest `active` link\n var sidebarNav = document.querySelector(\".bd-docs-nav\");\n var active_pages = sidebarNav.querySelectorAll(\".active\");\n if (active_pages.length > 0) {\n // Use the last active page as the offset since it's the page we're on\n var latest_active = active_pages[active_pages.length - 1];\n var offset =\n latest_active.getBoundingClientRect().y -\n sidebar.getBoundingClientRect().y;\n // Only scroll the navbar if the active link is lower than 50% of the page\n if (latest_active.getBoundingClientRect().y > window.innerHeight * 0.5) {\n let buffer = 0.25; // Buffer so we have some space above the scrolled item\n sidebar.scrollTop = offset - sidebar.clientHeight * buffer;\n console.log(\"[PST]: Scrolled sidebar using last active link...\");\n }\n }\n }\n\n // Store the sidebar scroll position\n window.addEventListener(\"beforeunload\", () => {\n sessionStorage.setItem(\"sidebar-scroll-top\", sidebar.scrollTop);\n });\n}\n\n/*******************************************************************************\n * Search\n */\n\n/**\n * Find any search forms on the page and return their input element\n */\nvar findSearchInput = () => {\n let forms = document.querySelectorAll(\"form.bd-search\");\n if (!forms.length) {\n // no search form found\n return;\n } else {\n var form;\n if (forms.length == 1) {\n // there is exactly one search form (persistent or hidden)\n form = forms[0];\n } else {\n // must be at least one persistent form, use the first persistent one\n form = document.querySelector(\n \"div:not(.search-button__search-container) > form.bd-search\",\n );\n }\n return form.querySelector(\"input\");\n }\n};\n\n/**\n * Activate the search field on the page.\n * - If there is a search field already visible it will be activated.\n * - If not, then a search field will pop up.\n */\nvar toggleSearchField = () => {\n // Find the search input to highlight\n let input = findSearchInput();\n\n // if the input field is the hidden one (the one associated with the\n // search button) then toggle the button state (to show/hide the field)\n let searchPopupWrapper = document.querySelector(\".search-button__wrapper\");\n let hiddenInput = searchPopupWrapper.querySelector(\"input\");\n if (input === hiddenInput) {\n searchPopupWrapper.classList.toggle(\"show\");\n }\n // when toggling off the search field, remove its focus\n if (document.activeElement === input) {\n input.blur();\n } else {\n input.focus();\n input.select();\n input.scrollIntoView({ block: \"center\" });\n }\n};\n\n/**\n * Add an event listener for toggleSearchField() for Ctrl/Cmd + K\n */\nvar addEventListenerForSearchKeyboard = () => {\n window.addEventListener(\n \"keydown\",\n (event) => {\n let input = findSearchInput();\n // toggle on Ctrl+k or ⌘+k\n if (\n // Ignore if shift or alt are pressed\n !event.shiftKey &&\n !event.altKey &&\n // On Mac use ⌘, all other OS use Ctrl\n (useCommandKey\n ? event.metaKey && !event.ctrlKey\n : !event.metaKey && event.ctrlKey) &&\n // Case-insensitive so the shortcut still works with caps lock\n /^k$/i.test(event.key)\n ) {\n event.preventDefault();\n toggleSearchField();\n }\n // also allow Escape key to hide (but not show) the dynamic search field\n else if (document.activeElement === input && /Escape/i.test(event.key)) {\n toggleSearchField();\n }\n },\n true,\n );\n};\n\n/**\n * If the user is on a Mac, use command (⌘) instead of control (ctrl) key\n *\n * Note: `navigator.platform` is deprecated; however MDN still recommends using\n * it for the one specific use case of detecting whether a keyboard shortcut\n * should use control or command:\n * https://developer.mozilla.org/en-US/docs/Web/API/Navigator/platform#examples\n */\nvar useCommandKey =\n navigator.platform.indexOf(\"Mac\") === 0 || navigator.platform === \"iPhone\";\n\n/**\n * Change the search hint to `meta key` if we are a Mac\n */\n\nvar changeSearchShortcutKey = () => {\n let shortcuts = document.querySelectorAll(\".search-button__kbd-shortcut\");\n if (useCommandKey) {\n shortcuts.forEach(\n (f) => (f.querySelector(\"kbd.kbd-shortcut__modifier\").innerText = \"⌘\"),\n );\n }\n};\n\n/**\n * Activate callbacks for search button popup\n */\nvar setupSearchButtons = () => {\n changeSearchShortcutKey();\n addEventListenerForSearchKeyboard();\n\n // Add the search button trigger event callback\n document.querySelectorAll(\".search-button__button\").forEach((btn) => {\n btn.onclick = toggleSearchField;\n });\n\n // Add the search button overlay event callback\n let overlay = document.querySelector(\".search-button__overlay\");\n if (overlay) {\n overlay.onclick = toggleSearchField;\n }\n};\n\n/*******************************************************************************\n * Version Switcher\n * Note that this depends on two variables existing that are defined in\n * and `html-page-context` hook:\n *\n * - DOCUMENTATION_OPTIONS.pagename\n * - DOCUMENTATION_OPTIONS.theme_switcher_url\n */\n\n/**\n * path component of URL\n */\nvar getCurrentUrlPath = () => {\n if (DOCUMENTATION_OPTIONS.BUILDER == \"dirhtml\") {\n return DOCUMENTATION_OPTIONS.pagename == \"index\"\n ? `/`\n : `${DOCUMENTATION_OPTIONS.pagename}/`;\n }\n return `${DOCUMENTATION_OPTIONS.pagename}.html`;\n};\n\n/**\n * Allow user to dismiss the warning banner about the docs version being dev / old.\n * We store the dismissal date and version, to give us flexibility about making the\n * dismissal last for longer than one browser session, if we decide to do that.\n *\n * @param {event} event the event that trigger the check\n */\nasync function DismissBannerAndStorePref(event) {\n const banner = document.querySelector(\"#bd-header-version-warning\");\n banner.remove();\n const version = DOCUMENTATION_OPTIONS.VERSION;\n const now = new Date();\n const banner_pref = JSON.parse(\n localStorage.getItem(\"pst_banner_pref\") || \"{}\",\n );\n console.debug(\n `[PST] Dismissing the version warning banner on ${version} starting ${now}.`,\n );\n banner_pref[version] = now;\n localStorage.setItem(\"pst_banner_pref\", JSON.stringify(banner_pref));\n}\n\n/**\n * Check if corresponding page path exists in other version of docs\n * and, if so, go there instead of the homepage of the other docs version\n *\n * @param {event} event the event that trigger the check\n */\nasync function checkPageExistsAndRedirect(event) {\n // ensure we don't follow the initial link\n event.preventDefault();\n const currentFilePath = getCurrentUrlPath();\n let tryUrl = event.currentTarget.getAttribute(\"href\");\n let otherDocsHomepage = tryUrl.replace(currentFilePath, \"\");\n try {\n let head = await fetch(tryUrl, { method: \"HEAD\" });\n if (head.ok) {\n location.href = tryUrl; // the page exists, go there\n } else {\n location.href = otherDocsHomepage;\n }\n } catch (err) {\n // something went wrong, probably CORS restriction, fallback to other docs homepage\n location.href = otherDocsHomepage;\n }\n}\n\n/**\n * Load and parse the version switcher JSON file from an absolute or relative URL.\n *\n * @param {string} url The URL to load version switcher entries from.\n */\nasync function fetchVersionSwitcherJSON(url) {\n // first check if it's a valid URL\n try {\n var result = new URL(url);\n } catch (err) {\n if (err instanceof TypeError) {\n if (!window.location.origin) {\n // window.location.origin is null for local static sites\n // (ie. window.location.protocol == 'file:')\n //\n // TODO: Fix this to return the static version switcher by working out\n // how to get the correct path to the switcher JSON file on local static builds\n return null;\n }\n // assume we got a relative path, and fix accordingly. But first, we need to\n // use `fetch()` to follow redirects so we get the correct final base URL\n const origin = await fetch(window.location.origin, { method: \"HEAD\" });\n result = new URL(url, origin.url);\n } else {\n // something unexpected happened\n throw err;\n }\n }\n // load and return the JSON\n const response = await fetch(result);\n const data = await response.json();\n return data;\n}\n\n// Populate the version switcher from the JSON data\nfunction populateVersionSwitcher(data, versionSwitcherBtns) {\n const currentFilePath = getCurrentUrlPath();\n versionSwitcherBtns.forEach((btn) => {\n // Set empty strings by default so that these attributes exist and can be used in CSS selectors\n btn.dataset[\"activeVersionName\"] = \"\";\n btn.dataset[\"activeVersion\"] = \"\";\n });\n // in case there are multiple entries with the same version string, this helps us\n // decide which entry's `name` to put on the button itself. Without this, it would\n // always be the *last* version-matching entry; now it will be either the\n // version-matching entry that is also marked as `\"preferred\": true`, or if that\n // doesn't exist: the *first* version-matching entry.\n data = data.map((entry) => {\n // does this entry match the version that we're currently building/viewing?\n entry.match =\n entry.version == DOCUMENTATION_OPTIONS.theme_switcher_version_match;\n entry.preferred = entry.preferred || false;\n // if no custom name specified (e.g., \"latest\"), use version string\n if (!(\"name\" in entry)) {\n entry.name = entry.version;\n }\n return entry;\n });\n const hasMatchingPreferredEntry = data\n .map((entry) => entry.preferred && entry.match)\n .some(Boolean);\n var foundMatch = false;\n // create links to the corresponding page in the other docs versions\n data.forEach((entry) => {\n // create the node\n const anchor = document.createElement(\"a\");\n anchor.setAttribute(\n \"class\",\n \"dropdown-item list-group-item list-group-item-action py-1\",\n );\n anchor.setAttribute(\"href\", `${entry.url}${currentFilePath}`);\n anchor.setAttribute(\"role\", \"option\");\n const span = document.createElement(\"span\");\n span.textContent = `${entry.name}`;\n anchor.appendChild(span);\n // Add dataset values for the version and name in case people want\n // to apply CSS styling based on this information.\n anchor.dataset[\"versionName\"] = entry.name;\n anchor.dataset[\"version\"] = entry.version;\n // replace dropdown button text with the preferred display name of the\n // currently-viewed version, rather than using sphinx's {{ version }} variable.\n // also highlight the dropdown entry for the currently-viewed version's entry\n let matchesAndIsPreferred = hasMatchingPreferredEntry && entry.preferred;\n let matchesAndIsFirst =\n !hasMatchingPreferredEntry && !foundMatch && entry.match;\n if (matchesAndIsPreferred || matchesAndIsFirst) {\n anchor.classList.add(\"active\");\n versionSwitcherBtns.forEach((btn) => {\n btn.innerText = entry.name;\n btn.dataset[\"activeVersionName\"] = entry.name;\n btn.dataset[\"activeVersion\"] = entry.version;\n });\n foundMatch = true;\n }\n // There may be multiple version-switcher elements, e.g. one\n // in a slide-over panel displayed on smaller screens.\n document.querySelectorAll(\".version-switcher__menu\").forEach((menu) => {\n // we need to clone the node for each menu, but onclick attributes are not\n // preserved by `.cloneNode()` so we add onclick here after cloning.\n let node = anchor.cloneNode(true);\n node.onclick = checkPageExistsAndRedirect;\n // on click, AJAX calls will check if the linked page exists before\n // trying to redirect, and if not, will redirect to the homepage\n // for that version of the docs.\n menu.append(node);\n });\n });\n}\n\n/*******************************************************************************\n * Warning banner when viewing non-stable version of the docs.\n */\n\n/**\n * Show a warning banner when viewing a non-stable version of the docs.\n *\n * adapted 2023-06 from https://mne.tools/versionwarning.js, which was\n * originally adapted 2020-05 from https://scikit-learn.org/versionwarning.js\n *\n * @param {Array} data The version data used to populate the switcher menu.\n */\nfunction showVersionWarningBanner(data) {\n var version = DOCUMENTATION_OPTIONS.VERSION;\n // figure out what latest stable version is\n var preferredEntries = data.filter((entry) => entry.preferred);\n if (preferredEntries.length !== 1) {\n const howMany = preferredEntries.length == 0 ? \"No\" : \"Multiple\";\n console.log(\n `[PST] ${howMany} versions marked \"preferred\" found in versions JSON, ignoring.`,\n );\n return;\n }\n const preferredVersion = preferredEntries[0].version;\n const preferredURL = preferredEntries[0].url;\n // if already on preferred version, nothing to do\n const versionsAreComparable = validate(version) && validate(preferredVersion);\n if (versionsAreComparable && compare(version, preferredVersion, \"=\")) {\n console.log(\n \"This is the prefered version of the docs, not showing the warning banner.\",\n );\n return;\n }\n // check if banner has been dismissed recently\n const dismiss_date_str = JSON.parse(\n localStorage.getItem(\"pst_banner_pref\") || \"{}\",\n )[version];\n if (dismiss_date_str != null) {\n const dismiss_date = new Date(dismiss_date_str);\n const now = new Date();\n const milliseconds_in_a_day = 24 * 60 * 60 * 1000;\n const days_passed = (now - dismiss_date) / milliseconds_in_a_day;\n const timeout_in_days = 14;\n if (days_passed < timeout_in_days) {\n console.info(\n `[PST] Suppressing version warning banner; was dismissed ${Math.floor(days_passed)} day(s) ago`,\n );\n return;\n }\n }\n\n // now construct the warning banner\n const banner = document.querySelector(\"#bd-header-version-warning\");\n const middle = document.createElement(\"div\");\n const inner = document.createElement(\"div\");\n const bold = document.createElement(\"strong\");\n const button = document.createElement(\"a\");\n const close_btn = document.createElement(\"a\");\n // these classes exist since pydata-sphinx-theme v0.10.0\n // the init class is used for animation\n middle.classList = \"bd-header-announcement__content ms-auto me-auto\";\n inner.classList = \"sidebar-message\";\n button.classList =\n \"btn text-wrap font-weight-bold ms-3 my-1 align-baseline pst-button-link-to-stable-version\";\n button.href = `${preferredURL}${getCurrentUrlPath()}`;\n button.innerText = \"Switch to stable version\";\n button.onclick = checkPageExistsAndRedirect;\n close_btn.classList = \"ms-3 my-1 align-baseline\";\n const close_x = document.createElement(\"i\");\n close_btn.append(close_x);\n close_x.classList = \"fa-solid fa-xmark\";\n close_btn.onclick = DismissBannerAndStorePref;\n // add the version-dependent text\n inner.innerText = \"This is documentation for \";\n const isDev =\n version.includes(\"dev\") ||\n version.includes(\"rc\") ||\n version.includes(\"pre\");\n const newerThanPreferred =\n versionsAreComparable && compare(version, preferredVersion, \">\");\n if (isDev || newerThanPreferred) {\n bold.innerText = \"an unstable development version\";\n } else if (versionsAreComparable && compare(version, preferredVersion, \"<\")) {\n bold.innerText = `an old version (${version})`;\n } else if (!version) {\n bold.innerText = \"an unknown version\"; // e.g., an empty string\n } else {\n bold.innerText = `version ${version}`;\n }\n banner.appendChild(middle);\n banner.append(close_btn);\n middle.appendChild(inner);\n inner.appendChild(bold);\n inner.appendChild(document.createTextNode(\".\"));\n inner.appendChild(button);\n banner.classList.remove(\"d-none\");\n}\n\n/*******************************************************************************\n * MutationObserver to move the ReadTheDocs button\n */\n\n/**\n * intercept the RTD flyout and place it in the rtd-footer-container if existing\n * if not it stays where on top of the page\n */\nfunction initRTDObserver() {\n const mutatedCallback = (mutationList, observer) => {\n mutationList.forEach((mutation) => {\n // Check whether the mutation is for RTD, which will have a specific structure\n if (mutation.addedNodes.length === 0) {\n return;\n }\n if (mutation.addedNodes[0].data === undefined) {\n return;\n }\n if (mutation.addedNodes[0].data.search(\"Inserted RTD Footer\") != -1) {\n mutation.addedNodes.forEach((node) => {\n document.getElementById(\"rtd-footer-container\").append(node);\n });\n }\n });\n };\n\n const observer = new MutationObserver(mutatedCallback);\n const config = { childList: true };\n observer.observe(document.body, config);\n}\n\nasync function fetchAndUseVersions() {\n // fetch the JSON version data (only once), then use it to populate the version\n // switcher and maybe show the version warning bar\n var versionSwitcherBtns = document.querySelectorAll(\n \".version-switcher__button\",\n );\n const hasSwitcherMenu = versionSwitcherBtns.length > 0;\n const hasVersionsJSON = DOCUMENTATION_OPTIONS.hasOwnProperty(\n \"theme_switcher_json_url\",\n );\n const wantsWarningBanner = DOCUMENTATION_OPTIONS.show_version_warning_banner;\n\n if (hasVersionsJSON && (hasSwitcherMenu || wantsWarningBanner)) {\n const data = await fetchVersionSwitcherJSON(\n DOCUMENTATION_OPTIONS.theme_switcher_json_url,\n );\n // TODO: remove the `if(data)` once the `return null` is fixed within fetchVersionSwitcherJSON.\n // We don't really want the switcher and warning bar to silently not work.\n if (data) {\n populateVersionSwitcher(data, versionSwitcherBtns);\n if (wantsWarningBanner) {\n showVersionWarningBanner(data);\n }\n }\n }\n}\n\n/*******************************************************************************\n * Add keyboard functionality to mobile sidebars.\n *\n * Wire up the hamburger-style buttons using the click event which (on buttons)\n * handles both mouse clicks and the space and enter keys.\n */\nfunction setupMobileSidebarKeyboardHandlers() {\n // These are hidden checkboxes at the top of the page whose :checked property\n // allows the mobile sidebars to be hidden or revealed via CSS.\n const primaryToggle = document.getElementById(\"pst-primary-sidebar-checkbox\");\n const secondaryToggle = document.getElementById(\n \"pst-secondary-sidebar-checkbox\",\n );\n const primarySidebar = document.querySelector(\".bd-sidebar-primary\");\n const secondarySidebar = document.querySelector(\".bd-sidebar-secondary\");\n\n // Toggle buttons -\n //\n // These are the hamburger-style buttons in the header nav bar. When the user\n // clicks, the button transmits the click to the hidden checkboxes used by the\n // CSS to control whether the sidebar is open or closed.\n const primaryClickTransmitter = document.querySelector(\".primary-toggle\");\n const secondaryClickTransmitter = document.querySelector(\".secondary-toggle\");\n [\n [primaryClickTransmitter, primaryToggle, primarySidebar],\n [secondaryClickTransmitter, secondaryToggle, secondarySidebar],\n ].forEach(([clickTransmitter, toggle, sidebar]) => {\n if (!clickTransmitter) {\n return;\n }\n clickTransmitter.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n toggle.checked = !toggle.checked;\n\n // If we are opening the sidebar, move focus to the first focusable item\n // in the sidebar\n if (toggle.checked) {\n // Note: this selector is not exhaustive, and we may need to update it\n // in the future\n const tabStop = sidebar.querySelector(\"a, button\");\n // use setTimeout because you cannot move focus synchronously during a\n // click in the handler for the click event\n setTimeout(() => tabStop.focus(), 100);\n }\n });\n });\n\n // Escape key -\n //\n // When sidebar is open, user should be able to press escape key to close the\n // sidebar.\n [\n [primarySidebar, primaryToggle, primaryClickTransmitter],\n [secondarySidebar, secondaryToggle, secondaryClickTransmitter],\n ].forEach(([sidebar, toggle, transmitter]) => {\n if (!sidebar) {\n return;\n }\n sidebar.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n toggle.checked = false;\n transmitter.focus();\n }\n });\n });\n\n // When the link,\n * but for the automatic collapsing we need this on the parent list item.\n *\n * The event is triggered on \"window\" (and not the nav item as documented),\n * see https://github.com/twbs/bootstrap/issues/20086\n */\nfunction addTOCInteractivity() {\n window.addEventListener(\"activate.bs.scrollspy\", function () {\n const navLinks = document.querySelectorAll(\".bd-toc-nav a\");\n\n navLinks.forEach((navLink) => {\n navLink.parentElement.classList.remove(\"active\");\n });\n\n const activeNavLinks = document.querySelectorAll(\".bd-toc-nav a.active\");\n activeNavLinks.forEach((navLink) => {\n navLink.parentElement.classList.add(\"active\");\n });\n });\n}\n\n/*******************************************************************************\n * Scroll\n */\n\n/**\n * Navigation sidebar scrolling to active page\n */\nfunction scrollToActive() {\n // If the docs nav doesn't exist, do nothing (e.g., on search page)\n if (!document.querySelector(\".bd-docs-nav\")) {\n return;\n }\n\n var sidebar = document.querySelector(\"div.bd-sidebar\");\n\n // Remember the sidebar scroll position between page loads\n // Inspired on source of revealjs.com\n let storedScrollTop = parseInt(\n sessionStorage.getItem(\"sidebar-scroll-top\"),\n 10,\n );\n\n if (!isNaN(storedScrollTop)) {\n // If we've got a saved scroll position, just use that\n sidebar.scrollTop = storedScrollTop;\n console.log(\"[PST]: Scrolled sidebar using stored browser position...\");\n } else {\n // Otherwise, calculate a position to scroll to based on the lowest `active` link\n var sidebarNav = document.querySelector(\".bd-docs-nav\");\n var active_pages = sidebarNav.querySelectorAll(\".active\");\n if (active_pages.length > 0) {\n // Use the last active page as the offset since it's the page we're on\n var latest_active = active_pages[active_pages.length - 1];\n var offset =\n latest_active.getBoundingClientRect().y -\n sidebar.getBoundingClientRect().y;\n // Only scroll the navbar if the active link is lower than 50% of the page\n if (latest_active.getBoundingClientRect().y > window.innerHeight * 0.5) {\n let buffer = 0.25; // Buffer so we have some space above the scrolled item\n sidebar.scrollTop = offset - sidebar.clientHeight * buffer;\n console.log(\"[PST]: Scrolled sidebar using last active link...\");\n }\n }\n }\n\n // Store the sidebar scroll position\n window.addEventListener(\"beforeunload\", () => {\n sessionStorage.setItem(\"sidebar-scroll-top\", sidebar.scrollTop);\n });\n}\n\n/*******************************************************************************\n * Search\n */\n\n/**\n * Find any search forms on the page and return their input element\n */\nvar findSearchInput = () => {\n let forms = document.querySelectorAll(\"form.bd-search\");\n if (!forms.length) {\n // no search form found\n return;\n } else {\n var form;\n if (forms.length == 1) {\n // there is exactly one search form (persistent or hidden)\n form = forms[0];\n } else {\n // must be at least one persistent form, use the first persistent one\n form = document.querySelector(\n \"div:not(.search-button__search-container) > form.bd-search\",\n );\n }\n return form.querySelector(\"input\");\n }\n};\n\n/**\n * Activate the search field on the page.\n * - If there is a search field already visible it will be activated.\n * - If not, then a search field will pop up.\n */\nvar toggleSearchField = () => {\n // Find the search input to highlight\n let input = findSearchInput();\n\n // if the input field is the hidden one (the one associated with the\n // search button) then toggle the button state (to show/hide the field)\n let searchPopupWrapper = document.querySelector(\".search-button__wrapper\");\n let hiddenInput = searchPopupWrapper.querySelector(\"input\");\n if (input === hiddenInput) {\n searchPopupWrapper.classList.toggle(\"show\");\n }\n // when toggling off the search field, remove its focus\n if (document.activeElement === input) {\n input.blur();\n } else {\n input.focus();\n input.select();\n input.scrollIntoView({ block: \"center\" });\n }\n};\n\n/**\n * Add an event listener for toggleSearchField() for Ctrl/Cmd + K\n */\nvar addEventListenerForSearchKeyboard = () => {\n window.addEventListener(\n \"keydown\",\n (event) => {\n let input = findSearchInput();\n // toggle on Ctrl+k or ⌘+k\n if (\n // Ignore if shift or alt are pressed\n !event.shiftKey &&\n !event.altKey &&\n // On Mac use ⌘, all other OS use Ctrl\n (useCommandKey\n ? event.metaKey && !event.ctrlKey\n : !event.metaKey && event.ctrlKey) &&\n // Case-insensitive so the shortcut still works with caps lock\n /^k$/i.test(event.key)\n ) {\n event.preventDefault();\n toggleSearchField();\n }\n // also allow Escape key to hide (but not show) the dynamic search field\n else if (document.activeElement === input && /Escape/i.test(event.key)) {\n toggleSearchField();\n }\n },\n true,\n );\n};\n\n/**\n * If the user is on a Mac, use command (⌘) instead of control (ctrl) key\n *\n * Note: `navigator.platform` is deprecated; however MDN still recommends using\n * it for the one specific use case of detecting whether a keyboard shortcut\n * should use control or command:\n * https://developer.mozilla.org/en-US/docs/Web/API/Navigator/platform#examples\n */\nvar useCommandKey =\n navigator.platform.indexOf(\"Mac\") === 0 || navigator.platform === \"iPhone\";\n\n/**\n * Change the search hint to `meta key` if we are a Mac\n */\n\nvar changeSearchShortcutKey = () => {\n let shortcuts = document.querySelectorAll(\".search-button__kbd-shortcut\");\n if (useCommandKey) {\n shortcuts.forEach(\n (f) => (f.querySelector(\"kbd.kbd-shortcut__modifier\").innerText = \"⌘\"),\n );\n }\n};\n\n/**\n * Activate callbacks for search button popup\n */\nvar setupSearchButtons = () => {\n changeSearchShortcutKey();\n addEventListenerForSearchKeyboard();\n\n // Add the search button trigger event callback\n document.querySelectorAll(\".search-button__button\").forEach((btn) => {\n btn.onclick = toggleSearchField;\n });\n\n // Add the search button overlay event callback\n let overlay = document.querySelector(\".search-button__overlay\");\n if (overlay) {\n overlay.onclick = toggleSearchField;\n }\n};\n\n/*******************************************************************************\n * Version Switcher\n * Note that this depends on two variables existing that are defined in\n * and `html-page-context` hook:\n *\n * - DOCUMENTATION_OPTIONS.pagename\n * - DOCUMENTATION_OPTIONS.theme_switcher_url\n */\n\n/**\n * path component of URL\n */\nvar getCurrentUrlPath = () => {\n if (DOCUMENTATION_OPTIONS.BUILDER == \"dirhtml\") {\n return DOCUMENTATION_OPTIONS.pagename == \"index\"\n ? `/`\n : `${DOCUMENTATION_OPTIONS.pagename}/`;\n }\n return `${DOCUMENTATION_OPTIONS.pagename}.html`;\n};\n\n/**\n * Allow user to dismiss the warning banner about the docs version being dev / old.\n * We store the dismissal date and version, to give us flexibility about making the\n * dismissal last for longer than one browser session, if we decide to do that.\n *\n * @param {event} event the event that trigger the check\n */\nasync function DismissBannerAndStorePref(event) {\n const banner = document.querySelector(\"#bd-header-version-warning\");\n banner.remove();\n const version = DOCUMENTATION_OPTIONS.VERSION;\n const now = new Date();\n const banner_pref = JSON.parse(\n localStorage.getItem(\"pst_banner_pref\") || \"{}\",\n );\n console.debug(\n `[PST] Dismissing the version warning banner on ${version} starting ${now}.`,\n );\n banner_pref[version] = now;\n localStorage.setItem(\"pst_banner_pref\", JSON.stringify(banner_pref));\n}\n\n/**\n * Check if corresponding page path exists in other version of docs\n * and, if so, go there instead of the homepage of the other docs version\n *\n * @param {event} event the event that trigger the check\n */\nasync function checkPageExistsAndRedirect(event) {\n // ensure we don't follow the initial link\n event.preventDefault();\n const currentFilePath = getCurrentUrlPath();\n let tryUrl = event.currentTarget.getAttribute(\"href\");\n let otherDocsHomepage = tryUrl.replace(currentFilePath, \"\");\n try {\n let head = await fetch(tryUrl, { method: \"HEAD\" });\n if (head.ok) {\n location.href = tryUrl; // the page exists, go there\n } else {\n location.href = otherDocsHomepage;\n }\n } catch (err) {\n // something went wrong, probably CORS restriction, fallback to other docs homepage\n location.href = otherDocsHomepage;\n }\n}\n\n/**\n * Load and parse the version switcher JSON file from an absolute or relative URL.\n *\n * @param {string} url The URL to load version switcher entries from.\n */\nasync function fetchVersionSwitcherJSON(url) {\n // first check if it's a valid URL\n try {\n var result = new URL(url);\n } catch (err) {\n if (err instanceof TypeError) {\n if (!window.location.origin) {\n // window.location.origin is null for local static sites\n // (ie. window.location.protocol == 'file:')\n //\n // TODO: Fix this to return the static version switcher by working out\n // how to get the correct path to the switcher JSON file on local static builds\n return null;\n }\n // assume we got a relative path, and fix accordingly. But first, we need to\n // use `fetch()` to follow redirects so we get the correct final base URL\n const origin = await fetch(window.location.origin, { method: \"HEAD\" });\n result = new URL(url, origin.url);\n } else {\n // something unexpected happened\n throw err;\n }\n }\n // load and return the JSON\n const response = await fetch(result);\n const data = await response.json();\n return data;\n}\n\n// Populate the version switcher from the JSON data\nfunction populateVersionSwitcher(data, versionSwitcherBtns) {\n const currentFilePath = getCurrentUrlPath();\n versionSwitcherBtns.forEach((btn) => {\n // Set empty strings by default so that these attributes exist and can be used in CSS selectors\n btn.dataset[\"activeVersionName\"] = \"\";\n btn.dataset[\"activeVersion\"] = \"\";\n });\n // in case there are multiple entries with the same version string, this helps us\n // decide which entry's `name` to put on the button itself. Without this, it would\n // always be the *last* version-matching entry; now it will be either the\n // version-matching entry that is also marked as `\"preferred\": true`, or if that\n // doesn't exist: the *first* version-matching entry.\n data = data.map((entry) => {\n // does this entry match the version that we're currently building/viewing?\n entry.match =\n entry.version == DOCUMENTATION_OPTIONS.theme_switcher_version_match;\n entry.preferred = entry.preferred || false;\n // if no custom name specified (e.g., \"latest\"), use version string\n if (!(\"name\" in entry)) {\n entry.name = entry.version;\n }\n return entry;\n });\n const hasMatchingPreferredEntry = data\n .map((entry) => entry.preferred && entry.match)\n .some(Boolean);\n var foundMatch = false;\n // create links to the corresponding page in the other docs versions\n data.forEach((entry) => {\n // create the node\n const anchor = document.createElement(\"a\");\n anchor.setAttribute(\n \"class\",\n \"dropdown-item list-group-item list-group-item-action py-1\",\n );\n anchor.setAttribute(\"href\", `${entry.url}${currentFilePath}`);\n anchor.setAttribute(\"role\", \"option\");\n const span = document.createElement(\"span\");\n span.textContent = `${entry.name}`;\n anchor.appendChild(span);\n // Add dataset values for the version and name in case people want\n // to apply CSS styling based on this information.\n anchor.dataset[\"versionName\"] = entry.name;\n anchor.dataset[\"version\"] = entry.version;\n // replace dropdown button text with the preferred display name of the\n // currently-viewed version, rather than using sphinx's {{ version }} variable.\n // also highlight the dropdown entry for the currently-viewed version's entry\n let matchesAndIsPreferred = hasMatchingPreferredEntry && entry.preferred;\n let matchesAndIsFirst =\n !hasMatchingPreferredEntry && !foundMatch && entry.match;\n if (matchesAndIsPreferred || matchesAndIsFirst) {\n anchor.classList.add(\"active\");\n versionSwitcherBtns.forEach((btn) => {\n btn.innerText = entry.name;\n btn.dataset[\"activeVersionName\"] = entry.name;\n btn.dataset[\"activeVersion\"] = entry.version;\n });\n foundMatch = true;\n }\n // There may be multiple version-switcher elements, e.g. one\n // in a slide-over panel displayed on smaller screens.\n document.querySelectorAll(\".version-switcher__menu\").forEach((menu) => {\n // we need to clone the node for each menu, but onclick attributes are not\n // preserved by `.cloneNode()` so we add onclick here after cloning.\n let node = anchor.cloneNode(true);\n node.onclick = checkPageExistsAndRedirect;\n // on click, AJAX calls will check if the linked page exists before\n // trying to redirect, and if not, will redirect to the homepage\n // for that version of the docs.\n menu.append(node);\n });\n });\n}\n\n/*******************************************************************************\n * Warning banner when viewing non-stable version of the docs.\n */\n\n/**\n * Show a warning banner when viewing a non-stable version of the docs.\n *\n * adapted 2023-06 from https://mne.tools/versionwarning.js, which was\n * originally adapted 2020-05 from https://scikit-learn.org/versionwarning.js\n *\n * @param {Array} data The version data used to populate the switcher menu.\n */\nfunction showVersionWarningBanner(data) {\n var version = DOCUMENTATION_OPTIONS.VERSION;\n // figure out what latest stable version is\n var preferredEntries = data.filter((entry) => entry.preferred);\n if (preferredEntries.length !== 1) {\n const howMany = preferredEntries.length == 0 ? \"No\" : \"Multiple\";\n console.log(\n `[PST] ${howMany} versions marked \"preferred\" found in versions JSON, ignoring.`,\n );\n return;\n }\n const preferredVersion = preferredEntries[0].version;\n const preferredURL = preferredEntries[0].url;\n // if already on preferred version, nothing to do\n const versionsAreComparable = validate(version) && validate(preferredVersion);\n if (versionsAreComparable && compare(version, preferredVersion, \"=\")) {\n console.log(\n \"This is the prefered version of the docs, not showing the warning banner.\",\n );\n return;\n }\n // check if banner has been dismissed recently\n const dismiss_date_str = JSON.parse(\n localStorage.getItem(\"pst_banner_pref\") || \"{}\",\n )[version];\n if (dismiss_date_str != null) {\n const dismiss_date = new Date(dismiss_date_str);\n const now = new Date();\n const milliseconds_in_a_day = 24 * 60 * 60 * 1000;\n const days_passed = (now - dismiss_date) / milliseconds_in_a_day;\n const timeout_in_days = 14;\n if (days_passed < timeout_in_days) {\n console.info(\n `[PST] Suppressing version warning banner; was dismissed ${Math.floor(days_passed)} day(s) ago`,\n );\n return;\n }\n }\n\n // now construct the warning banner\n const banner = document.querySelector(\"#bd-header-version-warning\");\n const middle = document.createElement(\"div\");\n const inner = document.createElement(\"div\");\n const bold = document.createElement(\"strong\");\n const button = document.createElement(\"a\");\n const close_btn = document.createElement(\"a\");\n // these classes exist since pydata-sphinx-theme v0.10.0\n // the init class is used for animation\n middle.classList = \"bd-header-announcement__content ms-auto me-auto\";\n inner.classList = \"sidebar-message\";\n button.classList =\n \"btn text-wrap font-weight-bold ms-3 my-1 align-baseline pst-button-link-to-stable-version\";\n button.href = `${preferredURL}${getCurrentUrlPath()}`;\n button.innerText = \"Switch to stable version\";\n button.onclick = checkPageExistsAndRedirect;\n close_btn.classList = \"ms-3 my-1 align-baseline\";\n const close_x = document.createElement(\"i\");\n close_btn.append(close_x);\n close_x.classList = \"fa-solid fa-xmark\";\n close_btn.onclick = DismissBannerAndStorePref;\n // add the version-dependent text\n inner.innerText = \"This is documentation for \";\n const isDev =\n version.includes(\"dev\") ||\n version.includes(\"rc\") ||\n version.includes(\"pre\");\n const newerThanPreferred =\n versionsAreComparable && compare(version, preferredVersion, \">\");\n if (isDev || newerThanPreferred) {\n bold.innerText = \"an unstable development version\";\n } else if (versionsAreComparable && compare(version, preferredVersion, \"<\")) {\n bold.innerText = `an old version (${version})`;\n } else if (!version) {\n bold.innerText = \"an unknown version\"; // e.g., an empty string\n } else {\n bold.innerText = `version ${version}`;\n }\n banner.appendChild(middle);\n banner.append(close_btn);\n middle.appendChild(inner);\n inner.appendChild(bold);\n inner.appendChild(document.createTextNode(\".\"));\n inner.appendChild(button);\n banner.classList.remove(\"d-none\");\n}\n\n/*******************************************************************************\n * MutationObserver to move the ReadTheDocs button\n */\n\n/**\n * intercept the RTD flyout and place it in the rtd-footer-container if existing\n * if not it stays where on top of the page\n */\nfunction initRTDObserver() {\n const mutatedCallback = (mutationList, observer) => {\n mutationList.forEach((mutation) => {\n // Check whether the mutation is for RTD, which will have a specific structure\n if (mutation.addedNodes.length === 0) {\n return;\n }\n if (mutation.addedNodes[0].data === undefined) {\n return;\n }\n if (mutation.addedNodes[0].data.search(\"Inserted RTD Footer\") != -1) {\n mutation.addedNodes.forEach((node) => {\n document.getElementById(\"rtd-footer-container\").append(node);\n });\n }\n });\n };\n\n const observer = new MutationObserver(mutatedCallback);\n const config = { childList: true };\n observer.observe(document.body, config);\n}\n\nasync function fetchAndUseVersions() {\n // fetch the JSON version data (only once), then use it to populate the version\n // switcher and maybe show the version warning bar\n var versionSwitcherBtns = document.querySelectorAll(\n \".version-switcher__button\",\n );\n const hasSwitcherMenu = versionSwitcherBtns.length > 0;\n const hasVersionsJSON = DOCUMENTATION_OPTIONS.hasOwnProperty(\n \"theme_switcher_json_url\",\n );\n const wantsWarningBanner = DOCUMENTATION_OPTIONS.show_version_warning_banner;\n\n if (hasVersionsJSON && (hasSwitcherMenu || wantsWarningBanner)) {\n const data = await fetchVersionSwitcherJSON(\n DOCUMENTATION_OPTIONS.theme_switcher_json_url,\n );\n // TODO: remove the `if(data)` once the `return null` is fixed within fetchVersionSwitcherJSON.\n // We don't really want the switcher and warning bar to silently not work.\n if (data) {\n populateVersionSwitcher(data, versionSwitcherBtns);\n if (wantsWarningBanner) {\n showVersionWarningBanner(data);\n }\n }\n }\n}\n\n/*******************************************************************************\n * Add keyboard functionality to mobile sidebars.\n *\n * Wire up the hamburger-style buttons using the click event which (on buttons)\n * handles both mouse clicks and the space and enter keys.\n */\nfunction setupMobileSidebarKeyboardHandlers() {\n // These are hidden checkboxes at the top of the page whose :checked property\n // allows the mobile sidebars to be hidden or revealed via CSS.\n const primaryToggle = document.getElementById(\"pst-primary-sidebar-checkbox\");\n const secondaryToggle = document.getElementById(\n \"pst-secondary-sidebar-checkbox\",\n );\n const primarySidebar = document.querySelector(\".bd-sidebar-primary\");\n const secondarySidebar = document.querySelector(\".bd-sidebar-secondary\");\n\n // Toggle buttons -\n //\n // These are the hamburger-style buttons in the header nav bar. When the user\n // clicks, the button transmits the click to the hidden checkboxes used by the\n // CSS to control whether the sidebar is open or closed.\n const primaryClickTransmitter = document.querySelector(\".primary-toggle\");\n const secondaryClickTransmitter = document.querySelector(\".secondary-toggle\");\n [\n [primaryClickTransmitter, primaryToggle, primarySidebar],\n [secondaryClickTransmitter, secondaryToggle, secondarySidebar],\n ].forEach(([clickTransmitter, toggle, sidebar]) => {\n if (!clickTransmitter) {\n return;\n }\n clickTransmitter.addEventListener(\"click\", (event) => {\n event.preventDefault();\n event.stopPropagation();\n toggle.checked = !toggle.checked;\n\n // If we are opening the sidebar, move focus to the first focusable item\n // in the sidebar\n if (toggle.checked) {\n // Note: this selector is not exhaustive, and we may need to update it\n // in the future\n const tabStop = sidebar.querySelector(\"a, button\");\n // use setTimeout because you cannot move focus synchronously during a\n // click in the handler for the click event\n setTimeout(() => tabStop.focus(), 100);\n }\n });\n });\n\n // Escape key -\n //\n // When sidebar is open, user should be able to press escape key to close the\n // sidebar.\n [\n [primarySidebar, primaryToggle, primaryClickTransmitter],\n [secondarySidebar, secondaryToggle, secondaryClickTransmitter],\n ].forEach(([sidebar, toggle, transmitter]) => {\n if (!sidebar) {\n return;\n }\n sidebar.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n toggle.checked = false;\n transmitter.focus();\n }\n });\n });\n\n // When the tag\n // so let the tag take up more space\n li.toctree-l0.has-children {\n > details {\n > summary {\n position: relative;\n height: auto;\n width: auto;\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n\n .toctree-toggle {\n // Prevent toggle icon from getting squished by summary being a\n // flexbox\n flex: 0 0 auto;\n\n // Make the level 0 chevron icon slightly bigger than descendant\n // levels\n .fa-chevron-down {\n font-size: 1rem;\n }\n }\n }\n }\n }\n }\n\n li.has-children {\n $toctree-toggle-width: 30px;\n\n position: relative;\n\n > .reference,\n .caption {\n margin-right: calc(\n $toctree-toggle-width + $focus-ring-width\n ); // keep clear of the toggle icon\n\n padding-top: 0.25rem; // align caption text with toggle chevron\n }\n\n > details {\n > summary {\n // Remove browser default toggle icon\n list-style: none;\n\n &::-webkit-details-marker {\n display: none;\n }\n\n // The summary element is natively focusable, but delegate the focus state to the toggle icon\n &:focus-visible {\n outline: none;\n\n > .toctree-toggle {\n outline: $focus-ring-outline;\n outline-offset: -$focus-ring-width; // Prevent right side of focus ring from disappearing underneath the sidebar's right edge\n }\n }\n\n // Container for expand/collapse chevron icon\n .toctree-toggle {\n cursor: pointer;\n\n // Position it so that it's aligned with the top right corner of the\n // last positioned element, in this case the li.has-children\n position: absolute;\n top: 0;\n right: 0;\n\n // Give it dimensions\n width: $toctree-toggle-width;\n height: $toctree-toggle-width; // make it square\n\n // Vertically and horizontally center the icon within the container\n display: inline-flex;\n justify-content: center;\n align-items: center;\n\n .fa-chevron-down {\n font-size: 0.75rem;\n }\n }\n }\n\n // The section is open/expanded, rotate the toggle icon (chevron) so it\n // points up instead of down\n &[open] {\n > summary {\n .fa-chevron-down {\n transform: rotate(180deg);\n }\n }\n }\n }\n }\n}\n\n/* Between-page links and captions */\nnav.bd-links {\n margin-right: -$sidebar-padding-right; // align toctree toggle chevrons with right edge of sidebar and allow text to flow closer to the right edge\n\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n display: block;\n }\n\n ul {\n list-style: none;\n\n // Reduce padding of nested `ul` items a bit\n ul {\n padding: 0 0 0 1rem;\n }\n }\n\n li > a {\n display: block;\n padding: 0.25rem 0.65rem;\n\n @include link-sidebar;\n\n box-shadow: none;\n margin-right: $focus-ring-width; // prevent the right side focus ring from disappearing under the sidebar right edge\n\n &.reference.external {\n &::after {\n font: var(--fa-font-solid);\n content: var(--pst-icon-external-link);\n font-size: 0.75em;\n margin-left: 0.3em;\n }\n }\n }\n\n .current > a {\n @include link-sidebar-current;\n\n background-color: transparent;\n }\n\n // Title\n p.bd-links__title {\n font-size: var(--pst-sidebar-header-font-size);\n font-weight: var(--pst-sidebar-header-font-weight);\n margin-bottom: 0.5rem;\n }\n\n // Toctree captions\n p.caption {\n font-weight: var(--pst-sidebar-header-font-weight);\n position: relative;\n margin-top: 1.25rem;\n margin-bottom: 0.5rem;\n color: var(--pst-color-text-base);\n\n &:first-child {\n margin-top: 0;\n }\n\n font-size: var(--pst-sidebar-font-size-mobile);\n\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n font-size: var(--pst-sidebar-font-size);\n }\n }\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is an invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","/**\n * Secondary sidebar on the right.\n * e.g., in-page table of contents.\n */\n.bd-sidebar-secondary {\n display: flex;\n order: 2;\n flex-shrink: 0;\n flex-direction: column;\n position: sticky;\n top: var(--pst-header-height);\n max-height: calc(100vh - var(--pst-header-height));\n padding: 2rem 1rem 1rem;\n width: var(--pst-sidebar-secondary);\n font-size: var(--pst-sidebar-font-size-mobile);\n\n @include media-breakpoint-up($breakpoint-sidebar-secondary) {\n font-size: var(--pst-sidebar-font-size);\n }\n\n // Color and border\n background-color: var(--pst-color-background);\n overflow-y: auto;\n}\n\n.sidebar-secondary-item {\n padding: 0.5rem;\n\n @include media-breakpoint-up($breakpoint-sidebar-secondary) {\n border-left: 1px solid var(--pst-color-border);\n padding-left: 1rem;\n }\n\n i {\n padding-right: 0.5rem;\n }\n}\n","/*******************************************************************************\n* Rules for the UX/UI of sidebar sliding drawers on mobile\n* Note that this sheet controls styles across many parts of the theme\n* It is aggregated into this one sheet instead of being split across\n* components in order to keep it easier to debug in one place.\n* It is broken up into major sections below.\n*/\n\n/*******************************************************************************\n* Buttons and overlays\n*/\ninput.sidebar-toggle {\n display: none;\n}\n\n// Background overlays\nlabel.overlay {\n background-color: black;\n opacity: 0.5;\n height: 0;\n width: 0;\n position: fixed;\n top: 0;\n left: 0;\n transition: opacity $animation-time ease-out;\n z-index: $zindex-modal-backdrop;\n}\n\ninput {\n // Show the correct overlay when its input is checked\n &#pst-primary-sidebar-checkbox:checked + label.overlay.overlay-primary,\n &#pst-secondary-sidebar-checkbox:checked + label.overlay.overlay-secondary {\n height: 100vh;\n width: 100vw;\n }\n\n // Primary sidebar slides in from the left\n &#pst-primary-sidebar-checkbox:checked ~ .bd-container .bd-sidebar-primary {\n visibility: visible;\n margin-left: 0;\n }\n\n // Secondary sidebar slides in from the right\n &#pst-secondary-sidebar-checkbox:checked\n ~ .bd-container\n .bd-sidebar-secondary {\n visibility: visible;\n margin-right: 0;\n }\n}\n\n/*******************************************************************************\n* Sidebar drawer behavior\n*/\n\n/**\n * Behavior for sliding drawer elements that will be toggled with an input\n *\n * NOTE: We use this mixin to define the toggle behavior on narrow screens,\n * And the wide-screen behavior of the sections is defined in their own section\n * .scss files.\n */\n@mixin sliding-drawer($side: \"left\") {\n position: fixed;\n top: 0;\n z-index: $zindex-modal;\n height: 100vh;\n max-height: 100vh;\n width: 75%;\n flex-grow: 0.75;\n max-width: 350px;\n transition:\n visibility $animation-time ease-out,\n margin $animation-time ease-out;\n visibility: hidden;\n\n @if $side == \"right\" {\n margin-right: -75%;\n right: 0;\n } @else {\n margin-left: -75%;\n left: 0;\n }\n}\n\n// Primary sidebar hides/shows at earlier widths\n@include media-breakpoint-up($breakpoint-sidebar-primary) {\n .sidebar-toggle.primary-toggle {\n display: none;\n }\n\n input#pst-primary-sidebar-checkbox {\n &:checked + label.overlay.overlay-primary {\n height: 0;\n width: 0;\n }\n }\n\n .bd-sidebar-primary {\n margin-left: 0;\n visibility: visible;\n }\n}\n\n.bd-sidebar-primary {\n @include media-breakpoint-down($breakpoint-sidebar-primary) {\n @include sliding-drawer(\"left\");\n }\n}\n\n.bd-sidebar-secondary {\n @include media-breakpoint-down($breakpoint-sidebar-secondary) {\n @include sliding-drawer(\"right\");\n }\n}\n","/**\n * Breadcrumbs for parent pages meant for the article header\n */\nul.bd-breadcrumbs {\n list-style: none;\n padding-left: 0;\n display: flex;\n flex-wrap: wrap;\n\n // Font size slightly smaller to avoid cluttering up space too much\n font-size: 0.8rem;\n\n li.breadcrumb-item {\n display: flex;\n align-items: center;\n\n // Style should look like heavier in-page links\n // keeping visited in the default link colour\n font-weight: bold;\n\n a {\n @include link-style-text;\n }\n\n // Items that aren't the home have a caret to the left\n &:not(.breadcrumb-home)::before {\n font: var(--fa-font-solid);\n font-size: 0.8rem;\n content: var(--pst-breadcrumb-divider);\n color: var(--pst-color-text-muted);\n padding: 0 0.5rem;\n }\n }\n}\n","/**\n * Icon links in the navbar\n */\n\n.navbar-icon-links {\n display: flex;\n flex-flow: row wrap;\n column-gap: 1rem;\n justify-content: space-evenly;\n\n // Remove the padding so that we can define it with flexbox gap above\n li.nav-item a.nav-link {\n padding-left: 0;\n padding-right: 0;\n\n @include icon-navbar-hover;\n\n &:focus {\n color: inherit;\n }\n }\n\n // Spacing and centering\n a span {\n display: flex;\n align-items: center;\n }\n\n // Icons styling\n i {\n &.fa-brands,\n &.fa-regular,\n &.fa-solid {\n vertical-align: middle;\n font-style: normal;\n font-size: var(--pst-font-size-icon);\n }\n\n /* Social media buttons hard-code the brand color */\n &.fa-square-twitter::before {\n color: #55acee;\n }\n\n &.fa-square-gitlab::before {\n color: #548;\n }\n\n &.fa-bitbucket::before {\n color: #0052cc;\n }\n }\n\n // Force images to be icon-sized\n img.icon-link-image {\n height: 1.5em;\n border-radius: 0.2rem;\n }\n\n .fa-pydata {\n stroke: var(--pst-color-background);\n stroke-linejoin: round;\n stroke-width: 0.35;\n }\n}\n","/**\n * Logo in the navbar\n */\n\n.navbar-brand {\n position: relative;\n height: var(--pst-header-height);\n max-height: var(--pst-header-height);\n padding: 0.5rem 0;\n width: auto;\n margin: 0;\n display: flex;\n\n // Ensure that the logo stays the same length while other content shrinks\n flex-shrink: 0;\n align-items: center;\n gap: 0.5rem;\n\n // If there's no logo image, we use a p element w/ the site title\n p {\n color: var(--pst-color-text-base);\n margin-bottom: 0;\n }\n\n // If there's a logo, it'll be in an img block\n img {\n max-width: 100%;\n height: 100%;\n width: auto;\n }\n\n &:hover,\n &:visited:hover {\n @include link-style-hover;\n\n color: var(--pst-color-text-base);\n }\n}\n","/**\n * Navigation text links in the navbar\n */\n.navbar-nav {\n ul {\n display: block;\n list-style: none;\n\n // Reduce padding of nested `ul` items a bit\n ul {\n padding: 0 0 0 1rem;\n }\n }\n\n // Navbar links - do not have an underline by default\n li {\n display: flex;\n flex-direction: column;\n\n a {\n display: flex;\n align-items: center;\n height: 100%;\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n\n @include link-style-text;\n }\n }\n}\n","/**\n * The list of in-page TOC links\n */\n.page-toc {\n .section-nav {\n padding-left: 0;\n border-bottom: none;\n\n ul {\n padding-left: 1rem;\n }\n }\n\n // override bootstrap settings\n .nav-link {\n font-size: var(--pst-sidebar-font-size-mobile);\n\n @include media-breakpoint-up($breakpoint-sidebar-secondary) {\n font-size: var(--pst-sidebar-font-size);\n }\n }\n\n .onthispage {\n color: var(--pst-color-text-base);\n font-weight: var(--pst-sidebar-header-font-weight);\n margin-bottom: 0.5rem;\n }\n}\n","/**\n* Previous / Next navigation buttons\n**/\n.prev-next-area {\n width: 100%;\n\n p {\n color: var(--pst-color-text-muted);\n margin: 0 0.3em;\n line-height: 1.3em;\n }\n\n i {\n font-size: 1.2em;\n }\n\n a {\n // So that buttons align with icons\n display: flex;\n align-items: center;\n border: none;\n padding: 10px;\n max-width: 45%;\n overflow-x: hidden;\n color: var(--pst-color-text-muted);\n text-decoration: none;\n\n p.prev-next-title {\n @include link-style-default;\n\n font-weight: var(--pst-admonition-font-weight-heading);\n font-size: 1.1em;\n }\n\n &:hover,\n &:visited:hover {\n p.prev-next-title {\n @include link-style-hover;\n }\n }\n\n .prev-next-info {\n flex-direction: column;\n margin: 0 0.5em;\n\n .prev-next-subtitle {\n text-transform: capitalize;\n }\n }\n\n &.left-prev {\n float: left;\n }\n\n &.right-next {\n float: right;\n\n div.prev-next-info {\n text-align: right;\n }\n }\n }\n}\n","/**\n * Search field\n **/\n.bd-search {\n position: relative;\n padding-left: 0.5rem;\n gap: 0.5rem;\n background-color: var(--pst-color-background);\n border-radius: $admonition-border-radius;\n border: 1px solid var(--pst-color-border);\n color: var(--pst-color-text-base);\n\n // Background should always be same color regardless of active or not\n &:active {\n background-color: var(--pst-color-background);\n color: var(--pst-color-text-muted);\n }\n\n .icon {\n position: absolute;\n color: var(--pst-color-border);\n left: 25px;\n }\n\n .fa-solid.fa-magnifying-glass {\n position: absolute;\n left: calc((2.5rem - 0.7em) / 2);\n color: var(--pst-color-text-muted);\n }\n\n input {\n // Inner-text of the search bar\n &::placeholder {\n color: var(--pst-color-text-muted);\n }\n\n // Remove the little \"x\" that pops up when you start typing\n &::-webkit-search-cancel-button,\n &::-webkit-search-decoration {\n appearance: none;\n }\n }\n\n // Shows off the keyboard shortcuts for the button\n .search-button__kbd-shortcut {\n display: flex;\n position: absolute;\n right: 0.5rem;\n color: var(--pst-color-border);\n }\n}\n\n.form-control {\n background-color: var(--pst-color-background);\n color: var(--pst-color-text-base);\n\n &:focus,\n &:focus-visible {\n border: none;\n background-color: var(--pst-color-background);\n color: var(--pst-color-text-muted);\n }\n}\n\n/**\n * Search button - located in the navbar\n */\n\n// Search link icon should be a bit bigger since it is separate from icon links\n.search-button {\n display: flex;\n align-items: center;\n align-content: center;\n color: var(--pst-color-text-muted);\n padding: 0;\n border-radius: 0;\n border: none; // Override Bootstrap button border\n font-size: 1rem; // Override Bootstrap button font size\n\n // Override Bootstrap button padding-x. Whitespace in nav bar is controlled\n // via column gap rule on the container.\n padding-left: 0;\n padding-right: 0;\n\n @include icon-navbar-hover;\n\n i {\n font-size: 1.3rem;\n }\n}\n\n// __search-container will only show up when we use the search pop-up bar\n.search-button__search-container,\n.search-button__overlay {\n display: none;\n}\n\n.search-button__wrapper.show {\n .search-button__search-container {\n display: flex;\n\n // Center in middle of screen just underneath header\n position: fixed;\n z-index: $zindex-modal;\n top: 30%;\n left: 50%;\n transform: translate(-50%, -50%);\n right: 1rem;\n margin-top: 0.5rem;\n width: 90%;\n max-width: 800px;\n }\n\n .search-button__overlay {\n display: flex;\n position: fixed;\n z-index: $zindex-modal-backdrop;\n background-color: black;\n opacity: 0.5;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n }\n\n form.bd-search {\n flex-grow: 1;\n padding-top: 0;\n padding-bottom: 0;\n }\n\n // Font and input text a bit bigger\n svg,\n input {\n font-size: var(--pst-font-size-icon);\n }\n}\n\n/**\n * The search button component that looks like a field.\n * Lives at components/search-button-field.html\n */\n.search-button-field {\n $search-button-border-radius: 1.5em;\n\n display: inline-flex;\n align-items: center;\n border: var(--pst-color-border) solid 1px;\n border-radius: $search-button-border-radius;\n color: var(--pst-color-text-muted);\n padding: 0.5em;\n background-color: var(--pst-color-surface);\n\n &:hover {\n box-shadow: 0 0 0 $focus-ring-width var(--pst-color-link-hover);\n }\n\n &:focus-visible {\n border-radius: $search-button-border-radius;\n }\n\n // The keyboard shotcut text\n .search-button__default-text {\n font-size: var(--bs-nav-link-font-size);\n font-weight: var(--bs-nav-link-font-weight);\n margin-right: 0.5em;\n margin-left: 0.5em;\n }\n\n .kbd-shortcut__modifier {\n font-size: 0.75em;\n }\n\n // Ensures that all the text lines up in the middle\n > * {\n align-items: center;\n }\n\n // Only the icon should be visible on narrow screens\n > :not(svg) {\n display: none;\n\n @include media-breakpoint-up(lg) {\n display: flex;\n }\n }\n}\n","/**\n * The 'Hide Search Matches' button.\n * This only shows up when a person lands on a page after clicking a search result.\n * Clicking it removes the highlighting of the search term from the page.\n * We want it to behave like a button.\n */\ndiv#searchbox {\n // Leave `#searchbox` rules empty so that it doesn't show at all when it is empty\n p.highlight-link {\n margin: 1rem 0;\n width: fit-content;\n\n // A bit more margin on wide screens to mimic article behavior\n @include media-breakpoint-up($breakpoint-sidebar-secondary) {\n margin-left: 2rem;\n }\n\n // Put outer shadow on this one so that we can darken the link w/ an inner shadow\n @include box-shadow;\n\n // Style the button to look like a Sphinx Design button\n a {\n border-radius: 0.25rem;\n font-size: 1.25rem;\n padding: 0.75rem;\n background-color: var(--pst-color-primary);\n color: var(--pst-color-primary-text);\n text-decoration: none;\n\n // The box shadow is inset so that it darkens the button on hover\n transition: box-shadow 0.25s ease-out;\n\n &:hover {\n box-shadow: inset 0 0 50px 50px rgb(0 0 0 / 25%);\n }\n\n &::before {\n content: var(--pst-icon-search-minus);\n color: unset;\n font: var(--fa-font-solid);\n margin-right: 0.5rem;\n }\n }\n }\n}\n","/**\n * Light/dark theme switcher\n */\n\n.theme-switch-button {\n color: var(--pst-color-text-muted);\n border-radius: 0;\n border: none; // Override Bootstrap button border\n font-size: 1rem; // Override Bootstrap's button font size\n\n // Override Bootstrap button padding-x. Whitespace in nav bar is controlled\n // via column gap rule on the container.\n padding-left: 0;\n padding-right: 0;\n\n &:hover {\n @include icon-navbar-hover;\n }\n\n span {\n display: none;\n\n &:active {\n text-decoration: none;\n color: var(--pst-color-link-hover);\n }\n\n .fa-lg {\n aspect-ratio: 1 / 1;\n }\n }\n}\n\nhtml[data-mode=\"auto\"] .theme-switch-button span[data-mode=\"auto\"] {\n display: flex;\n}\n\nhtml[data-mode=\"light\"] .theme-switch-button span[data-mode=\"light\"] {\n display: flex;\n}\n\nhtml[data-mode=\"dark\"] .theme-switch-button span[data-mode=\"dark\"] {\n display: flex;\n}\n","button.btn.version-switcher__button {\n border-color: var(--pst-color-border);\n color: var(--pst-color-text-base);\n\n // Add a margin on narrow screens to avoid feeling cramped\n margin-bottom: 1em;\n\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n margin-bottom: unset;\n }\n\n &:hover {\n box-shadow: 0 0 0 $focus-ring-width var(--pst-color-secondary);\n border-color: transparent;\n }\n\n &:active {\n color: var(--pst-color-text-base);\n border-color: var(--pst-color-border);\n }\n\n &:focus-visible {\n border-color: transparent;\n }\n}\n\n.version-switcher__menu {\n border-color: var(--pst-color-border);\n border-radius: var(--bs-dropdown-border-radius);\n\n a.list-group-item {\n background-color: var(--pst-color-on-background);\n color: var(--pst-color-text-base);\n padding: 0.75rem 1.25rem;\n\n &:not(:last-child) {\n border-bottom: 1px solid var(--pst-color-border);\n }\n\n &:hover {\n @include link-style-hover;\n\n background-color: var(--pst-color-surface);\n }\n\n &.active {\n @include link-sidebar-current;\n\n position: relative;\n z-index: 1;\n\n span::before {\n content: \"\";\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: -1;\n left: 0;\n top: 0;\n }\n }\n\n &:focus-visible {\n z-index: 10; // keep focus ring on top (prevent the hover background of the next dropdown item from covering the ring)\n }\n }\n}\n\n// Font behavior on mobile\nbutton.version-switcher__button,\n.version-switcher__menu {\n font-size: 1.1em; // A bit smaller than other menu font\n z-index: $zindex-modal; // higher than the sidebars\n\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n font-size: unset;\n }\n}\n","/* Collapsing of the TOC sidebar while scrolling */\n\n/* Nav: hide second level (shown on .active) */\n\nnav.page-toc {\n // A little extra space before the buttons\n margin-bottom: 1rem;\n}\n\n.bd-toc .nav {\n .nav {\n display: none;\n\n // So we can manually specify a level as visible in the config\n &.visible {\n display: block;\n }\n }\n\n > .active > ul {\n display: block;\n }\n}\n\n// Each entry of the in-page TOC\n.toc-entry {\n display: block;\n\n a > code {\n color: var(--pst-color-text-muted);\n }\n\n a.nav-link {\n display: block;\n padding: 0.125rem 0;\n\n // Padding w/ negative margin so the top TOC item highlight overlaps w/ the TOC border\n padding-left: 1rem;\n margin-left: -1rem;\n\n @include link-sidebar;\n\n &.active {\n @include link-sidebar-current;\n\n background-color: transparent;\n\n &:hover {\n color: var(--pst-color-link-hover);\n }\n }\n\n &:focus-visible {\n border-radius: $focus-ring-radius;\n }\n }\n}\n","div.versionadded,\ndiv.versionchanged,\ndiv.deprecated {\n vertical-align: middle;\n margin: 1.5625em auto;\n padding: 0 0.6rem;\n overflow: hidden;\n\n /* break-inside has replaced page-break-inside and is widely usable since 2019 */\n page-break-inside: avoid;\n break-inside: avoid;\n border-left: 0.2rem solid;\n border-color: var(--pst-color-info);\n border-radius: $admonition-border-radius;\n background-color: var(--pst-color-on-background);\n\n @include box-shadow;\n\n position: relative;\n\n > p {\n margin-bottom: 0.6rem;\n margin-top: 0.6rem;\n }\n}\n\ndiv.versionadded {\n border-color: var(--pst-color-success);\n background-color: var(--pst-color-success-bg);\n}\n\ndiv.versionchanged {\n border-color: var(--pst-color-warning);\n background-color: var(--pst-color-warning-bg);\n}\n\ndiv.deprecated {\n border-color: var(--pst-color-danger);\n background-color: var(--pst-color-danger-bg);\n}\n\nspan.versionmodified {\n font-weight: 600;\n\n &::before {\n margin-right: 0.6rem;\n color: var(--pst-color-info);\n font: var(--fa-font-solid);\n content: var(--pst-icon-versionmodified-default);\n }\n}\n\nspan.versionmodified.added {\n &::before {\n color: var(--pst-color-success);\n content: var(--pst-icon-versionmodified-added);\n }\n}\n\nspan.versionmodified.changed {\n &::before {\n color: var(--pst-color-warning);\n content: var(--pst-icon-versionmodified-changed);\n }\n}\n\nspan.versionmodified.deprecated {\n &::before {\n color: var(--pst-color-danger);\n content: var(--pst-icon-versionmodified-deprecated);\n }\n}\n",".sidebar-indices-items {\n display: flex;\n flex-direction: column;\n border-top: 1px solid var(--pst-color-border);\n\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n border-top: none;\n }\n\n .sidebar-indices-items__title {\n font-weight: var(--pst-sidebar-header-font-weight);\n font-size: var(--pst-sidebar-header-font-size);\n color: var(--pst-color-text-base);\n margin-bottom: 0.5rem;\n }\n\n ul.indices-link {\n margin-right: -1rem;\n list-style: none;\n padding: 0;\n\n li > a {\n display: block;\n padding: 0.25rem 0;\n color: var(--pst-color-text-muted);\n\n &:hover {\n color: var(--pst-color-primary);\n text-decoration: none;\n background-color: transparent;\n }\n }\n }\n}\n",".bd-sidebar-primary div#rtd-footer-container {\n position: sticky;\n bottom: -1rem;\n margin: -1rem; // ignore sidebar padding\n\n .rst-versions.rst-badge {\n position: unset;\n font-size: 0.9em;\n font-family: var(--pst-font-family-base);\n max-width: unset;\n\n .rst-current-version {\n display: flex;\n align-items: center;\n gap: 0.2rem;\n height: 2.5rem;\n transition: background-color 0.2s ease-out;\n background-color: var(--pst-color-background);\n color: var(--pst-color-success);\n border-top: 1px solid var(--pst-color-border);\n }\n\n .fa.fa-book {\n color: var(--pst-color-text-muted);\n margin-right: auto;\n\n &::after {\n color: var(--pst-color-text-base);\n content: \"Read The Docs\";\n font-family: var(--pst-font-family-base);\n font-weight: var(--pst-admonition-font-weight-heading);\n }\n }\n\n .fa.fa-caret-down {\n color: var(--pst-color-text-muted);\n }\n }\n\n .rst-versions.rst-badge.shift-up {\n .rst-current-version {\n border-bottom: 1px solid var(--pst-color-border);\n }\n }\n\n .rst-other-versions {\n background-color: var(--pst-color-surface);\n color: var(--pst-color-text-base);\n\n dl {\n dd a {\n color: var(--pst-color-text-muted);\n }\n }\n\n hr {\n background-color: var(--pst-color-border);\n }\n\n small a {\n color: var(--pst-color-link);\n }\n\n input {\n padding-left: 0.5rem;\n border: 1px solid var(--pst-color-border);\n background-color: var(--pst-color-surface);\n }\n }\n}\n","/**\n * Admonitions and blocks of styled content.\n * Admonitions CSS originally inspired by https://squidfunk.github.io/mkdocs-material/getting-started/\n */\n$admonition-border-radius: 0.25rem;\n$admonition-left-border-width: 0.2rem;\n\ndiv.admonition,\n.admonition {\n margin: 1.5625em auto;\n padding: 0 0.6rem 0.8rem;\n overflow: hidden;\n\n /* break-inside has replaced page-break-inside and is widely usable since 2019 */\n page-break-inside: avoid;\n break-inside: avoid;\n border-left: $admonition-left-border-width solid;\n border-color: var(--pst-color-info);\n border-radius: $admonition-border-radius;\n background-color: var(--pst-color-on-background);\n\n @include box-shadow;\n\n // Last item should have no spacing since we'll control that w/ padding\n *:last-child {\n margin-bottom: 0;\n }\n\n // Items after the title should be indented\n p.admonition-title ~ * {\n margin-left: 1.4rem;\n margin-right: 1.4rem;\n }\n\n // Lists need to have left margin so they don't spill into it\n > ol,\n > ul {\n margin-left: 1em;\n }\n\n // Defaults for all admonitions\n > .admonition-title {\n margin: 0 -0.6rem;\n padding: 0.4rem 0.6rem 0.4rem 2rem;\n font-weight: var(--pst-admonition-font-weight-heading);\n position: relative;\n\n @include legacy-backdrop-placeholder;\n\n background-color: var(--pst-color-info-bg);\n\n // now that we use solid colors we want the title on top\n z-index: 1;\n\n &::after {\n position: absolute;\n left: 0.5rem;\n width: 1rem;\n height: 1rem;\n color: var(--pst-color-info);\n font: var(--fa-font-solid);\n line-height: inherit;\n content: var(--pst-icon-admonition-default);\n opacity: 1;\n }\n\n // Next element after title needs some extra upper-space\n + * {\n margin-top: 0.4em;\n }\n }\n\n &.attention {\n border-color: var(--pst-color-attention);\n\n > .admonition-title {\n background-color: var(--pst-color-attention-bg);\n\n &::after {\n color: var(--pst-color-attention);\n content: var(--pst-icon-admonition-attention);\n }\n }\n }\n\n &.caution {\n border-color: var(--pst-color-warning);\n\n > .admonition-title {\n background-color: var(--pst-color-warning-bg);\n\n &::after {\n color: var(--pst-color-warning);\n content: var(--pst-icon-admonition-caution);\n }\n }\n }\n\n &.warning {\n border-color: var(--pst-color-warning);\n\n > .admonition-title {\n background-color: var(--pst-color-warning-bg);\n\n &::after {\n color: var(--pst-color-warning);\n content: var(--pst-icon-admonition-warning);\n }\n }\n }\n\n &.danger {\n border-color: var(--pst-color-danger);\n\n > .admonition-title {\n background-color: var(--pst-color-danger-bg);\n\n &::after {\n color: var(--pst-color-danger);\n content: var(--pst-icon-admonition-danger);\n }\n }\n }\n\n &.error {\n border-color: var(--pst-color-danger);\n\n > .admonition-title {\n background-color: var(--pst-color-danger-bg);\n\n &::after {\n color: var(--pst-color-danger);\n content: var(--pst-icon-admonition-error);\n }\n }\n }\n\n &.hint {\n border-color: var(--pst-color-success);\n\n > .admonition-title {\n background-color: var(--pst-color-success-bg);\n\n &::after {\n color: var(--pst-color-success);\n content: var(--pst-icon-admonition-hint);\n }\n }\n }\n\n &.tip {\n border-color: var(--pst-color-success);\n\n > .admonition-title {\n background-color: var(--pst-color-success-bg);\n\n &::after {\n color: var(--pst-color-success);\n content: var(--pst-icon-admonition-tip);\n }\n }\n }\n\n &.important {\n border-color: var(--pst-color-attention);\n\n > .admonition-title {\n background-color: var(--pst-color-attention-bg);\n\n &::after {\n color: var(--pst-color-attention);\n content: var(--pst-icon-admonition-important);\n }\n }\n }\n\n &.note {\n border-color: var(--pst-color-info);\n\n > .admonition-title {\n background-color: var(--pst-color-info-bg);\n\n &::after {\n color: var(--pst-color-info);\n content: var(--pst-icon-admonition-note);\n }\n }\n }\n\n &.seealso {\n border-color: var(--pst-color-success);\n\n > .admonition-title {\n background-color: var(--pst-color-success-bg);\n\n &::after {\n color: var(--pst-color-success);\n content: var(--pst-icon-admonition-seealso);\n }\n }\n }\n\n &.admonition-todo {\n border-color: var(--pst-color-secondary);\n\n > .admonition-title {\n background-color: var(--pst-color-secondary-bg);\n\n &::after {\n color: var(--pst-color-secondary);\n content: var(--pst-icon-admonition-todo);\n }\n }\n }\n\n /**\n * Special-case for a `sidebar` class that makes the admonition float to\n * the right like the {sidebar} directive.\n */\n &.sidebar {\n max-width: 40%;\n float: right;\n clear: both;\n margin-left: 0.5rem;\n margin-top: 0;\n\n // Undo the .sidebar directive border\n border-width: 0 0 0 $admonition-left-border-width;\n\n // TODO: these semantic-color-names border-color rules might no longer be\n // needed when we drop support for Sphinx 4 / docutils 0.17\n &.attention,\n &.important {\n border-color: var(--pst-color-attention);\n }\n\n &.caution,\n &.warning {\n border-color: var(--pst-color-warning);\n }\n\n &.danger,\n &.error {\n border-color: var(--pst-color-danger);\n }\n\n &.hint,\n &.tip,\n &.seealso {\n border-color: var(--pst-color-success);\n }\n\n &.note,\n &.todo {\n border-color: var(--pst-color-info);\n }\n\n // No inner margin since we have less horizontal space w/ the sidebar\n p.admonition-title ~ * {\n margin-left: 0;\n margin-right: 0;\n }\n }\n}\n\n/**************************************************************\n * Similar content blocks that are not technically admonitions.\n */\n\n/**\n * Topics and the {contents} directive\n */\n// Docutils <= 0.17\ndiv.topic,\ndiv.topic.contents,\n// Docutils >= 0.18\nnav.contents,\naside.topic {\n display: flex;\n flex-direction: column;\n background-color: var(--pst-color-surface);\n border-color: var(--pst-color-border);\n border-radius: $admonition-border-radius;\n padding: 1rem 1.25rem;\n\n @include box-shadow;\n\n .topic-title {\n margin: 0 0 0.5rem;\n }\n\n // Over-ride text color to ensure enough contrast\n p {\n color: var(--pst-color-on-surface) !important;\n }\n\n // Over-ride large default padding\n ul.simple {\n padding-left: 1rem;\n\n ul {\n // So that sub-lists will have a bit less padding\n padding-left: 2em;\n }\n }\n}\n\n/**\n * Sidebar directive\n */\naside.sidebar {\n border: 1px solid var(--pst-color-border);\n background-color: var(--pst-color-surface);\n border-radius: $admonition-border-radius;\n\n // to match the admonition-styled sidebars:\n margin-left: 0.5rem;\n padding: 0;\n\n > *:last-child {\n padding-bottom: 1rem;\n }\n\n p.sidebar-title {\n position: relative;\n margin-bottom: 0;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n border-bottom: 1px solid var(--pst-color-border);\n font-family: var(--pst-font-family-heading);\n font-weight: var(--pst-admonition-font-weight-heading);\n }\n\n // Add margin to the first non-`.sidebar-title` item\n > *:not(.sidebar-title):first-child,\n > p.sidebar-title + * {\n margin-top: 1rem;\n }\n\n > * {\n padding-left: 1rem;\n padding-right: 1rem;\n }\n}\n\n/**\n * Rubrics look kind of like section headers\n */\np.rubric {\n display: flex;\n flex-direction: column;\n}\n\n/**\n * Seealso is kind of like a vertically-collapsed admonition\n */\n.seealso dd {\n margin-top: 0;\n margin-bottom: 0;\n}\n","/**\n * Miscellaneous color functions and mixins\n**/\n\n@use \"sass:list\";\n@use \"sass:map\";\n@use \"sass:meta\";\n@use \"sass:math\";\n@use \"sass:string\";\n\n// We must add ::before pseudo-element to some theme components (such as admonitions)\n// because users were instructed to customize the background color this way.\n@mixin legacy-backdrop-placeholder {\n &::before {\n content: \"\";\n width: 100%;\n height: 100%;\n position: absolute;\n left: 0;\n top: 0;\n z-index: -1;\n\n // So that hovering over the text within background is still possible.\n // Otherwise the background overlays the text and you cannot click or select easily.\n // ref: https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events\n pointer-events: none;\n }\n}\n\n/**\n* Function to get items from nested maps\n*/\n// @param {Map} $map - Map\n// @param {Arglist} $keys - Keys to fetc\n// @return {*}\n@function map-deep-get($map, $keys...) {\n @each $key in $keys {\n $map: map.get($map, $key);\n }\n\n @return $map;\n}\n\n/**\n * Function to check if the color needs converting to a \"color\" type\n * if it is a string we cannot use other color manipulation functions\n * It is used to create the sphinx-design colours as these are often interpolated\n */\n// @param {String/Color} $color - Color definition from map\n// @return {Color} - Color type (in hex)\n@function check-color($color) {\n @if meta.type-of($color) == string {\n $color: from-hex($color);\n }\n\n @return $color;\n}\n\n/**\n * Function to convert the string representation of a color to a color type (hex)\n */\n// @param {String} $string - String representation of a color\n@function from-hex($string) {\n $string-lower: string.to-lower-case($string);\n $r: \"\";\n $g: \"\";\n $b: \"\";\n $hex: \"0\" \"1\" \"2\" \"3\" \"4\" \"5\" \"6\" \"7\" \"8\" \"9\" \"a\" \"b\" \"c\" \"d\" \"e\" \"f\";\n $length: string.length($string);\n $max: if($length == 4, 1, 2);\n\n // Check for length accuracy\n @if $length != 4 and $length != 7 {\n @return $string;\n }\n\n // Loop from the second character (omitting #)\n @for $i from 2 through $length {\n $c: string.slice($string-lower, $i, $i);\n\n // If wrong character, return\n @if not list.index($hex, $c) {\n @return $string;\n }\n\n @if string.length($r) < $max {\n $r: $r + $c;\n } @else if string.length($g) < $max {\n $g: $g + $c;\n } @else if string.length($b) < $max {\n $b: $b + $c;\n }\n }\n\n @if $length == 4 {\n $r: $r + $r;\n $g: $g + $g;\n $b: $b + $b;\n }\n\n @return rgb(hex-to-dec($r), hex-to-dec($g), hex-to-dec($b));\n}\n\n@function hex-to-dec($string) {\n $hex: \"0\" \"1\" \"2\" \"3\" \"4\" \"5\" \"6\" \"7\" \"8\" \"9\" \"a\" \"b\" \"c\" \"d\" \"e\" \"f\";\n $string: string.to-lower-case($string);\n $length: string.length($string);\n $dec: 0;\n\n @for $i from 1 through $length {\n $factor: 1 + (15 * ($length - $i));\n $index: list.index($hex, string.slice($string, $i, $i));\n $dec: $dec + $factor * ($index - 1);\n }\n\n @return $dec;\n}\n","// Style API docs from sphinx' autodoc / autosummary\n\n/*******************************************************************************\n* Styling for field lists\n*/\n\n/* grey highlighting of 'parameter' and 'returns' field */\ntable.field-list {\n border-collapse: separate;\n border-spacing: 10px;\n margin-left: 1px;\n\n th.field-name {\n padding: 1px 8px 1px 5px;\n white-space: nowrap;\n background-color: var(--pst-color-surface);\n }\n\n /* italic font for parameter types */\n td.field-body {\n p {\n font-style: italic;\n\n > strong {\n font-style: normal;\n }\n }\n\n /* reduced space around parameter description */\n blockquote {\n border-left: none;\n margin: 0 0 0.3em;\n padding-left: 30px;\n }\n }\n}\n\n/*******************************************************************************\n* Styling for autosummary tables\n*/\n\n.table.autosummary {\n // The first column (with the signature) should not wrap\n td:first-child {\n white-space: nowrap;\n }\n}\n\n/* overriding basic.css to use our own monospace font */\n.sig {\n font-family: var(--pst-font-family-monospace);\n}\n\n/* C++ specific styling - overriding the basic.css to avoid custom colors */\n\n.sig-inline.c-texpr,\n.sig-inline.cpp-texpr {\n font-family: unset;\n}\n\n.sig.c .k,\n.sig.c .kt,\n.sig.cpp .k,\n.sig.cpp .kt {\n color: var(--pst-color-text-base);\n}\n\n.sig.c .m,\n.sig.cpp .m {\n color: var(--pst-color-text-base);\n}\n\n.sig.c .s,\n.sig.c .sc,\n.sig.cpp .s,\n.sig.cpp .sc {\n color: var(--pst-color-text-base);\n}\n\n// addition\n\n// .sig.c .sig-name .n,\n// .sig.cpp .sig-name .n {\n// color: var(--pst-color-inline-code);\n// }\n\n.sig-name {\n color: var(--pst-color-inline-code);\n}\n\n.sig-param .o,\n.sig-param .default_value {\n color: var(--pst-color-text-muted);\n font-weight: normal;\n}\n\n// change target color for dark theme\ndt:target,\nspan.highlighted {\n background-color: var(--pst-color-target);\n}\n\n.viewcode-back {\n font-family: var(--pst-font-family-base);\n}\n\n.viewcode-block:target {\n border-top: 1px solid var(--pst-color-border);\n border-bottom: 1px solid var(--pst-color-border);\n position: relative;\n background-color: var(--pst-color-target);\n}\n\ndl > dt > a:has(.viewcode-link) {\n // Sphinx applies a `float:right` rule to the .viewcode-line span, which\n // exposes a browser glitch in the focus ring. It seems the browser creates\n // two separate boxes, an empty box where the anchor element gets laid out and\n // then another box around the anchor's contents that have been floated right.\n // Firefox draws the focus ring around the empty anchor element box. Chrome\n // draws two focus rings: one around the empty anchor and one around the\n // floated-right element. To fix the glitch, we apply the float rule on the\n // parent rather than the child.\n float: right;\n\n .viewcode-link {\n float: none;\n }\n}\n\n/*******************************************************************************\n* Styling for autosummary titles like \"parameters\" and \"returns\"\n*/\n\n// the API selector\n// from https://github.com/pradyunsg/furo/blob/main/src/furo/assets/styles/content/_api.sass#L6)\ndl[class]:not(.option-list, .field-list, .footnote, .glossary, .simple) {\n // increase margin bottom after the dl elements\n margin-bottom: 3rem;\n\n dd {\n margin-left: 2rem;\n\n // Fix until this will be solved to Sphinx https://github.com/sphinx-doc/sphinx/issues/10815\n & > dl.simple > dt {\n display: flex;\n }\n }\n\n dl.field-list {\n display: grid;\n grid-template-columns: unset;\n }\n\n dt.field-odd,\n dt.field-even {\n margin-top: 0.2rem;\n margin-bottom: 0.1rem;\n background-color: var(--pst-color-surface);\n }\n}\n","/**\n * Code block styling\n * Note that we inherit a lot of styling from Bootstrap so not many rules here.\n */\n\n// General code block behavior\n// Unset bootstrap behavior\ndiv[class*=\"highlight-\"],\ndiv.highlight,\ndiv.literal-block-wrapper {\n display: flex;\n flex-direction: column;\n width: unset;\n border-radius: $admonition-border-radius;\n break-inside: avoid;\n}\n\n// Code blocks with captions\n// There's a wrapper when the code block has a title\ndiv.literal-block-wrapper {\n border: 1px solid var(--pst-color-border);\n border-radius: $admonition-border-radius;\n\n // This is where the title goes\n div.code-block-caption {\n margin: 0;\n border-bottom: 1px solid var(--pst-color-border);\n padding: 0.5rem;\n font-size: 1rem;\n font-weight: var(--pst-font-weight-caption);\n\n a.headerlink {\n font-size: inherit;\n }\n }\n\n // Remove the upper border radius since we want it to connect with the title\n // Remove the box shadow so the wrapper gets the shadow instead\n div[class*=\"highlight-\"] {\n margin: 0;\n border-radius: 0;\n\n pre {\n border: none;\n box-shadow: none;\n }\n }\n}\n\n/**\n * In-line code\n */\ncode.literal {\n padding: 0.1rem 0.25rem;\n background-color: var(--pst-color-surface);\n border: 1px solid var(--pst-color-border);\n border-radius: 0.25rem;\n}\n\na > code {\n color: var(--pst-color-inline-code-links);\n}\n\n// Fix for Sphinx's \"highlight\" directive - this is an issue with our accessible pygments theme\n// and the colour we are using for the background of the code blocks.\nhtml[data-theme=\"light\"] .highlight .nf {\n color: #0078a1 !important;\n}\n\n// Minimum opacity needed for linenos to be WCAG AA conformant\nspan.linenos {\n opacity: 0.8 !important;\n}\n","figure > a,\nfigure > a > img,\nfigure > img,\nfigure > video {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n\nfigure {\n a.headerlink {\n // So that header link doesn't push caption to be off-center.\n position: absolute;\n font-size: inherit;\n }\n\n // Default headerlink hover doesn't trigger on figures\n &:hover a.headerlink {\n visibility: visible;\n }\n\n figcaption {\n font-family: var(--pst-font-family-heading);\n font-weight: var(--pst-font-weight-caption);\n color: var(--pst-color-text-muted);\n margin-left: auto;\n margin-right: auto;\n margin-top: 0.3rem;\n text-align: center;\n\n & > p:last-child {\n // Don't add extra margin to already existing figure bottom margin\n margin-bottom: 0;\n }\n\n p {\n text-align: start;\n display: inline-block;\n }\n\n table.table {\n width: fit-content;\n margin-left: auto;\n margin-right: auto;\n }\n }\n}\n","// For consistency, add bracket around footnotes/citations which are\n// cited more than once. E.g. [Newton](1,2) instead of Newton(1,2)\ndt.label > span.brackets:not(:only-child)::before {\n content: \"[\";\n}\n\ndt.label > span.brackets:not(:only-child)::after {\n content: \"]\";\n}\n\n// Make footnote as a superscript\na.footnote-reference {\n vertical-align: super;\n font-size: small;\n}\n\n// Docutils 0.18 uses an `aside.footnote` container with different internal structure\naside.footnote {\n margin-bottom: 0.5rem;\n\n &:last-child {\n margin-bottom: 1rem;\n }\n\n span.label,\n span.backrefs {\n font-weight: bold;\n }\n\n &:target {\n background-color: var(--pst-color-target);\n }\n}\n","/**\n * Hacky fixes that don't fit cleanly into other sections\n */\n\n// Ensure user highlighting/selecting behaves properly\n// From https://stackoverflow.com/a/34372191\ntable.highlighttable td.linenos,\nspan.linenos,\ndiv.doctest > div.highlight span.gp {\n /* gp: Generic.Prompt */\n user-select: none;\n}\n","// Override bootstrap by restoring the basic theme default.\ndd {\n margin-top: 3px;\n margin-bottom: 10px;\n margin-left: 30px;\n}\n\nol,\nul {\n padding-inline-start: 2rem;\n\n li > p:first-child {\n margin-bottom: 0.25rem;\n margin-top: 0.25rem;\n }\n}\n","// GitHub blockquote style\nblockquote {\n padding: 1em;\n color: var(--pst-color-text-muted);\n border-left: 0.25em solid var(--pst-color-blockquote-notch);\n border-radius: $admonition-border-radius;\n position: relative;\n\n p {\n color: var(--pst-color-text-base);\n }\n\n // remove padding from included line-block to avoid duplication\n .line-block {\n margin: 0;\n }\n\n // remove margin bottom for the last p\n p:last-child {\n margin-bottom: 0;\n }\n\n @include legacy-backdrop-placeholder;\n\n background-color: var(--pst-color-surface);\n\n // Ensure there is enough contrast against the background\n a {\n color: var(--pst-color-inline-code-links);\n }\n\n // hack to make the text in the blockquote selectable\n &::before {\n z-index: -1;\n }\n}\n","/**\n * Span-level styling within content\n */\n\nspan.guilabel {\n border: 1px solid var(--pst-color-info);\n font-size: 80%;\n font-weight: 700;\n border-radius: 4px;\n padding: 2.4px 6px;\n margin: auto 2px;\n position: relative;\n\n @include legacy-backdrop-placeholder;\n\n background-color: var(--pst-color-info-bg);\n}\n\na.reference.download::before {\n content: var(--pst-icon-download);\n font: var(--fa-font-solid);\n font-size: 0.8em;\n padding: 0 0.25em;\n color: var(--pst-color-text-muted);\n}\n","/**\n * Tables\n */\n\n// ensure table will fit in the article width and make them y-scrollable\ntable {\n @include table-colors;\n\n // default to table-center\n margin-left: auto;\n margin-right: auto;\n\n &.table-right {\n margin-right: 0;\n }\n\n &.table-left {\n margin-left: 0;\n }\n}\n\n// customize table caption from bootstrap\n// to display them on top and centered\ntable caption {\n text-align: center;\n caption-side: top;\n color: var(--pst-color-text-muted);\n}\n\n// MyST Markdown tables use these classes to control alignment\nth,\ntd {\n &.text-left {\n text-align: left;\n }\n\n &.text-right {\n text-align: right;\n }\n\n &.text-center {\n text-align: center;\n }\n}\n\n// override bootstrap table colors\n.table {\n @include table-colors;\n\n --bs-table-bg: transparent; // background\n --bs-table-color: var(\n --pst-color-text-base\n ); // ensure text and bullets are visible\n}\n\n.pst-scrollable-table-container {\n // Put a horizontal scrollbar just below tables that are too wide to fit\n // within the main column\n overflow-x: auto;\n}\n","/**\n * Style the toctree component in pages (avoid modifying the navbars)\n */\n.toctree-wrapper {\n p.caption {\n font-size: 1.5em;\n margin-bottom: 0;\n }\n\n & > ul {\n padding-left: 0;\n }\n\n li[class^=\"toctree-l\"] {\n list-style: none;\n margin-bottom: 0.2em;\n\n & > a {\n list-style: none;\n font-size: 1.1em;\n }\n\n & > ul {\n list-style: none;\n padding-inline-start: 1.5em;\n }\n }\n\n // slightly bigger font for l1\n .toctree-l1 > a {\n font-size: 1.3em;\n }\n}\n\ndiv.topic.contents, // Docutils <= 0.17\nnav.contents // Docutils >= 0.18\n{\n // Style similarly to toctree\n ul.simple {\n list-style: none;\n padding-left: 0;\n }\n}\n","/**\n * Mathematics via MathJax.\n *\n * This is designed for MathJax v3\n * ref: https://www.sphinx-doc.org/en/master/usage/extensions/math.html#module-sphinx.ext.mathjax\n */\n\n// Applies to all math elements\nspan.math,\ndiv.math {\n align-items: center;\n display: flex;\n max-width: 100%;\n\n // This will be over-ridden for the y-direction and divs\n overflow: hidden;\n}\n\n// Inline-only\nspan.math {\n display: inline-flex;\n}\n\n// Block-level only\ndiv.math {\n gap: 0.5em;\n\n // So that the eqno shows up after the equation\n flex-direction: row-reverse;\n\n // The equation number / link\n span.eqno a.headerlink {\n position: relative;\n font-size: 1em;\n }\n\n // The math container\n mjx-container {\n flex-grow: 1;\n padding-bottom: 0.2rem;\n overflow: auto;\n\n // Set height to 0 so that it does not cause scrollbars to appear\n // ref: https://github.com/mathjax/MathJax/issues/2521\n mjx-assistive-mml {\n height: 0;\n }\n }\n}\n","/**\n * ABlog\n * ref: https://ablog.readthedocs.io/\n */\n\n/**\n * Sidebar template components\n */\n.ablog-sidebar-item {\n h2,\n h3 {\n font-size: var(--pst-sidebar-header-font-size);\n\n // Remove unnecessary vertical whitespace\n margin-top: 0.5rem;\n\n // The headers are all links, but this makes them hard to parse\n // So we change the colors to make them look like headers\n a {\n color: var(--pst-color-text-base);\n }\n }\n\n ul {\n // No bullet points for the primary sidebar items\n list-style: none;\n padding-left: 0;\n\n // Otherwise a scrollbar randomly shows up\n overflow-y: hidden;\n\n // List of recent post items\n display: flex;\n flex-direction: column;\n gap: 0.5em;\n margin-bottom: 0;\n\n // The ablog cloud should move horizontally\n &.ablog-cloud {\n flex-flow: row wrap;\n gap: 0.5rem;\n\n // Vertical-align tag clouds\n li {\n // Center the tag cloud items\n display: flex;\n align-items: center;\n }\n }\n }\n}\n\n/**\n * Previous / next buttons at the bottom\n */\n.ablog__prev-next {\n font-size: 1.2em;\n display: flex;\n padding: 1rem 0;\n\n // The bottom previous / next arrows\n > span {\n // To ensure that the whole thing fits on one line even if there are long titles\n display: flex;\n max-width: 45%;\n\n // Links within each span have the collection of icon + text\n a {\n display: flex;\n align-items: center;\n margin-left: auto;\n gap: 1rem;\n line-height: 1.5rem;\n\n i::before {\n color: var(--pst-color-text-base);\n }\n }\n }\n\n // The first span is for the previous page and aligns to the left\n span.ablog__prev {\n i.fa-arrow-circle-left::before {\n content: var(--pst-icon-angle-left);\n }\n }\n\n // The second span is just an empty space so we remove it because we're\n // positioning with flex\n span.ablog__spacer {\n display: none;\n }\n\n // The third span is aligned to the right\n span.ablog__next {\n margin-left: auto;\n text-align: right;\n\n i.fa-arrow-circle-right::before {\n content: var(--pst-icon-angle-right);\n }\n }\n}\n\n/**\n * {postlist} directive and posts page\n */\n.ablog__collection,\n.postlist {\n padding-left: 0;\n\n .ablog-post {\n list-style: none;\n\n // Post metadata tags (author, links ,etc) should be a bit smaller\n .ablog-archive {\n display: flex;\n flex-flow: row wrap;\n gap: 1rem;\n list-style: none;\n font-size: 0.75rem;\n padding-left: 0;\n }\n\n // Title line should be a bit bigger and bold to stand out\n .ablog-post-title {\n margin-top: 0;\n font-size: 1.25rem;\n\n a {\n font-weight: bold;\n }\n }\n\n // Read more button should be a bit bigger\n .ablog-post-expand {\n margin-bottom: 0.5rem;\n }\n }\n}\n","/**\n * Special cases for Bootstrap functionality\n */\n\n// Bootstrap adds margin to their general container class. However, sphinx/docutils\n// can also generate output with the container class, but in those cases we should\n// not add the margin from bootstrap. Same for max-width.\n.docutils.container {\n padding-left: unset;\n padding-right: unset;\n margin-left: unset;\n margin-right: unset;\n max-width: unset;\n width: unset;\n}\n\n.btn {\n --bs-btn-focus-box-shadow: #{$btn-focus-box-shadow};\n}\n","/**\n * Sphinx Copybutton\n * ref: https://sphinx-copybutton.readthedocs.io/\n */\n\ndiv.highlight button.copybtn {\n // Nicer spacing\n display: flex;\n align-items: center;\n justify-content: center;\n\n // Don't over-ride the success color\n &:not(.success) {\n color: var(--pst-color-muted);\n }\n\n border: none;\n background-color: var(--pst-color-surface);\n\n &:hover {\n &:not(.success) {\n color: var(--pst-color-text);\n background-color: var(--pst-color-shadow);\n }\n }\n\n // Tooltip styling\n &.o-tooltip--left::after {\n color: var(--pst-color-text);\n background-color: var(--pst-color-surface);\n }\n\n &:focus {\n // For keyboard users, make the copy button visible when focussed.\n opacity: 1;\n }\n\n &:focus-visible {\n outline: $focus-ring-outline;\n }\n}\n\ndiv.highlight:has(button.copybtn) {\n // Make sure the code block has enough height for the copy button.\n // Sphinx-copybutton sets 0.3em top offset plus 1.7em height:\n // https://github.com/executablebooks/sphinx-copybutton/blob/master/sphinx_copybutton/_static/copybutton.css\n min-height: 2em;\n}\n","// adapt ethical ad to the theme\n#ethical-ad-placement {\n .ethical-sidebar a,\n .ethical-sidebar a:visited,\n .ethical-sidebar a:hover,\n .ethical-sidebar a:active,\n .ethical-footer a,\n .ethical-footer a:visited,\n .ethical-footer a:hover,\n .ethical-footer a:active {\n color: var(--pst-color-text-base);\n }\n\n .ethical-sidebar,\n .ethical-footer {\n background-color: var(--pst-color-background);\n border: 1px solid var(--pst-color-border);\n border-radius: 5px;\n color: var(--pst-color-text-base);\n font-size: 14px;\n line-height: 20px;\n }\n}\n","/**\n * Styles for various Sphinx execution libraries.\n * For now, where these define output sections, we simply revert their background\n * to be a \"light theme\" background. This ensures that inputs/outputs behave similarly,\n * because the CSS is often controlled by each package.\n * In the future, we might add dark theme support for specific packages.\n */\n\n/******************************************************************************\n * Jupyter Sphinx\n */\n\n.bd-content div.jupyter_container {\n // We don't want borders around the whole container, just around code cells\n border: none;\n background-color: unset;\n box-shadow: none;\n\n // Code cells should have the same style as our other code objects\n div.output,\n div.highlight {\n border-radius: 0.25rem;\n }\n\n div.highlight {\n background-color: var(--pst-color-surface);\n }\n\n // Ensure the style is the same as our code cells. Jupyter Sphinx makes it tiny.\n .cell_input,\n .cell_output {\n border-radius: 0.25rem;\n\n pre {\n padding: 1rem;\n }\n }\n}\n","/**\n * Special-cases for packages in the PyData ecosystem\n */\n\n// xarray output display in bootstrap\n.xr-wrap[hidden] {\n display: block !important;\n}\n\n// ipywidgets\n.jp-OutputArea-output.lm-Widget {\n // override overflow:hidden rule from Lumino (.lm-Widget) to allow scrolling\n overflow: auto;\n}\n","/*******************************************************************************\n * Special-cases for the sphinx-design library, mainly to make it compatible\n * with the dark/light themes of pydata-sphinx-theme.\n *\n * NOTE: sphinx-design uses !important quite liberally, so here we must do the\n * same for our overrides to have any effect.\n */\n@use \"../variables/color\" as pst-color;\n@use \"sass:color\";\n@use \"sass:map\";\n@use \"sass:meta\";\n@use \"sass:string\";\n\n/*******************************************************************************\n * Color and variables\n *\n * This is a list of the semantic color names from sphinx-design (we only\n * need to override variables that sphinx-design has actually defined).\n * https://github.com/executablebooks/sphinx-design/blob/9226a12a/style/_colors.scss#L31-L43\n */\n$sd-semantic-color-names: (\n \"primary\",\n \"secondary\",\n \"success\",\n \"info\",\n \"warning\",\n \"danger\",\n \"light\",\n \"muted\",\n \"dark\",\n \"black\",\n \"white\"\n);\n\n/**\n * Here we create some extra --pst-color-* variables and use\n * them to override the value of the corresponding sphinx-design variables.\n * This is easier than re-writing the sphinx-design rules. Even easier would be\n * directly assigning our values to the --sd-color-* variables, but then our\n * downstream users couldn't override *our* colors and have it affect buttons\n * and badges.\n *\n * First, define the extra keys needed to cover the full range of semantic\n * color names used in sphinx-design, then merge them with the names we\n * already define for our own needs.\n * see https://sphinx-design.readthedocs.io/en/latest/css_variables.html\n */\n$extra-semantic-colors: (\n \"white\": $foundation-white,\n \"light\": (\n light: $foundation-light-gray,\n bg-light: color.scale($foundation-light-gray, $lightness: 30%),\n dark: $foundation-light-gray,\n bg-dark: color.scale($foundation-light-gray, $lightness: -30%),\n ),\n \"muted\": (\n light: $foundation-muted-gray,\n bg-light: color.scale($foundation-muted-gray, $lightness: 30%),\n dark: $foundation-light-gray,\n bg-dark: color.scale($foundation-muted-gray, $lightness: -30%),\n ),\n \"dark\": $foundation-dark-gray,\n \"black\": $foundation-black,\n);\n$all-colors: map.merge($pst-semantic-colors, $extra-semantic-colors);\n\n@mixin create-sd-colors($value, $name) {\n // define the pst variables, so that downstream user overrides will work\n --pst-color-#{$name}: #{$value};\n\n // we are now using a11y-combination to calculate the text color - this is based\n // on the WCAG color contrast guidelines\n --pst-color-#{$name}-text: #{a11y-combination($value)};\n\n // TODO: highlight seems to be used for buttons @trallard to fix on a11y follow-up work\n --pst-color-#{$name}-highlight: #{color.adjust($value, $lightness: -15%)};\n\n // override the sphinx-design variables\n --sd-color-#{$name}: var(--pst-color-#{$name});\n --sd-color-#{$name}-text: var(--pst-color-#{$name}-text);\n\n // TODO: highlight seems to be used for buttons @trallard to fix on a11y follow-up work\n --sd-color-#{$name}-highlight: var(--pst-color-#{$name}-highlight);\n}\n\n// Now we override the --sd-color-* variables.\n@each $mode in (light, dark) {\n html[data-theme=\"#{$mode}\"] {\n // check if this color is defined differently for light/dark\n @each $name in $sd-semantic-color-names {\n $definition: map.get($all-colors, $name);\n\n @if meta.type-of($definition) == map {\n @each $key, $value in $definition {\n @if string.index($key, $mode) {\n // since now we define the bg colours in the semantic colours and not\n // by changing opacity, we need to check if the key contains bg and the\n // correct mode (light/dark)\n @if string.index($key, \"bg\") {\n --sd-color-#{$name}-bg: #{$value};\n\n // create local variable\n $value: check-color($value);\n\n --sd-color-#{$name}-bg-text: #{a11y-combination($value)};\n } @else {\n $value: check-color($value);\n\n @include create-sd-colors($value, $name);\n }\n }\n }\n } @else {\n $value: map.get($all-colors, $name);\n\n @include create-sd-colors($value, $name);\n }\n }\n }\n}\n\n// Make sure the color border variables are set using our variables\n@each $mode in (light, dark) {\n html[data-theme=\"#{$mode}\"] {\n --sd-color-card-border: var(--pst-color-border);\n }\n}\n\n/*******************************************************************************\n * shadows\n */\nhtml[data-theme=\"light\"] {\n .sd-shadow-xs,\n .sd-shadow-sm,\n .sd-shadow-md,\n .sd-shadow-lg {\n @include box-shadow;\n }\n}\n\n/*******************************************************************************\n * cards\n */\n\n.bd-content .sd-card {\n border: 1px solid var(--pst-color-border);\n\n // TODO - --pst-color-panel-background is not defined... where is this coming from?\n .sd-card-header {\n background-color: var(--pst-color-panel-background);\n border-bottom: 1px solid var(--pst-color-border);\n }\n\n .sd-card-footer {\n background-color: var(--pst-color-panel-background);\n border-top: 1px solid var(--pst-color-border);\n }\n\n .sd-card-body {\n background-color: var(--pst-color-panel-background);\n }\n\n // Focus ring for link-cards\n .sd-stretched-link:focus-visible {\n // Don't put the focus ring on the element (it has zero height in Sphinx Design cards)\n outline: none;\n\n // Put the focus ring on the element's ::after pseudo-element\n &::after {\n outline: $focus-ring-outline;\n border-radius: 0.25rem; // copied from Sphinx Design CSS for .sd-card\n }\n }\n\n &.sd-card-hover:hover {\n border-color: var(--pst-color-link-hover);\n }\n}\n\n/*******************************************************************************\n * tabs\n */\n\n.bd-content .sd-tab-set {\n > input {\n // Active tab label\n &:checked + label {\n border-style: solid solid none;\n border-color: var(--pst-color-primary) var(--pst-color-primary)\n transparent; // top LR bottom\n\n border-width: 0.125rem 0.125rem 0;\n border-radius: 0.125rem 0.125rem 0 0;\n background-color: var(--pst-color-on-background);\n transform: translateY(0.125rem);\n color: var(--pst-color-primary);\n }\n\n &:focus-visible + label {\n border: 0.125rem solid var(--pst-color-accent);\n border-radius: 0.125rem;\n background-color: var(--pst-color-accent-bg);\n color: var(--pst-color-on-surface);\n }\n\n // Hover label\n &:not(:checked, :focus-visible) + label:hover {\n border-color: transparent;\n color: var(--pst-color-secondary);\n }\n }\n\n // Tab label\n > label {\n color: var(--pst-color-on-surface);\n border: 0.125rem solid transparent;\n border-radius: 0.125rem 0.125rem 0 0;\n background-color: var(--pst-color-surface);\n padding: 0 0.75em;\n margin-inline-end: 0.25rem;\n line-height: 1.95;\n\n html[data-theme=\"dark\"] & {\n background-color: var(--pst-color-on-background);\n }\n }\n\n // panel\n .sd-tab-content {\n border: 0.125rem solid var(--pst-color-primary);\n border-radius: 0.1875rem;\n box-shadow: unset;\n padding: 0.625rem;\n background-color: var(--pst-color-on-background);\n }\n}\n\n/*******************************************************************************\n* Dropdowns\n*/\n\ndetails.sd-dropdown {\n // Remove all borders to over-ride SD behavior, and we'll add our own later\n border: 0 !important;\n\n // Drop shadow should behave same as admonitions\n @include box-shadow;\n\n // Header is where the \"clickable\" box goes\n summary.sd-card-header {\n border: 0 !important;\n display: flex;\n align-items: center;\n position: relative; // So background color works\n font-weight: 600;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n\n // Set a variable that we can re-use for colors later\n // We must set this in the current and content sibling container\n // so that it is defined in both places\n --pst-sd-dropdown-color: var(--pst-gray-500);\n --pst-sd-dropdown-bg-color: var(--pst-color-surface);\n\n & + div.sd-summary-content {\n border: 0;\n\n --pst-sd-dropdown-color: var(--sd-color-card-border);\n }\n\n @each $name in $sd-semantic-color-names {\n &.sd-bg-#{$name} {\n --pst-sd-dropdown-color: var(--sd-color-#{$name});\n --pst-sd-dropdown-bg-color: var(--sd-color-#{$name}-bg);\n\n // Otherwise it won't be defined in the sibling element\n & + div.sd-summary-content {\n --pst-sd-dropdown-color: var(--sd-color-#{$name});\n --pst-sd-dropdown-bg-color: var(--sd-color-#{$name}-bg);\n }\n }\n &.sd-bg-text-#{$name} {\n // Use the WCAG conformant text color\n color: var(--sd-color-#{$name}-bg-text) !important;\n }\n }\n\n @include legacy-backdrop-placeholder;\n\n background-color: var(--pst-sd-dropdown-bg-color) !important;\n\n // Add a left border with the same structure as our admonitions\n border-left: 0.2rem solid var(--pst-sd-dropdown-color) !important;\n\n // stylelint-disable-next-line no-duplicate-selectors\n & + div.sd-summary-content {\n border-left: 0.2rem solid var(--pst-sd-dropdown-color) !important;\n border-bottom-left-radius: calc(0.25rem - 1px);\n background-color: var(--pst-color-on-background);\n }\n\n span.sd-summary-icon {\n display: inline-flex;\n align-items: center;\n color: var(--pst-sd-dropdown-color) !important;\n\n svg {\n opacity: 1;\n }\n }\n\n // Positioning of the caret\n .sd-summary-up,\n .sd-summary-down {\n top: 0.7rem;\n }\n\n // Focus ring\n &:focus-visible {\n outline: $focus-ring-outline;\n outline-offset: -$focus-ring-width;\n }\n }\n}\n\n/*******************************************************************************\n* Buttons (which in Sphinx Design are actually links that look like buttons)\n* ref: https://sphinx-design.readthedocs.io/en/pydata-theme/badges_buttons.html#buttons\n*/\nhtml {\n .sd-btn {\n min-width: 2.25rem;\n padding: 0.3125rem 0.75rem 0.4375rem; // 5px 12px 7px\n\n &:hover {\n @include link-style-hover; // override Sphinx Design\n\n text-decoration-thickness: 1px;\n }\n }\n\n @each $name in $sd-semantic-color-names {\n .sd-btn-#{$name},\n .sd-btn-outline-#{$name} {\n &:focus-visible {\n // Override Sphinx Design's use of -highlight colors. The -highlight\n // colors are 15% darker, so this would create the effect of darkening\n // the button when focused but we just want the button to have a focus\n // ring of the same (non-highlight) color.\n background-color: var(--sd-color-#{$name}) !important;\n border-color: var(--sd-color-#{$name}) !important;\n outline: var(--sd-color-#{$name}) solid $focus-ring-width;\n outline-offset: $focus-ring-width;\n }\n }\n }\n}\n","/**\n * Sphinx togglebutton\n */\n\n.bd-content {\n @mixin chevron-down {\n .toggle-chevron-right {\n transform: rotate(90deg); // point chevron down\n transition: none; // match non-animated behavior of other chevrons on site\n }\n }\n\n @mixin chevron-up {\n .toggle-chevron-right {\n transform: rotate(-90deg); // point chevron up\n transition: none; // match non-animated behavior of other chevrons on site\n }\n }\n\n // Admonition toggles\n .admonition {\n button.toggle-button {\n color: inherit;\n\n // When disclosure widget is closed\n &.toggle-button-hidden {\n @include chevron-down;\n }\n\n // When open\n @include chevron-up;\n }\n\n // Focus ring\n // ----------\n // Sphinx-togglebutton makes the entire admonition header clickable, but\n // only the button within the header is focusable. We want the entire\n // clickable area to be surrounded with a focus ring, so that's why we use\n // the :focus-within selector, rather than a :focus-visible selector on the\n // button.\n &:focus-within {\n overflow: visible;\n\n // The complicated focus ring styles here are a consequence of the markup\n // and border styles for this particular admonition class. (For the other\n // type of admonition on this site, the focus ring style is achieved with\n // simple `outline` and `outline-offset` rules on the admonition's\n // header.) The problem is that Sphinx-togglebutton puts the admonition's\n // left border on the outermost container (rather than separately setting\n // the left border on the container's children). This makes it complicated\n // to get the focus ring to simultaneously cover the left border in the\n // header and align perfectly on the right with the body.\n .admonition-title:focus-within::before {\n content: \"\";\n transform: translateX(\n -$admonition-left-border-width\n ); // align left edges of admonition and ring\n\n width: calc(100% + $admonition-left-border-width); // align right edges\n height: 100%;\n border: $focus-ring-outline;\n border-radius: $focus-ring-width;\n }\n\n // When expanded, sharpen the bottom left and right corners of the focus ring\n &:not(.toggle-hidden) .admonition-title:focus-within::before {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n }\n\n // Details buttons\n details.toggle-details {\n // Over-ride border color to re-use our primary color\n summary {\n border-left: 3px solid var(--pst-color-primary);\n\n @include chevron-down;\n }\n\n // When expanded, sharpen the bottom left and right corners of the focus ring\n &[open] {\n @include chevron-up;\n\n :focus-visible {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n }\n}\n","/**\n * Styles for various Sphinx execution libraries to display pre-executed notebooks.\n * For now, where these define output sections, we simply revert their background\n * to be a \"light theme\" background. This ensures that inputs/outputs behave similarly,\n * because the CSS is often controlled by each package.\n * In the future, we might add dark theme support for specific packages.\n */\n\n/*******************************************************************************\n * nbsphinx\n */\nhtml div.rendered_html,\n// NBsphinx ipywidgets output selector\nhtml .jp-RenderedHTMLCommon {\n // Add some margin around the element box for the focus ring. Otherwise the\n // focus ring gets clipped because the containing elements have `overflow:\n // hidden` applied to them (via the `.lm-Widget` selector)\n margin: $focus-ring-width;\n\n table {\n table-layout: auto;\n }\n}\n\n.bd-content .nboutput {\n .output_area {\n &.rendered_html,\n .jp-RenderedHTMLCommon {\n // pandas\n table.dataframe {\n @include table-colors;\n }\n }\n\n // Dark theme special-cases\n html[data-theme=\"dark\"] & {\n &.rendered_html:not(:has(table.dataframe)),\n // ipywidgets\n .widget-subarea {\n @include cell-output-background;\n }\n\n &.stderr {\n background-color: var(--pst-color-danger);\n }\n }\n }\n}\n\n// Add extra padding to the final item in an nbsphinx container\ndiv.nblast.container {\n margin-bottom: 1rem;\n}\n\n/*******************************************************************************\n * myst NB\n */\n\ndiv.cell_output .output {\n max-width: 100%;\n overflow-x: auto;\n}\n\n.bd-content div.cell_output {\n // pandas\n table.dataframe {\n @include table-colors;\n }\n\n html[data-theme=\"dark\"] & {\n img,\n .text_html:not(:has(table.dataframe)),\n // ipywidgets\n .widget-subarea {\n @include cell-output-background;\n }\n }\n}\n\n// Prevent tables from scrunching together\n.bd-content {\n div.cell_input {\n display: flex;\n flex-direction: column;\n justify-content: stretch;\n }\n\n div.cell_input,\n div.output {\n border-radius: $admonition-border-radius;\n }\n\n div.output {\n table {\n table-layout: auto;\n }\n }\n}\n","/**\n * style for the various mapping libs based on leaflet (folium, geemap, ipyleaflet)\n * mainly ensure the good display of the maps in both themes and avoid the customization\n * of the tiles\n */\n\n/**\n * avoid border override from pydata-sphinx-theme\n * minimal selctor to get the priority\n */\nhtml[data-theme=\"dark\"] .bd-content img.leaflet-tile.leaflet-tile-loaded {\n border-radius: 0;\n padding: 0;\n}\n","/**\n * /search.html page special-cases\n */\n\n.bd-search-container {\n /*******************************************\n * Search results\n */\n // Whitespace\n div#search-results {\n > h2 {\n font-size: var(--pst-font-size-icon);\n margin-top: 1rem;\n }\n\n p.search-summary {\n color: var(--pst-color-text-muted);\n }\n }\n\n ul.search {\n margin: 0;\n list-style: none;\n\n li {\n background-image: none;\n padding: 1rem 0;\n margin: 1rem 0;\n border-top: 1px solid var(--pst-color-text-muted);\n\n // First link is the page title, it should be a bit bigger\n > a {\n font-size: 1.2em;\n }\n\n div.context,\n p.context {\n color: var(--pst-color-text-base);\n margin: 0.5em 0 0;\n\n // Add a # before page section titles to make it clear they are sections\n a::before {\n content: \"#\";\n padding-right: 0.2em;\n color: var(--pst-color-text-muted);\n }\n }\n }\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"styles/pydata-sphinx-theme.css","mappings":"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","sources":["webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/pydata-sphinx-theme.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/variables/_layout.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/variables/_fonts.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/variables/_icons.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/variables/_admonitions.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/variables/_versionmodified.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/base/_base.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/abstracts/_links.scss","webpack://pydata_sphinx_theme/./node_modules/bootstrap/scss/_variables.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/variables/_bootstrap.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/sections/_skip-link.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/variables/_color.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/sections/_container.scss","webpack://pydata_sphinx_theme/./node_modules/bootstrap/scss/mixins/_breakpoints.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/sections/_announcement.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/abstracts/_mixins.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/sections/_article.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/sections/_footer.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/sections/_footer-article.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/sections/_footer-content.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/sections/_header.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/sections/_header-article.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/sections/_sidebar-primary.scss","webpack://pydata_sphinx_theme/./node_modules/bootstrap/scss/mixins/_grid.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/sections/_sidebar-secondary.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/sections/_sidebar-toggle.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/components/_breadcrumbs.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/components/_icon-links.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/components/header/_header-logo.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/components/_navbar-links.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/components/_page-toc.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/components/_prev-next.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/components/_search.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/components/_searchbox.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/components/_switcher-theme.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/components/_switcher-version.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/components/_toc-inpage.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/components/_versionmodified.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/components/_indices.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/components/_readthedocs-switcher.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/content/_admonitions.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/abstracts/_color.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/content/_api.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/content/_code.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/content/_figures.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/content/_footnotes.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/content/_hacks.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/content/_lists.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/content/_quotes.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/content/_spans.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/content/_tables.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/content/_toctree.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/content/_math.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/extensions/_ablog.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/extensions/_bootstrap.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/extensions/_copybutton.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/extensions/_ethical-ads.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/extensions/_execution.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/extensions/_graphviz.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/extensions/_pydata.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/extensions/_sphinx_design.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/extensions/_togglebutton.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/extensions/_notebooks.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/extensions/_leaflet.scss","webpack://pydata_sphinx_theme/./src/pydata_sphinx_theme/assets/styles/pages/_search.scss"],"sourcesContent":["html{--pst-header-height: 4rem;--pst-header-article-height: calc(var(--pst-header-height) * 2 / 3);--pst-sidebar-secondary: 17rem}html{--pst-font-size-base: 1rem;--pst-font-size-h1: 2.5rem;--pst-font-size-h2: 2rem;--pst-font-size-h3: 1.75rem;--pst-font-size-h4: 1.5rem;--pst-font-size-h5: 1.25rem;--pst-font-size-h6: 1.1rem;--pst-font-size-milli: 0.9rem;--pst-sidebar-font-size: 0.9rem;--pst-sidebar-font-size-mobile: 1.1rem;--pst-sidebar-header-font-size: 1.2rem;--pst-sidebar-header-font-weight: 600;--pst-admonition-font-weight-heading: 600;--pst-font-weight-caption: 300;--pst-font-weight-heading: 400;--pst-font-family-base-system: -apple-system, \"BlinkMacSystemFont\", \"Segoe UI\", \"Helvetica Neue\", \"Arial\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";--pst-font-family-monospace-system: \"SFMono-Regular\", \"Menlo\", \"Consolas\", \"Monaco\", \"Liberation Mono\", \"Lucida Console\", monospace;--pst-font-family-base: var(--pst-font-family-base-system);--pst-font-family-heading: var(--pst-font-family-base-system);--pst-font-family-monospace: var(--pst-font-family-monospace-system)}html{--pst-font-size-icon: 1.5rem;--pst-icon-check-circle: \"\";--pst-icon-info-circle: \"\";--pst-icon-exclamation-triangle: \"\";--pst-icon-exclamation-circle: \"\";--pst-icon-times-circle: \"\";--pst-icon-lightbulb: \"\";--pst-icon-download: \"\";--pst-icon-angle-left: \"\";--pst-icon-angle-right: \"\";--pst-icon-external-link: \"\";--pst-icon-search-minus: \"\";--pst-icon-github: \"\";--pst-icon-gitlab: \"\";--pst-icon-share: \"\";--pst-icon-bell: \"\";--pst-icon-pencil: \"\";--pst-breadcrumb-divider: \"\"}html{--pst-icon-admonition-default: var(--pst-icon-bell);--pst-icon-admonition-note: var(--pst-icon-info-circle);--pst-icon-admonition-attention: var(--pst-icon-exclamation-circle);--pst-icon-admonition-caution: var(--pst-icon-exclamation-triangle);--pst-icon-admonition-warning: var(--pst-icon-exclamation-triangle);--pst-icon-admonition-danger: var(--pst-icon-exclamation-triangle);--pst-icon-admonition-error: var(--pst-icon-times-circle);--pst-icon-admonition-hint: var(--pst-icon-lightbulb);--pst-icon-admonition-tip: var(--pst-icon-lightbulb);--pst-icon-admonition-important: var(--pst-icon-exclamation-circle);--pst-icon-admonition-seealso: var(--pst-icon-share);--pst-icon-admonition-todo: var(--pst-icon-pencil)}html{--pst-icon-versionmodified-default: var(--pst-icon-exclamation-circle);--pst-icon-versionmodified-added: var(--pst-icon-exclamation-circle);--pst-icon-versionmodified-changed: var(--pst-icon-exclamation-circle);--pst-icon-versionmodified-deprecated: var(--pst-icon-exclamation-circle)}:root{--pst-teal-50: #f4fbfc;--pst-teal-100: #e9f6f8;--pst-teal-200: #d0ecf1;--pst-teal-300: #abdde6;--pst-teal-400: #3fb1c5;--pst-teal-500: #0a7d91;--pst-teal-600: #085d6c;--pst-teal-700: #064752;--pst-teal-800: #042c33;--pst-teal-900: #021b1f;--pst-violet-50: #f4eefb;--pst-violet-100: #e0c7ff;--pst-violet-200: #d5b4fd;--pst-violet-300: #b780ff;--pst-violet-400: #9c5ffd;--pst-violet-500: #8045e5;--pst-violet-600: #6432bd;--pst-violet-700: #4b258f;--pst-violet-800: #341a61;--pst-violet-900: #1e0e39;--pst-gray-50: #f9f9fa;--pst-gray-100: #f3f4f5;--pst-gray-200: #e5e7ea;--pst-gray-300: #d1d5da;--pst-gray-400: #9ca4af;--pst-gray-500: #677384;--pst-gray-600: #48566b;--pst-gray-700: #29313d;--pst-gray-800: #222832;--pst-gray-900: #14181e;--pst-pink-50: #fcf8fd;--pst-pink-100: #fcf0fa;--pst-pink-200: #f8dff5;--pst-pink-300: #f3c7ee;--pst-pink-400: #e47fd7;--pst-pink-500: #c132af;--pst-pink-600: #912583;--pst-pink-700: #6e1c64;--pst-pink-800: #46123f;--pst-pink-900: #2b0b27;--pst-foundation-white: #ffffff;--pst-foundation-black: #14181e}html:not([data-theme]){--pst-color-primary: #0a7d91;--pst-color-primary-bg: #d0ecf1;--pst-color-secondary: #8045e5;--pst-color-secondary-bg: #e0c7ff;--pst-color-accent: #c132af;--pst-color-accent-bg: #f8dff5;--pst-color-info: #276be9;--pst-color-info-bg: #dce7fc;--pst-color-warning: #f66a0a;--pst-color-warning-bg: #f8e3d0;--pst-color-success: #00843f;--pst-color-success-bg: #d6ece1;--pst-color-attention: var(--pst-color-warning);--pst-color-attention-bg: var(--pst-color-warning-bg);--pst-color-danger: #d72d47;--pst-color-danger-bg: #f9e1e4;--pst-color-text-base: #222832;--pst-color-text-muted: #48566b;--pst-color-heading-color: #fff;--pst-color-shadow: rgba(0, 0, 0, 0.1);--pst-color-border: #d1d5da;--pst-color-border-muted: rgba(23, 23, 26, 0.2);--pst-color-blockquote-notch: #677384;--pst-color-inline-code: #912583;--pst-color-inline-code-links: #085d6c;--pst-color-target: #f3cf95;--pst-color-table: #14181e;--pst-color-table-row-hover-bg: #b780ff;--pst-color-table-inner-border: #e5e7ea;--pst-color-background: #ffffff;--pst-color-on-background: #ffffff;--pst-color-surface: #f3f4f5;--pst-color-on-surface: #222832}html:not([data-theme]){--pst-color-link: var(--pst-color-primary);--pst-color-link-hover: var(--pst-color-secondary);--pst-color-table-outer-border: var(--pst-color-surface);--pst-color-table-heading-bg: var(--pst-color-surface);--pst-color-table-row-zebra-high-bg: var(--pst-color-on-background);--pst-color-table-row-zebra-low-bg: var(--pst-color-surface)}html:not([data-theme]) .only-dark,html:not([data-theme]) .only-dark~figcaption{display:none !important}html[data-theme=light]{--pst-color-primary: #0a7d91;--pst-color-primary-bg: #d0ecf1;--pst-color-secondary: #8045e5;--pst-color-secondary-bg: #e0c7ff;--pst-color-accent: #c132af;--pst-color-accent-bg: #f8dff5;--pst-color-info: #276be9;--pst-color-info-bg: #dce7fc;--pst-color-warning: #f66a0a;--pst-color-warning-bg: #f8e3d0;--pst-color-success: #00843f;--pst-color-success-bg: #d6ece1;--pst-color-attention: var(--pst-color-warning);--pst-color-attention-bg: var(--pst-color-warning-bg);--pst-color-danger: #d72d47;--pst-color-danger-bg: #f9e1e4;--pst-color-text-base: #222832;--pst-color-text-muted: #48566b;--pst-color-heading-color: #fff;--pst-color-shadow: rgba(0, 0, 0, 0.1);--pst-color-border: #d1d5da;--pst-color-border-muted: rgba(23, 23, 26, 0.2);--pst-color-blockquote-notch: #677384;--pst-color-inline-code: #912583;--pst-color-inline-code-links: #085d6c;--pst-color-target: #f3cf95;--pst-color-table: #14181e;--pst-color-table-row-hover-bg: #b780ff;--pst-color-table-inner-border: #e5e7ea;--pst-color-background: #ffffff;--pst-color-on-background: #ffffff;--pst-color-surface: #f3f4f5;--pst-color-on-surface: #222832;color-scheme:light}html[data-theme=light]{--pst-color-link: var(--pst-color-primary);--pst-color-link-hover: var(--pst-color-secondary);--pst-color-table-outer-border: var(--pst-color-surface);--pst-color-table-heading-bg: var(--pst-color-surface);--pst-color-table-row-zebra-high-bg: var(--pst-color-on-background);--pst-color-table-row-zebra-low-bg: var(--pst-color-surface)}html[data-theme=light] .only-dark,html[data-theme=light] .only-dark~figcaption{display:none !important}html[data-theme=dark]{--pst-color-primary: #3fb1c5;--pst-color-primary-bg: #042c33;--pst-color-secondary: #9c5ffd;--pst-color-secondary-bg: #341a61;--pst-color-accent: #e47fd7;--pst-color-accent-bg: #46123f;--pst-color-info: #79a3f2;--pst-color-info-bg: #06245d;--pst-color-warning: #ff9245;--pst-color-warning-bg: #652a02;--pst-color-success: #5fb488;--pst-color-success-bg: #002f17;--pst-color-attention: var(--pst-color-warning);--pst-color-attention-bg: var(--pst-color-warning-bg);--pst-color-danger: #e78894;--pst-color-danger-bg: #4e111b;--pst-color-text-base: #ced6dd;--pst-color-text-muted: #9ca4af;--pst-color-heading-color: #14181e;--pst-color-shadow: rgba(0, 0, 0, 0.2);--pst-color-border: #48566b;--pst-color-border-muted: #29313d;--pst-color-blockquote-notch: #9ca4af;--pst-color-inline-code: #f3c7ee;--pst-color-inline-code-links: #3fb1c5;--pst-color-target: #675c04;--pst-color-table: #ffffff;--pst-color-table-row-hover-bg: #6432bd;--pst-color-table-inner-border: #364150;--pst-color-background: #14181e;--pst-color-on-background: #222832;--pst-color-surface: #29313d;--pst-color-on-surface: #f3f4f5;color-scheme:dark}html[data-theme=dark]{--pst-color-link: var(--pst-color-primary);--pst-color-link-hover: var(--pst-color-secondary);--pst-color-table-outer-border: var(--pst-color-surface);--pst-color-table-heading-bg: var(--pst-color-surface);--pst-color-table-row-zebra-high-bg: var(--pst-color-on-background);--pst-color-table-row-zebra-low-bg: var(--pst-color-surface)}html[data-theme=dark] .only-light,html[data-theme=dark] .only-light~figcaption{display:none !important}html[data-theme=dark] img:not(.only-dark,.dark-light){filter:brightness(0.8) contrast(1.2)}html[data-theme=dark] .bd-content img:not(.only-dark,.dark-light){background-color:#fff;border-radius:.25rem}html[data-theme=dark] .MathJax_SVG *{fill:var(--pst-color-text-base)}.pst-color-primary{color:var(--pst-color-primary)}.pst-color-secondary{color:var(--pst-color-secondary)}.pst-color-accent{color:var(--pst-color-accent)}.pst-color-info{color:var(--pst-color-info)}.pst-color-warning{color:var(--pst-color-warning)}.pst-color-success{color:var(--pst-color-success)}.pst-color-attention{color:var(--pst-color-attention)}.pst-color-danger{color:var(--pst-color-danger)}.pst-color-text-base{color:var(--pst-color-text-base)}.pst-color-text-muted{color:var(--pst-color-text-muted)}.pst-color-heading-color{color:var(--pst-color-heading-color)}.pst-color-shadow{color:var(--pst-color-shadow)}.pst-color-border{color:var(--pst-color-border)}.pst-color-border-muted{color:var(--pst-color-border-muted)}.pst-color-blockquote-notch{color:var(--pst-color-blockquote-notch)}.pst-color-inline-code{color:var(--pst-color-inline-code)}.pst-color-inline-code-links{color:var(--pst-color-inline-code-links)}.pst-color-target{color:var(--pst-color-target)}.pst-color-table{color:var(--pst-color-table)}.pst-color-table-row-hover{color:var(--pst-color-table-row-hover)}.pst-color-table-inner-border{color:var(--pst-color-table-inner-border)}.pst-color-background{color:var(--pst-color-background)}.pst-color-on-background{color:var(--pst-color-on-background)}.pst-color-surface{color:var(--pst-color-surface)}.pst-color-on-surface{color:var(--pst-color-on-surface)}html{font-size:var(--pst-font-size-base);scroll-padding-top:calc(var(--pst-header-height) + 1rem)}body{background-color:var(--pst-color-background);font-family:var(--pst-font-family-base);font-weight:400;line-height:1.65;color:var(--pst-color-text-base);min-height:100vh;display:flex;flex-direction:column}body::-webkit-scrollbar-track{background-color:var(--pst-color-background)}p{margin-bottom:1.15rem;font-size:1em}p.rubric{border-bottom:1px solid var(--pst-color-border)}p.centered{text-align:center}a{word-wrap:break-word;color:var(--pst-color-link);text-decoration:underline;text-decoration-thickness:max(1px, .0625rem);text-underline-offset:.1578em}a:hover{color:var(--pst-color-link-hover);text-decoration-thickness:max(3px, .1875rem, .12em);text-decoration-skip-ink:none}a:active{color:var(--pst-color-link)}a:visited{color:var(--pst-color-link)}a:visited:hover{color:var(--pst-color-link-hover)}a.headerlink{color:var(--pst-color-secondary);opacity:.7;font-size:.8em;padding:0 4px;margin-left:.2em;text-decoration:none;transition:all .2s ease-out;user-select:none}a.headerlink:hover{opacity:1}a.github::before,a.gitlab::before{color:var(--pst-color-text-muted);font:var(--fa-font-brands);margin-right:.25rem}a.github::before{content:var(--pst-icon-github)}a.gitlab::before{content:var(--pst-icon-gitlab)}h6,h5,h4,h3,h2,h1{margin:2.75rem 0 1.05rem;font-family:var(--pst-font-family-heading);font-weight:var(--pst-font-weight-heading);line-height:1.15}h1{margin-top:0;font-size:var(--pst-font-size-h1);color:var(--pst-heading-color)}h2{font-size:var(--pst-font-size-h2);color:var(--pst-heading-color)}h3{font-size:var(--pst-font-size-h3);color:var(--pst-heading-color)}h4{font-size:var(--pst-font-size-h4);color:var(--pst-heading-color)}h5{font-size:var(--pst-font-size-h5);color:var(--pst-color-text-base)}h6{font-size:var(--pst-font-size-h6);color:var(--pst-color-text-base)}small,.text_small{font-size:var(--pst-font-size-milli)}hr{border:0;border-top:1px solid var(--pst-color-border)}pre,code,kbd,samp{font-family:var(--pst-font-family-monospace)}kbd{background-color:var(--pst-color-on-background);color:var(--pst-color-text-muted)}kbd:not(.compound){border:1px solid var(--pst-color-border);margin:0 .1rem;padding:.1rem .4rem;box-shadow:1px 1px 1px var(--pst-color-shadow)}code{color:var(--pst-color-inline-code)}pre{margin:1.5em 0;padding:1rem;background-color:var(--pst-color-surface);color:var(--pst-color-text-base);line-height:1.2em;border:1px solid var(--pst-color-border);border-radius:.25rem}pre .linenos{opacity:.8;padding-right:10px}#pst-back-to-top{z-index:1080;position:fixed;display:none;top:90vh;left:50vw;transform:translate(-50%);color:var(--pst-color-secondary-text);background-color:var(--pst-color-secondary);border:none}#pst-back-to-top .fa-arrow-up{margin-inline-end:.5em}#pst-back-to-top:hover{text-decoration:underline;text-decoration-thickness:max(1px, .0625rem);text-underline-offset:.1578em;text-decoration-thickness:max(3px, .1875rem, .12em);text-decoration-skip-ink:none;color:var(--pst-color-link-hover);text-decoration-thickness:1px;background-color:var(--pst-violet-600);color:var(--pst-color-secondary-text)}#pst-back-to-top:focus-visible{box-shadow:none;outline:var(--pst-color-accent) solid .1875rem;outline-color:var(--pst-color-secondary);outline-offset:.1875rem}:focus-visible{outline:var(--pst-color-accent) solid .1875rem;box-shadow:none}.skip-link{position:fixed;top:0;left:0;right:0;text-align:center;background-color:var(--pst-color-warning);padding:.5rem;z-index:1055;border-bottom:1px solid var(--pst-color-border);transform:translateY(-100%);transition:transform 150ms ease-in-out}.skip-link:focus-within{transform:translateY(0%)}.skip-link a{color:var(--pst-color-warning-text) !important}.skip-link a:focus-visible{outline-color:#14181e}.bd-container{flex-grow:1;display:flex;justify-content:center}.bd-container .bd-container__inner{display:flex}.bd-page-width{width:100%}@media(min-width: 960px){.bd-page-width{max-width:88rem}}.pst-async-banner-revealer{height:0;overflow:hidden;transition:height 300ms ease-in-out}@media(prefers-reduced-motion){.pst-async-banner-revealer{transition:none}}#bd-header-version-warning,.bd-header-announcement{min-height:3rem;width:100%;display:flex;position:relative;align-items:center;justify-content:center;text-align:center;padding:.5rem 12.5%}@media(max-width: 959.98px){#bd-header-version-warning,.bd-header-announcement{padding:.5rem 2%}}#bd-header-version-warning p,.bd-header-announcement p{font-weight:bold;margin:0}#bd-header-version-warning a,.bd-header-announcement a{color:var(--pst-color-inline-code-links)}#bd-header-version-warning .pst-button-link-to-stable-version,.bd-header-announcement .pst-button-link-to-stable-version{box-shadow:0 .2rem .5rem var(--pst-color-shadow),0 0 .0625rem var(--pst-color-shadow) !important;background-color:var(--pst-color-danger);border-color:var(--pst-color-danger);color:var(--pst-color-danger-text);border-radius:.25rem}#bd-header-version-warning .pst-button-link-to-stable-version:hover,.bd-header-announcement .pst-button-link-to-stable-version:hover{background-color:var(--pst-color-danger-highlight);border-color:var(--pst-color-danger-highlight);color:var(--pst-color-danger-text)}#bd-header-version-warning .pst-button-link-to-stable-version:focus-visible,.bd-header-announcement .pst-button-link-to-stable-version:focus-visible{outline:.1875rem solid var(--pst-color-danger);outline-offset:.1875rem}.bd-header-announcement{background-color:var(--pst-color-secondary-bg)}#bd-header-version-warning{background-color:var(--pst-color-danger-bg)}.bd-main{flex-grow:1;flex-direction:column;display:flex;min-width:0}.bd-main .bd-content{display:flex;justify-content:center;height:100%}.bd-main .bd-content .bd-article-container{justify-content:start;display:flex;flex-direction:column;width:100%;max-width:60em;overflow-x:auto;padding:1rem}@media(min-width: 1200px){.bd-main .bd-content .bd-article-container .bd-article{padding-top:1.5rem;padding-left:2rem}}.bd-footer{width:100%;border-top:1px solid var(--pst-color-border)}.bd-footer .bd-footer__inner{display:flex;flex-grow:1;padding:1rem;margin:auto}.bd-footer .footer-items__start,.bd-footer .footer-items__center,.bd-footer .footer-items__end{display:flex;flex-direction:column;gap:.5rem;justify-content:center;flex-grow:1}.bd-footer .footer-items__center{text-align:center}.bd-footer .footer-items__end{text-align:end}.bd-footer .footer-item p{margin-bottom:0}.bd-footer-article{margin-top:auto}.bd-footer-article .footer-article-items{display:flex;flex-direction:column}.bd-footer-content .footer-content-items{display:flex;flex-direction:column;margin-top:auto}.bd-header{position:sticky;top:0;z-index:1030;background-color:var(--pst-color-on-background) !important;box-shadow:0 .125rem .25rem 0 var(--pst-color-shadow);width:100%;padding:0;max-width:100vw;justify-content:center}.bd-header .bd-header__inner{display:flex;align-items:center;height:fit-content;padding-left:1rem;padding-right:1rem}.bd-header :focus-visible{border-radius:.125rem}.bd-header .navbar-item{height:var(--pst-header-height);max-height:var(--pst-header-height);display:flex;align-items:center}.bd-header .navbar-header-items{display:none;flex-shrink:1}@media(min-width: 960px){.bd-header .navbar-header-items{display:inherit;flex-grow:1;padding:0 0 0 .5rem}}.bd-header .navbar-header-items__end,.bd-header .navbar-header-items__center,.bd-header .navbar-header-items__start{display:flex;align-items:center;flex-flow:wrap;row-gap:0}.bd-header .navbar-header-items__end,.bd-header .navbar-header-items__center{column-gap:1rem}.bd-header .navbar-header-items__start{flex-shrink:0;margin-right:auto;gap:.5rem}.bd-header .navbar-header-items__end{justify-content:end}.bd-header ul.navbar-nav{display:flex}@media(min-width: 960px){.bd-header ul.navbar-nav{align-items:baseline}}.bd-header ul.navbar-nav>li.nav-item{margin-inline:2px}.bd-header ul.navbar-nav>li.nav-item>.nav-link{color:var(--pst-color-text-muted);position:relative;padding-inline:6px}.bd-header ul.navbar-nav>li.nav-item>.nav-link::before{content:\"\";display:block;position:absolute;inset:0;background-color:rgba(0,0,0,0);bottom:calc(-1*max(3px, .1875rem, .12em));margin:max(3px, .1875rem, .12em) 0}.bd-header ul.navbar-nav>li.nav-item>.nav-link:hover{color:var(--pst-color-secondary);text-decoration:none}.bd-header ul.navbar-nav>li.nav-item>.nav-link:hover::before{border-bottom:max(3px, .1875rem, .12em) solid var(--pst-color-secondary)}.bd-header ul.navbar-nav>li.nav-item>.nav-link:focus-visible{box-shadow:none;outline:3px solid var(--pst-color-accent);outline-offset:3px}.bd-header ul.navbar-nav>li.nav-item.current>.nav-link{color:var(--pst-color-primary)}.bd-header ul.navbar-nav>li.nav-item.current>.nav-link::before{border-bottom:3px solid var(--pst-color-primary)}.bd-header ul.navbar-nav>li.nav-item.dropdown{margin-inline:4px}.bd-header ul.navbar-nav>li.nav-item.dropdown button{padding-inline:8px}.bd-header ul.navbar-nav>li.nav-item.dropdown>.dropdown-toggle{border-radius:.125rem;color:var(--pst-color-text-muted)}.bd-header ul.navbar-nav>li.nav-item.dropdown>.dropdown-toggle:focus-visible{box-shadow:0 0 0 .1875rem var(--pst-color-accent)}.bd-header ul.navbar-nav>li.nav-item.dropdown>.dropdown-toggle:hover{text-decoration:none;box-shadow:0 0 0 .1875rem var(--pst-color-link-hover);color:var(--pst-color-text-base)}.bd-header ul.navbar-nav li a.nav-link.dropdown-item{color:var(--pst-color-text-muted);text-decoration:none}.bd-header ul.navbar-nav li a.nav-link.dropdown-item:hover{color:var(--pst-color-link-hover);text-decoration:underline;text-decoration-thickness:max(1px, .0625rem);text-underline-offset:.1578em;text-decoration-thickness:max(3px, .1875rem, .12em);text-decoration-skip-ink:none}.bd-header ul.navbar-nav .dropdown button{display:unset;border:none}.bd-header ul.navbar-nav .dropdown button:hover{text-decoration:underline;text-decoration-thickness:max(1px, .0625rem);text-underline-offset:.1578em;text-decoration-thickness:max(3px, .1875rem, .12em);text-decoration-skip-ink:none;color:var(--pst-color-link-hover)}.bd-header ul.navbar-nav .dropdown .dropdown-menu{z-index:1070;border:1px solid var(--pst-color-border);box-shadow:0 0 .3rem .1rem var(--pst-color-shadow);background-color:var(--pst-color-on-background);padding:.5rem 0;margin:.5rem 0;min-width:20rem}.bd-header ul.navbar-nav .dropdown .dropdown-menu .dropdown-item{padding:.25rem 1.5rem}.bd-header ul.navbar-nav .dropdown .dropdown-menu .dropdown-item:focus:not(:hover,:active){background-color:inherit}.bd-header ul.navbar-nav .dropdown .dropdown-menu .dropdown-item:focus-visible{z-index:10}.bd-header ul.navbar-nav .dropdown .dropdown-menu:not(.show){display:none}.bd-header button.sidebar-toggle{font-size:var(--pst-font-size-icon);color:var(--pst-color-muted);margin-bottom:0;background-color:inherit;padding:.5rem}.bd-header button.primary-toggle{margin-right:1rem}@media(min-width: 960px){.bd-header button.primary-toggle{display:none}}.bd-header button.secondary-toggle{margin-left:1rem}@media(min-width: 1200px){.bd-header button.secondary-toggle{display:none}}@media(min-width: 960px){.navbar-center-items .navbar-item{display:inline-block}}.nav-link{transition:none}.nav-link:hover{text-decoration:underline;text-decoration-thickness:max(1px, .0625rem);text-underline-offset:.1578em;text-decoration-thickness:max(3px, .1875rem, .12em);text-decoration-skip-ink:none;color:var(--pst-color-link-hover)}.nav-link.nav-external::after{font:var(--fa-font-solid);content:var(--pst-icon-external-link);font-size:.75em;margin-left:.3em}.bd-navbar-elements li.nav-item i{font-size:.7rem;padding-left:2px;vertical-align:middle}.navbar-persistent--mobile{margin-left:auto}@media(min-width: 960px){.navbar-persistent--mobile{display:none}}.navbar-persistent--container{display:none}@media(min-width: 960px){.navbar-persistent--container{display:flex}}.header-article__inner{display:flex;padding:0 .5rem}.header-article__inner .header-article-item{min-height:var(--pst-header-article-height);height:var(--pst-header-article-height)}.header-article__inner .header-article-items__start,.header-article__inner .header-article-items__end{display:flex;align-items:start;gap:.5rem}.header-article__inner .header-article-items__end{margin-left:auto}.bd-sidebar-primary{display:flex;flex-direction:column;gap:1rem;max-height:calc(100vh - var(--pst-header-height));position:sticky;top:var(--pst-header-height);flex:0 0 auto;width:25%;padding:2rem 1rem 1rem 1rem;border-right:1px solid var(--pst-color-border);background-color:var(--pst-color-background);overflow-y:auto;font-size:var(--pst-sidebar-font-size-mobile)}@media(min-width: 960px){.bd-sidebar-primary{font-size:var(--pst-sidebar-font-size)}}.bd-sidebar-primary :focus-visible{border-radius:.125rem}.bd-sidebar-primary .nav-link{font-size:var(--pst-sidebar-font-size-mobile)}.bd-sidebar-primary.no-sidebar{border-right:0}@media(min-width: 960px){.bd-sidebar-primary.hide-on-wide{display:none}}.bd-sidebar-primary h1,.bd-sidebar-primary h2,.bd-sidebar-primary h3,.bd-sidebar-primary h4{color:var(--pst-color-text-base)}.bd-sidebar-primary .sidebar-primary-items__start .sidebar-primary-item,.bd-sidebar-primary .sidebar-primary-items__end .sidebar-primary-item{padding:.5rem 0}.bd-sidebar-primary .sidebar-header-items{display:flex;flex-direction:column}.bd-sidebar-primary .sidebar-header-items .sidebar-header-items__title{font-weight:var(--pst-sidebar-header-font-weight);font-size:var(--pst-sidebar-header-font-size);color:var(--pst-color-text-base);margin-bottom:.5rem}.bd-sidebar-primary .sidebar-header-items .nav-item.dropdown button{display:none}.bd-sidebar-primary .sidebar-header-items .nav-item.dropdown .dropdown-menu{display:flex;flex-direction:column;padding:0;margin:0;border:none;background-color:inherit;font-size:inherit}.bd-sidebar-primary .sidebar-header-items .nav-item.dropdown .dropdown-menu .dropdown-item:hover,.bd-sidebar-primary .sidebar-header-items .nav-item.dropdown .dropdown-menu .dropdown-item:focus{background-color:unset}.bd-sidebar-primary .sidebar-header-items .bd-navbar-elements .nav-link:focus-visible{box-shadow:none;outline:var(--pst-color-accent) solid .1875rem;outline-offset:.1875rem}.bd-sidebar-primary .sidebar-header-items .sidebar-header-items__center{display:flex;flex-direction:column}.bd-sidebar-primary .sidebar-header-items .sidebar-header-items__end{display:flex;align-items:center;gap:1rem}@media(min-width: 960px){.bd-sidebar-primary .sidebar-header-items{display:none}}.bd-sidebar-primary .sidebar-primary-items__start{border-top:1px solid var(--pst-color-border)}@media(min-width: 960px){.bd-sidebar-primary .sidebar-primary-items__start{border-top:none}}.bd-sidebar-primary .sidebar-primary-items__end{margin-top:auto;margin-bottom:1em}.bd-sidebar-primary .list-caption{list-style:none;padding-left:0}.bd-sidebar-primary .list-caption li.toctree-l0.has-children>details>summary{position:relative;height:auto;width:auto;display:flex;justify-content:space-between;align-items:baseline}.bd-sidebar-primary .list-caption li.toctree-l0.has-children>details>summary .toctree-toggle{flex:0 0 auto}.bd-sidebar-primary .list-caption li.toctree-l0.has-children>details>summary .toctree-toggle .fa-chevron-down{font-size:1rem}.bd-sidebar-primary li.has-children{position:relative}.bd-sidebar-primary li.has-children>.reference,.bd-sidebar-primary li.has-children .caption{margin-right:calc(30px + .1875rem);padding-top:.25rem}.bd-sidebar-primary li.has-children>details>summary{list-style:none}.bd-sidebar-primary li.has-children>details>summary::-webkit-details-marker{display:none}.bd-sidebar-primary li.has-children>details>summary:focus-visible{outline:none}.bd-sidebar-primary li.has-children>details>summary:focus-visible>.toctree-toggle{outline:var(--pst-color-accent) solid .1875rem;outline-offset:-0.1875rem}.bd-sidebar-primary li.has-children>details>summary .toctree-toggle{cursor:pointer;position:absolute;top:0;right:0;width:30px;height:30px;display:inline-flex;justify-content:center;align-items:center}.bd-sidebar-primary li.has-children>details>summary .toctree-toggle .fa-chevron-down{font-size:.75rem}.bd-sidebar-primary li.has-children>details[open]>summary .fa-chevron-down{transform:rotate(180deg)}nav.bd-links{margin-right:-1rem}@media(min-width: 960px){nav.bd-links{display:block}}nav.bd-links ul{display:block;list-style:none}nav.bd-links ul ul{padding:0 0 0 1rem}nav.bd-links li>a{display:block;padding:.25rem .65rem;color:var(--pst-color-text-muted);text-decoration:none;box-shadow:none;margin-right:.1875rem}nav.bd-links li>a:hover{text-decoration:underline;background-color:rgba(0,0,0,0);color:var(--pst-color-link-hover);text-decoration-thickness:max(3px, .1875rem, .12em);text-decoration-skip-ink:none}nav.bd-links li>a:active{color:var(--pst-color-link-hover)}nav.bd-links li>a:focus-visible{box-shadow:0 0 0 .1875rem var(--pst-color-accent);outline:none;z-index:10}nav.bd-links li>a.reference.external::after{font:var(--fa-font-solid);content:var(--pst-icon-external-link);font-size:.75em;margin-left:.3em}nav.bd-links .current>a{font-weight:600;color:var(--pst-color-primary);box-shadow:inset max(3px, .1875rem, .12em) 0 0 var(--pst-color-primary);background-color:rgba(0,0,0,0)}nav.bd-links .current>a:focus-visible{box-shadow:inset max(3px, .1875rem, .12em) 0 0 var(--pst-color-primary),0 0 0 .1875rem var(--pst-color-accent);outline:none}nav.bd-links p.bd-links__title{font-size:var(--pst-sidebar-header-font-size);font-weight:var(--pst-sidebar-header-font-weight);margin-bottom:.5rem}nav.bd-links p.caption{font-weight:var(--pst-sidebar-header-font-weight);position:relative;margin-top:1.25rem;margin-bottom:.5rem;color:var(--pst-color-text-base);font-size:var(--pst-sidebar-font-size-mobile)}nav.bd-links p.caption:first-child{margin-top:0}@media(min-width: 960px){nav.bd-links p.caption{font-size:var(--pst-sidebar-font-size)}}.bd-sidebar-secondary{display:flex;order:2;flex-shrink:0;flex-direction:column;position:sticky;top:var(--pst-header-height);max-height:calc(100vh - var(--pst-header-height));padding:2rem 1rem 1rem;width:var(--pst-sidebar-secondary);font-size:var(--pst-sidebar-font-size-mobile);background-color:var(--pst-color-background);overflow-y:auto}@media(min-width: 1200px){.bd-sidebar-secondary{font-size:var(--pst-sidebar-font-size)}}.sidebar-secondary-item{padding:.5rem}@media(min-width: 1200px){.sidebar-secondary-item{border-left:1px solid var(--pst-color-border);padding-left:1rem}}.sidebar-secondary-item i{padding-right:.5rem}input.sidebar-toggle{display:none}label.overlay{background-color:#000;opacity:.5;height:0;width:0;position:fixed;top:0;left:0;transition:opacity 200ms ease-out;z-index:1050}input#pst-primary-sidebar-checkbox:checked+label.overlay.overlay-primary,input#pst-secondary-sidebar-checkbox:checked+label.overlay.overlay-secondary{height:100vh;width:100vw}input#pst-primary-sidebar-checkbox:checked~.bd-container .bd-sidebar-primary{visibility:visible;margin-left:0}input#pst-secondary-sidebar-checkbox:checked~.bd-container .bd-sidebar-secondary{visibility:visible;margin-right:0}@media(min-width: 960px){.sidebar-toggle.primary-toggle{display:none}input#pst-primary-sidebar-checkbox:checked+label.overlay.overlay-primary{height:0;width:0}.bd-sidebar-primary{margin-left:0;visibility:visible}}@media(max-width: 959.98px){.bd-sidebar-primary{position:fixed;top:0;z-index:1055;height:100vh;max-height:100vh;width:75%;flex-grow:.75;max-width:350px;transition:visibility 200ms ease-out,margin 200ms ease-out;visibility:hidden;margin-left:-75%;left:0}}@media(max-width: 1199.98px){.bd-sidebar-secondary{position:fixed;top:0;z-index:1055;height:100vh;max-height:100vh;width:75%;flex-grow:.75;max-width:350px;transition:visibility 200ms ease-out,margin 200ms ease-out;visibility:hidden;margin-right:-75%;right:0}}ul.bd-breadcrumbs{list-style:none;padding-left:0;display:flex;flex-wrap:wrap;font-size:.8rem}ul.bd-breadcrumbs li.breadcrumb-item{display:flex;align-items:center;font-weight:bold}ul.bd-breadcrumbs li.breadcrumb-item a{color:var(--pst-color-text-muted);text-decoration:none}ul.bd-breadcrumbs li.breadcrumb-item a:hover{color:var(--pst-color-link-hover);text-decoration:underline;text-decoration-thickness:max(1px, .0625rem);text-underline-offset:.1578em;text-decoration-thickness:max(3px, .1875rem, .12em);text-decoration-skip-ink:none}ul.bd-breadcrumbs li.breadcrumb-item:not(.breadcrumb-home)::before{font:var(--fa-font-solid);font-size:.8rem;content:var(--pst-breadcrumb-divider);color:var(--pst-color-text-muted);padding:0 .5rem}html .pst-navbar-icon{box-sizing:border-box;min-width:24px;min-height:24px;color:var(--pst-color-text-muted);position:relative;display:flex;align-items:center;justify-content:center;border-radius:0;border:none;font-size:1rem;line-height:1.65;padding:.25rem 0;height:2.15rem}html .pst-navbar-icon::before{content:\"\";display:block;position:absolute;inset:0;background-color:rgba(0,0,0,0);bottom:calc(-1*max(3px, .1875rem, .12em));margin:max(3px, .1875rem, .12em) 0}html .pst-navbar-icon:hover{color:var(--pst-color-secondary);text-decoration:none}html .pst-navbar-icon:hover::before{border-bottom:max(3px, .1875rem, .12em) solid var(--pst-color-secondary)}html .pst-navbar-icon:focus-visible{box-shadow:none;outline:3px solid var(--pst-color-accent);outline-offset:3px}ul.navbar-icon-links{display:flex;flex-flow:row wrap;column-gap:1rem;justify-content:space-evenly;align-items:center;padding-left:0;margin-bottom:0;list-style:none}ul.navbar-icon-links i.fa-brands,ul.navbar-icon-links i.fa-regular,ul.navbar-icon-links i.fa-solid{vertical-align:middle;font-style:normal;font-size:var(--pst-font-size-icon)}ul.navbar-icon-links i.fa-square-twitter::before{color:#55acee}ul.navbar-icon-links i.fa-square-gitlab::before{color:#548}ul.navbar-icon-links i.fa-bitbucket::before{color:#0052cc}ul.navbar-icon-links img.icon-link-image{height:1.5em;border-radius:.2rem}ul.navbar-icon-links .fa-pydata{stroke:var(--pst-color-background);stroke-linejoin:round;stroke-width:.35}.navbar-brand{position:relative;height:var(--pst-header-height);max-height:var(--pst-header-height);padding:.5rem 0;width:auto;margin:0;display:flex;flex-shrink:0;align-items:center;gap:.5rem}.navbar-brand p{color:var(--pst-color-text-base);margin-bottom:0}.navbar-brand img{max-width:100%;height:100%;width:auto}.navbar-brand:hover,.navbar-brand:visited:hover{text-decoration:underline;text-decoration-thickness:max(1px, .0625rem);text-underline-offset:.1578em;text-decoration-thickness:max(3px, .1875rem, .12em);text-decoration-skip-ink:none;color:var(--pst-color-link-hover);color:var(--pst-color-text-base)}ul.navbar-nav ul{padding:0 0 0 1rem}ul.navbar-nav li{display:flex;flex-direction:column}ul.navbar-nav li a{display:flex;align-items:center;height:100%;padding-top:.25rem;padding-bottom:.25rem;color:var(--pst-color-text-muted);text-decoration:none}ul.navbar-nav li a:hover{color:var(--pst-color-link-hover);text-decoration:underline;text-decoration-thickness:max(1px, .0625rem);text-underline-offset:.1578em;text-decoration-thickness:max(3px, .1875rem, .12em);text-decoration-skip-ink:none}.page-toc .section-nav{padding-left:0;border-bottom:none}.page-toc .section-nav ul{padding-left:1rem}.page-toc .nav-link{font-size:var(--pst-sidebar-font-size-mobile)}@media(min-width: 1200px){.page-toc .nav-link{font-size:var(--pst-sidebar-font-size)}}.page-toc .onthispage{color:var(--pst-color-text-base);font-weight:var(--pst-sidebar-header-font-weight);margin-bottom:.5rem}.prev-next-area{width:100%}.prev-next-area p{color:var(--pst-color-text-muted);margin:0 .3em;line-height:1.3em}.prev-next-area i{font-size:1.2em}.prev-next-area a{display:flex;align-items:center;border:none;padding:10px;max-width:45%;overflow-x:hidden;color:var(--pst-color-text-muted);text-decoration:none}.prev-next-area a p.prev-next-title{word-wrap:break-word;color:var(--pst-color-link);text-decoration:underline;text-decoration-thickness:max(1px, .0625rem);text-underline-offset:.1578em;font-weight:var(--pst-admonition-font-weight-heading);font-size:1.1em}.prev-next-area a p.prev-next-title:hover{color:var(--pst-color-link-hover);text-decoration-thickness:max(3px, .1875rem, .12em);text-decoration-skip-ink:none}.prev-next-area a p.prev-next-title:active{color:var(--pst-color-link)}.prev-next-area a p.prev-next-title:visited{color:var(--pst-color-link)}.prev-next-area a p.prev-next-title:visited:hover{color:var(--pst-color-link-hover)}.prev-next-area a:hover p.prev-next-title,.prev-next-area a:visited:hover p.prev-next-title{text-decoration:underline;text-decoration-thickness:max(1px, .0625rem);text-underline-offset:.1578em;text-decoration-thickness:max(3px, .1875rem, .12em);text-decoration-skip-ink:none;color:var(--pst-color-link-hover)}.prev-next-area a .prev-next-info{flex-direction:column;margin:0 .5em}.prev-next-area a .prev-next-info .prev-next-subtitle{text-transform:capitalize}.prev-next-area a.left-prev{float:left}.prev-next-area a.right-next{float:right}.prev-next-area a.right-next div.prev-next-info{text-align:right}.bd-search{position:relative;padding-left:.5rem;gap:.5rem;background-color:var(--pst-color-background);border-radius:.25rem;border:1px solid var(--pst-color-border);color:var(--pst-color-text-base)}.bd-search:active{background-color:var(--pst-color-background);color:var(--pst-color-text-muted)}.bd-search .icon{position:absolute;color:var(--pst-color-border);left:25px}.bd-search .fa-solid.fa-magnifying-glass{position:absolute;left:calc((2.5rem - .7em)/2);color:var(--pst-color-text-muted)}.bd-search input::placeholder{color:var(--pst-color-text-muted)}.bd-search input::-webkit-search-cancel-button,.bd-search input::-webkit-search-decoration{appearance:none}.bd-search .search-button__kbd-shortcut{display:flex;position:absolute;right:.5rem;color:var(--pst-color-border)}.form-control{background-color:var(--pst-color-background);color:var(--pst-color-text-base)}.form-control:focus,.form-control:focus-visible{border:none;background-color:var(--pst-color-background);color:var(--pst-color-text-muted)}.search-button i{font-size:1.3rem}.search-button__search-container,.search-button__overlay{display:none}.search-button__wrapper.show .search-button__search-container{display:flex;position:fixed;z-index:1055;top:30%;left:50%;transform:translate(-50%, -50%);right:1rem;margin-top:.5rem;width:90%;max-width:800px}.search-button__wrapper.show .search-button__overlay{display:flex;position:fixed;z-index:1050;background-color:#000;opacity:.5;width:100%;height:100%;top:0;left:0}.search-button__wrapper.show form.bd-search{flex-grow:1;padding-top:0;padding-bottom:0}.search-button__wrapper.show svg,.search-button__wrapper.show input{font-size:var(--pst-font-size-icon)}.search-button-field{display:inline-flex;align-items:center;border:var(--pst-color-border) solid 1px;border-radius:1.5em;color:var(--pst-color-text-muted);padding:.5em;background-color:var(--pst-color-surface)}.search-button-field:hover{box-shadow:0 0 0 .1875rem var(--pst-color-link-hover)}.search-button-field:focus-visible{border-radius:1.5em}.search-button-field .search-button__default-text{font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);margin-right:.5em;margin-left:.5em}.search-button-field .kbd-shortcut__modifier{font-size:.75em}.search-button-field>*{align-items:center}.search-button-field>:not(svg){display:none}@media(min-width: 960px){.search-button-field>:not(svg){display:flex}}div#searchbox p.highlight-link{margin:1rem 0;width:fit-content;box-shadow:0 .2rem .5rem var(--pst-color-shadow),0 0 .0625rem var(--pst-color-shadow) !important}@media(min-width: 1200px){div#searchbox p.highlight-link{margin-left:2rem}}div#searchbox p.highlight-link a{border-radius:.25rem;font-size:1.25rem;padding:.75rem;background-color:var(--pst-color-primary);color:var(--pst-color-primary-text);text-decoration:none;transition:box-shadow .25s ease-out}div#searchbox p.highlight-link a:hover{box-shadow:inset 0 0 50px 50px rgba(0,0,0,.25)}div#searchbox p.highlight-link a::before{content:var(--pst-icon-search-minus);color:unset;font:var(--fa-font-solid);margin-right:.5rem}.theme-switch-button .theme-switch{display:none}.theme-switch-button .theme-switch:active{text-decoration:none;color:var(--pst-color-link-hover)}.theme-switch-button .theme-switch .fa-lg{aspect-ratio:1/1}html[data-mode=auto] .theme-switch-button .theme-switch[data-mode=auto]{display:inline}html[data-mode=light] .theme-switch-button .theme-switch[data-mode=light]{display:inline}html[data-mode=dark] .theme-switch-button .theme-switch[data-mode=dark]{display:inline}button.btn.version-switcher__button{border-color:var(--pst-color-border);color:var(--pst-color-text-base);margin-bottom:1em}@media(min-width: 960px){button.btn.version-switcher__button{margin-bottom:unset}}button.btn.version-switcher__button:hover{box-shadow:0 0 0 .1875rem var(--pst-color-secondary);border-color:rgba(0,0,0,0)}button.btn.version-switcher__button:active{color:var(--pst-color-text-base);border-color:var(--pst-color-border)}button.btn.version-switcher__button:focus-visible{border-color:rgba(0,0,0,0)}.version-switcher__menu{border-color:var(--pst-color-border);border-radius:var(--bs-dropdown-border-radius)}.version-switcher__menu a.list-group-item{background-color:var(--pst-color-on-background);color:var(--pst-color-text-base);padding:.75rem 1.25rem}.version-switcher__menu a.list-group-item:not(:last-child){border-bottom:1px solid var(--pst-color-border)}.version-switcher__menu a.list-group-item:hover{text-decoration:underline;text-decoration-thickness:max(1px, .0625rem);text-underline-offset:.1578em;text-decoration-thickness:max(3px, .1875rem, .12em);text-decoration-skip-ink:none;color:var(--pst-color-link-hover);background-color:var(--pst-color-surface)}.version-switcher__menu a.list-group-item.active{font-weight:600;color:var(--pst-color-primary);box-shadow:inset max(3px, .1875rem, .12em) 0 0 var(--pst-color-primary);position:relative;z-index:1}.version-switcher__menu a.list-group-item.active:focus-visible{box-shadow:inset max(3px, .1875rem, .12em) 0 0 var(--pst-color-primary),0 0 0 .1875rem var(--pst-color-accent);outline:none}.version-switcher__menu a.list-group-item.active span::before{content:\"\";width:100%;height:100%;position:absolute;z-index:-1;left:0;top:0}.version-switcher__menu a.list-group-item:focus-visible{z-index:10}button.version-switcher__button,.version-switcher__menu{font-size:1.1em;z-index:1055;box-sizing:border-box;min-width:24px;min-height:24px}@media(min-width: 960px){button.version-switcher__button,.version-switcher__menu{font-size:unset}}nav.page-toc{margin-bottom:1rem}.bd-toc .nav .nav{display:none}.bd-toc .nav .nav.visible{display:block}.bd-toc .nav>.active>ul{display:block}.toc-entry{display:block}.toc-entry a>code{color:var(--pst-color-text-muted)}.toc-entry a.nav-link{display:block;padding:.125rem 0;padding-left:1rem;margin-left:-1rem;color:var(--pst-color-text-muted);text-decoration:none}.toc-entry a.nav-link:hover{text-decoration:underline;background-color:rgba(0,0,0,0);color:var(--pst-color-link-hover);text-decoration-thickness:max(3px, .1875rem, .12em);text-decoration-skip-ink:none}.toc-entry a.nav-link:active{color:var(--pst-color-link-hover)}.toc-entry a.nav-link:focus-visible{box-shadow:0 0 0 .1875rem var(--pst-color-accent);outline:none;z-index:10}.toc-entry a.nav-link.active{font-weight:600;color:var(--pst-color-primary);box-shadow:inset max(3px, .1875rem, .12em) 0 0 var(--pst-color-primary);background-color:rgba(0,0,0,0)}.toc-entry a.nav-link.active:focus-visible{box-shadow:inset max(3px, .1875rem, .12em) 0 0 var(--pst-color-primary),0 0 0 .1875rem var(--pst-color-accent);outline:none}.toc-entry a.nav-link.active:hover{color:var(--pst-color-link-hover)}.toc-entry a.nav-link:focus-visible{border-radius:.125rem}div.versionadded,div.versionchanged,div.deprecated{vertical-align:middle;margin:1.5625em auto;padding:0 .6rem;overflow:hidden;page-break-inside:avoid;break-inside:avoid;border-left:.2rem solid;border-color:var(--pst-color-info);border-radius:.25rem;background-color:var(--pst-color-on-background);box-shadow:0 .2rem .5rem var(--pst-color-shadow),0 0 .0625rem var(--pst-color-shadow) !important;position:relative}div.versionadded>p,div.versionchanged>p,div.deprecated>p{margin-bottom:.6rem;margin-top:.6rem}div.versionadded{border-color:var(--pst-color-success);background-color:var(--pst-color-success-bg)}div.versionchanged{border-color:var(--pst-color-warning);background-color:var(--pst-color-warning-bg)}div.deprecated{border-color:var(--pst-color-danger);background-color:var(--pst-color-danger-bg)}span.versionmodified{font-weight:600}span.versionmodified::before{margin-right:.6rem;color:var(--pst-color-info);font:var(--fa-font-solid);content:var(--pst-icon-versionmodified-default)}span.versionmodified.added::before{color:var(--pst-color-success);content:var(--pst-icon-versionmodified-added)}span.versionmodified.changed::before{color:var(--pst-color-warning);content:var(--pst-icon-versionmodified-changed)}span.versionmodified.deprecated::before{color:var(--pst-color-danger);content:var(--pst-icon-versionmodified-deprecated)}.sidebar-indices-items{display:flex;flex-direction:column;border-top:1px solid var(--pst-color-border)}@media(min-width: 960px){.sidebar-indices-items{border-top:none}}.sidebar-indices-items .sidebar-indices-items__title{font-weight:var(--pst-sidebar-header-font-weight);font-size:var(--pst-sidebar-header-font-size);color:var(--pst-color-text-base);margin-bottom:.5rem}.sidebar-indices-items ul.indices-link{margin-right:-1rem;list-style:none;padding:0}.sidebar-indices-items ul.indices-link li>a{display:block;padding:.25rem 0;color:var(--pst-color-text-muted)}.sidebar-indices-items ul.indices-link li>a:hover{color:var(--pst-color-primary);text-decoration:none;background-color:rgba(0,0,0,0)}.bd-sidebar-primary div#rtd-footer-container{position:sticky;bottom:-1rem;margin:-1rem}.bd-sidebar-primary div#rtd-footer-container .rst-versions.rst-badge{position:unset;font-size:.9em;font-family:var(--pst-font-family-base);max-width:unset}.bd-sidebar-primary div#rtd-footer-container .rst-versions.rst-badge .rst-current-version{display:flex;align-items:center;gap:.2rem;height:2.5rem;transition:background-color .2s ease-out;background-color:var(--pst-color-background);color:var(--pst-color-success);border-top:1px solid var(--pst-color-border)}.bd-sidebar-primary div#rtd-footer-container .rst-versions.rst-badge .fa.fa-book{color:var(--pst-color-text-muted);margin-right:auto}.bd-sidebar-primary div#rtd-footer-container .rst-versions.rst-badge .fa.fa-book::after{color:var(--pst-color-text-base);content:\"Read The Docs\";font-family:var(--pst-font-family-base);font-weight:var(--pst-admonition-font-weight-heading)}.bd-sidebar-primary div#rtd-footer-container .rst-versions.rst-badge .fa.fa-caret-down{color:var(--pst-color-text-muted)}.bd-sidebar-primary div#rtd-footer-container .rst-versions.rst-badge.shift-up .rst-current-version{border-bottom:1px solid var(--pst-color-border)}.bd-sidebar-primary div#rtd-footer-container .rst-other-versions{background-color:var(--pst-color-surface);color:var(--pst-color-text-base)}.bd-sidebar-primary div#rtd-footer-container .rst-other-versions dl dd a{color:var(--pst-color-text-muted)}.bd-sidebar-primary div#rtd-footer-container .rst-other-versions hr{background-color:var(--pst-color-border)}.bd-sidebar-primary div#rtd-footer-container .rst-other-versions small a{color:var(--pst-color-link)}.bd-sidebar-primary div#rtd-footer-container .rst-other-versions input{padding-left:.5rem;border:1px solid var(--pst-color-border);background-color:var(--pst-color-surface)}div.admonition,.admonition{margin:1.5625em auto;padding:0 .6rem .8rem;overflow:hidden;page-break-inside:avoid;break-inside:avoid;border-left:.2rem solid;border-color:var(--pst-color-info);border-radius:.25rem;background-color:var(--pst-color-on-background);box-shadow:0 .2rem .5rem var(--pst-color-shadow),0 0 .0625rem var(--pst-color-shadow) !important}div.admonition *:last-child,.admonition *:last-child{margin-bottom:0}div.admonition p.admonition-title~*,.admonition p.admonition-title~*{margin-left:1.4rem;margin-right:1.4rem}div.admonition>ol,div.admonition>ul,.admonition>ol,.admonition>ul{margin-left:1em}div.admonition>.admonition-title,.admonition>.admonition-title{margin:0 -0.6rem;padding:.4rem .6rem .4rem 2rem;font-weight:var(--pst-admonition-font-weight-heading);position:relative;background-color:var(--pst-color-info-bg);z-index:1}div.admonition>.admonition-title::before,.admonition>.admonition-title::before{content:\"\";width:100%;height:100%;position:absolute;left:0;top:0;z-index:-1;pointer-events:none}div.admonition>.admonition-title::after,.admonition>.admonition-title::after{position:absolute;left:.5rem;width:1rem;height:1rem;color:var(--pst-color-info);font:var(--fa-font-solid);line-height:inherit;content:var(--pst-icon-admonition-default);opacity:1}div.admonition>.admonition-title+*,.admonition>.admonition-title+*{margin-top:.4em}div.admonition.attention,.admonition.attention{border-color:var(--pst-color-attention)}div.admonition.attention>.admonition-title,.admonition.attention>.admonition-title{background-color:var(--pst-color-attention-bg)}div.admonition.attention>.admonition-title::after,.admonition.attention>.admonition-title::after{color:var(--pst-color-attention);content:var(--pst-icon-admonition-attention)}div.admonition.caution,.admonition.caution{border-color:var(--pst-color-warning)}div.admonition.caution>.admonition-title,.admonition.caution>.admonition-title{background-color:var(--pst-color-warning-bg)}div.admonition.caution>.admonition-title::after,.admonition.caution>.admonition-title::after{color:var(--pst-color-warning);content:var(--pst-icon-admonition-caution)}div.admonition.warning,.admonition.warning{border-color:var(--pst-color-warning)}div.admonition.warning>.admonition-title,.admonition.warning>.admonition-title{background-color:var(--pst-color-warning-bg)}div.admonition.warning>.admonition-title::after,.admonition.warning>.admonition-title::after{color:var(--pst-color-warning);content:var(--pst-icon-admonition-warning)}div.admonition.danger,.admonition.danger{border-color:var(--pst-color-danger)}div.admonition.danger>.admonition-title,.admonition.danger>.admonition-title{background-color:var(--pst-color-danger-bg)}div.admonition.danger>.admonition-title::after,.admonition.danger>.admonition-title::after{color:var(--pst-color-danger);content:var(--pst-icon-admonition-danger)}div.admonition.error,.admonition.error{border-color:var(--pst-color-danger)}div.admonition.error>.admonition-title,.admonition.error>.admonition-title{background-color:var(--pst-color-danger-bg)}div.admonition.error>.admonition-title::after,.admonition.error>.admonition-title::after{color:var(--pst-color-danger);content:var(--pst-icon-admonition-error)}div.admonition.hint,.admonition.hint{border-color:var(--pst-color-success)}div.admonition.hint>.admonition-title,.admonition.hint>.admonition-title{background-color:var(--pst-color-success-bg)}div.admonition.hint>.admonition-title::after,.admonition.hint>.admonition-title::after{color:var(--pst-color-success);content:var(--pst-icon-admonition-hint)}div.admonition.tip,.admonition.tip{border-color:var(--pst-color-success)}div.admonition.tip>.admonition-title,.admonition.tip>.admonition-title{background-color:var(--pst-color-success-bg)}div.admonition.tip>.admonition-title::after,.admonition.tip>.admonition-title::after{color:var(--pst-color-success);content:var(--pst-icon-admonition-tip)}div.admonition.important,.admonition.important{border-color:var(--pst-color-attention)}div.admonition.important>.admonition-title,.admonition.important>.admonition-title{background-color:var(--pst-color-attention-bg)}div.admonition.important>.admonition-title::after,.admonition.important>.admonition-title::after{color:var(--pst-color-attention);content:var(--pst-icon-admonition-important)}div.admonition.note,.admonition.note{border-color:var(--pst-color-info)}div.admonition.note>.admonition-title,.admonition.note>.admonition-title{background-color:var(--pst-color-info-bg)}div.admonition.note>.admonition-title::after,.admonition.note>.admonition-title::after{color:var(--pst-color-info);content:var(--pst-icon-admonition-note)}div.admonition.seealso,.admonition.seealso{border-color:var(--pst-color-success)}div.admonition.seealso>.admonition-title,.admonition.seealso>.admonition-title{background-color:var(--pst-color-success-bg)}div.admonition.seealso>.admonition-title::after,.admonition.seealso>.admonition-title::after{color:var(--pst-color-success);content:var(--pst-icon-admonition-seealso)}div.admonition.admonition-todo,.admonition.admonition-todo{border-color:var(--pst-color-secondary)}div.admonition.admonition-todo>.admonition-title,.admonition.admonition-todo>.admonition-title{background-color:var(--pst-color-secondary-bg)}div.admonition.admonition-todo>.admonition-title::after,.admonition.admonition-todo>.admonition-title::after{color:var(--pst-color-secondary);content:var(--pst-icon-admonition-todo)}div.admonition.sidebar,.admonition.sidebar{max-width:40%;float:right;clear:both;margin-left:.5rem;margin-top:0;border-width:0 0 0 .2rem}div.admonition.sidebar.attention,div.admonition.sidebar.important,.admonition.sidebar.attention,.admonition.sidebar.important{border-color:var(--pst-color-attention)}div.admonition.sidebar.caution,div.admonition.sidebar.warning,.admonition.sidebar.caution,.admonition.sidebar.warning{border-color:var(--pst-color-warning)}div.admonition.sidebar.danger,div.admonition.sidebar.error,.admonition.sidebar.danger,.admonition.sidebar.error{border-color:var(--pst-color-danger)}div.admonition.sidebar.hint,div.admonition.sidebar.tip,div.admonition.sidebar.seealso,.admonition.sidebar.hint,.admonition.sidebar.tip,.admonition.sidebar.seealso{border-color:var(--pst-color-success)}div.admonition.sidebar.note,div.admonition.sidebar.todo,.admonition.sidebar.note,.admonition.sidebar.todo{border-color:var(--pst-color-info)}div.admonition.sidebar p.admonition-title~*,.admonition.sidebar p.admonition-title~*{margin-left:0;margin-right:0}div.topic,div.topic.contents,nav.contents,aside.topic{display:flex;flex-direction:column;background-color:var(--pst-color-surface);border-color:var(--pst-color-border);border-radius:.25rem;padding:1rem 1.25rem;box-shadow:0 .2rem .5rem var(--pst-color-shadow),0 0 .0625rem var(--pst-color-shadow) !important}div.topic .topic-title,div.topic.contents .topic-title,nav.contents .topic-title,aside.topic .topic-title{margin:0 0 .5rem}div.topic p,div.topic.contents p,nav.contents p,aside.topic p{color:var(--pst-color-on-surface) !important}div.topic ul.simple,div.topic.contents ul.simple,nav.contents ul.simple,aside.topic ul.simple{padding-left:1rem}div.topic ul.simple ul,div.topic.contents ul.simple ul,nav.contents ul.simple ul,aside.topic ul.simple ul{padding-left:2em}aside.sidebar{border:1px solid var(--pst-color-border);background-color:var(--pst-color-surface);border-radius:.25rem;margin-left:.5rem;padding:0}aside.sidebar>*:last-child{padding-bottom:1rem}aside.sidebar p.sidebar-title{position:relative;margin-bottom:0;padding-top:.5rem;padding-bottom:.5rem;border-bottom:1px solid var(--pst-color-border);font-family:var(--pst-font-family-heading);font-weight:var(--pst-admonition-font-weight-heading)}aside.sidebar>*:not(.sidebar-title):first-child,aside.sidebar>p.sidebar-title+*{margin-top:1rem}aside.sidebar>*{padding-left:1rem;padding-right:1rem}p.rubric{display:flex;flex-direction:column}.seealso dd{margin-top:0;margin-bottom:0}table.field-list{border-collapse:separate;border-spacing:10px;margin-left:1px}table.field-list th.field-name{padding:1px 8px 1px 5px;white-space:nowrap;background-color:var(--pst-color-surface)}table.field-list td.field-body p{font-style:italic}table.field-list td.field-body p>strong{font-style:normal}table.field-list td.field-body blockquote{border-left:none;margin:0 0 .3em;padding-left:30px}.table.autosummary td:first-child{white-space:nowrap}.sig{font-family:var(--pst-font-family-monospace)}.sig-inline.c-texpr,.sig-inline.cpp-texpr{font-family:unset}.sig.c .k,.sig.c .kt,.sig.cpp .k,.sig.cpp .kt{color:var(--pst-color-text-base)}.sig.c .m,.sig.cpp .m{color:var(--pst-color-text-base)}.sig.c .s,.sig.c .sc,.sig.cpp .s,.sig.cpp .sc{color:var(--pst-color-text-base)}.sig-name{color:var(--pst-color-inline-code)}.sig-param .o,.sig-param .default_value{color:var(--pst-color-text-muted);font-weight:normal}dt:target,span.highlighted{background-color:var(--pst-color-target)}.viewcode-back{font-family:var(--pst-font-family-base)}.viewcode-block:target{border-top:1px solid var(--pst-color-border);border-bottom:1px solid var(--pst-color-border);position:relative;background-color:var(--pst-color-target)}dl>dt>a:has(.viewcode-link){float:right}dl>dt>a:has(.viewcode-link) .viewcode-link{float:none}dl[class]:not(.option-list,.field-list,.footnote,.glossary,.simple){margin-bottom:3rem}dl[class]:not(.option-list,.field-list,.footnote,.glossary,.simple) dd{margin-left:2rem}dl[class]:not(.option-list,.field-list,.footnote,.glossary,.simple) dd>dl.simple>dt{display:flex}dl[class]:not(.option-list,.field-list,.footnote,.glossary,.simple) dl.field-list{display:grid;grid-template-columns:unset}dl[class]:not(.option-list,.field-list,.footnote,.glossary,.simple) dt.field-odd,dl[class]:not(.option-list,.field-list,.footnote,.glossary,.simple) dt.field-even{margin-top:.2rem;margin-bottom:.1rem;background-color:var(--pst-color-surface)}div[class*=highlight-],div.highlight,div.literal-block-wrapper{display:flex;flex-direction:column;width:unset;border-radius:.25rem;break-inside:avoid}div.literal-block-wrapper{border:1px solid var(--pst-color-border);border-radius:.25rem}div.literal-block-wrapper div.code-block-caption{margin:0;border-bottom:1px solid var(--pst-color-border);padding:.5rem;font-size:1rem;font-weight:var(--pst-font-weight-caption)}div.literal-block-wrapper div.code-block-caption a.headerlink{font-size:inherit}div.literal-block-wrapper div[class*=highlight-]{margin:0;border-radius:0}div.literal-block-wrapper div[class*=highlight-] pre{border:none;box-shadow:none}code.literal{padding:.1rem .25rem;background-color:var(--pst-color-surface);border:1px solid var(--pst-color-border);border-radius:.25rem}a>code{color:var(--pst-color-inline-code-links)}html[data-theme=light] .highlight .nf{color:#0078a1 !important}span.linenos{opacity:.8 !important}figure>a,figure>a>img,figure>img,figure>video{display:block;margin-left:auto;margin-right:auto}figure a.headerlink{position:absolute;font-size:inherit}figure:hover a.headerlink{visibility:visible}figure figcaption{font-family:var(--pst-font-family-heading);font-weight:var(--pst-font-weight-caption);color:var(--pst-color-text-muted);margin-left:auto;margin-right:auto;margin-top:.3rem;text-align:center}figure figcaption>p:last-child{margin-bottom:0}figure figcaption p{text-align:start;display:inline-block}figure figcaption table.table{width:fit-content;margin-left:auto;margin-right:auto}dt.label>span.brackets:not(:only-child)::before{content:\"[\"}dt.label>span.brackets:not(:only-child)::after{content:\"]\"}a.footnote-reference{vertical-align:super;font-size:small}aside.footnote{margin-bottom:.5rem}aside.footnote:last-child{margin-bottom:1rem}aside.footnote span.label,aside.footnote span.backrefs{font-weight:bold}aside.footnote:target{background-color:var(--pst-color-target)}table.highlighttable td.linenos,span.linenos,div.doctest>div.highlight span.gp{user-select:none}dd{margin-top:3px;margin-bottom:10px;margin-left:30px}ol,ul{padding-inline-start:2rem}ol li>p:first-child,ul li>p:first-child{margin-bottom:.25rem;margin-top:.25rem}blockquote{padding:1em;color:var(--pst-color-text-muted);border-left:.25em solid var(--pst-color-blockquote-notch);border-radius:.25rem;position:relative;background-color:var(--pst-color-surface)}blockquote p{color:var(--pst-color-text-base)}blockquote .line-block{margin:0}blockquote p:last-child{margin-bottom:0}blockquote::before{content:\"\";width:100%;height:100%;position:absolute;left:0;top:0;z-index:-1;pointer-events:none}blockquote a{color:var(--pst-color-inline-code-links)}blockquote::before{z-index:-1}span.guilabel{border:1px solid var(--pst-color-info);font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px;position:relative;background-color:var(--pst-color-info-bg)}span.guilabel::before{content:\"\";width:100%;height:100%;position:absolute;left:0;top:0;z-index:-1;pointer-events:none}a.reference.download::before{content:var(--pst-icon-download);font:var(--fa-font-solid);font-size:.8em;padding:0 .25em;color:var(--pst-color-text-muted)}table{margin-left:auto;margin-right:auto}table.table-right{margin-right:0}table.table-left{margin-left:0}table caption{text-align:center;caption-side:top;color:var(--pst-color-text-muted)}th.text-left,td.text-left{text-align:left}th.text-right,td.text-right{text-align:right}th.text-center,td.text-center{text-align:center}.table{color:var(--pst-color-table);border:1px solid var(--pst-color-table-outer-border);--bs-table-bg: transparent;--bs-table-color: var( --pst-color-text-base )}.table th~th,.table th~td,.table td~th,.table td~td{border-left:1px solid var(--pst-color-table-inner-border)}.table thead tr{background-color:var(--pst-color-table-heading-bg);border-bottom:2px solid var(--pst-color-primary)}.table tbody tr:nth-child(odd){background-color:var(--pst-color-table-row-zebra-low-bg)}.table tbody tr:nth-child(even){background-color:var(--pst-color-table-row-zebra-high-bg)}.table tbody tr:hover{background-color:var(--pst-color-table-row-hover-bg)}.pst-scrollable-table-container{overflow-x:auto}.toctree-wrapper p.caption{font-size:1.5em;margin-bottom:0}.toctree-wrapper>ul{padding-left:0}.toctree-wrapper li[class^=toctree-l]{list-style:none;margin-bottom:.2em}.toctree-wrapper li[class^=toctree-l]>a{list-style:none;font-size:1.1em}.toctree-wrapper li[class^=toctree-l]>ul{list-style:none;padding-inline-start:1.5em}.toctree-wrapper .toctree-l1>a{font-size:1.3em}div.topic.contents ul.simple,nav.contents ul.simple{list-style:none;padding-left:0}span.math,div.math{align-items:center;display:flex;max-width:100%;overflow:hidden}span.math{display:inline-flex}div.math{gap:.5em;flex-direction:row-reverse}div.math span.eqno a.headerlink{position:relative;font-size:1em}div.math mjx-container{flex-grow:1;padding-bottom:.2rem;overflow:auto}div.math mjx-container mjx-assistive-mml{height:0}.ablog-sidebar-item h2,.ablog-sidebar-item h3{font-size:var(--pst-sidebar-header-font-size);margin-top:.5rem}.ablog-sidebar-item h2 a,.ablog-sidebar-item h3 a{color:var(--pst-color-text-base)}.ablog-sidebar-item ul{list-style:none;padding-left:0;overflow-y:hidden;display:flex;flex-direction:column;gap:.5em;margin-bottom:0}.ablog-sidebar-item ul.ablog-cloud{flex-flow:row wrap;gap:.5rem}.ablog-sidebar-item ul.ablog-cloud li{display:flex;align-items:center}.ablog__prev-next{font-size:1.2em;display:flex;padding:1rem 0}.ablog__prev-next>span{display:flex;max-width:45%}.ablog__prev-next>span a{display:flex;align-items:center;margin-left:auto;gap:1rem;line-height:1.5rem}.ablog__prev-next>span a i::before{color:var(--pst-color-text-base)}.ablog__prev-next span.ablog__prev i.fa-arrow-circle-left::before{content:var(--pst-icon-angle-left)}.ablog__prev-next span.ablog__spacer{display:none}.ablog__prev-next span.ablog__next{margin-left:auto;text-align:right}.ablog__prev-next span.ablog__next i.fa-arrow-circle-right::before{content:var(--pst-icon-angle-right)}.ablog__collection,.postlist{padding-left:0}.ablog__collection .ablog-post,.postlist .ablog-post{list-style:none}.ablog__collection .ablog-post .ablog-archive,.postlist .ablog-post .ablog-archive{display:flex;flex-flow:row wrap;gap:1rem;list-style:none;font-size:.75rem;padding-left:0}.ablog__collection .ablog-post .ablog-post-title,.postlist .ablog-post .ablog-post-title{margin-top:0;font-size:1.25rem}.ablog__collection .ablog-post .ablog-post-title a,.postlist .ablog-post .ablog-post-title a{font-weight:bold}.ablog__collection .ablog-post .ablog-post-expand,.postlist .ablog-post .ablog-post-expand{margin-bottom:.5rem}.docutils.container{padding-left:unset;padding-right:unset;margin-left:unset;margin-right:unset;max-width:unset;width:unset}.btn{--bs-btn-focus-box-shadow: 0 0 0 0.1875rem var(--pst-color-accent)}div.highlight button.copybtn{display:flex;align-items:center;justify-content:center;border:none;background-color:var(--pst-color-surface)}div.highlight button.copybtn:not(.success){color:var(--pst-color-muted)}div.highlight button.copybtn:hover:not(.success){color:var(--pst-color-text);background-color:var(--pst-color-shadow)}div.highlight button.copybtn.o-tooltip--left::after{color:var(--pst-color-text);background-color:var(--pst-color-surface)}div.highlight button.copybtn:focus{opacity:1}div.highlight button.copybtn:focus-visible{outline:var(--pst-color-accent) solid .1875rem}div.highlight:has(button.copybtn){min-height:2em}#ethical-ad-placement .ethical-sidebar a,#ethical-ad-placement .ethical-sidebar a:visited,#ethical-ad-placement .ethical-sidebar a:hover,#ethical-ad-placement .ethical-sidebar a:active,#ethical-ad-placement .ethical-footer a,#ethical-ad-placement .ethical-footer a:visited,#ethical-ad-placement .ethical-footer a:hover,#ethical-ad-placement .ethical-footer a:active{color:var(--pst-color-text-base)}#ethical-ad-placement .ethical-sidebar,#ethical-ad-placement .ethical-footer{background-color:var(--pst-color-background);border:1px solid var(--pst-color-border);border-radius:5px;color:var(--pst-color-text-base);font-size:14px;line-height:20px}.bd-content div.jupyter_container{border:none;background-color:unset;box-shadow:none}.bd-content div.jupyter_container div.output,.bd-content div.jupyter_container div.highlight{border-radius:.25rem}.bd-content div.jupyter_container div.highlight{background-color:var(--pst-color-surface)}.bd-content div.jupyter_container .cell_input,.bd-content div.jupyter_container .cell_output{border-radius:.25rem}.bd-content div.jupyter_container .cell_input pre,.bd-content div.jupyter_container .cell_output pre{padding:1rem}html[data-theme=dark] div.graphviz>object.inheritance{filter:brightness(0.8) invert(0.82) contrast(1.2);color-scheme:normal}.xr-wrap[hidden]{display:block !important}.jp-OutputArea-output.lm-Widget{overflow:auto}:root{--pst-teal-50: #f4fbfc;--pst-teal-100: #e9f6f8;--pst-teal-200: #d0ecf1;--pst-teal-300: #abdde6;--pst-teal-400: #3fb1c5;--pst-teal-500: #0a7d91;--pst-teal-600: #085d6c;--pst-teal-700: #064752;--pst-teal-800: #042c33;--pst-teal-900: #021b1f;--pst-violet-50: #f4eefb;--pst-violet-100: #e0c7ff;--pst-violet-200: #d5b4fd;--pst-violet-300: #b780ff;--pst-violet-400: #9c5ffd;--pst-violet-500: #8045e5;--pst-violet-600: #6432bd;--pst-violet-700: #4b258f;--pst-violet-800: #341a61;--pst-violet-900: #1e0e39;--pst-gray-50: #f9f9fa;--pst-gray-100: #f3f4f5;--pst-gray-200: #e5e7ea;--pst-gray-300: #d1d5da;--pst-gray-400: #9ca4af;--pst-gray-500: #677384;--pst-gray-600: #48566b;--pst-gray-700: #29313d;--pst-gray-800: #222832;--pst-gray-900: #14181e;--pst-pink-50: #fcf8fd;--pst-pink-100: #fcf0fa;--pst-pink-200: #f8dff5;--pst-pink-300: #f3c7ee;--pst-pink-400: #e47fd7;--pst-pink-500: #c132af;--pst-pink-600: #912583;--pst-pink-700: #6e1c64;--pst-pink-800: #46123f;--pst-pink-900: #2b0b27;--pst-foundation-white: #ffffff;--pst-foundation-black: #14181e}html:not([data-theme]){--pst-color-primary: #0a7d91;--pst-color-primary-bg: #d0ecf1;--pst-color-secondary: #8045e5;--pst-color-secondary-bg: #e0c7ff;--pst-color-accent: #c132af;--pst-color-accent-bg: #f8dff5;--pst-color-info: #276be9;--pst-color-info-bg: #dce7fc;--pst-color-warning: #f66a0a;--pst-color-warning-bg: #f8e3d0;--pst-color-success: #00843f;--pst-color-success-bg: #d6ece1;--pst-color-attention: var(--pst-color-warning);--pst-color-attention-bg: var(--pst-color-warning-bg);--pst-color-danger: #d72d47;--pst-color-danger-bg: #f9e1e4;--pst-color-text-base: #222832;--pst-color-text-muted: #48566b;--pst-color-heading-color: #fff;--pst-color-shadow: rgba(0, 0, 0, 0.1);--pst-color-border: #d1d5da;--pst-color-border-muted: rgba(23, 23, 26, 0.2);--pst-color-blockquote-notch: #677384;--pst-color-inline-code: #912583;--pst-color-inline-code-links: #085d6c;--pst-color-target: #f3cf95;--pst-color-table: #14181e;--pst-color-table-row-hover-bg: #b780ff;--pst-color-table-inner-border: #e5e7ea;--pst-color-background: #ffffff;--pst-color-on-background: #ffffff;--pst-color-surface: #f3f4f5;--pst-color-on-surface: #222832}html:not([data-theme]){--pst-color-link: var(--pst-color-primary);--pst-color-link-hover: var(--pst-color-secondary);--pst-color-table-outer-border: var(--pst-color-surface);--pst-color-table-heading-bg: var(--pst-color-surface);--pst-color-table-row-zebra-high-bg: var(--pst-color-on-background);--pst-color-table-row-zebra-low-bg: var(--pst-color-surface)}html:not([data-theme]) .only-dark,html:not([data-theme]) .only-dark~figcaption{display:none !important}html[data-theme=light]{--pst-color-primary: #0a7d91;--pst-color-primary-bg: #d0ecf1;--pst-color-secondary: #8045e5;--pst-color-secondary-bg: #e0c7ff;--pst-color-accent: #c132af;--pst-color-accent-bg: #f8dff5;--pst-color-info: #276be9;--pst-color-info-bg: #dce7fc;--pst-color-warning: #f66a0a;--pst-color-warning-bg: #f8e3d0;--pst-color-success: #00843f;--pst-color-success-bg: #d6ece1;--pst-color-attention: var(--pst-color-warning);--pst-color-attention-bg: var(--pst-color-warning-bg);--pst-color-danger: #d72d47;--pst-color-danger-bg: #f9e1e4;--pst-color-text-base: #222832;--pst-color-text-muted: #48566b;--pst-color-heading-color: #fff;--pst-color-shadow: rgba(0, 0, 0, 0.1);--pst-color-border: #d1d5da;--pst-color-border-muted: rgba(23, 23, 26, 0.2);--pst-color-blockquote-notch: #677384;--pst-color-inline-code: #912583;--pst-color-inline-code-links: #085d6c;--pst-color-target: #f3cf95;--pst-color-table: #14181e;--pst-color-table-row-hover-bg: #b780ff;--pst-color-table-inner-border: #e5e7ea;--pst-color-background: #ffffff;--pst-color-on-background: #ffffff;--pst-color-surface: #f3f4f5;--pst-color-on-surface: #222832;color-scheme:light}html[data-theme=light]{--pst-color-link: var(--pst-color-primary);--pst-color-link-hover: var(--pst-color-secondary);--pst-color-table-outer-border: var(--pst-color-surface);--pst-color-table-heading-bg: var(--pst-color-surface);--pst-color-table-row-zebra-high-bg: var(--pst-color-on-background);--pst-color-table-row-zebra-low-bg: var(--pst-color-surface)}html[data-theme=light] .only-dark,html[data-theme=light] .only-dark~figcaption{display:none !important}html[data-theme=dark]{--pst-color-primary: #3fb1c5;--pst-color-primary-bg: #042c33;--pst-color-secondary: #9c5ffd;--pst-color-secondary-bg: #341a61;--pst-color-accent: #e47fd7;--pst-color-accent-bg: #46123f;--pst-color-info: #79a3f2;--pst-color-info-bg: #06245d;--pst-color-warning: #ff9245;--pst-color-warning-bg: #652a02;--pst-color-success: #5fb488;--pst-color-success-bg: #002f17;--pst-color-attention: var(--pst-color-warning);--pst-color-attention-bg: var(--pst-color-warning-bg);--pst-color-danger: #e78894;--pst-color-danger-bg: #4e111b;--pst-color-text-base: #ced6dd;--pst-color-text-muted: #9ca4af;--pst-color-heading-color: #14181e;--pst-color-shadow: rgba(0, 0, 0, 0.2);--pst-color-border: #48566b;--pst-color-border-muted: #29313d;--pst-color-blockquote-notch: #9ca4af;--pst-color-inline-code: #f3c7ee;--pst-color-inline-code-links: #3fb1c5;--pst-color-target: #675c04;--pst-color-table: #ffffff;--pst-color-table-row-hover-bg: #6432bd;--pst-color-table-inner-border: #364150;--pst-color-background: #14181e;--pst-color-on-background: #222832;--pst-color-surface: #29313d;--pst-color-on-surface: #f3f4f5;color-scheme:dark}html[data-theme=dark]{--pst-color-link: var(--pst-color-primary);--pst-color-link-hover: var(--pst-color-secondary);--pst-color-table-outer-border: var(--pst-color-surface);--pst-color-table-heading-bg: var(--pst-color-surface);--pst-color-table-row-zebra-high-bg: var(--pst-color-on-background);--pst-color-table-row-zebra-low-bg: var(--pst-color-surface)}html[data-theme=dark] .only-light,html[data-theme=dark] .only-light~figcaption{display:none !important}html[data-theme=dark] img:not(.only-dark,.dark-light){filter:brightness(0.8) contrast(1.2)}html[data-theme=dark] .bd-content img:not(.only-dark,.dark-light){background-color:#fff;border-radius:.25rem}html[data-theme=dark] .MathJax_SVG *{fill:var(--pst-color-text-base)}.pst-color-primary{color:var(--pst-color-primary)}.pst-color-secondary{color:var(--pst-color-secondary)}.pst-color-accent{color:var(--pst-color-accent)}.pst-color-info{color:var(--pst-color-info)}.pst-color-warning{color:var(--pst-color-warning)}.pst-color-success{color:var(--pst-color-success)}.pst-color-attention{color:var(--pst-color-attention)}.pst-color-danger{color:var(--pst-color-danger)}.pst-color-text-base{color:var(--pst-color-text-base)}.pst-color-text-muted{color:var(--pst-color-text-muted)}.pst-color-heading-color{color:var(--pst-color-heading-color)}.pst-color-shadow{color:var(--pst-color-shadow)}.pst-color-border{color:var(--pst-color-border)}.pst-color-border-muted{color:var(--pst-color-border-muted)}.pst-color-blockquote-notch{color:var(--pst-color-blockquote-notch)}.pst-color-inline-code{color:var(--pst-color-inline-code)}.pst-color-inline-code-links{color:var(--pst-color-inline-code-links)}.pst-color-target{color:var(--pst-color-target)}.pst-color-table{color:var(--pst-color-table)}.pst-color-table-row-hover{color:var(--pst-color-table-row-hover)}.pst-color-table-inner-border{color:var(--pst-color-table-inner-border)}.pst-color-background{color:var(--pst-color-background)}.pst-color-on-background{color:var(--pst-color-on-background)}.pst-color-surface{color:var(--pst-color-surface)}.pst-color-on-surface{color:var(--pst-color-on-surface)}html[data-theme=light]{--pst-color-primary: rgb(10, 125, 145);--pst-color-primary-text: #fff;--pst-color-primary-highlight: #053f49;--sd-color-primary: var(--pst-color-primary);--sd-color-primary-text: var(--pst-color-primary-text);--sd-color-primary-highlight: var(--pst-color-primary-highlight);--sd-color-primary-bg: #d0ecf1;--sd-color-primary-bg-text: #14181e;--pst-color-secondary: rgb(128, 69, 229);--pst-color-secondary-text: #fff;--pst-color-secondary-highlight: #591bc2;--sd-color-secondary: var(--pst-color-secondary);--sd-color-secondary-text: var(--pst-color-secondary-text);--sd-color-secondary-highlight: var(--pst-color-secondary-highlight);--sd-color-secondary-bg: #e0c7ff;--sd-color-secondary-bg-text: #14181e;--pst-color-success: #00843f;--pst-color-success-text: #fff;--pst-color-success-highlight: #00381a;--sd-color-success: var(--pst-color-success);--sd-color-success-text: var(--pst-color-success-text);--sd-color-success-highlight: var(--pst-color-success-highlight);--sd-color-success-bg: #d6ece1;--sd-color-success-bg-text: #14181e;--pst-color-info: #276be9;--pst-color-info-text: #fff;--pst-color-info-highlight: #124ab1;--sd-color-info: var(--pst-color-info);--sd-color-info-text: var(--pst-color-info-text);--sd-color-info-highlight: var(--pst-color-info-highlight);--sd-color-info-bg: #dce7fc;--sd-color-info-bg-text: #14181e;--pst-color-warning: #f66a0a;--pst-color-warning-text: #14181e;--pst-color-warning-highlight: #ad4a06;--sd-color-warning: var(--pst-color-warning);--sd-color-warning-text: var(--pst-color-warning-text);--sd-color-warning-highlight: var(--pst-color-warning-highlight);--sd-color-warning-bg: #f8e3d0;--sd-color-warning-bg-text: #14181e;--pst-color-danger: #d72d47;--pst-color-danger-text: #fff;--pst-color-danger-highlight: #9a1d30;--sd-color-danger: var(--pst-color-danger);--sd-color-danger-text: var(--pst-color-danger-text);--sd-color-danger-highlight: var(--pst-color-danger-highlight);--sd-color-danger-bg: #f9e1e4;--sd-color-danger-bg-text: #14181e;--pst-color-light: #f3f4f5;--pst-color-light-text: #14181e;--pst-color-light-highlight: #c9ced2;--sd-color-light: var(--pst-color-light);--sd-color-light-text: var(--pst-color-light-text);--sd-color-light-highlight: var(--pst-color-light-highlight);--sd-color-light-bg: #f7f7f8;--sd-color-light-bg-text: #14181e;--pst-color-muted: #29313d;--pst-color-muted-text: #fff;--pst-color-muted-highlight: #0a0c0f;--sd-color-muted: var(--pst-color-muted);--sd-color-muted-text: var(--pst-color-muted-text);--sd-color-muted-highlight: var(--pst-color-muted-highlight);--sd-color-muted-bg: #5a6c86;--sd-color-muted-bg-text: #fff;--pst-color-dark: #222832;--pst-color-dark-text: #fff;--pst-color-dark-highlight: #030404;--sd-color-dark: var(--pst-color-dark);--sd-color-dark-text: var(--pst-color-dark-text);--sd-color-dark-highlight: var(--pst-color-dark-highlight);--pst-color-black: #14181e;--pst-color-black-text: #fff;--pst-color-black-highlight: black;--sd-color-black: var(--pst-color-black);--sd-color-black-text: var(--pst-color-black-text);--sd-color-black-highlight: var(--pst-color-black-highlight);--pst-color-white: #fff;--pst-color-white-text: #14181e;--pst-color-white-highlight: #d9d9d9;--sd-color-white: var(--pst-color-white);--sd-color-white-text: var(--pst-color-white-text);--sd-color-white-highlight: var(--pst-color-white-highlight)}html[data-theme=dark]{--pst-color-primary: rgb(63, 177, 197);--pst-color-primary-text: #14181e;--pst-color-primary-highlight: #2b7e8d;--sd-color-primary: var(--pst-color-primary);--sd-color-primary-text: var(--pst-color-primary-text);--sd-color-primary-highlight: var(--pst-color-primary-highlight);--sd-color-primary-bg: #042c33;--sd-color-primary-bg-text: #fff;--pst-color-secondary: rgb(156, 95, 253);--pst-color-secondary-text: #14181e;--pst-color-secondary-highlight: #6d13fc;--sd-color-secondary: var(--pst-color-secondary);--sd-color-secondary-text: var(--pst-color-secondary-text);--sd-color-secondary-highlight: var(--pst-color-secondary-highlight);--sd-color-secondary-bg: #341a61;--sd-color-secondary-bg-text: #fff;--pst-color-success: #5fb488;--pst-color-success-text: #14181e;--pst-color-success-highlight: #3f8762;--sd-color-success: var(--pst-color-success);--sd-color-success-text: var(--pst-color-success-text);--sd-color-success-highlight: var(--pst-color-success-highlight);--sd-color-success-bg: #002f17;--sd-color-success-bg-text: #fff;--pst-color-info: #79a3f2;--pst-color-info-text: #14181e;--pst-color-info-highlight: #3373eb;--sd-color-info: var(--pst-color-info);--sd-color-info-text: var(--pst-color-info-text);--sd-color-info-highlight: var(--pst-color-info-highlight);--sd-color-info-bg: #06245d;--sd-color-info-bg-text: #fff;--pst-color-warning: #ff9245;--pst-color-warning-text: #14181e;--pst-color-warning-highlight: #f86600;--sd-color-warning: var(--pst-color-warning);--sd-color-warning-text: var(--pst-color-warning-text);--sd-color-warning-highlight: var(--pst-color-warning-highlight);--sd-color-warning-bg: #652a02;--sd-color-warning-bg-text: #fff;--pst-color-danger: #e78894;--pst-color-danger-text: #14181e;--pst-color-danger-highlight: #da485b;--sd-color-danger: var(--pst-color-danger);--sd-color-danger-text: var(--pst-color-danger-text);--sd-color-danger-highlight: var(--pst-color-danger-highlight);--sd-color-danger-bg: #4e111b;--sd-color-danger-bg-text: #fff;--pst-color-light: #f3f4f5;--pst-color-light-text: #14181e;--pst-color-light-highlight: #c9ced2;--sd-color-light: var(--pst-color-light);--sd-color-light-text: var(--pst-color-light-text);--sd-color-light-highlight: var(--pst-color-light-highlight);--sd-color-light-bg: #a3abb2;--sd-color-light-bg-text: #14181e;--pst-color-muted: #f3f4f5;--pst-color-muted-text: #14181e;--pst-color-muted-highlight: #c9ced2;--sd-color-muted: var(--pst-color-muted);--sd-color-muted-text: var(--pst-color-muted-text);--sd-color-muted-highlight: var(--pst-color-muted-highlight);--sd-color-muted-bg: #1d222b;--sd-color-muted-bg-text: #fff;--pst-color-dark: #222832;--pst-color-dark-text: #fff;--pst-color-dark-highlight: #030404;--sd-color-dark: var(--pst-color-dark);--sd-color-dark-text: var(--pst-color-dark-text);--sd-color-dark-highlight: var(--pst-color-dark-highlight);--pst-color-black: #14181e;--pst-color-black-text: #fff;--pst-color-black-highlight: black;--sd-color-black: var(--pst-color-black);--sd-color-black-text: var(--pst-color-black-text);--sd-color-black-highlight: var(--pst-color-black-highlight);--pst-color-white: #fff;--pst-color-white-text: #14181e;--pst-color-white-highlight: #d9d9d9;--sd-color-white: var(--pst-color-white);--sd-color-white-text: var(--pst-color-white-text);--sd-color-white-highlight: var(--pst-color-white-highlight)}html[data-theme=light]{--sd-color-card-border: var(--pst-color-border)}html[data-theme=dark]{--sd-color-card-border: var(--pst-color-border)}html[data-theme=light] .sd-shadow-xs,html[data-theme=light] .sd-shadow-sm,html[data-theme=light] .sd-shadow-md,html[data-theme=light] .sd-shadow-lg{box-shadow:0 .2rem .5rem var(--pst-color-shadow),0 0 .0625rem var(--pst-color-shadow) !important}.bd-content .sd-card{border:1px solid var(--pst-color-border)}.bd-content .sd-card .sd-card-header{background-color:var(--pst-color-panel-background);border-bottom:1px solid var(--pst-color-border)}.bd-content .sd-card .sd-card-footer{background-color:var(--pst-color-panel-background);border-top:1px solid var(--pst-color-border)}.bd-content .sd-card .sd-card-body{background-color:var(--pst-color-panel-background)}.bd-content .sd-card .sd-stretched-link:focus-visible{outline:none}.bd-content .sd-card .sd-stretched-link:focus-visible::after{outline:var(--pst-color-accent) solid .1875rem;border-radius:.25rem}.bd-content .sd-card.sd-card-hover:hover{border-color:var(--pst-color-link-hover)}.bd-content .sd-tab-set>input:checked+label{border-style:solid solid none;border-color:var(--pst-color-primary) var(--pst-color-primary) rgba(0,0,0,0);border-width:.125rem .125rem 0;border-radius:.125rem .125rem 0 0;background-color:var(--pst-color-on-background);transform:translateY(0.125rem);color:var(--pst-color-primary)}.bd-content .sd-tab-set>input:focus-visible+label{border:.125rem solid var(--pst-color-accent);border-radius:.125rem;background-color:var(--pst-color-accent-bg);color:var(--pst-color-on-surface)}.bd-content .sd-tab-set>input:not(:checked,:focus-visible)+label:hover{border-color:rgba(0,0,0,0);color:var(--pst-color-secondary);text-decoration-line:underline;text-decoration-thickness:max(3px, .1875rem, .12em)}.bd-content .sd-tab-set>label{color:var(--pst-color-on-surface);border:.125rem solid rgba(0,0,0,0);border-radius:.125rem .125rem 0 0;background-color:var(--pst-color-surface);padding:0 .75em;margin-inline-end:.25rem;line-height:1.95}html[data-theme=dark] .bd-content .sd-tab-set>label{background-color:var(--pst-color-on-background)}.bd-content .sd-tab-set .sd-tab-content{border:.125rem solid var(--pst-color-primary);border-radius:.1875rem;box-shadow:unset;padding:.625rem;background-color:var(--pst-color-on-background)}details.sd-dropdown{border:0 !important;box-shadow:0 .2rem .5rem var(--pst-color-shadow),0 0 .0625rem var(--pst-color-shadow) !important}details.sd-dropdown summary.sd-card-header{border:0 !important;display:flex;align-items:center;position:relative;font-weight:600;padding-top:.5rem;padding-bottom:.5rem;--pst-sd-dropdown-color: var(--pst-gray-500);--pst-sd-dropdown-bg-color: var(--pst-color-surface);background-color:var(--pst-sd-dropdown-bg-color) !important;border-left:.2rem solid var(--pst-sd-dropdown-color) !important}details.sd-dropdown summary.sd-card-header+div.sd-summary-content{border:0;--pst-sd-dropdown-color: var(--sd-color-card-border)}details.sd-dropdown summary.sd-card-header.sd-bg-primary{--pst-sd-dropdown-color: var(--sd-color-primary);--pst-sd-dropdown-bg-color: var(--sd-color-primary-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-primary+div.sd-summary-content{--pst-sd-dropdown-color: var(--sd-color-primary);--pst-sd-dropdown-bg-color: var(--sd-color-primary-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-text-primary{color:var(--sd-color-primary-bg-text) !important}details.sd-dropdown summary.sd-card-header.sd-bg-secondary{--pst-sd-dropdown-color: var(--sd-color-secondary);--pst-sd-dropdown-bg-color: var(--sd-color-secondary-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-secondary+div.sd-summary-content{--pst-sd-dropdown-color: var(--sd-color-secondary);--pst-sd-dropdown-bg-color: var(--sd-color-secondary-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-text-secondary{color:var(--sd-color-secondary-bg-text) !important}details.sd-dropdown summary.sd-card-header.sd-bg-success{--pst-sd-dropdown-color: var(--sd-color-success);--pst-sd-dropdown-bg-color: var(--sd-color-success-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-success+div.sd-summary-content{--pst-sd-dropdown-color: var(--sd-color-success);--pst-sd-dropdown-bg-color: var(--sd-color-success-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-text-success{color:var(--sd-color-success-bg-text) !important}details.sd-dropdown summary.sd-card-header.sd-bg-info{--pst-sd-dropdown-color: var(--sd-color-info);--pst-sd-dropdown-bg-color: var(--sd-color-info-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-info+div.sd-summary-content{--pst-sd-dropdown-color: var(--sd-color-info);--pst-sd-dropdown-bg-color: var(--sd-color-info-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-text-info{color:var(--sd-color-info-bg-text) !important}details.sd-dropdown summary.sd-card-header.sd-bg-warning{--pst-sd-dropdown-color: var(--sd-color-warning);--pst-sd-dropdown-bg-color: var(--sd-color-warning-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-warning+div.sd-summary-content{--pst-sd-dropdown-color: var(--sd-color-warning);--pst-sd-dropdown-bg-color: var(--sd-color-warning-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-text-warning{color:var(--sd-color-warning-bg-text) !important}details.sd-dropdown summary.sd-card-header.sd-bg-danger{--pst-sd-dropdown-color: var(--sd-color-danger);--pst-sd-dropdown-bg-color: var(--sd-color-danger-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-danger+div.sd-summary-content{--pst-sd-dropdown-color: var(--sd-color-danger);--pst-sd-dropdown-bg-color: var(--sd-color-danger-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-text-danger{color:var(--sd-color-danger-bg-text) !important}details.sd-dropdown summary.sd-card-header.sd-bg-light{--pst-sd-dropdown-color: var(--sd-color-light);--pst-sd-dropdown-bg-color: var(--sd-color-light-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-light+div.sd-summary-content{--pst-sd-dropdown-color: var(--sd-color-light);--pst-sd-dropdown-bg-color: var(--sd-color-light-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-text-light{color:var(--sd-color-light-bg-text) !important}details.sd-dropdown summary.sd-card-header.sd-bg-muted{--pst-sd-dropdown-color: var(--sd-color-muted);--pst-sd-dropdown-bg-color: var(--sd-color-muted-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-muted+div.sd-summary-content{--pst-sd-dropdown-color: var(--sd-color-muted);--pst-sd-dropdown-bg-color: var(--sd-color-muted-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-text-muted{color:var(--sd-color-muted-bg-text) !important}details.sd-dropdown summary.sd-card-header.sd-bg-dark{--pst-sd-dropdown-color: var(--sd-color-dark);--pst-sd-dropdown-bg-color: var(--sd-color-dark-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-dark+div.sd-summary-content{--pst-sd-dropdown-color: var(--sd-color-dark);--pst-sd-dropdown-bg-color: var(--sd-color-dark-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-text-dark{color:var(--sd-color-dark-bg-text) !important}details.sd-dropdown summary.sd-card-header.sd-bg-black{--pst-sd-dropdown-color: var(--sd-color-black);--pst-sd-dropdown-bg-color: var(--sd-color-black-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-black+div.sd-summary-content{--pst-sd-dropdown-color: var(--sd-color-black);--pst-sd-dropdown-bg-color: var(--sd-color-black-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-text-black{color:var(--sd-color-black-bg-text) !important}details.sd-dropdown summary.sd-card-header.sd-bg-white{--pst-sd-dropdown-color: var(--sd-color-white);--pst-sd-dropdown-bg-color: var(--sd-color-white-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-white+div.sd-summary-content{--pst-sd-dropdown-color: var(--sd-color-white);--pst-sd-dropdown-bg-color: var(--sd-color-white-bg)}details.sd-dropdown summary.sd-card-header.sd-bg-text-white{color:var(--sd-color-white-bg-text) !important}details.sd-dropdown summary.sd-card-header::before{content:\"\";width:100%;height:100%;position:absolute;left:0;top:0;z-index:-1;pointer-events:none}details.sd-dropdown summary.sd-card-header+div.sd-summary-content{border-left:.2rem solid var(--pst-sd-dropdown-color) !important;border-bottom-left-radius:calc(.25rem - 1px);background-color:var(--pst-color-on-background)}details.sd-dropdown summary.sd-card-header span.sd-summary-icon{display:inline-flex;align-items:center;color:var(--pst-sd-dropdown-color) !important}details.sd-dropdown summary.sd-card-header span.sd-summary-icon svg{opacity:1}details.sd-dropdown summary.sd-card-header .sd-summary-up,details.sd-dropdown summary.sd-card-header .sd-summary-down{top:.7rem}details.sd-dropdown summary.sd-card-header:focus-visible{outline:var(--pst-color-accent) solid .1875rem;outline-offset:-0.1875rem}html .sd-btn{min-width:2.25rem;padding:.3125rem .75rem .4375rem}html .sd-btn:hover{text-decoration:underline;text-decoration-thickness:max(1px, .0625rem);text-underline-offset:.1578em;text-decoration-thickness:max(3px, .1875rem, .12em);text-decoration-skip-ink:none;color:var(--pst-color-link-hover);text-decoration-thickness:1px}html .sd-btn-primary:focus-visible,html .sd-btn-outline-primary:focus-visible{background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;outline:var(--sd-color-primary) solid .1875rem;outline-offset:.1875rem}html .sd-btn-secondary:focus-visible,html .sd-btn-outline-secondary:focus-visible{background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;outline:var(--sd-color-secondary) solid .1875rem;outline-offset:.1875rem}html .sd-btn-success:focus-visible,html .sd-btn-outline-success:focus-visible{background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;outline:var(--sd-color-success) solid .1875rem;outline-offset:.1875rem}html .sd-btn-info:focus-visible,html .sd-btn-outline-info:focus-visible{background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;outline:var(--sd-color-info) solid .1875rem;outline-offset:.1875rem}html .sd-btn-warning:focus-visible,html .sd-btn-outline-warning:focus-visible{background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;outline:var(--sd-color-warning) solid .1875rem;outline-offset:.1875rem}html .sd-btn-danger:focus-visible,html .sd-btn-outline-danger:focus-visible{background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;outline:var(--sd-color-danger) solid .1875rem;outline-offset:.1875rem}html .sd-btn-light:focus-visible,html .sd-btn-outline-light:focus-visible{background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;outline:var(--sd-color-light) solid .1875rem;outline-offset:.1875rem}html .sd-btn-muted:focus-visible,html .sd-btn-outline-muted:focus-visible{background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;outline:var(--sd-color-muted) solid .1875rem;outline-offset:.1875rem}html .sd-btn-dark:focus-visible,html .sd-btn-outline-dark:focus-visible{background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;outline:var(--sd-color-dark) solid .1875rem;outline-offset:.1875rem}html .sd-btn-black:focus-visible,html .sd-btn-outline-black:focus-visible{background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;outline:var(--sd-color-black) solid .1875rem;outline-offset:.1875rem}html .sd-btn-white:focus-visible,html .sd-btn-outline-white:focus-visible{background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;outline:var(--sd-color-white) solid .1875rem;outline-offset:.1875rem}.bd-content .admonition button.toggle-button{color:inherit}.bd-content .admonition button.toggle-button.toggle-button-hidden .toggle-chevron-right{transform:rotate(90deg);transition:none}.bd-content .admonition button.toggle-button .toggle-chevron-right{transform:rotate(-90deg);transition:none}.bd-content .admonition:focus-within{overflow:visible}.bd-content .admonition:focus-within .admonition-title:focus-within::before{content:\"\";transform:translateX(-0.2rem);width:calc(100% + .2rem);height:100%;border:var(--pst-color-accent) solid .1875rem;border-radius:.1875rem}.bd-content .admonition:focus-within:not(.toggle-hidden) .admonition-title:focus-within::before{border-bottom-left-radius:0;border-bottom-right-radius:0}.bd-content details.toggle-details summary{border-left:3px solid var(--pst-color-primary)}.bd-content details.toggle-details summary .toggle-chevron-right{transform:rotate(90deg);transition:none}.bd-content details.toggle-details[open] .toggle-chevron-right{transform:rotate(-90deg);transition:none}.bd-content details.toggle-details[open] :focus-visible{border-bottom-left-radius:0;border-bottom-right-radius:0}html div.rendered_html,html .jp-RenderedHTMLCommon{margin:.1875rem}html div.rendered_html table,html .jp-RenderedHTMLCommon table{table-layout:auto}.bd-content .nboutput .output_area.rendered_html table.dataframe,.bd-content .nboutput .output_area .jp-RenderedHTMLCommon table.dataframe{color:var(--pst-color-table);border:1px solid var(--pst-color-table-outer-border)}.bd-content .nboutput .output_area.rendered_html table.dataframe th~th,.bd-content .nboutput .output_area.rendered_html table.dataframe th~td,.bd-content .nboutput .output_area.rendered_html table.dataframe td~th,.bd-content .nboutput .output_area.rendered_html table.dataframe td~td,.bd-content .nboutput .output_area .jp-RenderedHTMLCommon table.dataframe th~th,.bd-content .nboutput .output_area .jp-RenderedHTMLCommon table.dataframe th~td,.bd-content .nboutput .output_area .jp-RenderedHTMLCommon table.dataframe td~th,.bd-content .nboutput .output_area .jp-RenderedHTMLCommon table.dataframe td~td{border-left:1px solid var(--pst-color-table-inner-border)}.bd-content .nboutput .output_area.rendered_html table.dataframe thead tr,.bd-content .nboutput .output_area .jp-RenderedHTMLCommon table.dataframe thead tr{background-color:var(--pst-color-table-heading-bg);border-bottom:2px solid var(--pst-color-primary)}.bd-content .nboutput .output_area.rendered_html table.dataframe tbody tr:nth-child(odd),.bd-content .nboutput .output_area .jp-RenderedHTMLCommon table.dataframe tbody tr:nth-child(odd){background-color:var(--pst-color-table-row-zebra-low-bg)}.bd-content .nboutput .output_area.rendered_html table.dataframe tbody tr:nth-child(even),.bd-content .nboutput .output_area .jp-RenderedHTMLCommon table.dataframe tbody tr:nth-child(even){background-color:var(--pst-color-table-row-zebra-high-bg)}.bd-content .nboutput .output_area.rendered_html table.dataframe tbody tr:hover,.bd-content .nboutput .output_area .jp-RenderedHTMLCommon table.dataframe tbody tr:hover{background-color:var(--pst-color-table-row-hover-bg)}html[data-theme=dark] .bd-content .nboutput .output_area.rendered_html:not(:has(table.dataframe)),html[data-theme=dark] .bd-content .nboutput .output_area .widget-subarea{color:var(--pst-color-on-background);background-color:var(--pst-color-text-base);border-radius:.25rem;padding:.5rem}html[data-theme=dark] .bd-content .nboutput .output_area.stderr{background-color:var(--pst-color-danger)}div.nblast.container{margin-bottom:1rem}div.cell_output .output{max-width:100%;overflow-x:auto}.bd-content div.cell_output table.dataframe{color:var(--pst-color-table);border:1px solid var(--pst-color-table-outer-border)}.bd-content div.cell_output table.dataframe th~th,.bd-content div.cell_output table.dataframe th~td,.bd-content div.cell_output table.dataframe td~th,.bd-content div.cell_output table.dataframe td~td{border-left:1px solid var(--pst-color-table-inner-border)}.bd-content div.cell_output table.dataframe thead tr{background-color:var(--pst-color-table-heading-bg);border-bottom:2px solid var(--pst-color-primary)}.bd-content div.cell_output table.dataframe tbody tr:nth-child(odd){background-color:var(--pst-color-table-row-zebra-low-bg)}.bd-content div.cell_output table.dataframe tbody tr:nth-child(even){background-color:var(--pst-color-table-row-zebra-high-bg)}.bd-content div.cell_output table.dataframe tbody tr:hover{background-color:var(--pst-color-table-row-hover-bg)}html[data-theme=dark] .bd-content div.cell_output img,html[data-theme=dark] .bd-content div.cell_output .text_html:not(:has(table.dataframe)),html[data-theme=dark] .bd-content div.cell_output .widget-subarea{color:var(--pst-color-on-background);background-color:var(--pst-color-text-base);border-radius:.25rem;padding:.5rem}.bd-content div.cell_input{display:flex;flex-direction:column;justify-content:stretch}.bd-content div.cell_input,.bd-content div.output{border-radius:.25rem}.bd-content div.output table{table-layout:auto}html[data-theme=dark] .bd-content img.leaflet-tile.leaflet-tile-loaded{border-radius:0;padding:0}.bd-search-container div#search-results>h2{font-size:var(--pst-font-size-icon);margin-top:1rem}.bd-search-container div#search-results p.search-summary{color:var(--pst-color-text-muted)}.bd-search-container ul.search{margin:0;list-style:none}.bd-search-container ul.search li{background-image:none;padding:1rem 0;margin:1rem 0;border-top:1px solid var(--pst-color-text-muted)}.bd-search-container ul.search li>a{font-size:1.2em}.bd-search-container ul.search li div.context,.bd-search-container ul.search li p.context{color:var(--pst-color-text-base);margin:.5em 0 0}.bd-search-container ul.search li div.context a::before,.bd-search-container ul.search li p.context a::before{content:\"#\";padding-right:.2em;color:var(--pst-color-text-muted)}","html {\n /*****************************************************************************\n * Overall Layout Variables\n */\n\n // Header height will impact the top offset for many sections\n // Article header is 66% of Header\n --pst-header-height: 4rem;\n --pst-header-article-height: calc(var(--pst-header-height) * 2 / 3);\n --pst-sidebar-secondary: 17rem;\n}\n\n/*******************************************************************************\n* Breakpoints that trigger UI changes\n*\n* Note that media-breakpoint-down begins at the next highest level!\n* So we should choose a media-breakpoint-down one *lower* than when we want to start\n* example: media-breakpoint-up(md) and media-breakpoint-down(sm) trigger at the same time\n* ref: https://github.com/twbs/bootstrap/issues/31214\n*/\n$breakpoint-sidebar-primary: lg; // When we collapse the primary sidebar\n$breakpoint-sidebar-secondary: xl; // When we collapse the secondary sidebar\n$breakpoint-page-width: 88rem; // taken from sphinx-basic-ng, which we are ultimately going to inherit\n\n/*******************************************************************************\n* Define the animation behaviour\n*/\n$animation-time: 200ms;\n\n/*******************************************************************************\n* UI shaping and padding\n*/\n$admonition-border-radius: 0.25rem;\n\n// In this theme, some focus rings have rounded corners while others do not.\n// This variable sets the border radius for the rounded focus rings.\n$focus-ring-radius: 0.125rem; // 2px at 100% zoom and 16px base font.\n\n$navbar-link-padding-y: 0.25rem;\n","html {\n /*****************************************************************************\n * Font features used in this theme\n */\n\n // base font size - applied at body/html level\n --pst-font-size-base: 1rem;\n\n // heading font sizes based on bootstrap sizing\n --pst-font-size-h1: 2.5rem;\n --pst-font-size-h2: 2rem;\n --pst-font-size-h3: 1.75rem;\n --pst-font-size-h4: 1.5rem;\n --pst-font-size-h5: 1.25rem;\n --pst-font-size-h6: 1.1rem;\n\n // smaller than heading font sizes\n --pst-font-size-milli: 0.9rem;\n\n // Sidebar styles\n --pst-sidebar-font-size: 0.9rem;\n --pst-sidebar-font-size-mobile: 1.1rem;\n --pst-sidebar-header-font-size: 1.2rem;\n --pst-sidebar-header-font-weight: 600;\n\n // Admonition styles\n --pst-admonition-font-weight-heading: 600;\n\n // Font weights\n --pst-font-weight-caption: 300;\n --pst-font-weight-heading: 400;\n\n // Font family\n // These are adapted from https://systemfontstack.com/ */\n --pst-font-family-base-system: -apple-system, \"BlinkMacSystemFont\", \"Segoe UI\",\n \"Helvetica Neue\", \"Arial\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\",\n \"Segoe UI Symbol\";\n --pst-font-family-monospace-system: \"SFMono-Regular\", \"Menlo\", \"Consolas\",\n \"Monaco\", \"Liberation Mono\", \"Lucida Console\", monospace;\n --pst-font-family-base: var(--pst-font-family-base-system);\n --pst-font-family-heading: var(--pst-font-family-base-system);\n --pst-font-family-monospace: var(--pst-font-family-monospace-system);\n}\n\n$line-height-body: 1.65;\n","html {\n /*****************************************************************************\n * Icon\n */\n\n // Font size across all icons\n --pst-font-size-icon: 1.5rem;\n\n // Font Awesome default icons\n --pst-icon-check-circle: \"\\f058\"; // fa-solid fa-circle-check\n --pst-icon-info-circle: \"\\f05a\"; // fa-solid fa-circle-info\n --pst-icon-exclamation-triangle: \"\\f071\"; // fa-solid fa-triangle-exclamation\n --pst-icon-exclamation-circle: \"\\f06a\"; // fa-solid fa-circle-exclamation\n --pst-icon-times-circle: \"\\f057\"; // fa-solid fa-circle-xmark\n --pst-icon-lightbulb: \"\\f0eb\"; // fa-solid fa-lightbulb\n --pst-icon-download: \"\\f019\"; // fa-solid fa-download\n --pst-icon-angle-left: \"\\f104\"; // fa-solid fa-angle-left\n --pst-icon-angle-right: \"\\f105\"; // fa-solid fa-angle-right\n --pst-icon-external-link: \"\\f35d\"; // fa-solid fa-up-right-from-square\n --pst-icon-search-minus: \"\\f010\"; // fa-solid fa-magnifying-glass-minus\n --pst-icon-github: \"\\f09b\"; // fa-brands fa-github\n --pst-icon-gitlab: \"\\f296\"; // fa-brands fa-gitlab\n --pst-icon-share: \"\\f064\"; // fa-solid fa-share\n --pst-icon-bell: \"\\f0f3\"; // fa-solid fa-bell\n --pst-icon-pencil: \"\\f303\"; // fa-solid fa-pencil\n\n // Bootstrap icons\n --pst-breadcrumb-divider: \"\\f105\";\n}\n","html {\n /*****************************************************************************\n * Admonitions\n **/\n\n --pst-icon-admonition-default: var(--pst-icon-bell);\n --pst-icon-admonition-note: var(--pst-icon-info-circle);\n --pst-icon-admonition-attention: var(--pst-icon-exclamation-circle);\n --pst-icon-admonition-caution: var(--pst-icon-exclamation-triangle);\n --pst-icon-admonition-warning: var(--pst-icon-exclamation-triangle);\n --pst-icon-admonition-danger: var(--pst-icon-exclamation-triangle);\n --pst-icon-admonition-error: var(--pst-icon-times-circle);\n --pst-icon-admonition-hint: var(--pst-icon-lightbulb);\n --pst-icon-admonition-tip: var(--pst-icon-lightbulb);\n --pst-icon-admonition-important: var(--pst-icon-exclamation-circle);\n --pst-icon-admonition-seealso: var(--pst-icon-share);\n --pst-icon-admonition-todo: var(--pst-icon-pencil);\n}\n","html {\n /*****************************************************************************\n * versionmodified\n **/\n\n --pst-icon-versionmodified-default: var(--pst-icon-exclamation-circle);\n --pst-icon-versionmodified-added: var(--pst-icon-exclamation-circle);\n --pst-icon-versionmodified-changed: var(--pst-icon-exclamation-circle);\n --pst-icon-versionmodified-deprecated: var(--pst-icon-exclamation-circle);\n}\n","html {\n font-size: var(--pst-font-size-base);\n scroll-padding-top: calc(var(--pst-header-height) + 1rem);\n}\n\nbody {\n background-color: var(--pst-color-background);\n font-family: var(--pst-font-family-base);\n font-weight: 400;\n line-height: $line-height-body;\n color: var(--pst-color-text-base);\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n\n // hack to avoid the black background on some browser including Safari\n &::-webkit-scrollbar-track {\n background-color: var(--pst-color-background);\n }\n}\n\np {\n margin-bottom: 1.15rem;\n font-size: 1em;\n\n /* section header in docstring pages */\n &.rubric {\n border-bottom: 1px solid var(--pst-color-border);\n }\n\n &.centered {\n text-align: center;\n }\n}\n\na {\n @include link-style-default;\n\n // The # anchor that appears on hover over headings\n &.headerlink {\n color: var(--pst-color-secondary);\n opacity: 0.7;\n font-size: 0.8em;\n padding: 0 4px;\n margin-left: 0.2em;\n text-decoration: none;\n transition: all 0.2s ease-out;\n user-select: none;\n\n &:hover {\n opacity: 1;\n }\n }\n\n // set up a icon next to the shorten links from github and gitlab\n &.github,\n &.gitlab {\n &::before {\n color: var(--pst-color-text-muted);\n font: var(--fa-font-brands);\n margin-right: 0.25rem;\n }\n }\n\n &.github::before {\n content: var(--pst-icon-github);\n }\n\n &.gitlab::before {\n content: var(--pst-icon-gitlab);\n }\n}\n\n%heading-style {\n margin: 2.75rem 0 1.05rem;\n font-family: var(--pst-font-family-heading);\n font-weight: var(--pst-font-weight-heading);\n line-height: 1.15;\n}\n\nh1 {\n @extend %heading-style;\n\n margin-top: 0;\n font-size: var(--pst-font-size-h1);\n color: var(--pst-heading-color);\n}\n\nh2 {\n @extend %heading-style;\n\n font-size: var(--pst-font-size-h2);\n color: var(--pst-heading-color);\n}\n\nh3 {\n @extend %heading-style;\n\n font-size: var(--pst-font-size-h3);\n color: var(--pst-heading-color);\n}\n\nh4 {\n @extend %heading-style;\n\n font-size: var(--pst-font-size-h4);\n color: var(--pst-heading-color);\n}\n\nh5 {\n @extend %heading-style;\n\n font-size: var(--pst-font-size-h5);\n color: var(--pst-color-text-base);\n}\n\nh6 {\n @extend %heading-style;\n\n font-size: var(--pst-font-size-h6);\n color: var(--pst-color-text-base);\n}\n\nsmall,\n.text_small {\n font-size: var(--pst-font-size-milli);\n}\n\nhr {\n border: 0;\n border-top: 1px solid var(--pst-color-border);\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: var(--pst-font-family-monospace);\n}\n\nkbd {\n // use theme negative\n background-color: var(--pst-color-on-background);\n color: var(--pst-color-text-muted);\n\n // Compound keyboard elements will have nested kbd in them, so this prevents double lines\n &:not(.compound) {\n border: 1px solid var(--pst-color-border);\n margin: 0 0.1rem;\n padding: 0.1rem 0.4rem;\n box-shadow: 1px 1px 1px var(--pst-color-shadow);\n }\n}\n\ncode {\n color: var(--pst-color-inline-code);\n}\n\npre {\n margin: 1.5em 0;\n padding: 1rem;\n background-color: var(--pst-color-surface);\n color: var(--pst-color-text-base);\n line-height: 1.2em;\n border: 1px solid var(--pst-color-border);\n border-radius: $admonition-border-radius;\n\n .linenos {\n // minimum opacity to make the line numbers WCAG AA conformant\n opacity: 0.8;\n padding-right: 10px;\n }\n}\n\n// the back to top btn\n#pst-back-to-top {\n z-index: $zindex-tooltip;\n position: fixed;\n display: none;\n top: 90vh;\n left: 50vw;\n transform: translate(-50%);\n color: var(--pst-color-secondary-text);\n background-color: var(--pst-color-secondary);\n border: none;\n\n .fa-arrow-up {\n // Using margin instead of a space character prevents the space between the\n // icon and the text from being underlined when the button is hovered.\n margin-inline-end: 0.5em;\n }\n\n &:hover {\n @include link-style-hover;\n\n text-decoration-thickness: 1px;\n background-color: var(--pst-violet-600);\n color: var(--pst-color-secondary-text);\n }\n\n &:focus-visible {\n box-shadow: none;\n outline: $focus-ring-outline;\n outline-color: var(--pst-color-secondary);\n outline-offset: $focus-ring-width;\n }\n}\n\n// Focus ring\n// ----------\n// Note: The Bootstrap stylesheet provides the focus ring (customized by this\n// theme via Sass variables in _bootstrap.scss) in some cases. This rule covers\n// all other cases.\n:focus-visible {\n outline: $focus-ring-outline;\n box-shadow: none; // override Bootstrap\n}\n","// Consistent styling for links\n// ============================\n\n@use \"sass:string\";\n\n// Define some useful variables for links styling consistency\n\n// The default thickness of the underline for links will be either:\n// - 1px\n// - 0.0625rem if it's thicker than 1px because the user has changed the text\n// size in their browser\n$link-underline-thickness: string.unquote(\"max(1px, .0625rem)\") !default;\n\n// Offset of link underlines from text baseline\n// The default is 3px expressed as ems, as calculated against the default body\n// font size (on desktop).\n$link-underline-offset: 0.1578em !default;\n\n// Thickness of link underlines in hover state\n// The default for each link will be the thickest of the following:\n// - 3px\n// - 0.1875rem, if it's thicker than 3px because the user has changed the text\n// size in their browser\n// - 0.12em (relative to the link's text size)\n$link-hover-decoration-thickness: string.unquote(\n \"max(3px, .1875rem, .12em)\"\n) !default;\n\n// Ensures links have an underline decoration by default - needed to meet\n// WCAG SC 1.4.1\n@mixin link-decoration {\n text-decoration: underline;\n\n @if $link-underline-thickness {\n text-decoration-thickness: $link-underline-thickness;\n }\n\n @if $link-underline-offset {\n text-underline-offset: $link-underline-offset;\n }\n}\n\n// Ensures links have an underline decoration on hover - distinct from the\n// default behaviour\n@mixin link-decoration-hover {\n @if $link-hover-decoration-thickness {\n text-decoration-thickness: $link-hover-decoration-thickness;\n\n // Disable ink skipping on underlines on hover.\n text-decoration-skip-ink: none;\n }\n}\n\n// Simple hover style - can be used alone or in conjunction with other mixins\n// Add the text underline and change in thickness on hover.\n// Intended for use with the `:hover` pseudo-class.\n@mixin link-style-hover {\n @include link-decoration;\n @include link-decoration-hover;\n\n color: var(--pst-color-link-hover);\n}\n\n// Default link styles\n// -------------------\n// Defines: default unvisited, visited, hover, and active.\n// TODO: @trallard to improve focus styles in subsequent PR\n@mixin link-style-default {\n // So that really long links don't spill out of their container\n word-wrap: break-word;\n color: var(--pst-color-link);\n\n @include link-decoration;\n\n &:hover {\n color: var(--pst-color-link-hover);\n\n @include link-decoration-hover;\n }\n\n // TODO: @trallard to add active styles in subsequent PR\n &:active {\n color: var(--pst-color-link);\n }\n\n // Visited should still be hoverable\n &:visited {\n color: var(--pst-color-link);\n\n &:hover {\n color: var(--pst-color-link-hover);\n }\n }\n}\n\n// Text link styles\n// ----------------\n// Makes links use the muted text colour and removes the underline.\n// Use this mixin for navigation bar links.\n@mixin link-style-text {\n color: var(--pst-color-text-muted);\n text-decoration: none;\n\n &:hover {\n color: var(--pst-color-link-hover);\n\n @include link-decoration;\n @include link-decoration-hover;\n }\n}\n\n// Sidebar and TOC links\n// ---------------------\n// Makes links use the muted text colour and removes the underline.\n// Use this mixin for navigation the primary sidebar and table of contents.\n// Active and hover should work together rather than one overriding the other.\n@mixin link-sidebar {\n color: var(--pst-color-text-muted);\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n background-color: transparent;\n color: var(--pst-color-link-hover);\n\n @include link-decoration-hover;\n }\n\n // TODO: @trallard to update active styles in subsequent PR\n &:active {\n color: var(--pst-color-link-hover);\n }\n\n &:focus-visible {\n box-shadow: $focus-ring-box-shadow;\n outline: none;\n z-index: 10; // keep focus ring on top (prevent the link-sidebar-current notch from lying on top of the ring)\n }\n}\n\n// Sidebar current page link styles\n// --------------------------------\n// Adds a vertical line on the left hand side of the link to indicate that\n// it's the current page. Note this is distinct from an active state.\n// Used on the primary sidebar and the TOC.\n// We want the side box shadow to have the same thickness as the hover underline\n@mixin link-sidebar-current {\n font-weight: 600;\n color: var(--pst-color-primary);\n\n @if $link-hover-decoration-thickness {\n $notch-shadow: inset\n $link-hover-decoration-thickness\n 0\n 0\n var(--pst-color-primary);\n\n box-shadow: $notch-shadow;\n\n &:focus-visible {\n box-shadow: $notch-shadow, $focus-ring-box-shadow;\n outline: none;\n }\n }\n}\n\n// Heaver navbar text and icon links\n// ---------------------------------\n// (includes light/dark mode button)\n\n// This mixin makes it possible to show hover/underline and focus/ring styles at\n// the same time. The trick is to use:\n// - a pseudo-element with bottom border for the hover underline\n// - a CSS outline for the focus ring.\n\n// Normally we use box-shadow for underline and outline for focus ring. But we\n// cannot apply box-shadow and outline together on the same element because the\n// border-radius value that we use to round the outline will also round the\n// box-shadow used for the underline. We also cannot use text-underline because\n// it does not work on non-text links, nor do we want to use it on text links\n// that we want to treat as blocks, such as the header nav links because the\n// underline will wrap across two lines if the link text also wraps across two\n// lines.\n@mixin link-style-block {\n color: var(--pst-color-text-muted);\n\n // Set position relative so that the child ::before pseudo-element's absolute\n // position is relative to this element.\n position: relative;\n\n // Set up pseudo-element used for hover underline styles\n &::before {\n content: \"\";\n display: block;\n position: absolute;\n inset: 0;\n background-color: transparent;\n\n @if $link-hover-decoration-thickness {\n bottom: calc(-1 * $link-hover-decoration-thickness);\n margin: $link-hover-decoration-thickness 0;\n }\n }\n\n &:hover {\n color: var(--pst-color-secondary);\n text-decoration: none; // override the link-style-hover mixin\n &::before {\n @if $link-hover-decoration-thickness {\n border-bottom: $link-hover-decoration-thickness\n solid\n var(--pst-color-secondary);\n }\n }\n }\n\n &:focus-visible {\n box-shadow: none; // override Bootstrap\n outline: 3px solid var(--pst-color-accent);\n outline-offset: 3px;\n }\n}\n","// Variables\n//\n// Variables should follow the `$component-state-property-size` formula for\n// consistent naming. Ex: $nav-link-disabled-color and $modal-content-box-shadow-xs.\n\n// Color system\n\n// scss-docs-start gray-color-variables\n$white: #fff !default;\n$gray-100: #f8f9fa !default;\n$gray-200: #e9ecef !default;\n$gray-300: #dee2e6 !default;\n$gray-400: #ced4da !default;\n$gray-500: #adb5bd !default;\n$gray-600: #6c757d !default;\n$gray-700: #495057 !default;\n$gray-800: #343a40 !default;\n$gray-900: #212529 !default;\n$black: #000 !default;\n// scss-docs-end gray-color-variables\n\n// fusv-disable\n// scss-docs-start gray-colors-map\n$grays: (\n \"100\": $gray-100,\n \"200\": $gray-200,\n \"300\": $gray-300,\n \"400\": $gray-400,\n \"500\": $gray-500,\n \"600\": $gray-600,\n \"700\": $gray-700,\n \"800\": $gray-800,\n \"900\": $gray-900\n) !default;\n// scss-docs-end gray-colors-map\n// fusv-enable\n\n// scss-docs-start color-variables\n$blue: #0d6efd !default;\n$indigo: #6610f2 !default;\n$purple: #6f42c1 !default;\n$pink: #d63384 !default;\n$red: #dc3545 !default;\n$orange: #fd7e14 !default;\n$yellow: #ffc107 !default;\n$green: #198754 !default;\n$teal: #20c997 !default;\n$cyan: #0dcaf0 !default;\n// scss-docs-end color-variables\n\n// scss-docs-start colors-map\n$colors: (\n \"blue\": $blue,\n \"indigo\": $indigo,\n \"purple\": $purple,\n \"pink\": $pink,\n \"red\": $red,\n \"orange\": $orange,\n \"yellow\": $yellow,\n \"green\": $green,\n \"teal\": $teal,\n \"cyan\": $cyan,\n \"black\": $black,\n \"white\": $white,\n \"gray\": $gray-600,\n \"gray-dark\": $gray-800\n) !default;\n// scss-docs-end colors-map\n\n// The contrast ratio to reach against white, to determine if color changes from \"light\" to \"dark\". Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n$min-contrast-ratio: 4.5 !default;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$color-contrast-dark: $black !default;\n$color-contrast-light: $white !default;\n\n// fusv-disable\n$blue-100: tint-color($blue, 80%) !default;\n$blue-200: tint-color($blue, 60%) !default;\n$blue-300: tint-color($blue, 40%) !default;\n$blue-400: tint-color($blue, 20%) !default;\n$blue-500: $blue !default;\n$blue-600: shade-color($blue, 20%) !default;\n$blue-700: shade-color($blue, 40%) !default;\n$blue-800: shade-color($blue, 60%) !default;\n$blue-900: shade-color($blue, 80%) !default;\n\n$indigo-100: tint-color($indigo, 80%) !default;\n$indigo-200: tint-color($indigo, 60%) !default;\n$indigo-300: tint-color($indigo, 40%) !default;\n$indigo-400: tint-color($indigo, 20%) !default;\n$indigo-500: $indigo !default;\n$indigo-600: shade-color($indigo, 20%) !default;\n$indigo-700: shade-color($indigo, 40%) !default;\n$indigo-800: shade-color($indigo, 60%) !default;\n$indigo-900: shade-color($indigo, 80%) !default;\n\n$purple-100: tint-color($purple, 80%) !default;\n$purple-200: tint-color($purple, 60%) !default;\n$purple-300: tint-color($purple, 40%) !default;\n$purple-400: tint-color($purple, 20%) !default;\n$purple-500: $purple !default;\n$purple-600: shade-color($purple, 20%) !default;\n$purple-700: shade-color($purple, 40%) !default;\n$purple-800: shade-color($purple, 60%) !default;\n$purple-900: shade-color($purple, 80%) !default;\n\n$pink-100: tint-color($pink, 80%) !default;\n$pink-200: tint-color($pink, 60%) !default;\n$pink-300: tint-color($pink, 40%) !default;\n$pink-400: tint-color($pink, 20%) !default;\n$pink-500: $pink !default;\n$pink-600: shade-color($pink, 20%) !default;\n$pink-700: shade-color($pink, 40%) !default;\n$pink-800: shade-color($pink, 60%) !default;\n$pink-900: shade-color($pink, 80%) !default;\n\n$red-100: tint-color($red, 80%) !default;\n$red-200: tint-color($red, 60%) !default;\n$red-300: tint-color($red, 40%) !default;\n$red-400: tint-color($red, 20%) !default;\n$red-500: $red !default;\n$red-600: shade-color($red, 20%) !default;\n$red-700: shade-color($red, 40%) !default;\n$red-800: shade-color($red, 60%) !default;\n$red-900: shade-color($red, 80%) !default;\n\n$orange-100: tint-color($orange, 80%) !default;\n$orange-200: tint-color($orange, 60%) !default;\n$orange-300: tint-color($orange, 40%) !default;\n$orange-400: tint-color($orange, 20%) !default;\n$orange-500: $orange !default;\n$orange-600: shade-color($orange, 20%) !default;\n$orange-700: shade-color($orange, 40%) !default;\n$orange-800: shade-color($orange, 60%) !default;\n$orange-900: shade-color($orange, 80%) !default;\n\n$yellow-100: tint-color($yellow, 80%) !default;\n$yellow-200: tint-color($yellow, 60%) !default;\n$yellow-300: tint-color($yellow, 40%) !default;\n$yellow-400: tint-color($yellow, 20%) !default;\n$yellow-500: $yellow !default;\n$yellow-600: shade-color($yellow, 20%) !default;\n$yellow-700: shade-color($yellow, 40%) !default;\n$yellow-800: shade-color($yellow, 60%) !default;\n$yellow-900: shade-color($yellow, 80%) !default;\n\n$green-100: tint-color($green, 80%) !default;\n$green-200: tint-color($green, 60%) !default;\n$green-300: tint-color($green, 40%) !default;\n$green-400: tint-color($green, 20%) !default;\n$green-500: $green !default;\n$green-600: shade-color($green, 20%) !default;\n$green-700: shade-color($green, 40%) !default;\n$green-800: shade-color($green, 60%) !default;\n$green-900: shade-color($green, 80%) !default;\n\n$teal-100: tint-color($teal, 80%) !default;\n$teal-200: tint-color($teal, 60%) !default;\n$teal-300: tint-color($teal, 40%) !default;\n$teal-400: tint-color($teal, 20%) !default;\n$teal-500: $teal !default;\n$teal-600: shade-color($teal, 20%) !default;\n$teal-700: shade-color($teal, 40%) !default;\n$teal-800: shade-color($teal, 60%) !default;\n$teal-900: shade-color($teal, 80%) !default;\n\n$cyan-100: tint-color($cyan, 80%) !default;\n$cyan-200: tint-color($cyan, 60%) !default;\n$cyan-300: tint-color($cyan, 40%) !default;\n$cyan-400: tint-color($cyan, 20%) !default;\n$cyan-500: $cyan !default;\n$cyan-600: shade-color($cyan, 20%) !default;\n$cyan-700: shade-color($cyan, 40%) !default;\n$cyan-800: shade-color($cyan, 60%) !default;\n$cyan-900: shade-color($cyan, 80%) !default;\n\n$blues: (\n \"blue-100\": $blue-100,\n \"blue-200\": $blue-200,\n \"blue-300\": $blue-300,\n \"blue-400\": $blue-400,\n \"blue-500\": $blue-500,\n \"blue-600\": $blue-600,\n \"blue-700\": $blue-700,\n \"blue-800\": $blue-800,\n \"blue-900\": $blue-900\n) !default;\n\n$indigos: (\n \"indigo-100\": $indigo-100,\n \"indigo-200\": $indigo-200,\n \"indigo-300\": $indigo-300,\n \"indigo-400\": $indigo-400,\n \"indigo-500\": $indigo-500,\n \"indigo-600\": $indigo-600,\n \"indigo-700\": $indigo-700,\n \"indigo-800\": $indigo-800,\n \"indigo-900\": $indigo-900\n) !default;\n\n$purples: (\n \"purple-100\": $purple-100,\n \"purple-200\": $purple-200,\n \"purple-300\": $purple-300,\n \"purple-400\": $purple-400,\n \"purple-500\": $purple-500,\n \"purple-600\": $purple-600,\n \"purple-700\": $purple-700,\n \"purple-800\": $purple-800,\n \"purple-900\": $purple-900\n) !default;\n\n$pinks: (\n \"pink-100\": $pink-100,\n \"pink-200\": $pink-200,\n \"pink-300\": $pink-300,\n \"pink-400\": $pink-400,\n \"pink-500\": $pink-500,\n \"pink-600\": $pink-600,\n \"pink-700\": $pink-700,\n \"pink-800\": $pink-800,\n \"pink-900\": $pink-900\n) !default;\n\n$reds: (\n \"red-100\": $red-100,\n \"red-200\": $red-200,\n \"red-300\": $red-300,\n \"red-400\": $red-400,\n \"red-500\": $red-500,\n \"red-600\": $red-600,\n \"red-700\": $red-700,\n \"red-800\": $red-800,\n \"red-900\": $red-900\n) !default;\n\n$oranges: (\n \"orange-100\": $orange-100,\n \"orange-200\": $orange-200,\n \"orange-300\": $orange-300,\n \"orange-400\": $orange-400,\n \"orange-500\": $orange-500,\n \"orange-600\": $orange-600,\n \"orange-700\": $orange-700,\n \"orange-800\": $orange-800,\n \"orange-900\": $orange-900\n) !default;\n\n$yellows: (\n \"yellow-100\": $yellow-100,\n \"yellow-200\": $yellow-200,\n \"yellow-300\": $yellow-300,\n \"yellow-400\": $yellow-400,\n \"yellow-500\": $yellow-500,\n \"yellow-600\": $yellow-600,\n \"yellow-700\": $yellow-700,\n \"yellow-800\": $yellow-800,\n \"yellow-900\": $yellow-900\n) !default;\n\n$greens: (\n \"green-100\": $green-100,\n \"green-200\": $green-200,\n \"green-300\": $green-300,\n \"green-400\": $green-400,\n \"green-500\": $green-500,\n \"green-600\": $green-600,\n \"green-700\": $green-700,\n \"green-800\": $green-800,\n \"green-900\": $green-900\n) !default;\n\n$teals: (\n \"teal-100\": $teal-100,\n \"teal-200\": $teal-200,\n \"teal-300\": $teal-300,\n \"teal-400\": $teal-400,\n \"teal-500\": $teal-500,\n \"teal-600\": $teal-600,\n \"teal-700\": $teal-700,\n \"teal-800\": $teal-800,\n \"teal-900\": $teal-900\n) !default;\n\n$cyans: (\n \"cyan-100\": $cyan-100,\n \"cyan-200\": $cyan-200,\n \"cyan-300\": $cyan-300,\n \"cyan-400\": $cyan-400,\n \"cyan-500\": $cyan-500,\n \"cyan-600\": $cyan-600,\n \"cyan-700\": $cyan-700,\n \"cyan-800\": $cyan-800,\n \"cyan-900\": $cyan-900\n) !default;\n// fusv-enable\n\n// scss-docs-start theme-color-variables\n$primary: $blue !default;\n$secondary: $gray-600 !default;\n$success: $green !default;\n$info: $cyan !default;\n$warning: $yellow !default;\n$danger: $red !default;\n$light: $gray-100 !default;\n$dark: $gray-900 !default;\n// scss-docs-end theme-color-variables\n\n// scss-docs-start theme-colors-map\n$theme-colors: (\n \"primary\": $primary,\n \"secondary\": $secondary,\n \"success\": $success,\n \"info\": $info,\n \"warning\": $warning,\n \"danger\": $danger,\n \"light\": $light,\n \"dark\": $dark\n) !default;\n// scss-docs-end theme-colors-map\n\n// scss-docs-start theme-text-variables\n$primary-text-emphasis: shade-color($primary, 60%) !default;\n$secondary-text-emphasis: shade-color($secondary, 60%) !default;\n$success-text-emphasis: shade-color($success, 60%) !default;\n$info-text-emphasis: shade-color($info, 60%) !default;\n$warning-text-emphasis: shade-color($warning, 60%) !default;\n$danger-text-emphasis: shade-color($danger, 60%) !default;\n$light-text-emphasis: $gray-700 !default;\n$dark-text-emphasis: $gray-700 !default;\n// scss-docs-end theme-text-variables\n\n// scss-docs-start theme-bg-subtle-variables\n$primary-bg-subtle: tint-color($primary, 80%) !default;\n$secondary-bg-subtle: tint-color($secondary, 80%) !default;\n$success-bg-subtle: tint-color($success, 80%) !default;\n$info-bg-subtle: tint-color($info, 80%) !default;\n$warning-bg-subtle: tint-color($warning, 80%) !default;\n$danger-bg-subtle: tint-color($danger, 80%) !default;\n$light-bg-subtle: mix($gray-100, $white) !default;\n$dark-bg-subtle: $gray-400 !default;\n// scss-docs-end theme-bg-subtle-variables\n\n// scss-docs-start theme-border-subtle-variables\n$primary-border-subtle: tint-color($primary, 60%) !default;\n$secondary-border-subtle: tint-color($secondary, 60%) !default;\n$success-border-subtle: tint-color($success, 60%) !default;\n$info-border-subtle: tint-color($info, 60%) !default;\n$warning-border-subtle: tint-color($warning, 60%) !default;\n$danger-border-subtle: tint-color($danger, 60%) !default;\n$light-border-subtle: $gray-200 !default;\n$dark-border-subtle: $gray-500 !default;\n// scss-docs-end theme-border-subtle-variables\n\n// Characters which are escaped by the escape-svg function\n$escaped-characters: (\n (\"<\", \"%3c\"),\n (\">\", \"%3e\"),\n (\"#\", \"%23\"),\n (\"(\", \"%28\"),\n (\")\", \"%29\"),\n) !default;\n\n// Options\n//\n// Quickly modify global styling by enabling or disabling optional features.\n\n$enable-caret: true !default;\n$enable-rounded: true !default;\n$enable-shadows: false !default;\n$enable-gradients: false !default;\n$enable-transitions: true !default;\n$enable-reduced-motion: true !default;\n$enable-smooth-scroll: true !default;\n$enable-grid-classes: true !default;\n$enable-container-classes: true !default;\n$enable-cssgrid: false !default;\n$enable-button-pointers: true !default;\n$enable-rfs: true !default;\n$enable-validation-icons: true !default;\n$enable-negative-margins: false !default;\n$enable-deprecation-messages: true !default;\n$enable-important-utilities: true !default;\n\n$enable-dark-mode: true !default;\n$color-mode-type: data !default; // `data` or `media-query`\n\n// Prefix for :root CSS variables\n\n$variable-prefix: bs- !default; // Deprecated in v5.2.0 for the shorter `$prefix`\n$prefix: $variable-prefix !default;\n\n// Gradient\n//\n// The gradient which is added to components if `$enable-gradients` is `true`\n// This gradient is also added to elements with `.bg-gradient`\n// scss-docs-start variable-gradient\n$gradient: linear-gradient(180deg, rgba($white, .15), rgba($white, 0)) !default;\n// scss-docs-end variable-gradient\n\n// Spacing\n//\n// Control the default styling of most Bootstrap elements by modifying these\n// variables. Mostly focused on spacing.\n// You can add more entries to the $spacers map, should you need more variation.\n\n// scss-docs-start spacer-variables-maps\n$spacer: 1rem !default;\n$spacers: (\n 0: 0,\n 1: $spacer * .25,\n 2: $spacer * .5,\n 3: $spacer,\n 4: $spacer * 1.5,\n 5: $spacer * 3,\n) !default;\n// scss-docs-end spacer-variables-maps\n\n// Position\n//\n// Define the edge positioning anchors of the position utilities.\n\n// scss-docs-start position-map\n$position-values: (\n 0: 0,\n 50: 50%,\n 100: 100%\n) !default;\n// scss-docs-end position-map\n\n// Body\n//\n// Settings for the `` element.\n\n$body-text-align: null !default;\n$body-color: $gray-900 !default;\n$body-bg: $white !default;\n\n$body-secondary-color: rgba($body-color, .75) !default;\n$body-secondary-bg: $gray-200 !default;\n\n$body-tertiary-color: rgba($body-color, .5) !default;\n$body-tertiary-bg: $gray-100 !default;\n\n$body-emphasis-color: $black !default;\n\n// Links\n//\n// Style anchor elements.\n\n$link-color: $primary !default;\n$link-decoration: underline !default;\n$link-shade-percentage: 20% !default;\n$link-hover-color: shift-color($link-color, $link-shade-percentage) !default;\n$link-hover-decoration: null !default;\n\n$stretched-link-pseudo-element: after !default;\n$stretched-link-z-index: 1 !default;\n\n// Icon links\n// scss-docs-start icon-link-variables\n$icon-link-gap: .375rem !default;\n$icon-link-underline-offset: .25em !default;\n$icon-link-icon-size: 1em !default;\n$icon-link-icon-transition: .2s ease-in-out transform !default;\n$icon-link-icon-transform: translate3d(.25em, 0, 0) !default;\n// scss-docs-end icon-link-variables\n\n// Paragraphs\n//\n// Style p element.\n\n$paragraph-margin-bottom: 1rem !default;\n\n\n// Grid breakpoints\n//\n// Define the minimum dimensions at which your layout will change,\n// adapting to different screen sizes, for use in media queries.\n\n// scss-docs-start grid-breakpoints\n$grid-breakpoints: (\n xs: 0,\n sm: 576px,\n md: 768px,\n lg: 992px,\n xl: 1200px,\n xxl: 1400px\n) !default;\n// scss-docs-end grid-breakpoints\n\n@include _assert-ascending($grid-breakpoints, \"$grid-breakpoints\");\n@include _assert-starts-at-zero($grid-breakpoints, \"$grid-breakpoints\");\n\n\n// Grid containers\n//\n// Define the maximum width of `.container` for different screen sizes.\n\n// scss-docs-start container-max-widths\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1140px,\n xxl: 1320px\n) !default;\n// scss-docs-end container-max-widths\n\n@include _assert-ascending($container-max-widths, \"$container-max-widths\");\n\n\n// Grid columns\n//\n// Set the number of columns and specify the width of the gutters.\n\n$grid-columns: 12 !default;\n$grid-gutter-width: 1.5rem !default;\n$grid-row-columns: 6 !default;\n\n// Container padding\n\n$container-padding-x: $grid-gutter-width !default;\n\n\n// Components\n//\n// Define common padding and border radius sizes and more.\n\n// scss-docs-start border-variables\n$border-width: 1px !default;\n$border-widths: (\n 1: 1px,\n 2: 2px,\n 3: 3px,\n 4: 4px,\n 5: 5px\n) !default;\n$border-style: solid !default;\n$border-color: $gray-300 !default;\n$border-color-translucent: rgba($black, .175) !default;\n// scss-docs-end border-variables\n\n// scss-docs-start border-radius-variables\n$border-radius: .375rem !default;\n$border-radius-sm: .25rem !default;\n$border-radius-lg: .5rem !default;\n$border-radius-xl: 1rem !default;\n$border-radius-xxl: 2rem !default;\n$border-radius-pill: 50rem !default;\n// scss-docs-end border-radius-variables\n// fusv-disable\n$border-radius-2xl: $border-radius-xxl !default; // Deprecated in v5.3.0\n// fusv-enable\n\n// scss-docs-start box-shadow-variables\n$box-shadow: 0 .5rem 1rem rgba($black, .15) !default;\n$box-shadow-sm: 0 .125rem .25rem rgba($black, .075) !default;\n$box-shadow-lg: 0 1rem 3rem rgba($black, .175) !default;\n$box-shadow-inset: inset 0 1px 2px rgba($black, .075) !default;\n// scss-docs-end box-shadow-variables\n\n$component-active-color: $white !default;\n$component-active-bg: $primary !default;\n\n// scss-docs-start focus-ring-variables\n$focus-ring-width: .25rem !default;\n$focus-ring-opacity: .25 !default;\n$focus-ring-color: rgba($primary, $focus-ring-opacity) !default;\n$focus-ring-blur: 0 !default;\n$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color !default;\n// scss-docs-end focus-ring-variables\n\n// scss-docs-start caret-variables\n$caret-width: .3em !default;\n$caret-vertical-align: $caret-width * .85 !default;\n$caret-spacing: $caret-width * .85 !default;\n// scss-docs-end caret-variables\n\n$transition-base: all .2s ease-in-out !default;\n$transition-fade: opacity .15s linear !default;\n// scss-docs-start collapse-transition\n$transition-collapse: height .35s ease !default;\n$transition-collapse-width: width .35s ease !default;\n// scss-docs-end collapse-transition\n\n// stylelint-disable function-disallowed-list\n// scss-docs-start aspect-ratios\n$aspect-ratios: (\n \"1x1\": 100%,\n \"4x3\": calc(3 / 4 * 100%),\n \"16x9\": calc(9 / 16 * 100%),\n \"21x9\": calc(9 / 21 * 100%)\n) !default;\n// scss-docs-end aspect-ratios\n// stylelint-enable function-disallowed-list\n\n// Typography\n//\n// Font, line-height, and color for body text, headings, and more.\n\n// scss-docs-start font-variables\n// stylelint-disable value-keyword-case\n$font-family-sans-serif: system-ui, -apple-system, \"Segoe UI\", Roboto, \"Helvetica Neue\", \"Noto Sans\", \"Liberation Sans\", Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\" !default;\n$font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace !default;\n// stylelint-enable value-keyword-case\n$font-family-base: var(--#{$prefix}font-sans-serif) !default;\n$font-family-code: var(--#{$prefix}font-monospace) !default;\n\n// $font-size-root affects the value of `rem`, which is used for as well font sizes, paddings, and margins\n// $font-size-base affects the font size of the body text\n$font-size-root: null !default;\n$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`\n$font-size-sm: $font-size-base * .875 !default;\n$font-size-lg: $font-size-base * 1.25 !default;\n\n$font-weight-lighter: lighter !default;\n$font-weight-light: 300 !default;\n$font-weight-normal: 400 !default;\n$font-weight-medium: 500 !default;\n$font-weight-semibold: 600 !default;\n$font-weight-bold: 700 !default;\n$font-weight-bolder: bolder !default;\n\n$font-weight-base: $font-weight-normal !default;\n\n$line-height-base: 1.5 !default;\n$line-height-sm: 1.25 !default;\n$line-height-lg: 2 !default;\n\n$h1-font-size: $font-size-base * 2.5 !default;\n$h2-font-size: $font-size-base * 2 !default;\n$h3-font-size: $font-size-base * 1.75 !default;\n$h4-font-size: $font-size-base * 1.5 !default;\n$h5-font-size: $font-size-base * 1.25 !default;\n$h6-font-size: $font-size-base !default;\n// scss-docs-end font-variables\n\n// scss-docs-start font-sizes\n$font-sizes: (\n 1: $h1-font-size,\n 2: $h2-font-size,\n 3: $h3-font-size,\n 4: $h4-font-size,\n 5: $h5-font-size,\n 6: $h6-font-size\n) !default;\n// scss-docs-end font-sizes\n\n// scss-docs-start headings-variables\n$headings-margin-bottom: $spacer * .5 !default;\n$headings-font-family: null !default;\n$headings-font-style: null !default;\n$headings-font-weight: 500 !default;\n$headings-line-height: 1.2 !default;\n$headings-color: inherit !default;\n// scss-docs-end headings-variables\n\n// scss-docs-start display-headings\n$display-font-sizes: (\n 1: 5rem,\n 2: 4.5rem,\n 3: 4rem,\n 4: 3.5rem,\n 5: 3rem,\n 6: 2.5rem\n) !default;\n\n$display-font-family: null !default;\n$display-font-style: null !default;\n$display-font-weight: 300 !default;\n$display-line-height: $headings-line-height !default;\n// scss-docs-end display-headings\n\n// scss-docs-start type-variables\n$lead-font-size: $font-size-base * 1.25 !default;\n$lead-font-weight: 300 !default;\n\n$small-font-size: .875em !default;\n\n$sub-sup-font-size: .75em !default;\n\n// fusv-disable\n$text-muted: var(--#{$prefix}secondary-color) !default; // Deprecated in 5.3.0\n// fusv-enable\n\n$initialism-font-size: $small-font-size !default;\n\n$blockquote-margin-y: $spacer !default;\n$blockquote-font-size: $font-size-base * 1.25 !default;\n$blockquote-footer-color: $gray-600 !default;\n$blockquote-footer-font-size: $small-font-size !default;\n\n$hr-margin-y: $spacer !default;\n$hr-color: inherit !default;\n\n// fusv-disable\n$hr-bg-color: null !default; // Deprecated in v5.2.0\n$hr-height: null !default; // Deprecated in v5.2.0\n// fusv-enable\n\n$hr-border-color: null !default; // Allows for inherited colors\n$hr-border-width: var(--#{$prefix}border-width) !default;\n$hr-opacity: .25 !default;\n\n// scss-docs-start vr-variables\n$vr-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end vr-variables\n\n$legend-margin-bottom: .5rem !default;\n$legend-font-size: 1.5rem !default;\n$legend-font-weight: null !default;\n\n$dt-font-weight: $font-weight-bold !default;\n\n$list-inline-padding: .5rem !default;\n\n$mark-padding: .1875em !default;\n$mark-color: $body-color !default;\n$mark-bg: $yellow-100 !default;\n// scss-docs-end type-variables\n\n\n// Tables\n//\n// Customizes the `.table` component with basic values, each used across all table variations.\n\n// scss-docs-start table-variables\n$table-cell-padding-y: .5rem !default;\n$table-cell-padding-x: .5rem !default;\n$table-cell-padding-y-sm: .25rem !default;\n$table-cell-padding-x-sm: .25rem !default;\n\n$table-cell-vertical-align: top !default;\n\n$table-color: var(--#{$prefix}emphasis-color) !default;\n$table-bg: var(--#{$prefix}body-bg) !default;\n$table-accent-bg: transparent !default;\n\n$table-th-font-weight: null !default;\n\n$table-striped-color: $table-color !default;\n$table-striped-bg-factor: .05 !default;\n$table-striped-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-striped-bg-factor) !default;\n\n$table-active-color: $table-color !default;\n$table-active-bg-factor: .1 !default;\n$table-active-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-active-bg-factor) !default;\n\n$table-hover-color: $table-color !default;\n$table-hover-bg-factor: .075 !default;\n$table-hover-bg: rgba(var(--#{$prefix}emphasis-color-rgb), $table-hover-bg-factor) !default;\n\n$table-border-factor: .2 !default;\n$table-border-width: var(--#{$prefix}border-width) !default;\n$table-border-color: var(--#{$prefix}border-color) !default;\n\n$table-striped-order: odd !default;\n$table-striped-columns-order: even !default;\n\n$table-group-separator-color: currentcolor !default;\n\n$table-caption-color: var(--#{$prefix}secondary-color) !default;\n\n$table-bg-scale: -80% !default;\n// scss-docs-end table-variables\n\n// scss-docs-start table-loop\n$table-variants: (\n \"primary\": shift-color($primary, $table-bg-scale),\n \"secondary\": shift-color($secondary, $table-bg-scale),\n \"success\": shift-color($success, $table-bg-scale),\n \"info\": shift-color($info, $table-bg-scale),\n \"warning\": shift-color($warning, $table-bg-scale),\n \"danger\": shift-color($danger, $table-bg-scale),\n \"light\": $light,\n \"dark\": $dark,\n) !default;\n// scss-docs-end table-loop\n\n\n// Buttons + Forms\n//\n// Shared variables that are reassigned to `$input-` and `$btn-` specific variables.\n\n// scss-docs-start input-btn-variables\n$input-btn-padding-y: .375rem !default;\n$input-btn-padding-x: .75rem !default;\n$input-btn-font-family: null !default;\n$input-btn-font-size: $font-size-base !default;\n$input-btn-line-height: $line-height-base !default;\n\n$input-btn-focus-width: $focus-ring-width !default;\n$input-btn-focus-color-opacity: $focus-ring-opacity !default;\n$input-btn-focus-color: $focus-ring-color !default;\n$input-btn-focus-blur: $focus-ring-blur !default;\n$input-btn-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$input-btn-padding-y-sm: .25rem !default;\n$input-btn-padding-x-sm: .5rem !default;\n$input-btn-font-size-sm: $font-size-sm !default;\n\n$input-btn-padding-y-lg: .5rem !default;\n$input-btn-padding-x-lg: 1rem !default;\n$input-btn-font-size-lg: $font-size-lg !default;\n\n$input-btn-border-width: var(--#{$prefix}border-width) !default;\n// scss-docs-end input-btn-variables\n\n\n// Buttons\n//\n// For each of Bootstrap's buttons, define text, background, and border color.\n\n// scss-docs-start btn-variables\n$btn-color: var(--#{$prefix}body-color) !default;\n$btn-padding-y: $input-btn-padding-y !default;\n$btn-padding-x: $input-btn-padding-x !default;\n$btn-font-family: $input-btn-font-family !default;\n$btn-font-size: $input-btn-font-size !default;\n$btn-line-height: $input-btn-line-height !default;\n$btn-white-space: null !default; // Set to `nowrap` to prevent text wrapping\n\n$btn-padding-y-sm: $input-btn-padding-y-sm !default;\n$btn-padding-x-sm: $input-btn-padding-x-sm !default;\n$btn-font-size-sm: $input-btn-font-size-sm !default;\n\n$btn-padding-y-lg: $input-btn-padding-y-lg !default;\n$btn-padding-x-lg: $input-btn-padding-x-lg !default;\n$btn-font-size-lg: $input-btn-font-size-lg !default;\n\n$btn-border-width: $input-btn-border-width !default;\n\n$btn-font-weight: $font-weight-normal !default;\n$btn-box-shadow: inset 0 1px 0 rgba($white, .15), 0 1px 1px rgba($black, .075) !default;\n$btn-focus-width: $input-btn-focus-width !default;\n$btn-focus-box-shadow: $input-btn-focus-box-shadow !default;\n$btn-disabled-opacity: .65 !default;\n$btn-active-box-shadow: inset 0 3px 5px rgba($black, .125) !default;\n\n$btn-link-color: var(--#{$prefix}link-color) !default;\n$btn-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$btn-link-disabled-color: $gray-600 !default;\n$btn-link-focus-shadow-rgb: to-rgb(mix(color-contrast($link-color), $link-color, 15%)) !default;\n\n// Allows for customizing button radius independently from global border radius\n$btn-border-radius: var(--#{$prefix}border-radius) !default;\n$btn-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$btn-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$btn-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$btn-hover-bg-shade-amount: 15% !default;\n$btn-hover-bg-tint-amount: 15% !default;\n$btn-hover-border-shade-amount: 20% !default;\n$btn-hover-border-tint-amount: 10% !default;\n$btn-active-bg-shade-amount: 20% !default;\n$btn-active-bg-tint-amount: 20% !default;\n$btn-active-border-shade-amount: 25% !default;\n$btn-active-border-tint-amount: 10% !default;\n// scss-docs-end btn-variables\n\n\n// Forms\n\n// scss-docs-start form-text-variables\n$form-text-margin-top: .25rem !default;\n$form-text-font-size: $small-font-size !default;\n$form-text-font-style: null !default;\n$form-text-font-weight: null !default;\n$form-text-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end form-text-variables\n\n// scss-docs-start form-label-variables\n$form-label-margin-bottom: .5rem !default;\n$form-label-font-size: null !default;\n$form-label-font-style: null !default;\n$form-label-font-weight: null !default;\n$form-label-color: null !default;\n// scss-docs-end form-label-variables\n\n// scss-docs-start form-input-variables\n$input-padding-y: $input-btn-padding-y !default;\n$input-padding-x: $input-btn-padding-x !default;\n$input-font-family: $input-btn-font-family !default;\n$input-font-size: $input-btn-font-size !default;\n$input-font-weight: $font-weight-base !default;\n$input-line-height: $input-btn-line-height !default;\n\n$input-padding-y-sm: $input-btn-padding-y-sm !default;\n$input-padding-x-sm: $input-btn-padding-x-sm !default;\n$input-font-size-sm: $input-btn-font-size-sm !default;\n\n$input-padding-y-lg: $input-btn-padding-y-lg !default;\n$input-padding-x-lg: $input-btn-padding-x-lg !default;\n$input-font-size-lg: $input-btn-font-size-lg !default;\n\n$input-bg: var(--#{$prefix}body-bg) !default;\n$input-disabled-color: null !default;\n$input-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$input-disabled-border-color: null !default;\n\n$input-color: var(--#{$prefix}body-color) !default;\n$input-border-color: var(--#{$prefix}border-color) !default;\n$input-border-width: $input-btn-border-width !default;\n$input-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$input-border-radius: var(--#{$prefix}border-radius) !default;\n$input-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$input-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n\n$input-focus-bg: $input-bg !default;\n$input-focus-border-color: tint-color($component-active-bg, 50%) !default;\n$input-focus-color: $input-color !default;\n$input-focus-width: $input-btn-focus-width !default;\n$input-focus-box-shadow: $input-btn-focus-box-shadow !default;\n\n$input-placeholder-color: var(--#{$prefix}secondary-color) !default;\n$input-plaintext-color: var(--#{$prefix}body-color) !default;\n\n$input-height-border: calc(#{$input-border-width} * 2) !default; // stylelint-disable-line function-disallowed-list\n\n$input-height-inner: add($input-line-height * 1em, $input-padding-y * 2) !default;\n$input-height-inner-half: add($input-line-height * .5em, $input-padding-y) !default;\n$input-height-inner-quarter: add($input-line-height * .25em, $input-padding-y * .5) !default;\n\n$input-height: add($input-line-height * 1em, add($input-padding-y * 2, $input-height-border, false)) !default;\n$input-height-sm: add($input-line-height * 1em, add($input-padding-y-sm * 2, $input-height-border, false)) !default;\n$input-height-lg: add($input-line-height * 1em, add($input-padding-y-lg * 2, $input-height-border, false)) !default;\n\n$input-transition: border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$form-color-width: 3rem !default;\n// scss-docs-end form-input-variables\n\n// scss-docs-start form-check-variables\n$form-check-input-width: 1em !default;\n$form-check-min-height: $font-size-base * $line-height-base !default;\n$form-check-padding-start: $form-check-input-width + .5em !default;\n$form-check-margin-bottom: .125rem !default;\n$form-check-label-color: null !default;\n$form-check-label-cursor: null !default;\n$form-check-transition: null !default;\n\n$form-check-input-active-filter: brightness(90%) !default;\n\n$form-check-input-bg: $input-bg !default;\n$form-check-input-border: var(--#{$prefix}border-width) solid var(--#{$prefix}border-color) !default;\n$form-check-input-border-radius: .25em !default;\n$form-check-radio-border-radius: 50% !default;\n$form-check-input-focus-border: $input-focus-border-color !default;\n$form-check-input-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$form-check-input-checked-color: $component-active-color !default;\n$form-check-input-checked-bg-color: $component-active-bg !default;\n$form-check-input-checked-border-color: $form-check-input-checked-bg-color !default;\n$form-check-input-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-check-radio-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-indeterminate-color: $component-active-color !default;\n$form-check-input-indeterminate-bg-color: $component-active-bg !default;\n$form-check-input-indeterminate-border-color: $form-check-input-indeterminate-bg-color !default;\n$form-check-input-indeterminate-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-check-input-disabled-opacity: .5 !default;\n$form-check-label-disabled-opacity: $form-check-input-disabled-opacity !default;\n$form-check-btn-check-disabled-opacity: $btn-disabled-opacity !default;\n\n$form-check-inline-margin-end: 1rem !default;\n// scss-docs-end form-check-variables\n\n// scss-docs-start form-switch-variables\n$form-switch-color: rgba($black, .25) !default;\n$form-switch-width: 2em !default;\n$form-switch-padding-start: $form-switch-width + .5em !default;\n$form-switch-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-border-radius: $form-switch-width !default;\n$form-switch-transition: background-position .15s ease-in-out !default;\n\n$form-switch-focus-color: $input-focus-border-color !default;\n$form-switch-focus-bg-image: url(\"data:image/svg+xml,\") !default;\n\n$form-switch-checked-color: $component-active-color !default;\n$form-switch-checked-bg-image: url(\"data:image/svg+xml,\") !default;\n$form-switch-checked-bg-position: right center !default;\n// scss-docs-end form-switch-variables\n\n// scss-docs-start input-group-variables\n$input-group-addon-padding-y: $input-padding-y !default;\n$input-group-addon-padding-x: $input-padding-x !default;\n$input-group-addon-font-weight: $input-font-weight !default;\n$input-group-addon-color: $input-color !default;\n$input-group-addon-bg: var(--#{$prefix}tertiary-bg) !default;\n$input-group-addon-border-color: $input-border-color !default;\n// scss-docs-end input-group-variables\n\n// scss-docs-start form-select-variables\n$form-select-padding-y: $input-padding-y !default;\n$form-select-padding-x: $input-padding-x !default;\n$form-select-font-family: $input-font-family !default;\n$form-select-font-size: $input-font-size !default;\n$form-select-indicator-padding: $form-select-padding-x * 3 !default; // Extra padding for background-image\n$form-select-font-weight: $input-font-weight !default;\n$form-select-line-height: $input-line-height !default;\n$form-select-color: $input-color !default;\n$form-select-bg: $input-bg !default;\n$form-select-disabled-color: null !default;\n$form-select-disabled-bg: $input-disabled-bg !default;\n$form-select-disabled-border-color: $input-disabled-border-color !default;\n$form-select-bg-position: right $form-select-padding-x center !default;\n$form-select-bg-size: 16px 12px !default; // In pixels because image dimensions\n$form-select-indicator-color: $gray-800 !default;\n$form-select-indicator: url(\"data:image/svg+xml,\") !default;\n\n$form-select-feedback-icon-padding-end: $form-select-padding-x * 2.5 + $form-select-indicator-padding !default;\n$form-select-feedback-icon-position: center right $form-select-indicator-padding !default;\n$form-select-feedback-icon-size: $input-height-inner-half $input-height-inner-half !default;\n\n$form-select-border-width: $input-border-width !default;\n$form-select-border-color: $input-border-color !default;\n$form-select-border-radius: $input-border-radius !default;\n$form-select-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-select-focus-border-color: $input-focus-border-color !default;\n$form-select-focus-width: $input-focus-width !default;\n$form-select-focus-box-shadow: 0 0 0 $form-select-focus-width $input-btn-focus-color !default;\n\n$form-select-padding-y-sm: $input-padding-y-sm !default;\n$form-select-padding-x-sm: $input-padding-x-sm !default;\n$form-select-font-size-sm: $input-font-size-sm !default;\n$form-select-border-radius-sm: $input-border-radius-sm !default;\n\n$form-select-padding-y-lg: $input-padding-y-lg !default;\n$form-select-padding-x-lg: $input-padding-x-lg !default;\n$form-select-font-size-lg: $input-font-size-lg !default;\n$form-select-border-radius-lg: $input-border-radius-lg !default;\n\n$form-select-transition: $input-transition !default;\n// scss-docs-end form-select-variables\n\n// scss-docs-start form-range-variables\n$form-range-track-width: 100% !default;\n$form-range-track-height: .5rem !default;\n$form-range-track-cursor: pointer !default;\n$form-range-track-bg: var(--#{$prefix}secondary-bg) !default;\n$form-range-track-border-radius: 1rem !default;\n$form-range-track-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n\n$form-range-thumb-width: 1rem !default;\n$form-range-thumb-height: $form-range-thumb-width !default;\n$form-range-thumb-bg: $component-active-bg !default;\n$form-range-thumb-border: 0 !default;\n$form-range-thumb-border-radius: 1rem !default;\n$form-range-thumb-box-shadow: 0 .1rem .25rem rgba($black, .1) !default;\n$form-range-thumb-focus-box-shadow: 0 0 0 1px $body-bg, $input-focus-box-shadow !default;\n$form-range-thumb-focus-box-shadow-width: $input-focus-width !default; // For focus box shadow issue in Edge\n$form-range-thumb-active-bg: tint-color($component-active-bg, 70%) !default;\n$form-range-thumb-disabled-bg: var(--#{$prefix}secondary-color) !default;\n$form-range-thumb-transition: background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n// scss-docs-end form-range-variables\n\n// scss-docs-start form-file-variables\n$form-file-button-color: $input-color !default;\n$form-file-button-bg: var(--#{$prefix}tertiary-bg) !default;\n$form-file-button-hover-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end form-file-variables\n\n// scss-docs-start form-floating-variables\n$form-floating-height: add(3.5rem, $input-height-border) !default;\n$form-floating-line-height: 1.25 !default;\n$form-floating-padding-x: $input-padding-x !default;\n$form-floating-padding-y: 1rem !default;\n$form-floating-input-padding-t: 1.625rem !default;\n$form-floating-input-padding-b: .625rem !default;\n$form-floating-label-height: 1.5em !default;\n$form-floating-label-opacity: .65 !default;\n$form-floating-label-transform: scale(.85) translateY(-.5rem) translateX(.15rem) !default;\n$form-floating-label-disabled-color: $gray-600 !default;\n$form-floating-transition: opacity .1s ease-in-out, transform .1s ease-in-out !default;\n// scss-docs-end form-floating-variables\n\n// Form validation\n\n// scss-docs-start form-feedback-variables\n$form-feedback-margin-top: $form-text-margin-top !default;\n$form-feedback-font-size: $form-text-font-size !default;\n$form-feedback-font-style: $form-text-font-style !default;\n$form-feedback-valid-color: $success !default;\n$form-feedback-invalid-color: $danger !default;\n\n$form-feedback-icon-valid-color: $form-feedback-valid-color !default;\n$form-feedback-icon-valid: url(\"data:image/svg+xml,\") !default;\n$form-feedback-icon-invalid-color: $form-feedback-invalid-color !default;\n$form-feedback-icon-invalid: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end form-feedback-variables\n\n// scss-docs-start form-validation-colors\n$form-valid-color: $form-feedback-valid-color !default;\n$form-valid-border-color: $form-feedback-valid-color !default;\n$form-invalid-color: $form-feedback-invalid-color !default;\n$form-invalid-border-color: $form-feedback-invalid-color !default;\n// scss-docs-end form-validation-colors\n\n// scss-docs-start form-validation-states\n$form-validation-states: (\n \"valid\": (\n \"color\": var(--#{$prefix}form-valid-color),\n \"icon\": $form-feedback-icon-valid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}success),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}success-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-valid-border-color),\n ),\n \"invalid\": (\n \"color\": var(--#{$prefix}form-invalid-color),\n \"icon\": $form-feedback-icon-invalid,\n \"tooltip-color\": #fff,\n \"tooltip-bg-color\": var(--#{$prefix}danger),\n \"focus-box-shadow\": 0 0 $input-btn-focus-blur $input-focus-width rgba(var(--#{$prefix}danger-rgb), $input-btn-focus-color-opacity),\n \"border-color\": var(--#{$prefix}form-invalid-border-color),\n )\n) !default;\n// scss-docs-end form-validation-states\n\n// Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n\n// scss-docs-start zindex-stack\n$zindex-dropdown: 1000 !default;\n$zindex-sticky: 1020 !default;\n$zindex-fixed: 1030 !default;\n$zindex-offcanvas-backdrop: 1040 !default;\n$zindex-offcanvas: 1045 !default;\n$zindex-modal-backdrop: 1050 !default;\n$zindex-modal: 1055 !default;\n$zindex-popover: 1070 !default;\n$zindex-tooltip: 1080 !default;\n$zindex-toast: 1090 !default;\n// scss-docs-end zindex-stack\n\n// scss-docs-start zindex-levels-map\n$zindex-levels: (\n n1: -1,\n 0: 0,\n 1: 1,\n 2: 2,\n 3: 3\n) !default;\n// scss-docs-end zindex-levels-map\n\n\n// Navs\n\n// scss-docs-start nav-variables\n$nav-link-padding-y: .5rem !default;\n$nav-link-padding-x: 1rem !default;\n$nav-link-font-size: null !default;\n$nav-link-font-weight: null !default;\n$nav-link-color: var(--#{$prefix}link-color) !default;\n$nav-link-hover-color: var(--#{$prefix}link-hover-color) !default;\n$nav-link-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out !default;\n$nav-link-disabled-color: var(--#{$prefix}secondary-color) !default;\n$nav-link-focus-box-shadow: $focus-ring-box-shadow !default;\n\n$nav-tabs-border-color: var(--#{$prefix}border-color) !default;\n$nav-tabs-border-width: var(--#{$prefix}border-width) !default;\n$nav-tabs-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-tabs-link-hover-border-color: var(--#{$prefix}secondary-bg) var(--#{$prefix}secondary-bg) $nav-tabs-border-color !default;\n$nav-tabs-link-active-color: var(--#{$prefix}emphasis-color) !default;\n$nav-tabs-link-active-bg: var(--#{$prefix}body-bg) !default;\n$nav-tabs-link-active-border-color: var(--#{$prefix}border-color) var(--#{$prefix}border-color) $nav-tabs-link-active-bg !default;\n\n$nav-pills-border-radius: var(--#{$prefix}border-radius) !default;\n$nav-pills-link-active-color: $component-active-color !default;\n$nav-pills-link-active-bg: $component-active-bg !default;\n\n$nav-underline-gap: 1rem !default;\n$nav-underline-border-width: .125rem !default;\n$nav-underline-link-active-color: var(--#{$prefix}emphasis-color) !default;\n// scss-docs-end nav-variables\n\n\n// Navbar\n\n// scss-docs-start navbar-variables\n$navbar-padding-y: $spacer * .5 !default;\n$navbar-padding-x: null !default;\n\n$navbar-nav-link-padding-x: .5rem !default;\n\n$navbar-brand-font-size: $font-size-lg !default;\n// Compute the navbar-brand padding-y so the navbar-brand will have the same height as navbar-text and nav-link\n$nav-link-height: $font-size-base * $line-height-base + $nav-link-padding-y * 2 !default;\n$navbar-brand-height: $navbar-brand-font-size * $line-height-base !default;\n$navbar-brand-padding-y: ($nav-link-height - $navbar-brand-height) * .5 !default;\n$navbar-brand-margin-end: 1rem !default;\n\n$navbar-toggler-padding-y: .25rem !default;\n$navbar-toggler-padding-x: .75rem !default;\n$navbar-toggler-font-size: $font-size-lg !default;\n$navbar-toggler-border-radius: $btn-border-radius !default;\n$navbar-toggler-focus-width: $btn-focus-width !default;\n$navbar-toggler-transition: box-shadow .15s ease-in-out !default;\n\n$navbar-light-color: rgba(var(--#{$prefix}emphasis-color-rgb), .65) !default;\n$navbar-light-hover-color: rgba(var(--#{$prefix}emphasis-color-rgb), .8) !default;\n$navbar-light-active-color: rgba(var(--#{$prefix}emphasis-color-rgb), 1) !default;\n$navbar-light-disabled-color: rgba(var(--#{$prefix}emphasis-color-rgb), .3) !default;\n$navbar-light-icon-color: rgba($body-color, .75) !default;\n$navbar-light-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-light-toggler-border-color: rgba(var(--#{$prefix}emphasis-color-rgb), .15) !default;\n$navbar-light-brand-color: $navbar-light-active-color !default;\n$navbar-light-brand-hover-color: $navbar-light-active-color !default;\n// scss-docs-end navbar-variables\n\n// scss-docs-start navbar-dark-variables\n$navbar-dark-color: rgba($white, .55) !default;\n$navbar-dark-hover-color: rgba($white, .75) !default;\n$navbar-dark-active-color: $white !default;\n$navbar-dark-disabled-color: rgba($white, .25) !default;\n$navbar-dark-icon-color: $navbar-dark-color !default;\n$navbar-dark-toggler-icon-bg: url(\"data:image/svg+xml,\") !default;\n$navbar-dark-toggler-border-color: rgba($white, .1) !default;\n$navbar-dark-brand-color: $navbar-dark-active-color !default;\n$navbar-dark-brand-hover-color: $navbar-dark-active-color !default;\n// scss-docs-end navbar-dark-variables\n\n\n// Dropdowns\n//\n// Dropdown menu container and contents.\n\n// scss-docs-start dropdown-variables\n$dropdown-min-width: 10rem !default;\n$dropdown-padding-x: 0 !default;\n$dropdown-padding-y: .5rem !default;\n$dropdown-spacer: .125rem !default;\n$dropdown-font-size: $font-size-base !default;\n$dropdown-color: var(--#{$prefix}body-color) !default;\n$dropdown-bg: var(--#{$prefix}body-bg) !default;\n$dropdown-border-color: var(--#{$prefix}border-color-translucent) !default;\n$dropdown-border-radius: var(--#{$prefix}border-radius) !default;\n$dropdown-border-width: var(--#{$prefix}border-width) !default;\n$dropdown-inner-border-radius: calc(#{$dropdown-border-radius} - #{$dropdown-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$dropdown-divider-bg: $dropdown-border-color !default;\n$dropdown-divider-margin-y: $spacer * .5 !default;\n$dropdown-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$dropdown-link-color: var(--#{$prefix}body-color) !default;\n$dropdown-link-hover-color: $dropdown-link-color !default;\n$dropdown-link-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n\n$dropdown-link-active-color: $component-active-color !default;\n$dropdown-link-active-bg: $component-active-bg !default;\n\n$dropdown-link-disabled-color: var(--#{$prefix}tertiary-color) !default;\n\n$dropdown-item-padding-y: $spacer * .25 !default;\n$dropdown-item-padding-x: $spacer !default;\n\n$dropdown-header-color: $gray-600 !default;\n$dropdown-header-padding-x: $dropdown-item-padding-x !default;\n$dropdown-header-padding-y: $dropdown-padding-y !default;\n// fusv-disable\n$dropdown-header-padding: $dropdown-header-padding-y $dropdown-header-padding-x !default; // Deprecated in v5.2.0\n// fusv-enable\n// scss-docs-end dropdown-variables\n\n// scss-docs-start dropdown-dark-variables\n$dropdown-dark-color: $gray-300 !default;\n$dropdown-dark-bg: $gray-800 !default;\n$dropdown-dark-border-color: $dropdown-border-color !default;\n$dropdown-dark-divider-bg: $dropdown-divider-bg !default;\n$dropdown-dark-box-shadow: null !default;\n$dropdown-dark-link-color: $dropdown-dark-color !default;\n$dropdown-dark-link-hover-color: $white !default;\n$dropdown-dark-link-hover-bg: rgba($white, .15) !default;\n$dropdown-dark-link-active-color: $dropdown-link-active-color !default;\n$dropdown-dark-link-active-bg: $dropdown-link-active-bg !default;\n$dropdown-dark-link-disabled-color: $gray-500 !default;\n$dropdown-dark-header-color: $gray-500 !default;\n// scss-docs-end dropdown-dark-variables\n\n\n// Pagination\n\n// scss-docs-start pagination-variables\n$pagination-padding-y: .375rem !default;\n$pagination-padding-x: .75rem !default;\n$pagination-padding-y-sm: .25rem !default;\n$pagination-padding-x-sm: .5rem !default;\n$pagination-padding-y-lg: .75rem !default;\n$pagination-padding-x-lg: 1.5rem !default;\n\n$pagination-font-size: $font-size-base !default;\n\n$pagination-color: var(--#{$prefix}link-color) !default;\n$pagination-bg: var(--#{$prefix}body-bg) !default;\n$pagination-border-radius: var(--#{$prefix}border-radius) !default;\n$pagination-border-width: var(--#{$prefix}border-width) !default;\n$pagination-margin-start: calc(#{$pagination-border-width} * -1) !default; // stylelint-disable-line function-disallowed-list\n$pagination-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-focus-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-focus-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-focus-box-shadow: $focus-ring-box-shadow !default;\n$pagination-focus-outline: 0 !default;\n\n$pagination-hover-color: var(--#{$prefix}link-hover-color) !default;\n$pagination-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$pagination-hover-border-color: var(--#{$prefix}border-color) !default; // Todo in v6: remove this?\n\n$pagination-active-color: $component-active-color !default;\n$pagination-active-bg: $component-active-bg !default;\n$pagination-active-border-color: $component-active-bg !default;\n\n$pagination-disabled-color: var(--#{$prefix}secondary-color) !default;\n$pagination-disabled-bg: var(--#{$prefix}secondary-bg) !default;\n$pagination-disabled-border-color: var(--#{$prefix}border-color) !default;\n\n$pagination-transition: color .15s ease-in-out, background-color .15s ease-in-out, border-color .15s ease-in-out, box-shadow .15s ease-in-out !default;\n\n$pagination-border-radius-sm: var(--#{$prefix}border-radius-sm) !default;\n$pagination-border-radius-lg: var(--#{$prefix}border-radius-lg) !default;\n// scss-docs-end pagination-variables\n\n\n// Placeholders\n\n// scss-docs-start placeholders\n$placeholder-opacity-max: .5 !default;\n$placeholder-opacity-min: .2 !default;\n// scss-docs-end placeholders\n\n// Cards\n\n// scss-docs-start card-variables\n$card-spacer-y: $spacer !default;\n$card-spacer-x: $spacer !default;\n$card-title-spacer-y: $spacer * .5 !default;\n$card-title-color: null !default;\n$card-subtitle-color: null !default;\n$card-border-width: var(--#{$prefix}border-width) !default;\n$card-border-color: var(--#{$prefix}border-color-translucent) !default;\n$card-border-radius: var(--#{$prefix}border-radius) !default;\n$card-box-shadow: null !default;\n$card-inner-border-radius: subtract($card-border-radius, $card-border-width) !default;\n$card-cap-padding-y: $card-spacer-y * .5 !default;\n$card-cap-padding-x: $card-spacer-x !default;\n$card-cap-bg: rgba(var(--#{$prefix}body-color-rgb), .03) !default;\n$card-cap-color: null !default;\n$card-height: null !default;\n$card-color: null !default;\n$card-bg: var(--#{$prefix}body-bg) !default;\n$card-img-overlay-padding: $spacer !default;\n$card-group-margin: $grid-gutter-width * .5 !default;\n// scss-docs-end card-variables\n\n// Accordion\n\n// scss-docs-start accordion-variables\n$accordion-padding-y: 1rem !default;\n$accordion-padding-x: 1.25rem !default;\n$accordion-color: var(--#{$prefix}body-color) !default;\n$accordion-bg: var(--#{$prefix}body-bg) !default;\n$accordion-border-width: var(--#{$prefix}border-width) !default;\n$accordion-border-color: var(--#{$prefix}border-color) !default;\n$accordion-border-radius: var(--#{$prefix}border-radius) !default;\n$accordion-inner-border-radius: subtract($accordion-border-radius, $accordion-border-width) !default;\n\n$accordion-body-padding-y: $accordion-padding-y !default;\n$accordion-body-padding-x: $accordion-padding-x !default;\n\n$accordion-button-padding-y: $accordion-padding-y !default;\n$accordion-button-padding-x: $accordion-padding-x !default;\n$accordion-button-color: var(--#{$prefix}body-color) !default;\n$accordion-button-bg: var(--#{$prefix}accordion-bg) !default;\n$accordion-transition: $btn-transition, border-radius .15s ease !default;\n$accordion-button-active-bg: var(--#{$prefix}primary-bg-subtle) !default;\n$accordion-button-active-color: var(--#{$prefix}primary-text-emphasis) !default;\n\n// fusv-disable\n$accordion-button-focus-border-color: $input-focus-border-color !default; // Deprecated in v5.3.3\n// fusv-enable\n$accordion-button-focus-box-shadow: $btn-focus-box-shadow !default;\n\n$accordion-icon-width: 1.25rem !default;\n$accordion-icon-color: $body-color !default;\n$accordion-icon-active-color: $primary-text-emphasis !default;\n$accordion-icon-transition: transform .2s ease-in-out !default;\n$accordion-icon-transform: rotate(-180deg) !default;\n\n$accordion-button-icon: url(\"data:image/svg+xml,\") !default;\n$accordion-button-active-icon: url(\"data:image/svg+xml,\") !default;\n// scss-docs-end accordion-variables\n\n// Tooltips\n\n// scss-docs-start tooltip-variables\n$tooltip-font-size: $font-size-sm !default;\n$tooltip-max-width: 200px !default;\n$tooltip-color: var(--#{$prefix}body-bg) !default;\n$tooltip-bg: var(--#{$prefix}emphasis-color) !default;\n$tooltip-border-radius: var(--#{$prefix}border-radius) !default;\n$tooltip-opacity: .9 !default;\n$tooltip-padding-y: $spacer * .25 !default;\n$tooltip-padding-x: $spacer * .5 !default;\n$tooltip-margin: null !default; // TODO: remove this in v6\n\n$tooltip-arrow-width: .8rem !default;\n$tooltip-arrow-height: .4rem !default;\n// fusv-disable\n$tooltip-arrow-color: null !default; // Deprecated in Bootstrap 5.2.0 for CSS variables\n// fusv-enable\n// scss-docs-end tooltip-variables\n\n// Form tooltips must come after regular tooltips\n// scss-docs-start tooltip-feedback-variables\n$form-feedback-tooltip-padding-y: $tooltip-padding-y !default;\n$form-feedback-tooltip-padding-x: $tooltip-padding-x !default;\n$form-feedback-tooltip-font-size: $tooltip-font-size !default;\n$form-feedback-tooltip-line-height: null !default;\n$form-feedback-tooltip-opacity: $tooltip-opacity !default;\n$form-feedback-tooltip-border-radius: $tooltip-border-radius !default;\n// scss-docs-end tooltip-feedback-variables\n\n\n// Popovers\n\n// scss-docs-start popover-variables\n$popover-font-size: $font-size-sm !default;\n$popover-bg: var(--#{$prefix}body-bg) !default;\n$popover-max-width: 276px !default;\n$popover-border-width: var(--#{$prefix}border-width) !default;\n$popover-border-color: var(--#{$prefix}border-color-translucent) !default;\n$popover-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}) !default; // stylelint-disable-line function-disallowed-list\n$popover-box-shadow: var(--#{$prefix}box-shadow) !default;\n\n$popover-header-font-size: $font-size-base !default;\n$popover-header-bg: var(--#{$prefix}secondary-bg) !default;\n$popover-header-color: $headings-color !default;\n$popover-header-padding-y: .5rem !default;\n$popover-header-padding-x: $spacer !default;\n\n$popover-body-color: var(--#{$prefix}body-color) !default;\n$popover-body-padding-y: $spacer !default;\n$popover-body-padding-x: $spacer !default;\n\n$popover-arrow-width: 1rem !default;\n$popover-arrow-height: .5rem !default;\n// scss-docs-end popover-variables\n\n// fusv-disable\n// Deprecated in Bootstrap 5.2.0 for CSS variables\n$popover-arrow-color: $popover-bg !default;\n$popover-arrow-outer-color: var(--#{$prefix}border-color-translucent) !default;\n// fusv-enable\n\n\n// Toasts\n\n// scss-docs-start toast-variables\n$toast-max-width: 350px !default;\n$toast-padding-x: .75rem !default;\n$toast-padding-y: .5rem !default;\n$toast-font-size: .875rem !default;\n$toast-color: null !default;\n$toast-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-border-width: var(--#{$prefix}border-width) !default;\n$toast-border-color: var(--#{$prefix}border-color-translucent) !default;\n$toast-border-radius: var(--#{$prefix}border-radius) !default;\n$toast-box-shadow: var(--#{$prefix}box-shadow) !default;\n$toast-spacing: $container-padding-x !default;\n\n$toast-header-color: var(--#{$prefix}secondary-color) !default;\n$toast-header-background-color: rgba(var(--#{$prefix}body-bg-rgb), .85) !default;\n$toast-header-border-color: $toast-border-color !default;\n// scss-docs-end toast-variables\n\n\n// Badges\n\n// scss-docs-start badge-variables\n$badge-font-size: .75em !default;\n$badge-font-weight: $font-weight-bold !default;\n$badge-color: $white !default;\n$badge-padding-y: .35em !default;\n$badge-padding-x: .65em !default;\n$badge-border-radius: var(--#{$prefix}border-radius) !default;\n// scss-docs-end badge-variables\n\n\n// Modals\n\n// scss-docs-start modal-variables\n$modal-inner-padding: $spacer !default;\n\n$modal-footer-margin-between: .5rem !default;\n\n$modal-dialog-margin: .5rem !default;\n$modal-dialog-margin-y-sm-up: 1.75rem !default;\n\n$modal-title-line-height: $line-height-base !default;\n\n$modal-content-color: null !default;\n$modal-content-bg: var(--#{$prefix}body-bg) !default;\n$modal-content-border-color: var(--#{$prefix}border-color-translucent) !default;\n$modal-content-border-width: var(--#{$prefix}border-width) !default;\n$modal-content-border-radius: var(--#{$prefix}border-radius-lg) !default;\n$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width) !default;\n$modal-content-box-shadow-xs: var(--#{$prefix}box-shadow-sm) !default;\n$modal-content-box-shadow-sm-up: var(--#{$prefix}box-shadow) !default;\n\n$modal-backdrop-bg: $black !default;\n$modal-backdrop-opacity: .5 !default;\n\n$modal-header-border-color: var(--#{$prefix}border-color) !default;\n$modal-header-border-width: $modal-content-border-width !default;\n$modal-header-padding-y: $modal-inner-padding !default;\n$modal-header-padding-x: $modal-inner-padding !default;\n$modal-header-padding: $modal-header-padding-y $modal-header-padding-x !default; // Keep this for backwards compatibility\n\n$modal-footer-bg: null !default;\n$modal-footer-border-color: $modal-header-border-color !default;\n$modal-footer-border-width: $modal-header-border-width !default;\n\n$modal-sm: 300px !default;\n$modal-md: 500px !default;\n$modal-lg: 800px !default;\n$modal-xl: 1140px !default;\n\n$modal-fade-transform: translate(0, -50px) !default;\n$modal-show-transform: none !default;\n$modal-transition: transform .3s ease-out !default;\n$modal-scale-transform: scale(1.02) !default;\n// scss-docs-end modal-variables\n\n\n// Alerts\n//\n// Define alert colors, border radius, and padding.\n\n// scss-docs-start alert-variables\n$alert-padding-y: $spacer !default;\n$alert-padding-x: $spacer !default;\n$alert-margin-bottom: 1rem !default;\n$alert-border-radius: var(--#{$prefix}border-radius) !default;\n$alert-link-font-weight: $font-weight-bold !default;\n$alert-border-width: var(--#{$prefix}border-width) !default;\n$alert-dismissible-padding-r: $alert-padding-x * 3 !default; // 3x covers width of x plus default padding on either side\n// scss-docs-end alert-variables\n\n// fusv-disable\n$alert-bg-scale: -80% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-border-scale: -70% !default; // Deprecated in v5.2.0, to be removed in v6\n$alert-color-scale: 40% !default; // Deprecated in v5.2.0, to be removed in v6\n// fusv-enable\n\n// Progress bars\n\n// scss-docs-start progress-variables\n$progress-height: 1rem !default;\n$progress-font-size: $font-size-base * .75 !default;\n$progress-bg: var(--#{$prefix}secondary-bg) !default;\n$progress-border-radius: var(--#{$prefix}border-radius) !default;\n$progress-box-shadow: var(--#{$prefix}box-shadow-inset) !default;\n$progress-bar-color: $white !default;\n$progress-bar-bg: $primary !default;\n$progress-bar-animation-timing: 1s linear infinite !default;\n$progress-bar-transition: width .6s ease !default;\n// scss-docs-end progress-variables\n\n\n// List group\n\n// scss-docs-start list-group-variables\n$list-group-color: var(--#{$prefix}body-color) !default;\n$list-group-bg: var(--#{$prefix}body-bg) !default;\n$list-group-border-color: var(--#{$prefix}border-color) !default;\n$list-group-border-width: var(--#{$prefix}border-width) !default;\n$list-group-border-radius: var(--#{$prefix}border-radius) !default;\n\n$list-group-item-padding-y: $spacer * .5 !default;\n$list-group-item-padding-x: $spacer !default;\n// fusv-disable\n$list-group-item-bg-scale: -80% !default; // Deprecated in v5.3.0\n$list-group-item-color-scale: 40% !default; // Deprecated in v5.3.0\n// fusv-enable\n\n$list-group-hover-bg: var(--#{$prefix}tertiary-bg) !default;\n$list-group-active-color: $component-active-color !default;\n$list-group-active-bg: $component-active-bg !default;\n$list-group-active-border-color: $list-group-active-bg !default;\n\n$list-group-disabled-color: var(--#{$prefix}secondary-color) !default;\n$list-group-disabled-bg: $list-group-bg !default;\n\n$list-group-action-color: var(--#{$prefix}secondary-color) !default;\n$list-group-action-hover-color: var(--#{$prefix}emphasis-color) !default;\n\n$list-group-action-active-color: var(--#{$prefix}body-color) !default;\n$list-group-action-active-bg: var(--#{$prefix}secondary-bg) !default;\n// scss-docs-end list-group-variables\n\n\n// Image thumbnails\n\n// scss-docs-start thumbnail-variables\n$thumbnail-padding: .25rem !default;\n$thumbnail-bg: var(--#{$prefix}body-bg) !default;\n$thumbnail-border-width: var(--#{$prefix}border-width) !default;\n$thumbnail-border-color: var(--#{$prefix}border-color) !default;\n$thumbnail-border-radius: var(--#{$prefix}border-radius) !default;\n$thumbnail-box-shadow: var(--#{$prefix}box-shadow-sm) !default;\n// scss-docs-end thumbnail-variables\n\n\n// Figures\n\n// scss-docs-start figure-variables\n$figure-caption-font-size: $small-font-size !default;\n$figure-caption-color: var(--#{$prefix}secondary-color) !default;\n// scss-docs-end figure-variables\n\n\n// Breadcrumbs\n\n// scss-docs-start breadcrumb-variables\n$breadcrumb-font-size: null !default;\n$breadcrumb-padding-y: 0 !default;\n$breadcrumb-padding-x: 0 !default;\n$breadcrumb-item-padding-x: .5rem !default;\n$breadcrumb-margin-bottom: 1rem !default;\n$breadcrumb-bg: null !default;\n$breadcrumb-divider-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-active-color: var(--#{$prefix}secondary-color) !default;\n$breadcrumb-divider: quote(\"/\") !default;\n$breadcrumb-divider-flipped: $breadcrumb-divider !default;\n$breadcrumb-border-radius: null !default;\n// scss-docs-end breadcrumb-variables\n\n// Carousel\n\n// scss-docs-start carousel-variables\n$carousel-control-color: $white !default;\n$carousel-control-width: 15% !default;\n$carousel-control-opacity: .5 !default;\n$carousel-control-hover-opacity: .9 !default;\n$carousel-control-transition: opacity .15s ease !default;\n\n$carousel-indicator-width: 30px !default;\n$carousel-indicator-height: 3px !default;\n$carousel-indicator-hit-area-height: 10px !default;\n$carousel-indicator-spacer: 3px !default;\n$carousel-indicator-opacity: .5 !default;\n$carousel-indicator-active-bg: $white !default;\n$carousel-indicator-active-opacity: 1 !default;\n$carousel-indicator-transition: opacity .6s ease !default;\n\n$carousel-caption-width: 70% !default;\n$carousel-caption-color: $white !default;\n$carousel-caption-padding-y: 1.25rem !default;\n$carousel-caption-spacer: 1.25rem !default;\n\n$carousel-control-icon-width: 2rem !default;\n\n$carousel-control-prev-icon-bg: url(\"data:image/svg+xml,\") !default;\n$carousel-control-next-icon-bg: url(\"data:image/svg+xml,\") !default;\n\n$carousel-transition-duration: .6s !default;\n$carousel-transition: transform $carousel-transition-duration ease-in-out !default; // Define transform transition first if using multiple transitions (e.g., `transform 2s ease, opacity .5s ease-out`)\n// scss-docs-end carousel-variables\n\n// scss-docs-start carousel-dark-variables\n$carousel-dark-indicator-active-bg: $black !default;\n$carousel-dark-caption-color: $black !default;\n$carousel-dark-control-icon-filter: invert(1) grayscale(100) !default;\n// scss-docs-end carousel-dark-variables\n\n\n// Spinners\n\n// scss-docs-start spinner-variables\n$spinner-width: 2rem !default;\n$spinner-height: $spinner-width !default;\n$spinner-vertical-align: -.125em !default;\n$spinner-border-width: .25em !default;\n$spinner-animation-speed: .75s !default;\n\n$spinner-width-sm: 1rem !default;\n$spinner-height-sm: $spinner-width-sm !default;\n$spinner-border-width-sm: .2em !default;\n// scss-docs-end spinner-variables\n\n\n// Close\n\n// scss-docs-start close-variables\n$btn-close-width: 1em !default;\n$btn-close-height: $btn-close-width !default;\n$btn-close-padding-x: .25em !default;\n$btn-close-padding-y: $btn-close-padding-x !default;\n$btn-close-color: $black !default;\n$btn-close-bg: url(\"data:image/svg+xml,\") !default;\n$btn-close-focus-shadow: $focus-ring-box-shadow !default;\n$btn-close-opacity: .5 !default;\n$btn-close-hover-opacity: .75 !default;\n$btn-close-focus-opacity: 1 !default;\n$btn-close-disabled-opacity: .25 !default;\n$btn-close-white-filter: invert(1) grayscale(100%) brightness(200%) !default;\n// scss-docs-end close-variables\n\n\n// Offcanvas\n\n// scss-docs-start offcanvas-variables\n$offcanvas-padding-y: $modal-inner-padding !default;\n$offcanvas-padding-x: $modal-inner-padding !default;\n$offcanvas-horizontal-width: 400px !default;\n$offcanvas-vertical-height: 30vh !default;\n$offcanvas-transition-duration: .3s !default;\n$offcanvas-border-color: $modal-content-border-color !default;\n$offcanvas-border-width: $modal-content-border-width !default;\n$offcanvas-title-line-height: $modal-title-line-height !default;\n$offcanvas-bg-color: var(--#{$prefix}body-bg) !default;\n$offcanvas-color: var(--#{$prefix}body-color) !default;\n$offcanvas-box-shadow: $modal-content-box-shadow-xs !default;\n$offcanvas-backdrop-bg: $modal-backdrop-bg !default;\n$offcanvas-backdrop-opacity: $modal-backdrop-opacity !default;\n// scss-docs-end offcanvas-variables\n\n// Code\n\n$code-font-size: $small-font-size !default;\n$code-color: $pink !default;\n\n$kbd-padding-y: .1875rem !default;\n$kbd-padding-x: .375rem !default;\n$kbd-font-size: $code-font-size !default;\n$kbd-color: var(--#{$prefix}body-bg) !default;\n$kbd-bg: var(--#{$prefix}body-color) !default;\n$nested-kbd-font-weight: null !default; // Deprecated in v5.2.0, removing in v6\n\n$pre-color: null !default;\n\n@import \"variables-dark\"; // TODO: can be removed safely in v6, only here to avoid breaking changes in v5.3\n","// Override bootstrap variables\n$spacer: 1rem;\n$container-max-widths: (\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1400px,\n);\n$grid-breakpoints: (\n xs: 0,\n sm: 540px,\n md: 720px,\n lg: 960px,\n xl: 1200px,\n);\n$dropdown-link-hover-bg: var(--pst-color-surface);\n\n// --pst-color-surface can also be assigned to the dark variant because it is\n// scoped to different values depending on light/dark theme\n$dropdown-dark-link-hover-bg: var(--pst-color-surface);\n$dropdown-link-active-bg: var(--pst-color-surface);\n$dropdown-dark-link-active-bg: var(--pst-color-surface);\n$focus-ring-width: 0.1875rem; // 3px at 100% zoom (0.1875 * 16px base font = 3px)\n$focus-ring-opacity: 1;\n$focus-ring-color: var(--pst-color-accent);\n$focus-ring-blur: 0;\n$focus-ring-box-shadow: 0 0 $focus-ring-blur $focus-ring-width $focus-ring-color;\n\n// outline creates the same style of focus ring, it just uses CSS outline instead of box shadow\n$focus-ring-outline: $focus-ring-color solid $focus-ring-width;\n$btn-focus-box-shadow: $focus-ring-box-shadow;\n","/***\n * Rules for the UX/UI of skip navigation link btn.\n * It's only visible to people\n * navigating with keyboard for accessibility purposes\n * ref: https://www.youtube.com/watch?v=VUR0I5mqq7I\n ***/\n\n.skip-link {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n text-align: center;\n background-color: var(--pst-color-warning);\n padding: 0.5rem;\n z-index: $zindex-modal;\n border-bottom: 1px solid var(--pst-color-border);\n\n // This shows / hides the button\n transform: translateY(-100%);\n transition: transform 150ms ease-in-out;\n\n &:focus-within {\n transform: translateY(0%);\n }\n\n a {\n // Ensure we are using a WCAG conformant colour\n color: var(--pst-color-warning-text) !important;\n\n &:focus-visible {\n // use color with sufficient contrast\n outline-color: $foundation-black;\n }\n }\n}\n","/*******************************************************************************\n* master color map. Only the colors that actually differ between light and dark\n* themes are specified separately.\n*\n* To see the full list of colors see https://www.figma.com/file/rUrrHGhUBBIAAjQ82x6pz9/PyData-Design-system---proposal-for-implementation-(2)?node-id=1234%3A765&t=ifcFT1JtnrSshGfi-1\n*/\n\n@use \"sass:map\";\n@use \"sass:meta\";\n@use \"sass:string\";\n\n/**\n* Function to get items from nested maps\n*/\n// @param {Map} $map - Map\n// @param {Arglist} $keys - Keys to fetch\n// @return {*}\n@function map-deep-get($map, $keys...) {\n @each $key in $keys {\n $map: map.get($map, $key);\n }\n\n @return $map;\n}\n\n/* Assign base colors for the PyData theme */\n$color-palette: (\n // Primary color\n \"teal\":\n (\n \"50\": #f4fbfc,\n \"100\": #e9f6f8,\n \"200\": #d0ecf1,\n \"300\": #abdde6,\n \"400\": #3fb1c5,\n \"500\": #0a7d91,\n \"600\": #085d6c,\n \"700\": #064752,\n \"800\": #042c33,\n \"900\": #021b1f,\n ),\n // Secondary color\n \"violet\":\n (\n \"50\": #f4eefb,\n \"100\": #e0c7ff,\n \"200\": #d5b4fd,\n \"300\": #b780ff,\n \"400\": #9c5ffd,\n \"500\": #8045e5,\n \"600\": #6432bd,\n \"700\": #4b258f,\n \"800\": #341a61,\n \"900\": #1e0e39,\n ),\n // Neutrals\n \"gray\":\n (\n \"50\": #f9f9fa,\n \"100\": #f3f4f5,\n \"200\": #e5e7ea,\n \"300\": #d1d5da,\n \"400\": #9ca4af,\n \"500\": #677384,\n \"600\": #48566b,\n \"700\": #29313d,\n \"800\": #222832,\n \"900\": #14181e,\n ),\n // Accent color\n \"pink\":\n (\n \"50\": #fcf8fd,\n \"100\": #fcf0fa,\n \"200\": #f8dff5,\n \"300\": #f3c7ee,\n \"400\": #e47fd7,\n \"500\": #c132af,\n \"600\": #912583,\n \"700\": #6e1c64,\n \"800\": #46123f,\n \"900\": #2b0b27,\n ),\n \"foundation\": (\n \"white\": #ffffff,\n // gray-900\n \"black\": #14181e,\n )\n);\n\n:root {\n // Add theme colours to the html root element\n @each $group-color, $color in $color-palette {\n @each $color-name, $definition in $color {\n --pst-#{$group-color}-#{$color-name}: #{$definition};\n }\n }\n}\n\n// Static SCSS variables used thoroughout the theme\n// Minimum contrast ratio used for the theme.\n// Acceptable values for WCAG 2.0 are 3, 4.5 and 7.\n// See https://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast\n// 4.5 - is for text that is 14pt or less\n$min-contrast-ratio-4: 4.5;\n\n// 3 is for text that is 18pt or bold, or for non-text elements\n$min-contrast-ratio-3: 3;\n\n// Customize the light and dark text colors for use in our color contrast function.\n$foundation-black: #14181e;\n$foundation-white: #fff;\n\n// This is a custom - calculated color between gray 100 and 200 - to reduce\n// the contrast ratio (avoid a jarring effect)\n$base-light-text: #ced6dd;\n\n// used in sphinx_design - gray 100\n$foundation-light-gray: #f3f4f5;\n\n// used in sphinx_design - gray 700\n$foundation-muted-gray: #29313d;\n\n// used in sphinx_design - gray 800\n$foundation-dark-gray: #222832;\n$pst-semantic-colors: (\n \"primary\": (\n \"light\": #{map-deep-get($color-palette, \"teal\", \"500\")},\n \"bg-light\": #{map-deep-get($color-palette, \"teal\", \"200\")},\n \"dark\": #{map-deep-get($color-palette, \"teal\", \"400\")},\n \"bg-dark\": #{map-deep-get($color-palette, \"teal\", \"800\")},\n ),\n \"secondary\": (\n \"light\": #{map-deep-get($color-palette, \"violet\", \"500\")},\n \"bg-light\": #{map-deep-get($color-palette, \"violet\", \"100\")},\n \"dark\": #{map-deep-get($color-palette, \"violet\", \"400\")},\n \"bg-dark\": #{map-deep-get($color-palette, \"violet\", \"800\")},\n ),\n \"accent\": (\n \"light\": #{map-deep-get($color-palette, \"pink\", \"500\")},\n \"bg-light\": #{map-deep-get($color-palette, \"pink\", \"200\")},\n \"dark\": #{map-deep-get($color-palette, \"pink\", \"400\")},\n \"bg-dark\": #{map-deep-get($color-palette, \"pink\", \"800\")},\n ),\n \"info\": (\n \"light\": #276be9,\n \"bg-light\": #dce7fc,\n \"dark\": #79a3f2,\n \"bg-dark\": #06245d,\n ),\n \"warning\": (\n \"light\": #f66a0a,\n \"bg-light\": #f8e3d0,\n \"dark\": #ff9245,\n \"bg-dark\": #652a02,\n ),\n \"success\": (\n \"light\": #00843f,\n \"bg-light\": #d6ece1,\n \"dark\": #5fb488,\n \"bg-dark\": #002f17,\n ),\n // This is based on the warning color\n \"attention\":\n (\n \"light\": var(--pst-color-warning),\n \"bg-light\": var(--pst-color-warning-bg),\n \"dark\": var(--pst-color-warning),\n \"bg-dark\": var(--pst-color-warning-bg),\n ),\n \"danger\": (\n \"light\": #d72d47,\n \"bg-light\": #f9e1e4,\n \"dark\": #e78894,\n \"bg-dark\": #4e111b,\n ),\n \"text-base\": (\n \"light\": #{map-deep-get($color-palette, \"gray\", \"800\")},\n \"dark\": $base-light-text,\n ),\n \"text-muted\": (\n \"light\": #{map-deep-get($color-palette, \"gray\", \"600\")},\n \"dark\": #{map-deep-get($color-palette, \"gray\", \"400\")},\n ),\n \"heading-color\": (\n \"light\": #{$foundation-white},\n \"dark\": #{$foundation-black},\n ),\n \"shadow\": (\n \"light\": rgba(0, 0, 0, 0.1),\n \"dark\": rgba(0, 0, 0, 0.2),\n ),\n \"border\": (\n \"light\": #{map-deep-get($color-palette, \"gray\", \"300\")},\n \"dark\": #{map-deep-get($color-palette, \"gray\", \"600\")},\n ),\n \"border-muted\": (\n \"light\": rgba(23, 23, 26, 0.2),\n \"dark\": #{map-deep-get($color-palette, \"gray\", \"700\")},\n ),\n \"blockquote-notch\": (\n // These colors have a contrast ratio > 3.0 against both the background and\n // surface colors that the notch is sandwiched between\n \"light\": #{map-deep-get($color-palette, \"gray\", \"500\")},\n \"dark\": #{map-deep-get($color-palette, \"gray\", \"400\")},\n ),\n \"inline-code\": (\n \"light\": #{map-deep-get($color-palette, \"pink\", \"600\")},\n \"dark\": #{map-deep-get($color-palette, \"pink\", \"300\")},\n ),\n \"inline-code-links\": (\n // need to make sure there is enough contrast against the code bg\n \"light\": #{map-deep-get($color-palette, \"teal\", \"600\")},\n // keep primary color for dark mode\n \"dark\": #{map-deep-get($color-palette, \"teal\", \"400\")},\n ),\n \"target\": (\n \"light\": #f3cf95,\n \"dark\": #675c04,\n ),\n \"table\": (\n \"light\": #{map-deep-get($color-palette, \"foundation\", \"black\")},\n \"dark\": #{map-deep-get($color-palette, \"foundation\", \"white\")},\n ),\n \"table-row-hover\": (\n \"bg-light\": #{map-deep-get($color-palette, \"violet\", \"300\")},\n \"bg-dark\": #{map-deep-get($color-palette, \"violet\", \"600\")},\n ),\n \"table-inner-border\": (\n \"light\": #{map-deep-get($color-palette, \"gray\", \"200\")},\n \"dark\": #364150,\n ),\n // DEPTH COLORS - you can see the elevation colours and shades\n // in the Figma file https://www.figma.com/file/rUrrHGhUBBIAAjQ82x6pz9/PyData-Design-system---proposal-for-implementation-(2)?node-id=1492%3A922&t=sQeQZehkOzposYEg-1\n // background: color of the canvas / the furthest back layer\n \"background\":\n (\n \"light\": #{map-deep-get($color-palette, \"foundation\", \"white\")},\n \"dark\": #{map-deep-get($color-palette, \"foundation\", \"black\")},\n ),\n // on-background: provides slight contrast against background\n // (by use of shadows in light theme)\n \"on-background\":\n (\n \"light\": #{map-deep-get($color-palette, \"foundation\", \"white\")},\n \"dark\": #{map-deep-get($color-palette, \"gray\", \"800\")},\n ),\n \"surface\": (\n \"light\": #{map-deep-get($color-palette, \"gray\", \"100\")},\n \"dark\": #{map-deep-get($color-palette, \"gray\", \"700\")},\n ),\n // on_surface: object on top of surface object (without shadows)\n \"on-surface\":\n (\n \"light\": #{map-deep-get($color-palette, \"gray\", \"800\")},\n \"dark\": $foundation-light-gray,\n ),\n);\n\n/*******************************************************************************\n* write the color rules for each theme (light/dark)\n*/\n\n/* NOTE:\n * Mixins enable us to reuse the same definitions for the different modes\n * https://sass-lang.com/documentation/at-rules/mixin\n * #{something} inserts a variable into a CSS selector or property name\n * https://sass-lang.com/documentation/interpolation\n */\n@mixin theme-colors($mode) {\n // check if this color is defined differently for light/dark\n @each $col-name, $definition in $pst-semantic-colors {\n @if meta.type-of($definition) == map {\n @each $key, $val in $definition {\n @if string.index($key, $mode) {\n // since now we define the bg colours in the semantic colours and not\n // by changing opacity, we need to check if the key contains bg and the\n // correct mode (light/dark)\n @if string.index($key, \"bg\") {\n --pst-color-#{$col-name}-bg: #{$val};\n } @else {\n --pst-color-#{$col-name}: #{$val};\n }\n }\n }\n } @else {\n --pst-color-#{$col-name}: #{$definition};\n }\n }\n\n // assign the \"duplicate\" colors (ones that just reference other variables)\n & {\n --pst-color-link: var(--pst-color-primary);\n --pst-color-link-hover: var(--pst-color-secondary);\n --pst-color-table-outer-border: var(--pst-color-surface);\n --pst-color-table-heading-bg: var(--pst-color-surface);\n --pst-color-table-row-zebra-high-bg: var(--pst-color-on-background);\n --pst-color-table-row-zebra-low-bg: var(--pst-color-surface);\n }\n\n // adapt to light/dark-specific content\n @if $mode == \"light\" {\n .only-dark,\n .only-dark ~ figcaption {\n display: none !important;\n }\n } @else {\n .only-light,\n .only-light ~ figcaption {\n display: none !important;\n }\n\n /* Adjust images in dark mode (unless they have class .only-dark or\n * .dark-light, in which case assume they're already optimized for dark\n * mode).\n */\n img:not(.only-dark, .dark-light) {\n filter: brightness(0.8) contrast(1.2);\n }\n\n /* Give images a light background in dark mode in case they have\n * transparency and black text (unless they have class .only-dark or .dark-light, in\n * which case assume they're already optimized for dark mode).\n */\n .bd-content img:not(.only-dark, .dark-light) {\n background-color: rgb(255 255 255);\n border-radius: 0.25rem;\n }\n\n // MathJax SVG outputs should be filled to same color as text.\n .MathJax_SVG * {\n fill: var(--pst-color-text-base);\n }\n }\n}\n\n/* Defaults to light mode if data-theme is not set */\nhtml:not([data-theme]) {\n @include theme-colors(\"light\");\n}\n\n/* NOTE: @each {...} is like a for-loop\n * https://sass-lang.com/documentation/at-rules/control/each\n */\n@each $mode in (light, dark) {\n html[data-theme=\"#{$mode}\"] {\n @include theme-colors($mode);\n\n color-scheme: $mode;\n }\n}\n\n// assign classes too, for runtime use of theme colors\n@each $col-name, $definition in $pst-semantic-colors {\n .pst-color-#{$col-name} {\n color: var(--pst-color-#{$col-name});\n }\n}\n",".bd-container {\n flex-grow: 1;\n display: flex;\n justify-content: center;\n\n .bd-container__inner {\n display: flex;\n }\n}\n\n.bd-page-width {\n width: 100%;\n\n @include media-breakpoint-up(lg) {\n max-width: $breakpoint-page-width;\n }\n}\n","// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px)\n//\n// The map defined in the `$grid-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl xxl))\n// md\n@function breakpoint-next($name, $breakpoints: $grid-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @if not $n {\n @error \"breakpoint `#{$name}` not found in `#{$breakpoints}`\";\n }\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $grid-breakpoints) {\n $min: map-get($breakpoints, $name);\n @return if($min != 0, $min, null);\n}\n\n// Maximum breakpoint width.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $grid-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash in front.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $grid-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $grid-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Media that spans multiple breakpoint widths.\n// Makes the @content apply between the min and max breakpoints\n@mixin media-breakpoint-between($lower, $upper, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($lower, $breakpoints);\n $max: breakpoint-max($upper, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($lower, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($upper, $breakpoints) {\n @content;\n }\n }\n}\n\n// Media between the breakpoint's minimum and maximum widths.\n// No minimum for the smallest breakpoint, and no maximum for the largest one.\n// Makes the @content apply only to the given breakpoint, not viewports any wider or narrower.\n@mixin media-breakpoint-only($name, $breakpoints: $grid-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n $next: breakpoint-next($name, $breakpoints);\n $max: breakpoint-max($next, $breakpoints);\n\n @if $min != null and $max != null {\n @media (min-width: $min) and (max-width: $max) {\n @content;\n }\n } @else if $max == null {\n @include media-breakpoint-up($name, $breakpoints) {\n @content;\n }\n } @else if $min == null {\n @include media-breakpoint-down($next, $breakpoints) {\n @content;\n }\n }\n}\n",".pst-async-banner-revealer {\n // Setting height to 0 and overflow to hidden allows us to add up the heights\n // of this element's children before revealing them.\n height: 0;\n overflow: hidden;\n\n // Height to be set by JavaScript, which should trigger the following\n // transition rule (unless the user has set their system to reduce motion).\n transition: height 300ms ease-in-out;\n\n @media (prefers-reduced-motion) {\n transition: none;\n }\n}\n\n#bd-header-version-warning,\n.bd-header-announcement {\n min-height: 3rem;\n width: 100%;\n display: flex;\n position: relative;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 0.5rem 12.5%; // Horizontal padding so the width is 75%\n // One breakpoint less than $breakpoint-sidebar-primary. See variables/_layout.scss for more info.\n @include media-breakpoint-down(lg) {\n // Announcements can take a bit more width on mobile\n padding: 0.5rem 2%;\n }\n\n p {\n font-weight: bold;\n margin: 0;\n }\n\n // Ensure there is enough contrast against the background\n a {\n color: var(--pst-color-inline-code-links);\n }\n\n // The \"Switch to stable version\" link (styled like a button)\n .pst-button-link-to-stable-version {\n @include box-shadow;\n\n $background-color: var(--pst-color-danger);\n $hover-background-color: var(--pst-color-danger-highlight);\n $color: var(--pst-color-danger-text);\n\n background-color: $background-color;\n border-color: $background-color;\n color: $color;\n border-radius: 0.25rem;\n\n &:hover {\n background-color: $hover-background-color;\n border-color: $hover-background-color;\n color: $color;\n }\n\n &:focus-visible {\n outline: $focus-ring-width solid $background-color;\n outline-offset: $focus-ring-width;\n }\n }\n}\n\n// Bg color is now defined in the theme color palette - using our secondary color\n.bd-header-announcement {\n background-color: var(--pst-color-secondary-bg);\n}\n\n#bd-header-version-warning {\n background-color: var(--pst-color-danger-bg);\n}\n","/*********************************************\n* SASS Mixins\n*********************************************/\n\n/**\n * A consistent box shadow style we apply across elements.\n */\n@mixin box-shadow() {\n box-shadow:\n 0 0.2rem 0.5rem var(--pst-color-shadow),\n 0 0 0.0625rem var(--pst-color-shadow) !important;\n}\n\n/**\n * Set background of some cell outputs to white-ish to make sure colors work\n * This is because many libraries make output that only looks good on white\n */\n@mixin cell-output-background {\n color: var(--pst-color-on-background);\n background-color: var(--pst-color-text-base);\n border-radius: 0.25rem;\n padding: 0.5rem;\n}\n\n@mixin table-colors {\n color: var(--pst-color-table);\n border: 1px solid var(--pst-color-table-outer-border);\n\n th,\n td {\n ~ th,\n ~ td {\n border-left: 1px solid var(--pst-color-table-inner-border);\n }\n }\n\n thead {\n tr {\n background-color: var(--pst-color-table-heading-bg);\n border-bottom: 2px solid var(--pst-color-primary);\n }\n }\n\n tbody {\n tr {\n &:nth-child(odd) {\n background-color: var(--pst-color-table-row-zebra-low-bg);\n }\n\n &:nth-child(even) {\n background-color: var(--pst-color-table-row-zebra-high-bg);\n }\n\n &:hover {\n background-color: var(--pst-color-table-row-hover-bg);\n }\n }\n }\n}\n\n// Minimum mouse hit area\n// ----------------------\n// Ensures that the element has a minimum hit area that conforms to\n// accessibility guidelines. For WCAG AA, we need 24px x 24px, see:\n// https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html\n@mixin min-hit-area() {\n box-sizing: border-box;\n min-width: 24px;\n min-height: 24px;\n}\n","/**\n * Main content area\n */\n.bd-main {\n flex-grow: 1;\n flex-direction: column;\n display: flex;\n min-width: 0;\n\n .bd-content {\n display: flex;\n justify-content: center;\n height: 100%;\n\n .bd-article-container {\n justify-content: start;\n display: flex;\n flex-direction: column;\n\n // Max-width is slightly more than the W3 since our docs often have images.\n // We shoot for about 100 characters per line instead of 80.\n // ref: https://www.w3.org/WAI/tutorials/page-structure/styling/#line-length\n width: 100%;\n max-width: 60em;\n overflow-x: auto; // Prevent wide content from pushing off the secondary sidebar\n padding: 1rem;\n\n .bd-article {\n // Give a bit more verticle spacing on wide screens\n @include media-breakpoint-up($breakpoint-sidebar-secondary) {\n padding-top: 1.5rem;\n padding-left: 2rem;\n }\n }\n }\n }\n}\n",".bd-footer {\n width: 100%;\n border-top: 1px solid var(--pst-color-border);\n\n .bd-footer__inner {\n display: flex;\n flex-grow: 1;\n padding: 1rem;\n margin: auto;\n }\n\n .footer-items__start,\n .footer-items__center,\n .footer-items__end {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n justify-content: center;\n flex-grow: 1;\n }\n\n .footer-items__center {\n text-align: center;\n }\n\n .footer-items__end {\n text-align: end;\n }\n\n // So that paragraphs don't take up extra room\n .footer-item p {\n margin-bottom: 0;\n }\n}\n",".bd-footer-article {\n margin-top: auto;\n\n .footer-article-items {\n display: flex;\n flex-direction: column;\n }\n}\n",".bd-footer-content {\n .footer-content-items {\n display: flex;\n flex-direction: column;\n margin-top: auto;\n }\n}\n","/**\n * Header at the top of the page\n * It includes the announcement bar and the navigation bar.\n */\n\n// Styling for the Icon links can be found in components/_icon-links.scss\n\n// If we want the shadow to only point downward in the future, set\n// box-shadow to: 0 0.125rem 0.25rem -0.125rem rgba(0, 0, 0, 0.11);\n.bd-header {\n position: sticky;\n top: 0;\n z-index: $zindex-fixed;\n\n // Overrides bootstrap\n background-color: var(--pst-color-on-background) !important;\n box-shadow: 0 0.125rem 0.25rem 0 var(--pst-color-shadow);\n width: 100%;\n padding: 0;\n max-width: 100vw;\n justify-content: center;\n\n .bd-header__inner {\n display: flex;\n align-items: center;\n height: fit-content;\n padding-left: 1rem;\n padding-right: 1rem;\n }\n\n :focus-visible {\n border-radius: $focus-ring-radius;\n }\n\n // These items will define the height of the header\n .navbar-item {\n height: var(--pst-header-height);\n max-height: var(--pst-header-height);\n display: flex;\n align-items: center;\n }\n\n // Hide the navbar header items on mobile because they're in the sidebar\n .navbar-header-items {\n display: none;\n flex-shrink: 1;\n\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n display: inherit;\n flex-grow: 1;\n padding: 0 0 0 0.5rem;\n }\n }\n\n .navbar-header-items__end,\n .navbar-header-items__center,\n .navbar-header-items__start {\n display: flex;\n align-items: center;\n flex-flow: wrap;\n\n // In case we wrap our items to multiple rows on small screens\n row-gap: 0;\n }\n\n .navbar-header-items__end,\n .navbar-header-items__center {\n column-gap: 1rem;\n }\n\n // A little smaller because this is displayed by default on mobile\n .navbar-header-items__start {\n flex-shrink: 0;\n margin-right: auto;\n gap: 0.5rem;\n }\n\n .navbar-header-items__end {\n // End navbar items should snap to the right\n justify-content: end;\n }\n\n // Contains the navigation links within the navbar\n ul.navbar-nav {\n display: flex;\n\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n // Align on wide screens so the dropdown button is centered properly\n align-items: baseline;\n }\n\n > li.nav-item {\n margin-inline: 2px; // breathing room so hover and focus styles do not overlap\n\n > .nav-link {\n @include link-style-block;\n\n padding-inline: 6px;\n }\n\n &.current {\n > .nav-link {\n color: var(--pst-color-primary);\n\n // Underline the current navbar item\n &::before {\n border-bottom: 3px solid var(--pst-color-primary);\n }\n }\n }\n\n &.dropdown {\n margin-inline: 4px;\n\n button {\n padding-inline: 8px;\n }\n\n > .dropdown-toggle {\n border-radius: $focus-ring-radius; // make border radius the same for both hover ring and focus ring\n color: var(--pst-color-text-muted);\n\n &:focus-visible {\n box-shadow: $focus-ring-box-shadow;\n }\n\n &:hover {\n text-decoration: none;\n box-shadow: 0 0 0 $focus-ring-width var(--pst-color-link-hover); // purple focus ring\n // Brighten the text on hover (muted -> base)\n color: var(--pst-color-text-base);\n }\n }\n }\n }\n\n li a.nav-link.dropdown-item {\n @include link-style-text;\n }\n\n // Dropdowns for the extra links\n .dropdown {\n button {\n display: unset;\n border: none;\n\n &:hover {\n @include link-style-hover;\n }\n }\n\n .dropdown-menu {\n z-index: $zindex-popover;\n border: 1px solid var(--pst-color-border);\n box-shadow: 0 0 0.3rem 0.1rem var(--pst-color-shadow);\n background-color: var(--pst-color-on-background);\n padding: 0.5rem 0;\n margin: 0.5rem 0;\n min-width: 20rem;\n\n .dropdown-item {\n // Give the items in the dropdown some breathing room but let the hit\n // and hover area of the items extend to the edges of the menu\n padding: 0.25rem 1.5rem;\n\n // Override Bootstrap\n &:focus:not(:hover, :active) {\n background-color: inherit;\n }\n\n &:focus-visible {\n z-index: 10; // keep focus ring on top (prevent the hover background of the next dropdown item from covering the ring)\n }\n }\n\n // Hide the menu unless show has been clicked\n &:not(.show) {\n display: none;\n }\n }\n }\n }\n\n // **************************************************************\n // Showing and hiding the sidebar toggle buttons and header items\n // **************************************************************\n\n // Toggle buttons\n button.sidebar-toggle {\n font-size: var(--pst-font-size-icon);\n color: var(--pst-color-muted);\n margin-bottom: 0;\n background-color: inherit;\n padding: 0.5rem;\n }\n\n button.primary-toggle {\n margin-right: 1rem;\n\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n display: none;\n }\n }\n\n button.secondary-toggle {\n margin-left: 1rem;\n\n @include media-breakpoint-up($breakpoint-sidebar-secondary) {\n display: none;\n }\n }\n}\n\n// inline the element in the navbar as long as they fit and use display block when collapsing\n@include media-breakpoint-up($breakpoint-sidebar-primary) {\n .navbar-center-items .navbar-item {\n display: inline-block;\n }\n}\n\n.nav-link {\n &:hover {\n @include link-style-hover;\n }\n\n // Override Bootstrap\n transition: none;\n\n &.nav-external::after {\n font: var(--fa-font-solid);\n content: var(--pst-icon-external-link);\n font-size: 0.75em;\n margin-left: 0.3em;\n }\n}\n\n.bd-navbar-elements li.nav-item i {\n font-size: 0.7rem;\n padding-left: 2px;\n vertical-align: middle;\n}\n\n// THe elements next to the hamburger menu only show on narrow screens\n.navbar-persistent--mobile {\n margin-left: auto;\n\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n display: none;\n }\n}\n\n// The navbar-persistent content should only show on wide screens\n.navbar-persistent--container {\n display: none;\n\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n display: flex;\n }\n}\n",".header-article__inner {\n display: flex;\n padding: 0 0.5rem;\n\n // The items define the height so that it disappears if there are no items\n .header-article-item {\n min-height: var(--pst-header-article-height);\n height: var(--pst-header-article-height);\n }\n\n .header-article-items__start,\n .header-article-items__end {\n display: flex;\n align-items: start;\n gap: 0.5rem;\n }\n\n .header-article-items__end {\n margin-left: auto;\n }\n}\n","/**\n * The primary sidebar on the left.\n * e.g., between-pages navigation.\n */\n\n$sidebar-padding-right: 1rem;\n\n.bd-sidebar-primary {\n display: flex;\n flex-direction: column;\n gap: 1rem;\n max-height: calc(100vh - var(--pst-header-height));\n position: sticky;\n top: var(--pst-header-height);\n\n @include make-col(3);\n\n // Borders padding and whitespace\n padding: 2rem $sidebar-padding-right 1rem 1rem;\n border-right: 1px solid var(--pst-color-border);\n background-color: var(--pst-color-background);\n overflow-y: auto;\n font-size: var(--pst-sidebar-font-size-mobile);\n\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n font-size: var(--pst-sidebar-font-size);\n }\n\n :focus-visible {\n border-radius: $focus-ring-radius;\n }\n\n // override bootstrap when navlink are displayed in the sidebar\n .nav-link {\n font-size: var(--pst-sidebar-font-size-mobile);\n }\n\n &.no-sidebar {\n border-right: 0;\n }\n\n &.hide-on-wide {\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n display: none;\n }\n }\n\n // Headers shouldn't be colored in the sidebars and some extensions add headers\n h1,\n h2,\n h3,\n h4 {\n color: var(--pst-color-text-base);\n }\n\n .sidebar-primary-items__start,\n .sidebar-primary-items__end {\n .sidebar-primary-item {\n padding: 0.5rem 0;\n }\n }\n\n // Hide the sidebar header items on widescreen since they are visible in the header\n .sidebar-header-items {\n display: flex;\n flex-direction: column;\n\n .sidebar-header-items__title {\n font-weight: var(--pst-sidebar-header-font-weight);\n font-size: var(--pst-sidebar-header-font-size);\n color: var(--pst-color-text-base);\n margin-bottom: 0.5rem;\n }\n\n // The dropdown toggle for extra links just shows them all instead.\n .nav-item.dropdown {\n // On mobile, the dropdown behaves like any other link, no hiding\n button {\n display: none;\n }\n\n .dropdown-menu {\n display: flex;\n flex-direction: column;\n padding: 0;\n margin: 0;\n border: none;\n background-color: inherit;\n font-size: inherit;\n\n .dropdown-item {\n &:hover,\n &:focus {\n // In the mobile sidebar, the dropdown menu is inlined with the\n // other links, which do not have background-color changes on hover\n // and focus\n background-color: unset;\n }\n }\n }\n }\n\n .bd-navbar-elements {\n .nav-link {\n &:focus-visible {\n box-shadow: none; // Override Bootstrap\n outline: $focus-ring-outline;\n outline-offset: $focus-ring-width;\n }\n }\n }\n\n // Center header items get displayed vertically, end items are displayed horizontally\n .sidebar-header-items__center {\n display: flex;\n flex-direction: column;\n }\n\n // Positioning end items\n .sidebar-header-items__end {\n display: flex;\n align-items: center;\n gap: 1rem;\n }\n\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n display: none;\n }\n }\n\n .sidebar-primary-items__start {\n // Add a border on mobile to separate it from the header sidebar area\n border-top: 1px solid var(--pst-color-border);\n\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n border-top: none;\n }\n }\n\n .sidebar-primary-items__end {\n margin-top: auto;\n margin-bottom: 1em;\n }\n\n .list-caption {\n list-style: none;\n padding-left: 0;\n\n // Level 0 TOC heading is put inside the tag\n // so let the tag take up more space\n li.toctree-l0.has-children {\n > details {\n > summary {\n position: relative;\n height: auto;\n width: auto;\n display: flex;\n justify-content: space-between;\n align-items: baseline;\n\n .toctree-toggle {\n // Prevent toggle icon from getting squished by summary being a\n // flexbox\n flex: 0 0 auto;\n\n // Make the level 0 chevron icon slightly bigger than descendant\n // levels\n .fa-chevron-down {\n font-size: 1rem;\n }\n }\n }\n }\n }\n }\n\n li.has-children {\n $toctree-toggle-width: 30px;\n\n position: relative;\n\n > .reference,\n .caption {\n margin-right: calc(\n $toctree-toggle-width + $focus-ring-width\n ); // keep clear of the toggle icon\n\n padding-top: 0.25rem; // align caption text with toggle chevron\n }\n\n > details {\n > summary {\n // Remove browser default toggle icon\n list-style: none;\n\n &::-webkit-details-marker {\n display: none;\n }\n\n // The summary element is natively focusable, but delegate the focus state to the toggle icon\n &:focus-visible {\n outline: none;\n\n > .toctree-toggle {\n outline: $focus-ring-outline;\n outline-offset: -$focus-ring-width; // Prevent right side of focus ring from disappearing underneath the sidebar's right edge\n }\n }\n\n // Container for expand/collapse chevron icon\n .toctree-toggle {\n cursor: pointer;\n\n // Position it so that it's aligned with the top right corner of the\n // last positioned element, in this case the li.has-children\n position: absolute;\n top: 0;\n right: 0;\n\n // Give it dimensions\n width: $toctree-toggle-width;\n height: $toctree-toggle-width; // make it square\n\n // Vertically and horizontally center the icon within the container\n display: inline-flex;\n justify-content: center;\n align-items: center;\n\n .fa-chevron-down {\n font-size: 0.75rem;\n }\n }\n }\n\n // The section is open/expanded, rotate the toggle icon (chevron) so it\n // points up instead of down\n &[open] {\n > summary {\n .fa-chevron-down {\n transform: rotate(180deg);\n }\n }\n }\n }\n }\n}\n\n/* Between-page links and captions */\nnav.bd-links {\n margin-right: -$sidebar-padding-right; // align toctree toggle chevrons with right edge of sidebar and allow text to flow closer to the right edge\n\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n display: block;\n }\n\n ul {\n display: block;\n list-style: none;\n\n // Reduce padding of nested `ul` items a bit\n ul {\n padding: 0 0 0 1rem;\n }\n }\n\n li > a {\n display: block;\n padding: 0.25rem 0.65rem;\n\n @include link-sidebar;\n\n box-shadow: none;\n margin-right: $focus-ring-width; // prevent the right side focus ring from disappearing under the sidebar right edge\n\n &.reference.external {\n &::after {\n font: var(--fa-font-solid);\n content: var(--pst-icon-external-link);\n font-size: 0.75em;\n margin-left: 0.3em;\n }\n }\n }\n\n .current > a {\n @include link-sidebar-current;\n\n background-color: transparent;\n }\n\n // Title\n p.bd-links__title {\n font-size: var(--pst-sidebar-header-font-size);\n font-weight: var(--pst-sidebar-header-font-weight);\n margin-bottom: 0.5rem;\n }\n\n // Toctree captions\n p.caption {\n font-weight: var(--pst-sidebar-header-font-weight);\n position: relative;\n margin-top: 1.25rem;\n margin-bottom: 0.5rem;\n color: var(--pst-color-text-base);\n\n &:first-child {\n margin-top: 0;\n }\n\n font-size: var(--pst-sidebar-font-size-mobile);\n\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n font-size: var(--pst-sidebar-font-size);\n }\n }\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n@mixin make-row($gutter: $grid-gutter-width) {\n --#{$prefix}gutter-x: #{$gutter};\n --#{$prefix}gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n // TODO: Revisit calc order after https://github.com/react-bootstrap/react-bootstrap/issues/6039 is fixed\n margin-top: calc(-1 * var(--#{$prefix}gutter-y)); // stylelint-disable-line function-disallowed-list\n margin-right: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n margin-left: calc(-.5 * var(--#{$prefix}gutter-x)); // stylelint-disable-line function-disallowed-list\n}\n\n@mixin make-col-ready() {\n // Add box sizing if only the grid is loaded\n box-sizing: if(variable-exists(include-column-box-sizing) and $include-column-box-sizing, border-box, null);\n // Prevent columns from becoming too narrow when at smaller grid tiers by\n // always setting `width: 100%;`. This works because we set the width\n // later on to override this initial width.\n flex-shrink: 0;\n width: 100%;\n max-width: 100%; // Prevent `.col-auto`, `.col` (& responsive variants) from breaking out the grid\n padding-right: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n padding-left: calc(var(--#{$prefix}gutter-x) * .5); // stylelint-disable-line function-disallowed-list\n margin-top: var(--#{$prefix}gutter-y);\n}\n\n@mixin make-col($size: false, $columns: $grid-columns) {\n @if $size {\n flex: 0 0 auto;\n width: percentage(divide($size, $columns));\n\n } @else {\n flex: 1 1 0;\n max-width: 100%;\n }\n}\n\n@mixin make-col-auto() {\n flex: 0 0 auto;\n width: auto;\n}\n\n@mixin make-col-offset($size, $columns: $grid-columns) {\n $num: divide($size, $columns);\n margin-left: if($num == 0, 0, percentage($num));\n}\n\n// Row columns\n//\n// Specify on a parent element(e.g., .row) to force immediate children into NN\n// number of columns. Supports wrapping to new lines, but does not do a Masonry\n// style grid.\n@mixin row-cols($count) {\n > * {\n flex: 0 0 auto;\n width: percentage(divide(1, $count));\n }\n}\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `$grid-columns`.\n\n@mixin make-grid-columns($columns: $grid-columns, $gutter: $grid-gutter-width, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n // Provide basic `.col-{bp}` classes for equal-width flexbox columns\n .col#{$infix} {\n flex: 1 0 0%; // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4\n }\n\n .row-cols#{$infix}-auto > * {\n @include make-col-auto();\n }\n\n @if $grid-row-columns > 0 {\n @for $i from 1 through $grid-row-columns {\n .row-cols#{$infix}-#{$i} {\n @include row-cols($i);\n }\n }\n }\n\n .col#{$infix}-auto {\n @include make-col-auto();\n }\n\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .col#{$infix}-#{$i} {\n @include make-col($i, $columns);\n }\n }\n\n // `$columns - 1` because offsetting by the width of an entire row isn't possible\n @for $i from 0 through ($columns - 1) {\n @if not ($infix == \"\" and $i == 0) { // Avoid emitting useless .offset-0\n .offset#{$infix}-#{$i} {\n @include make-col-offset($i, $columns);\n }\n }\n }\n }\n\n // Gutters\n //\n // Make use of `.g-*`, `.gx-*` or `.gy-*` utilities to change spacing between the columns.\n @each $key, $value in $gutters {\n .g#{$infix}-#{$key},\n .gx#{$infix}-#{$key} {\n --#{$prefix}gutter-x: #{$value};\n }\n\n .g#{$infix}-#{$key},\n .gy#{$infix}-#{$key} {\n --#{$prefix}gutter-y: #{$value};\n }\n }\n }\n }\n}\n\n@mixin make-cssgrid($columns: $grid-columns, $breakpoints: $grid-breakpoints) {\n @each $breakpoint in map-keys($breakpoints) {\n $infix: breakpoint-infix($breakpoint, $breakpoints);\n\n @include media-breakpoint-up($breakpoint, $breakpoints) {\n @if $columns > 0 {\n @for $i from 1 through $columns {\n .g-col#{$infix}-#{$i} {\n grid-column: auto / span $i;\n }\n }\n\n // Start with `1` because `0` is an invalid value.\n // Ends with `$columns - 1` because offsetting by the width of an entire row isn't possible.\n @for $i from 1 through ($columns - 1) {\n .g-start#{$infix}-#{$i} {\n grid-column-start: $i;\n }\n }\n }\n }\n }\n}\n","/**\n * Secondary sidebar on the right.\n * e.g., in-page table of contents.\n */\n.bd-sidebar-secondary {\n display: flex;\n order: 2;\n flex-shrink: 0;\n flex-direction: column;\n position: sticky;\n top: var(--pst-header-height);\n max-height: calc(100vh - var(--pst-header-height));\n padding: 2rem 1rem 1rem;\n width: var(--pst-sidebar-secondary);\n font-size: var(--pst-sidebar-font-size-mobile);\n\n @include media-breakpoint-up($breakpoint-sidebar-secondary) {\n font-size: var(--pst-sidebar-font-size);\n }\n\n // Color and border\n background-color: var(--pst-color-background);\n overflow-y: auto;\n}\n\n.sidebar-secondary-item {\n padding: 0.5rem;\n\n @include media-breakpoint-up($breakpoint-sidebar-secondary) {\n border-left: 1px solid var(--pst-color-border);\n padding-left: 1rem;\n }\n\n i {\n padding-right: 0.5rem;\n }\n}\n","/*******************************************************************************\n* Rules for the UX/UI of sidebar sliding drawers on mobile\n* Note that this sheet controls styles across many parts of the theme\n* It is aggregated into this one sheet instead of being split across\n* components in order to keep it easier to debug in one place.\n* It is broken up into major sections below.\n*/\n\n/*******************************************************************************\n* Buttons and overlays\n*/\ninput.sidebar-toggle {\n display: none;\n}\n\n// Background overlays\nlabel.overlay {\n background-color: black;\n opacity: 0.5;\n height: 0;\n width: 0;\n position: fixed;\n top: 0;\n left: 0;\n transition: opacity $animation-time ease-out;\n z-index: $zindex-modal-backdrop;\n}\n\ninput {\n // Show the correct overlay when its input is checked\n &#pst-primary-sidebar-checkbox:checked + label.overlay.overlay-primary,\n &#pst-secondary-sidebar-checkbox:checked + label.overlay.overlay-secondary {\n height: 100vh;\n width: 100vw;\n }\n\n // Primary sidebar slides in from the left\n &#pst-primary-sidebar-checkbox:checked ~ .bd-container .bd-sidebar-primary {\n visibility: visible;\n margin-left: 0;\n }\n\n // Secondary sidebar slides in from the right\n &#pst-secondary-sidebar-checkbox:checked\n ~ .bd-container\n .bd-sidebar-secondary {\n visibility: visible;\n margin-right: 0;\n }\n}\n\n/*******************************************************************************\n* Sidebar drawer behavior\n*/\n\n/**\n * Behavior for sliding drawer elements that will be toggled with an input\n *\n * NOTE: We use this mixin to define the toggle behavior on narrow screens,\n * And the wide-screen behavior of the sections is defined in their own section\n * .scss files.\n */\n@mixin sliding-drawer($side: \"left\") {\n position: fixed;\n top: 0;\n z-index: $zindex-modal;\n height: 100vh;\n max-height: 100vh;\n width: 75%;\n flex-grow: 0.75;\n max-width: 350px;\n transition:\n visibility $animation-time ease-out,\n margin $animation-time ease-out;\n visibility: hidden;\n\n @if $side == \"right\" {\n margin-right: -75%;\n right: 0;\n } @else {\n margin-left: -75%;\n left: 0;\n }\n}\n\n// Primary sidebar hides/shows at earlier widths\n@include media-breakpoint-up($breakpoint-sidebar-primary) {\n .sidebar-toggle.primary-toggle {\n display: none;\n }\n\n input#pst-primary-sidebar-checkbox {\n &:checked + label.overlay.overlay-primary {\n height: 0;\n width: 0;\n }\n }\n\n .bd-sidebar-primary {\n margin-left: 0;\n visibility: visible;\n }\n}\n\n.bd-sidebar-primary {\n @include media-breakpoint-down($breakpoint-sidebar-primary) {\n @include sliding-drawer(\"left\");\n }\n}\n\n.bd-sidebar-secondary {\n @include media-breakpoint-down($breakpoint-sidebar-secondary) {\n @include sliding-drawer(\"right\");\n }\n}\n","/**\n * Breadcrumbs for parent pages meant for the article header\n */\nul.bd-breadcrumbs {\n list-style: none;\n padding-left: 0;\n display: flex;\n flex-wrap: wrap;\n\n // Font size slightly smaller to avoid cluttering up space too much\n font-size: 0.8rem;\n\n li.breadcrumb-item {\n display: flex;\n align-items: center;\n\n // Style should look like heavier in-page links\n // keeping visited in the default link colour\n font-weight: bold;\n\n a {\n @include link-style-text;\n }\n\n // Items that aren't the home have a caret to the left\n &:not(.breadcrumb-home)::before {\n font: var(--fa-font-solid);\n font-size: 0.8rem;\n content: var(--pst-breadcrumb-divider);\n color: var(--pst-color-text-muted);\n padding: 0 0.5rem;\n }\n }\n}\n","/**\n * Icon links in the navbar\n */\n\n.pst-navbar-icon {\n // Extra specificity needed for overrides\n html & {\n @include min-hit-area;\n @include link-style-block;\n\n display: flex;\n align-items: center;\n justify-content: center;\n\n // Bootstrap overrides\n border-radius: 0;\n border: none;\n font-size: 1rem;\n line-height: $line-height-body; // Override Boostrap, which defines a separate line-height for buttons\n padding: $navbar-link-padding-y 0; // Horizontal white space in nav bar between items is controlled via column gap rule on the container.\n\n // Make the navbar icon links have the same size as the navbar text links\n height: calc(2 * $navbar-link-padding-y + $line-height-body * 1rem);\n }\n}\n\nul.navbar-icon-links {\n display: flex;\n flex-flow: row wrap;\n column-gap: 1rem;\n justify-content: space-evenly;\n align-items: center;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n\n // Icons styling\n i {\n &.fa-brands,\n &.fa-regular,\n &.fa-solid {\n vertical-align: middle;\n font-style: normal;\n font-size: var(--pst-font-size-icon);\n }\n\n /* Social media buttons hard-code the brand color */\n &.fa-square-twitter::before {\n color: #55acee;\n }\n\n &.fa-square-gitlab::before {\n color: #548;\n }\n\n &.fa-bitbucket::before {\n color: #0052cc;\n }\n }\n\n // Force images to be icon-sized\n img.icon-link-image {\n height: 1.5em;\n border-radius: 0.2rem;\n }\n\n .fa-pydata {\n stroke: var(--pst-color-background);\n stroke-linejoin: round;\n stroke-width: 0.35;\n }\n}\n","/**\n * Logo in the navbar\n */\n\n.navbar-brand {\n position: relative;\n height: var(--pst-header-height);\n max-height: var(--pst-header-height);\n padding: 0.5rem 0;\n width: auto;\n margin: 0;\n display: flex;\n\n // Ensure that the logo stays the same length while other content shrinks\n flex-shrink: 0;\n align-items: center;\n gap: 0.5rem;\n\n // If there's no logo image, we use a p element w/ the site title\n p {\n color: var(--pst-color-text-base);\n margin-bottom: 0;\n }\n\n // If there's a logo, it'll be in an img block\n img {\n max-width: 100%;\n height: 100%;\n width: auto;\n }\n\n &:hover,\n &:visited:hover {\n @include link-style-hover;\n\n color: var(--pst-color-text-base);\n }\n}\n","/**\n * Navigation links in the navbar and icon links\n */\nul.navbar-nav {\n // Reduce padding of nested `ul` items a bit\n ul {\n padding: 0 0 0 1rem;\n }\n\n // Navbar links - do not have an underline by default\n li {\n display: flex;\n flex-direction: column;\n\n a {\n display: flex;\n align-items: center;\n height: 100%;\n padding-top: $navbar-link-padding-y;\n padding-bottom: $navbar-link-padding-y;\n\n @include link-style-text;\n }\n }\n}\n","/**\n * The list of in-page TOC links\n */\n.page-toc {\n .section-nav {\n padding-left: 0;\n border-bottom: none;\n\n ul {\n padding-left: 1rem;\n }\n }\n\n // override bootstrap settings\n .nav-link {\n font-size: var(--pst-sidebar-font-size-mobile);\n\n @include media-breakpoint-up($breakpoint-sidebar-secondary) {\n font-size: var(--pst-sidebar-font-size);\n }\n }\n\n .onthispage {\n color: var(--pst-color-text-base);\n font-weight: var(--pst-sidebar-header-font-weight);\n margin-bottom: 0.5rem;\n }\n}\n","/**\n* Previous / Next navigation buttons\n**/\n.prev-next-area {\n width: 100%;\n\n p {\n color: var(--pst-color-text-muted);\n margin: 0 0.3em;\n line-height: 1.3em;\n }\n\n i {\n font-size: 1.2em;\n }\n\n a {\n // So that buttons align with icons\n display: flex;\n align-items: center;\n border: none;\n padding: 10px;\n max-width: 45%;\n overflow-x: hidden;\n color: var(--pst-color-text-muted);\n text-decoration: none;\n\n p.prev-next-title {\n @include link-style-default;\n\n font-weight: var(--pst-admonition-font-weight-heading);\n font-size: 1.1em;\n }\n\n &:hover,\n &:visited:hover {\n p.prev-next-title {\n @include link-style-hover;\n }\n }\n\n .prev-next-info {\n flex-direction: column;\n margin: 0 0.5em;\n\n .prev-next-subtitle {\n text-transform: capitalize;\n }\n }\n\n &.left-prev {\n float: left;\n }\n\n &.right-next {\n float: right;\n\n div.prev-next-info {\n text-align: right;\n }\n }\n }\n}\n","/**\n * Search field\n **/\n.bd-search {\n position: relative;\n padding-left: 0.5rem;\n gap: 0.5rem;\n background-color: var(--pst-color-background);\n border-radius: $admonition-border-radius;\n border: 1px solid var(--pst-color-border);\n color: var(--pst-color-text-base);\n\n // Background should always be same color regardless of active or not\n &:active {\n background-color: var(--pst-color-background);\n color: var(--pst-color-text-muted);\n }\n\n .icon {\n position: absolute;\n color: var(--pst-color-border);\n left: 25px;\n }\n\n .fa-solid.fa-magnifying-glass {\n position: absolute;\n left: calc((2.5rem - 0.7em) / 2);\n color: var(--pst-color-text-muted);\n }\n\n input {\n // Inner-text of the search bar\n &::placeholder {\n color: var(--pst-color-text-muted);\n }\n\n // Remove the little \"x\" that pops up when you start typing\n &::-webkit-search-cancel-button,\n &::-webkit-search-decoration {\n appearance: none;\n }\n }\n\n // Shows off the keyboard shortcuts for the button\n .search-button__kbd-shortcut {\n display: flex;\n position: absolute;\n right: 0.5rem;\n color: var(--pst-color-border);\n }\n}\n\n.form-control {\n background-color: var(--pst-color-background);\n color: var(--pst-color-text-base);\n\n &:focus,\n &:focus-visible {\n border: none;\n background-color: var(--pst-color-background);\n color: var(--pst-color-text-muted);\n }\n}\n\n/**\n * Search button - located in the navbar\n */\n\n// Search link icon should be a bit bigger since it is separate from icon links\n.search-button i {\n font-size: 1.3rem;\n}\n\n// __search-container will only show up when we use the search pop-up bar\n.search-button__search-container,\n.search-button__overlay {\n display: none;\n}\n\n.search-button__wrapper.show {\n .search-button__search-container {\n display: flex;\n\n // Center in middle of screen just underneath header\n position: fixed;\n z-index: $zindex-modal;\n top: 30%;\n left: 50%;\n transform: translate(-50%, -50%);\n right: 1rem;\n margin-top: 0.5rem;\n width: 90%;\n max-width: 800px;\n }\n\n .search-button__overlay {\n display: flex;\n position: fixed;\n z-index: $zindex-modal-backdrop;\n background-color: black;\n opacity: 0.5;\n width: 100%;\n height: 100%;\n top: 0;\n left: 0;\n }\n\n form.bd-search {\n flex-grow: 1;\n padding-top: 0;\n padding-bottom: 0;\n }\n\n // Font and input text a bit bigger\n svg,\n input {\n font-size: var(--pst-font-size-icon);\n }\n}\n\n/**\n * The search button component that looks like a field.\n * Lives at components/search-button-field.html\n */\n.search-button-field {\n $search-button-border-radius: 1.5em;\n\n display: inline-flex;\n align-items: center;\n border: var(--pst-color-border) solid 1px;\n border-radius: $search-button-border-radius;\n color: var(--pst-color-text-muted);\n padding: 0.5em;\n background-color: var(--pst-color-surface);\n\n &:hover {\n box-shadow: 0 0 0 $focus-ring-width var(--pst-color-link-hover);\n }\n\n &:focus-visible {\n border-radius: $search-button-border-radius;\n }\n\n // The keyboard shotcut text\n .search-button__default-text {\n font-size: var(--bs-nav-link-font-size);\n font-weight: var(--bs-nav-link-font-weight);\n margin-right: 0.5em;\n margin-left: 0.5em;\n }\n\n .kbd-shortcut__modifier {\n font-size: 0.75em;\n }\n\n // Ensures that all the text lines up in the middle\n > * {\n align-items: center;\n }\n\n // Only the icon should be visible on narrow screens\n > :not(svg) {\n display: none;\n\n @include media-breakpoint-up(lg) {\n display: flex;\n }\n }\n}\n","/**\n * The 'Hide Search Matches' button.\n * This only shows up when a person lands on a page after clicking a search result.\n * Clicking it removes the highlighting of the search term from the page.\n * We want it to behave like a button.\n */\ndiv#searchbox {\n // Leave `#searchbox` rules empty so that it doesn't show at all when it is empty\n p.highlight-link {\n margin: 1rem 0;\n width: fit-content;\n\n // A bit more margin on wide screens to mimic article behavior\n @include media-breakpoint-up($breakpoint-sidebar-secondary) {\n margin-left: 2rem;\n }\n\n // Put outer shadow on this one so that we can darken the link w/ an inner shadow\n @include box-shadow;\n\n // Style the button to look like a Sphinx Design button\n a {\n border-radius: 0.25rem;\n font-size: 1.25rem;\n padding: 0.75rem;\n background-color: var(--pst-color-primary);\n color: var(--pst-color-primary-text);\n text-decoration: none;\n\n // The box shadow is inset so that it darkens the button on hover\n transition: box-shadow 0.25s ease-out;\n\n &:hover {\n box-shadow: inset 0 0 50px 50px rgb(0 0 0 / 25%);\n }\n\n &::before {\n content: var(--pst-icon-search-minus);\n color: unset;\n font: var(--fa-font-solid);\n margin-right: 0.5rem;\n }\n }\n }\n}\n","/**\n * Light/dark theme switcher\n */\n\n.theme-switch-button {\n .theme-switch {\n display: none;\n\n &:active {\n text-decoration: none;\n color: var(--pst-color-link-hover);\n }\n\n .fa-lg {\n aspect-ratio: 1 / 1;\n }\n }\n}\n\n@each $mode in auto, light, dark {\n html[data-mode=\"#{$mode}\"]\n .theme-switch-button\n .theme-switch[data-mode=\"#{$mode}\"] {\n display: inline; // inline needed for span height to be calculated using inherited font size and line height\n }\n}\n","button.btn.version-switcher__button {\n border-color: var(--pst-color-border);\n color: var(--pst-color-text-base);\n\n // Add a margin on narrow screens to avoid feeling cramped\n margin-bottom: 1em;\n\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n margin-bottom: unset;\n }\n\n &:hover {\n box-shadow: 0 0 0 $focus-ring-width var(--pst-color-secondary);\n border-color: transparent;\n }\n\n &:active {\n color: var(--pst-color-text-base);\n border-color: var(--pst-color-border);\n }\n\n &:focus-visible {\n border-color: transparent;\n }\n}\n\n.version-switcher__menu {\n border-color: var(--pst-color-border);\n border-radius: var(--bs-dropdown-border-radius);\n\n a.list-group-item {\n background-color: var(--pst-color-on-background);\n color: var(--pst-color-text-base);\n padding: 0.75rem 1.25rem;\n\n &:not(:last-child) {\n border-bottom: 1px solid var(--pst-color-border);\n }\n\n &:hover {\n @include link-style-hover;\n\n background-color: var(--pst-color-surface);\n }\n\n &.active {\n @include link-sidebar-current;\n\n position: relative;\n z-index: 1;\n\n span::before {\n content: \"\";\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: -1;\n left: 0;\n top: 0;\n }\n }\n\n &:focus-visible {\n z-index: 10; // keep focus ring on top (prevent the hover background of the next dropdown item from covering the ring)\n }\n }\n}\n\n// Font behavior on mobile\nbutton.version-switcher__button,\n.version-switcher__menu {\n font-size: 1.1em; // A bit smaller than other menu font\n z-index: $zindex-modal; // higher than the sidebars\n\n // Make sure it meets WCAG target size requirement no matter the version\n // string displayed in the button\n @include min-hit-area;\n\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n font-size: unset;\n }\n}\n","/* Collapsing of the TOC sidebar while scrolling */\n\n/* Nav: hide second level (shown on .active) */\n\nnav.page-toc {\n // A little extra space before the buttons\n margin-bottom: 1rem;\n}\n\n.bd-toc .nav {\n .nav {\n display: none;\n\n // So we can manually specify a level as visible in the config\n &.visible {\n display: block;\n }\n }\n\n > .active > ul {\n display: block;\n }\n}\n\n// Each entry of the in-page TOC\n.toc-entry {\n display: block;\n\n a > code {\n color: var(--pst-color-text-muted);\n }\n\n a.nav-link {\n display: block;\n padding: 0.125rem 0;\n\n // Padding w/ negative margin so the top TOC item highlight overlaps w/ the TOC border\n padding-left: 1rem;\n margin-left: -1rem;\n\n @include link-sidebar;\n\n &.active {\n @include link-sidebar-current;\n\n background-color: transparent;\n\n &:hover {\n color: var(--pst-color-link-hover);\n }\n }\n\n &:focus-visible {\n border-radius: $focus-ring-radius;\n }\n }\n}\n","div.versionadded,\ndiv.versionchanged,\ndiv.deprecated {\n vertical-align: middle;\n margin: 1.5625em auto;\n padding: 0 0.6rem;\n overflow: hidden;\n\n /* break-inside has replaced page-break-inside and is widely usable since 2019 */\n page-break-inside: avoid;\n break-inside: avoid;\n border-left: 0.2rem solid;\n border-color: var(--pst-color-info);\n border-radius: $admonition-border-radius;\n background-color: var(--pst-color-on-background);\n\n @include box-shadow;\n\n position: relative;\n\n > p {\n margin-bottom: 0.6rem;\n margin-top: 0.6rem;\n }\n}\n\ndiv.versionadded {\n border-color: var(--pst-color-success);\n background-color: var(--pst-color-success-bg);\n}\n\ndiv.versionchanged {\n border-color: var(--pst-color-warning);\n background-color: var(--pst-color-warning-bg);\n}\n\ndiv.deprecated {\n border-color: var(--pst-color-danger);\n background-color: var(--pst-color-danger-bg);\n}\n\nspan.versionmodified {\n font-weight: 600;\n\n &::before {\n margin-right: 0.6rem;\n color: var(--pst-color-info);\n font: var(--fa-font-solid);\n content: var(--pst-icon-versionmodified-default);\n }\n}\n\nspan.versionmodified.added {\n &::before {\n color: var(--pst-color-success);\n content: var(--pst-icon-versionmodified-added);\n }\n}\n\nspan.versionmodified.changed {\n &::before {\n color: var(--pst-color-warning);\n content: var(--pst-icon-versionmodified-changed);\n }\n}\n\nspan.versionmodified.deprecated {\n &::before {\n color: var(--pst-color-danger);\n content: var(--pst-icon-versionmodified-deprecated);\n }\n}\n",".sidebar-indices-items {\n display: flex;\n flex-direction: column;\n border-top: 1px solid var(--pst-color-border);\n\n @include media-breakpoint-up($breakpoint-sidebar-primary) {\n border-top: none;\n }\n\n .sidebar-indices-items__title {\n font-weight: var(--pst-sidebar-header-font-weight);\n font-size: var(--pst-sidebar-header-font-size);\n color: var(--pst-color-text-base);\n margin-bottom: 0.5rem;\n }\n\n ul.indices-link {\n margin-right: -1rem;\n list-style: none;\n padding: 0;\n\n li > a {\n display: block;\n padding: 0.25rem 0;\n color: var(--pst-color-text-muted);\n\n &:hover {\n color: var(--pst-color-primary);\n text-decoration: none;\n background-color: transparent;\n }\n }\n }\n}\n",".bd-sidebar-primary div#rtd-footer-container {\n position: sticky;\n bottom: -1rem;\n margin: -1rem; // ignore sidebar padding\n\n .rst-versions.rst-badge {\n position: unset;\n font-size: 0.9em;\n font-family: var(--pst-font-family-base);\n max-width: unset;\n\n .rst-current-version {\n display: flex;\n align-items: center;\n gap: 0.2rem;\n height: 2.5rem;\n transition: background-color 0.2s ease-out;\n background-color: var(--pst-color-background);\n color: var(--pst-color-success);\n border-top: 1px solid var(--pst-color-border);\n }\n\n .fa.fa-book {\n color: var(--pst-color-text-muted);\n margin-right: auto;\n\n &::after {\n color: var(--pst-color-text-base);\n content: \"Read The Docs\";\n font-family: var(--pst-font-family-base);\n font-weight: var(--pst-admonition-font-weight-heading);\n }\n }\n\n .fa.fa-caret-down {\n color: var(--pst-color-text-muted);\n }\n }\n\n .rst-versions.rst-badge.shift-up {\n .rst-current-version {\n border-bottom: 1px solid var(--pst-color-border);\n }\n }\n\n .rst-other-versions {\n background-color: var(--pst-color-surface);\n color: var(--pst-color-text-base);\n\n dl {\n dd a {\n color: var(--pst-color-text-muted);\n }\n }\n\n hr {\n background-color: var(--pst-color-border);\n }\n\n small a {\n color: var(--pst-color-link);\n }\n\n input {\n padding-left: 0.5rem;\n border: 1px solid var(--pst-color-border);\n background-color: var(--pst-color-surface);\n }\n }\n}\n","/**\n * Admonitions and blocks of styled content.\n * Admonitions CSS originally inspired by https://squidfunk.github.io/mkdocs-material/getting-started/\n */\n$admonition-border-radius: 0.25rem;\n$admonition-left-border-width: 0.2rem;\n\ndiv.admonition,\n.admonition {\n margin: 1.5625em auto;\n padding: 0 0.6rem 0.8rem;\n overflow: hidden;\n\n /* break-inside has replaced page-break-inside and is widely usable since 2019 */\n page-break-inside: avoid;\n break-inside: avoid;\n border-left: $admonition-left-border-width solid;\n border-color: var(--pst-color-info);\n border-radius: $admonition-border-radius;\n background-color: var(--pst-color-on-background);\n\n @include box-shadow;\n\n // Last item should have no spacing since we'll control that w/ padding\n *:last-child {\n margin-bottom: 0;\n }\n\n // Items after the title should be indented\n p.admonition-title ~ * {\n margin-left: 1.4rem;\n margin-right: 1.4rem;\n }\n\n // Lists need to have left margin so they don't spill into it\n > ol,\n > ul {\n margin-left: 1em;\n }\n\n // Defaults for all admonitions\n > .admonition-title {\n margin: 0 -0.6rem;\n padding: 0.4rem 0.6rem 0.4rem 2rem;\n font-weight: var(--pst-admonition-font-weight-heading);\n position: relative;\n\n @include legacy-backdrop-placeholder;\n\n background-color: var(--pst-color-info-bg);\n\n // now that we use solid colors we want the title on top\n z-index: 1;\n\n &::after {\n position: absolute;\n left: 0.5rem;\n width: 1rem;\n height: 1rem;\n color: var(--pst-color-info);\n font: var(--fa-font-solid);\n line-height: inherit;\n content: var(--pst-icon-admonition-default);\n opacity: 1;\n }\n\n // Next element after title needs some extra upper-space\n + * {\n margin-top: 0.4em;\n }\n }\n\n &.attention {\n border-color: var(--pst-color-attention);\n\n > .admonition-title {\n background-color: var(--pst-color-attention-bg);\n\n &::after {\n color: var(--pst-color-attention);\n content: var(--pst-icon-admonition-attention);\n }\n }\n }\n\n &.caution {\n border-color: var(--pst-color-warning);\n\n > .admonition-title {\n background-color: var(--pst-color-warning-bg);\n\n &::after {\n color: var(--pst-color-warning);\n content: var(--pst-icon-admonition-caution);\n }\n }\n }\n\n &.warning {\n border-color: var(--pst-color-warning);\n\n > .admonition-title {\n background-color: var(--pst-color-warning-bg);\n\n &::after {\n color: var(--pst-color-warning);\n content: var(--pst-icon-admonition-warning);\n }\n }\n }\n\n &.danger {\n border-color: var(--pst-color-danger);\n\n > .admonition-title {\n background-color: var(--pst-color-danger-bg);\n\n &::after {\n color: var(--pst-color-danger);\n content: var(--pst-icon-admonition-danger);\n }\n }\n }\n\n &.error {\n border-color: var(--pst-color-danger);\n\n > .admonition-title {\n background-color: var(--pst-color-danger-bg);\n\n &::after {\n color: var(--pst-color-danger);\n content: var(--pst-icon-admonition-error);\n }\n }\n }\n\n &.hint {\n border-color: var(--pst-color-success);\n\n > .admonition-title {\n background-color: var(--pst-color-success-bg);\n\n &::after {\n color: var(--pst-color-success);\n content: var(--pst-icon-admonition-hint);\n }\n }\n }\n\n &.tip {\n border-color: var(--pst-color-success);\n\n > .admonition-title {\n background-color: var(--pst-color-success-bg);\n\n &::after {\n color: var(--pst-color-success);\n content: var(--pst-icon-admonition-tip);\n }\n }\n }\n\n &.important {\n border-color: var(--pst-color-attention);\n\n > .admonition-title {\n background-color: var(--pst-color-attention-bg);\n\n &::after {\n color: var(--pst-color-attention);\n content: var(--pst-icon-admonition-important);\n }\n }\n }\n\n &.note {\n border-color: var(--pst-color-info);\n\n > .admonition-title {\n background-color: var(--pst-color-info-bg);\n\n &::after {\n color: var(--pst-color-info);\n content: var(--pst-icon-admonition-note);\n }\n }\n }\n\n &.seealso {\n border-color: var(--pst-color-success);\n\n > .admonition-title {\n background-color: var(--pst-color-success-bg);\n\n &::after {\n color: var(--pst-color-success);\n content: var(--pst-icon-admonition-seealso);\n }\n }\n }\n\n &.admonition-todo {\n border-color: var(--pst-color-secondary);\n\n > .admonition-title {\n background-color: var(--pst-color-secondary-bg);\n\n &::after {\n color: var(--pst-color-secondary);\n content: var(--pst-icon-admonition-todo);\n }\n }\n }\n\n /**\n * Special-case for a `sidebar` class that makes the admonition float to\n * the right like the {sidebar} directive.\n */\n &.sidebar {\n max-width: 40%;\n float: right;\n clear: both;\n margin-left: 0.5rem;\n margin-top: 0;\n\n // Undo the .sidebar directive border\n border-width: 0 0 0 $admonition-left-border-width;\n\n // TODO: these semantic-color-names border-color rules might no longer be\n // needed when we drop support for Sphinx 4 / docutils 0.17\n &.attention,\n &.important {\n border-color: var(--pst-color-attention);\n }\n\n &.caution,\n &.warning {\n border-color: var(--pst-color-warning);\n }\n\n &.danger,\n &.error {\n border-color: var(--pst-color-danger);\n }\n\n &.hint,\n &.tip,\n &.seealso {\n border-color: var(--pst-color-success);\n }\n\n &.note,\n &.todo {\n border-color: var(--pst-color-info);\n }\n\n // No inner margin since we have less horizontal space w/ the sidebar\n p.admonition-title ~ * {\n margin-left: 0;\n margin-right: 0;\n }\n }\n}\n\n/**************************************************************\n * Similar content blocks that are not technically admonitions.\n */\n\n/**\n * Topics and the {contents} directive\n */\n// Docutils <= 0.17\ndiv.topic,\ndiv.topic.contents,\n// Docutils >= 0.18\nnav.contents,\naside.topic {\n display: flex;\n flex-direction: column;\n background-color: var(--pst-color-surface);\n border-color: var(--pst-color-border);\n border-radius: $admonition-border-radius;\n padding: 1rem 1.25rem;\n\n @include box-shadow;\n\n .topic-title {\n margin: 0 0 0.5rem;\n }\n\n // Over-ride text color to ensure enough contrast\n p {\n color: var(--pst-color-on-surface) !important;\n }\n\n // Over-ride large default padding\n ul.simple {\n padding-left: 1rem;\n\n ul {\n // So that sub-lists will have a bit less padding\n padding-left: 2em;\n }\n }\n}\n\n/**\n * Sidebar directive\n */\naside.sidebar {\n border: 1px solid var(--pst-color-border);\n background-color: var(--pst-color-surface);\n border-radius: $admonition-border-radius;\n\n // to match the admonition-styled sidebars:\n margin-left: 0.5rem;\n padding: 0;\n\n > *:last-child {\n padding-bottom: 1rem;\n }\n\n p.sidebar-title {\n position: relative;\n margin-bottom: 0;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n border-bottom: 1px solid var(--pst-color-border);\n font-family: var(--pst-font-family-heading);\n font-weight: var(--pst-admonition-font-weight-heading);\n }\n\n // Add margin to the first non-`.sidebar-title` item\n > *:not(.sidebar-title):first-child,\n > p.sidebar-title + * {\n margin-top: 1rem;\n }\n\n > * {\n padding-left: 1rem;\n padding-right: 1rem;\n }\n}\n\n/**\n * Rubrics look kind of like section headers\n */\np.rubric {\n display: flex;\n flex-direction: column;\n}\n\n/**\n * Seealso is kind of like a vertically-collapsed admonition\n */\n.seealso dd {\n margin-top: 0;\n margin-bottom: 0;\n}\n","/**\n * Miscellaneous color functions and mixins\n**/\n\n@use \"sass:list\";\n@use \"sass:map\";\n@use \"sass:meta\";\n@use \"sass:math\";\n@use \"sass:string\";\n\n// We must add ::before pseudo-element to some theme components (such as admonitions)\n// because users were instructed to customize the background color this way.\n@mixin legacy-backdrop-placeholder {\n &::before {\n content: \"\";\n width: 100%;\n height: 100%;\n position: absolute;\n left: 0;\n top: 0;\n z-index: -1;\n\n // So that hovering over the text within background is still possible.\n // Otherwise the background overlays the text and you cannot click or select easily.\n // ref: https://developer.mozilla.org/en-US/docs/Web/CSS/pointer-events\n pointer-events: none;\n }\n}\n\n/**\n* Function to get items from nested maps\n*/\n// @param {Map} $map - Map\n// @param {Arglist} $keys - Keys to fetc\n// @return {*}\n@function map-deep-get($map, $keys...) {\n @each $key in $keys {\n $map: map.get($map, $key);\n }\n\n @return $map;\n}\n\n/**\n * Function to check if the color needs converting to a \"color\" type\n * if it is a string we cannot use other color manipulation functions\n * It is used to create the sphinx-design colours as these are often interpolated\n */\n// @param {String/Color} $color - Color definition from map\n// @return {Color} - Color type (in hex)\n@function check-color($color) {\n @if meta.type-of($color) == string {\n $color: from-hex($color);\n }\n\n @return $color;\n}\n\n/**\n * Function to convert the string representation of a color to a color type (hex)\n */\n// @param {String} $string - String representation of a color\n@function from-hex($string) {\n $string-lower: string.to-lower-case($string);\n $r: \"\";\n $g: \"\";\n $b: \"\";\n $hex: \"0\" \"1\" \"2\" \"3\" \"4\" \"5\" \"6\" \"7\" \"8\" \"9\" \"a\" \"b\" \"c\" \"d\" \"e\" \"f\";\n $length: string.length($string);\n $max: if($length == 4, 1, 2);\n\n // Check for length accuracy\n @if $length != 4 and $length != 7 {\n @return $string;\n }\n\n // Loop from the second character (omitting #)\n @for $i from 2 through $length {\n $c: string.slice($string-lower, $i, $i);\n\n // If wrong character, return\n @if not list.index($hex, $c) {\n @return $string;\n }\n\n @if string.length($r) < $max {\n $r: $r + $c;\n } @else if string.length($g) < $max {\n $g: $g + $c;\n } @else if string.length($b) < $max {\n $b: $b + $c;\n }\n }\n\n @if $length == 4 {\n $r: $r + $r;\n $g: $g + $g;\n $b: $b + $b;\n }\n\n @return rgb(hex-to-dec($r), hex-to-dec($g), hex-to-dec($b));\n}\n\n@function hex-to-dec($string) {\n $hex: \"0\" \"1\" \"2\" \"3\" \"4\" \"5\" \"6\" \"7\" \"8\" \"9\" \"a\" \"b\" \"c\" \"d\" \"e\" \"f\";\n $string: string.to-lower-case($string);\n $length: string.length($string);\n $dec: 0;\n\n @for $i from 1 through $length {\n $factor: 1 + (15 * ($length - $i));\n $index: list.index($hex, string.slice($string, $i, $i));\n $dec: $dec + $factor * ($index - 1);\n }\n\n @return $dec;\n}\n","// Style API docs from sphinx' autodoc / autosummary\n\n/*******************************************************************************\n* Styling for field lists\n*/\n\n/* grey highlighting of 'parameter' and 'returns' field */\ntable.field-list {\n border-collapse: separate;\n border-spacing: 10px;\n margin-left: 1px;\n\n th.field-name {\n padding: 1px 8px 1px 5px;\n white-space: nowrap;\n background-color: var(--pst-color-surface);\n }\n\n /* italic font for parameter types */\n td.field-body {\n p {\n font-style: italic;\n\n > strong {\n font-style: normal;\n }\n }\n\n /* reduced space around parameter description */\n blockquote {\n border-left: none;\n margin: 0 0 0.3em;\n padding-left: 30px;\n }\n }\n}\n\n/*******************************************************************************\n* Styling for autosummary tables\n*/\n\n.table.autosummary {\n // The first column (with the signature) should not wrap\n td:first-child {\n white-space: nowrap;\n }\n}\n\n/* overriding basic.css to use our own monospace font */\n.sig {\n font-family: var(--pst-font-family-monospace);\n}\n\n/* C++ specific styling - overriding the basic.css to avoid custom colors */\n\n.sig-inline.c-texpr,\n.sig-inline.cpp-texpr {\n font-family: unset;\n}\n\n.sig.c .k,\n.sig.c .kt,\n.sig.cpp .k,\n.sig.cpp .kt {\n color: var(--pst-color-text-base);\n}\n\n.sig.c .m,\n.sig.cpp .m {\n color: var(--pst-color-text-base);\n}\n\n.sig.c .s,\n.sig.c .sc,\n.sig.cpp .s,\n.sig.cpp .sc {\n color: var(--pst-color-text-base);\n}\n\n// addition\n\n// .sig.c .sig-name .n,\n// .sig.cpp .sig-name .n {\n// color: var(--pst-color-inline-code);\n// }\n\n.sig-name {\n color: var(--pst-color-inline-code);\n}\n\n.sig-param .o,\n.sig-param .default_value {\n color: var(--pst-color-text-muted);\n font-weight: normal;\n}\n\n// change target color for dark theme\ndt:target,\nspan.highlighted {\n background-color: var(--pst-color-target);\n}\n\n.viewcode-back {\n font-family: var(--pst-font-family-base);\n}\n\n.viewcode-block:target {\n border-top: 1px solid var(--pst-color-border);\n border-bottom: 1px solid var(--pst-color-border);\n position: relative;\n background-color: var(--pst-color-target);\n}\n\ndl > dt > a:has(.viewcode-link) {\n // Sphinx applies a `float:right` rule to the .viewcode-line span, which\n // exposes a browser glitch in the focus ring. It seems the browser creates\n // two separate boxes, an empty box where the anchor element gets laid out and\n // then another box around the anchor's contents that have been floated right.\n // Firefox draws the focus ring around the empty anchor element box. Chrome\n // draws two focus rings: one around the empty anchor and one around the\n // floated-right element. To fix the glitch, we apply the float rule on the\n // parent rather than the child.\n float: right;\n\n .viewcode-link {\n float: none;\n }\n}\n\n/*******************************************************************************\n* Styling for autosummary titles like \"parameters\" and \"returns\"\n*/\n\n// the API selector\n// from https://github.com/pradyunsg/furo/blob/main/src/furo/assets/styles/content/_api.sass#L6)\ndl[class]:not(.option-list, .field-list, .footnote, .glossary, .simple) {\n // increase margin bottom after the dl elements\n margin-bottom: 3rem;\n\n dd {\n margin-left: 2rem;\n\n // Fix until this will be solved to Sphinx https://github.com/sphinx-doc/sphinx/issues/10815\n & > dl.simple > dt {\n display: flex;\n }\n }\n\n dl.field-list {\n display: grid;\n grid-template-columns: unset;\n }\n\n dt.field-odd,\n dt.field-even {\n margin-top: 0.2rem;\n margin-bottom: 0.1rem;\n background-color: var(--pst-color-surface);\n }\n}\n","/**\n * Code block styling\n * Note that we inherit a lot of styling from Bootstrap so not many rules here.\n */\n\n// General code block behavior\n// Unset bootstrap behavior\ndiv[class*=\"highlight-\"],\ndiv.highlight,\ndiv.literal-block-wrapper {\n display: flex;\n flex-direction: column;\n width: unset;\n border-radius: $admonition-border-radius;\n break-inside: avoid;\n}\n\n// Code blocks with captions\n// There's a wrapper when the code block has a title\ndiv.literal-block-wrapper {\n border: 1px solid var(--pst-color-border);\n border-radius: $admonition-border-radius;\n\n // This is where the title goes\n div.code-block-caption {\n margin: 0;\n border-bottom: 1px solid var(--pst-color-border);\n padding: 0.5rem;\n font-size: 1rem;\n font-weight: var(--pst-font-weight-caption);\n\n a.headerlink {\n font-size: inherit;\n }\n }\n\n // Remove the upper border radius since we want it to connect with the title\n // Remove the box shadow so the wrapper gets the shadow instead\n div[class*=\"highlight-\"] {\n margin: 0;\n border-radius: 0;\n\n pre {\n border: none;\n box-shadow: none;\n }\n }\n}\n\n/**\n * In-line code\n */\ncode.literal {\n padding: 0.1rem 0.25rem;\n background-color: var(--pst-color-surface);\n border: 1px solid var(--pst-color-border);\n border-radius: 0.25rem;\n}\n\na > code {\n color: var(--pst-color-inline-code-links);\n}\n\n// Fix for Sphinx's \"highlight\" directive - this is an issue with our accessible pygments theme\n// and the colour we are using for the background of the code blocks.\nhtml[data-theme=\"light\"] .highlight .nf {\n color: #0078a1 !important;\n}\n\n// Minimum opacity needed for linenos to be WCAG AA conformant\nspan.linenos {\n opacity: 0.8 !important;\n}\n","figure > a,\nfigure > a > img,\nfigure > img,\nfigure > video {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n\nfigure {\n a.headerlink {\n // So that header link doesn't push caption to be off-center.\n position: absolute;\n font-size: inherit;\n }\n\n // Default headerlink hover doesn't trigger on figures\n &:hover a.headerlink {\n visibility: visible;\n }\n\n figcaption {\n font-family: var(--pst-font-family-heading);\n font-weight: var(--pst-font-weight-caption);\n color: var(--pst-color-text-muted);\n margin-left: auto;\n margin-right: auto;\n margin-top: 0.3rem;\n text-align: center;\n\n & > p:last-child {\n // Don't add extra margin to already existing figure bottom margin\n margin-bottom: 0;\n }\n\n p {\n text-align: start;\n display: inline-block;\n }\n\n table.table {\n width: fit-content;\n margin-left: auto;\n margin-right: auto;\n }\n }\n}\n","// For consistency, add bracket around footnotes/citations which are\n// cited more than once. E.g. [Newton](1,2) instead of Newton(1,2)\ndt.label > span.brackets:not(:only-child)::before {\n content: \"[\";\n}\n\ndt.label > span.brackets:not(:only-child)::after {\n content: \"]\";\n}\n\n// Make footnote as a superscript\na.footnote-reference {\n vertical-align: super;\n font-size: small;\n}\n\n// Docutils 0.18 uses an `aside.footnote` container with different internal structure\naside.footnote {\n margin-bottom: 0.5rem;\n\n &:last-child {\n margin-bottom: 1rem;\n }\n\n span.label,\n span.backrefs {\n font-weight: bold;\n }\n\n &:target {\n background-color: var(--pst-color-target);\n }\n}\n","/**\n * Hacky fixes that don't fit cleanly into other sections\n */\n\n// Ensure user highlighting/selecting behaves properly\n// From https://stackoverflow.com/a/34372191\ntable.highlighttable td.linenos,\nspan.linenos,\ndiv.doctest > div.highlight span.gp {\n /* gp: Generic.Prompt */\n user-select: none;\n}\n","// Override bootstrap by restoring the basic theme default.\ndd {\n margin-top: 3px;\n margin-bottom: 10px;\n margin-left: 30px;\n}\n\nol,\nul {\n padding-inline-start: 2rem;\n\n li > p:first-child {\n margin-bottom: 0.25rem;\n margin-top: 0.25rem;\n }\n}\n","// GitHub blockquote style\nblockquote {\n padding: 1em;\n color: var(--pst-color-text-muted);\n border-left: 0.25em solid var(--pst-color-blockquote-notch);\n border-radius: $admonition-border-radius;\n position: relative;\n\n p {\n color: var(--pst-color-text-base);\n }\n\n // remove padding from included line-block to avoid duplication\n .line-block {\n margin: 0;\n }\n\n // remove margin bottom for the last p\n p:last-child {\n margin-bottom: 0;\n }\n\n @include legacy-backdrop-placeholder;\n\n background-color: var(--pst-color-surface);\n\n // Ensure there is enough contrast against the background\n a {\n color: var(--pst-color-inline-code-links);\n }\n\n // hack to make the text in the blockquote selectable\n &::before {\n z-index: -1;\n }\n}\n","/**\n * Span-level styling within content\n */\n\nspan.guilabel {\n border: 1px solid var(--pst-color-info);\n font-size: 80%;\n font-weight: 700;\n border-radius: 4px;\n padding: 2.4px 6px;\n margin: auto 2px;\n position: relative;\n\n @include legacy-backdrop-placeholder;\n\n background-color: var(--pst-color-info-bg);\n}\n\na.reference.download::before {\n content: var(--pst-icon-download);\n font: var(--fa-font-solid);\n font-size: 0.8em;\n padding: 0 0.25em;\n color: var(--pst-color-text-muted);\n}\n","/**\n * Tables\n */\n\ntable {\n // default to table-center\n margin-left: auto;\n margin-right: auto;\n\n &.table-right {\n margin-right: 0;\n }\n\n &.table-left {\n margin-left: 0;\n }\n}\n\n// customize table caption from bootstrap\n// to display them on top and centered\ntable caption {\n text-align: center;\n caption-side: top;\n color: var(--pst-color-text-muted);\n}\n\n// MyST Markdown tables use these classes to control alignment\nth,\ntd {\n &.text-left {\n text-align: left;\n }\n\n &.text-right {\n text-align: right;\n }\n\n &.text-center {\n text-align: center;\n }\n}\n\n// override bootstrap table colors\n.table {\n @include table-colors;\n\n --bs-table-bg: transparent; // background\n --bs-table-color: var(\n --pst-color-text-base\n ); // ensure text and bullets are visible\n}\n\n.pst-scrollable-table-container {\n // Put a horizontal scrollbar just below tables that are too wide to fit\n // within the main column\n overflow-x: auto;\n}\n","/**\n * Style the toctree component in pages (avoid modifying the navbars)\n */\n.toctree-wrapper {\n p.caption {\n font-size: 1.5em;\n margin-bottom: 0;\n }\n\n & > ul {\n padding-left: 0;\n }\n\n li[class^=\"toctree-l\"] {\n list-style: none;\n margin-bottom: 0.2em;\n\n & > a {\n list-style: none;\n font-size: 1.1em;\n }\n\n & > ul {\n list-style: none;\n padding-inline-start: 1.5em;\n }\n }\n\n // slightly bigger font for l1\n .toctree-l1 > a {\n font-size: 1.3em;\n }\n}\n\ndiv.topic.contents, // Docutils <= 0.17\nnav.contents // Docutils >= 0.18\n{\n // Style similarly to toctree\n ul.simple {\n list-style: none;\n padding-left: 0;\n }\n}\n","/**\n * Mathematics via MathJax.\n *\n * This is designed for MathJax v3\n * ref: https://www.sphinx-doc.org/en/master/usage/extensions/math.html#module-sphinx.ext.mathjax\n */\n\n// Applies to all math elements\nspan.math,\ndiv.math {\n align-items: center;\n display: flex;\n max-width: 100%;\n\n // This will be over-ridden for the y-direction and divs\n overflow: hidden;\n}\n\n// Inline-only\nspan.math {\n display: inline-flex;\n}\n\n// Block-level only\ndiv.math {\n gap: 0.5em;\n\n // So that the eqno shows up after the equation\n flex-direction: row-reverse;\n\n // The equation number / link\n span.eqno a.headerlink {\n position: relative;\n font-size: 1em;\n }\n\n // The math container\n mjx-container {\n flex-grow: 1;\n padding-bottom: 0.2rem;\n overflow: auto;\n\n // Set height to 0 so that it does not cause scrollbars to appear\n // ref: https://github.com/mathjax/MathJax/issues/2521\n mjx-assistive-mml {\n height: 0;\n }\n }\n}\n","/**\n * ABlog\n * ref: https://ablog.readthedocs.io/\n */\n\n/**\n * Sidebar template components\n */\n.ablog-sidebar-item {\n h2,\n h3 {\n font-size: var(--pst-sidebar-header-font-size);\n\n // Remove unnecessary vertical whitespace\n margin-top: 0.5rem;\n\n // The headers are all links, but this makes them hard to parse\n // So we change the colors to make them look like headers\n a {\n color: var(--pst-color-text-base);\n }\n }\n\n ul {\n // No bullet points for the primary sidebar items\n list-style: none;\n padding-left: 0;\n\n // Otherwise a scrollbar randomly shows up\n overflow-y: hidden;\n\n // List of recent post items\n display: flex;\n flex-direction: column;\n gap: 0.5em;\n margin-bottom: 0;\n\n // The ablog cloud should move horizontally\n &.ablog-cloud {\n flex-flow: row wrap;\n gap: 0.5rem;\n\n // Vertical-align tag clouds\n li {\n // Center the tag cloud items\n display: flex;\n align-items: center;\n }\n }\n }\n}\n\n/**\n * Previous / next buttons at the bottom\n */\n.ablog__prev-next {\n font-size: 1.2em;\n display: flex;\n padding: 1rem 0;\n\n // The bottom previous / next arrows\n > span {\n // To ensure that the whole thing fits on one line even if there are long titles\n display: flex;\n max-width: 45%;\n\n // Links within each span have the collection of icon + text\n a {\n display: flex;\n align-items: center;\n margin-left: auto;\n gap: 1rem;\n line-height: 1.5rem;\n\n i::before {\n color: var(--pst-color-text-base);\n }\n }\n }\n\n // The first span is for the previous page and aligns to the left\n span.ablog__prev {\n i.fa-arrow-circle-left::before {\n content: var(--pst-icon-angle-left);\n }\n }\n\n // The second span is just an empty space so we remove it because we're\n // positioning with flex\n span.ablog__spacer {\n display: none;\n }\n\n // The third span is aligned to the right\n span.ablog__next {\n margin-left: auto;\n text-align: right;\n\n i.fa-arrow-circle-right::before {\n content: var(--pst-icon-angle-right);\n }\n }\n}\n\n/**\n * {postlist} directive and posts page\n */\n.ablog__collection,\n.postlist {\n padding-left: 0;\n\n .ablog-post {\n list-style: none;\n\n // Post metadata tags (author, links ,etc) should be a bit smaller\n .ablog-archive {\n display: flex;\n flex-flow: row wrap;\n gap: 1rem;\n list-style: none;\n font-size: 0.75rem;\n padding-left: 0;\n }\n\n // Title line should be a bit bigger and bold to stand out\n .ablog-post-title {\n margin-top: 0;\n font-size: 1.25rem;\n\n a {\n font-weight: bold;\n }\n }\n\n // Read more button should be a bit bigger\n .ablog-post-expand {\n margin-bottom: 0.5rem;\n }\n }\n}\n","/**\n * Special cases for Bootstrap functionality\n */\n\n// Bootstrap adds margin to their general container class. However, sphinx/docutils\n// can also generate output with the container class, but in those cases we should\n// not add the margin from bootstrap. Same for max-width.\n.docutils.container {\n padding-left: unset;\n padding-right: unset;\n margin-left: unset;\n margin-right: unset;\n max-width: unset;\n width: unset;\n}\n\n.btn {\n --bs-btn-focus-box-shadow: #{$btn-focus-box-shadow};\n}\n","/**\n * Sphinx Copybutton\n * ref: https://sphinx-copybutton.readthedocs.io/\n */\n\ndiv.highlight button.copybtn {\n // Nicer spacing\n display: flex;\n align-items: center;\n justify-content: center;\n\n // Don't over-ride the success color\n &:not(.success) {\n color: var(--pst-color-muted);\n }\n\n border: none;\n background-color: var(--pst-color-surface);\n\n &:hover {\n &:not(.success) {\n color: var(--pst-color-text);\n background-color: var(--pst-color-shadow);\n }\n }\n\n // Tooltip styling\n &.o-tooltip--left::after {\n color: var(--pst-color-text);\n background-color: var(--pst-color-surface);\n }\n\n &:focus {\n // For keyboard users, make the copy button visible when focussed.\n opacity: 1;\n }\n\n &:focus-visible {\n outline: $focus-ring-outline;\n }\n}\n\ndiv.highlight:has(button.copybtn) {\n // Make sure the code block has enough height for the copy button.\n // Sphinx-copybutton sets 0.3em top offset plus 1.7em height:\n // https://github.com/executablebooks/sphinx-copybutton/blob/master/sphinx_copybutton/_static/copybutton.css\n min-height: 2em;\n}\n","// adapt ethical ad to the theme\n#ethical-ad-placement {\n .ethical-sidebar a,\n .ethical-sidebar a:visited,\n .ethical-sidebar a:hover,\n .ethical-sidebar a:active,\n .ethical-footer a,\n .ethical-footer a:visited,\n .ethical-footer a:hover,\n .ethical-footer a:active {\n color: var(--pst-color-text-base);\n }\n\n .ethical-sidebar,\n .ethical-footer {\n background-color: var(--pst-color-background);\n border: 1px solid var(--pst-color-border);\n border-radius: 5px;\n color: var(--pst-color-text-base);\n font-size: 14px;\n line-height: 20px;\n }\n}\n","/**\n * Styles for various Sphinx execution libraries.\n * For now, where these define output sections, we simply revert their background\n * to be a \"light theme\" background. This ensures that inputs/outputs behave similarly,\n * because the CSS is often controlled by each package.\n * In the future, we might add dark theme support for specific packages.\n */\n\n/******************************************************************************\n * Jupyter Sphinx\n */\n\n.bd-content div.jupyter_container {\n // We don't want borders around the whole container, just around code cells\n border: none;\n background-color: unset;\n box-shadow: none;\n\n // Code cells should have the same style as our other code objects\n div.output,\n div.highlight {\n border-radius: 0.25rem;\n }\n\n div.highlight {\n background-color: var(--pst-color-surface);\n }\n\n // Ensure the style is the same as our code cells. Jupyter Sphinx makes it tiny.\n .cell_input,\n .cell_output {\n border-radius: 0.25rem;\n\n pre {\n padding: 1rem;\n }\n }\n}\n","/* Styles for graphviz generated output from Sphinx */\n\n/* Style the inheritance diagram such that it has a dark mode */\nhtml[data-theme=\"dark\"] div.graphviz > object.inheritance {\n filter: brightness(0.8) invert(0.82) contrast(1.2);\n color-scheme: normal;\n}\n","/**\n * Special-cases for packages in the PyData ecosystem\n */\n\n// xarray output display in bootstrap\n.xr-wrap[hidden] {\n display: block !important;\n}\n\n// ipywidgets\n.jp-OutputArea-output.lm-Widget {\n // override overflow:hidden rule from Lumino (.lm-Widget) to allow scrolling\n overflow: auto;\n}\n","/*******************************************************************************\n * Special-cases for the sphinx-design library, mainly to make it compatible\n * with the dark/light themes of pydata-sphinx-theme.\n *\n * NOTE: sphinx-design uses !important quite liberally, so here we must do the\n * same for our overrides to have any effect.\n */\n@use \"../variables/color\" as pst-color;\n@use \"sass:color\";\n@use \"sass:map\";\n@use \"sass:meta\";\n@use \"sass:string\";\n\n/*******************************************************************************\n * Color and variables\n *\n * This is a list of the semantic color names from sphinx-design (we only\n * need to override variables that sphinx-design has actually defined).\n * https://github.com/executablebooks/sphinx-design/blob/9226a12a/style/_colors.scss#L31-L43\n */\n$sd-semantic-color-names: (\n \"primary\",\n \"secondary\",\n \"success\",\n \"info\",\n \"warning\",\n \"danger\",\n \"light\",\n \"muted\",\n \"dark\",\n \"black\",\n \"white\"\n);\n\n/**\n * Here we create some extra --pst-color-* variables and use\n * them to override the value of the corresponding sphinx-design variables.\n * This is easier than re-writing the sphinx-design rules. Even easier would be\n * directly assigning our values to the --sd-color-* variables, but then our\n * downstream users couldn't override *our* colors and have it affect buttons\n * and badges.\n *\n * First, define the extra keys needed to cover the full range of semantic\n * color names used in sphinx-design, then merge them with the names we\n * already define for our own needs.\n * see https://sphinx-design.readthedocs.io/en/latest/css_variables.html\n */\n$extra-semantic-colors: (\n \"white\": $foundation-white,\n \"light\": (\n light: $foundation-light-gray,\n bg-light: color.scale($foundation-light-gray, $lightness: 30%),\n dark: $foundation-light-gray,\n bg-dark: color.scale($foundation-light-gray, $lightness: -30%),\n ),\n \"muted\": (\n light: $foundation-muted-gray,\n bg-light: color.scale($foundation-muted-gray, $lightness: 30%),\n dark: $foundation-light-gray,\n bg-dark: color.scale($foundation-muted-gray, $lightness: -30%),\n ),\n \"dark\": $foundation-dark-gray,\n \"black\": $foundation-black,\n);\n$all-colors: map.merge($pst-semantic-colors, $extra-semantic-colors);\n\n@mixin create-sd-colors($value, $name) {\n // define the pst variables, so that downstream user overrides will work\n --pst-color-#{$name}: #{$value};\n\n // we are now using a11y-combination to calculate the text color - this is based\n // on the WCAG color contrast guidelines\n --pst-color-#{$name}-text: #{a11y-combination($value)};\n\n // TODO: highlight seems to be used for buttons @trallard to fix on a11y follow-up work\n --pst-color-#{$name}-highlight: #{color.adjust($value, $lightness: -15%)};\n\n // override the sphinx-design variables\n --sd-color-#{$name}: var(--pst-color-#{$name});\n --sd-color-#{$name}-text: var(--pst-color-#{$name}-text);\n\n // TODO: highlight seems to be used for buttons @trallard to fix on a11y follow-up work\n --sd-color-#{$name}-highlight: var(--pst-color-#{$name}-highlight);\n}\n\n// Now we override the --sd-color-* variables.\n@each $mode in (light, dark) {\n html[data-theme=\"#{$mode}\"] {\n // check if this color is defined differently for light/dark\n @each $name in $sd-semantic-color-names {\n $definition: map.get($all-colors, $name);\n\n @if meta.type-of($definition) == map {\n @each $key, $value in $definition {\n @if string.index($key, $mode) {\n // since now we define the bg colours in the semantic colours and not\n // by changing opacity, we need to check if the key contains bg and the\n // correct mode (light/dark)\n @if string.index($key, \"bg\") {\n --sd-color-#{$name}-bg: #{$value};\n\n // create local variable\n $value: check-color($value);\n\n --sd-color-#{$name}-bg-text: #{a11y-combination($value)};\n } @else {\n $value: check-color($value);\n\n @include create-sd-colors($value, $name);\n }\n }\n }\n } @else {\n $value: map.get($all-colors, $name);\n\n @include create-sd-colors($value, $name);\n }\n }\n }\n}\n\n// Make sure the color border variables are set using our variables\n@each $mode in (light, dark) {\n html[data-theme=\"#{$mode}\"] {\n --sd-color-card-border: var(--pst-color-border);\n }\n}\n\n/*******************************************************************************\n * shadows\n */\nhtml[data-theme=\"light\"] {\n .sd-shadow-xs,\n .sd-shadow-sm,\n .sd-shadow-md,\n .sd-shadow-lg {\n @include box-shadow;\n }\n}\n\n/*******************************************************************************\n * cards\n */\n\n.bd-content .sd-card {\n border: 1px solid var(--pst-color-border);\n\n // TODO - --pst-color-panel-background is not defined... where is this coming from?\n .sd-card-header {\n background-color: var(--pst-color-panel-background);\n border-bottom: 1px solid var(--pst-color-border);\n }\n\n .sd-card-footer {\n background-color: var(--pst-color-panel-background);\n border-top: 1px solid var(--pst-color-border);\n }\n\n .sd-card-body {\n background-color: var(--pst-color-panel-background);\n }\n\n // Focus ring for link-cards\n .sd-stretched-link:focus-visible {\n // Don't put the focus ring on the element (it has zero height in Sphinx Design cards)\n outline: none;\n\n // Put the focus ring on the element's ::after pseudo-element\n &::after {\n outline: $focus-ring-outline;\n border-radius: 0.25rem; // copied from Sphinx Design CSS for .sd-card\n }\n }\n\n &.sd-card-hover:hover {\n border-color: var(--pst-color-link-hover);\n }\n}\n\n/*******************************************************************************\n * tabs\n */\n\n.bd-content .sd-tab-set {\n > input {\n // Active tab label\n &:checked + label {\n border-style: solid solid none;\n border-color: var(--pst-color-primary) var(--pst-color-primary)\n transparent; // top LR bottom\n\n border-width: 0.125rem 0.125rem 0;\n border-radius: 0.125rem 0.125rem 0 0;\n background-color: var(--pst-color-on-background);\n transform: translateY(0.125rem);\n color: var(--pst-color-primary);\n }\n\n &:focus-visible + label {\n border: 0.125rem solid var(--pst-color-accent);\n border-radius: 0.125rem;\n background-color: var(--pst-color-accent-bg);\n color: var(--pst-color-on-surface);\n }\n\n // Hover label\n &:not(:checked, :focus-visible) + label:hover {\n border-color: transparent;\n color: var(--pst-color-secondary);\n text-decoration-line: underline;\n text-decoration-thickness: $link-hover-decoration-thickness;\n }\n }\n\n // Tab label\n > label {\n color: var(--pst-color-on-surface);\n border: 0.125rem solid transparent;\n border-radius: 0.125rem 0.125rem 0 0;\n background-color: var(--pst-color-surface);\n padding: 0 0.75em;\n margin-inline-end: 0.25rem;\n line-height: 1.95;\n\n html[data-theme=\"dark\"] & {\n background-color: var(--pst-color-on-background);\n }\n }\n\n // panel\n .sd-tab-content {\n border: 0.125rem solid var(--pst-color-primary);\n border-radius: 0.1875rem;\n box-shadow: unset;\n padding: 0.625rem;\n background-color: var(--pst-color-on-background);\n }\n}\n\n/*******************************************************************************\n* Dropdowns\n*/\n\ndetails.sd-dropdown {\n // Remove all borders to over-ride SD behavior, and we'll add our own later\n border: 0 !important;\n\n // Drop shadow should behave same as admonitions\n @include box-shadow;\n\n // Header is where the \"clickable\" box goes\n summary.sd-card-header {\n border: 0 !important;\n display: flex;\n align-items: center;\n position: relative; // So background color works\n font-weight: 600;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n\n // Set a variable that we can re-use for colors later\n // We must set this in the current and content sibling container\n // so that it is defined in both places\n --pst-sd-dropdown-color: var(--pst-gray-500);\n --pst-sd-dropdown-bg-color: var(--pst-color-surface);\n\n & + div.sd-summary-content {\n border: 0;\n\n --pst-sd-dropdown-color: var(--sd-color-card-border);\n }\n\n @each $name in $sd-semantic-color-names {\n &.sd-bg-#{$name} {\n --pst-sd-dropdown-color: var(--sd-color-#{$name});\n --pst-sd-dropdown-bg-color: var(--sd-color-#{$name}-bg);\n\n // Otherwise it won't be defined in the sibling element\n & + div.sd-summary-content {\n --pst-sd-dropdown-color: var(--sd-color-#{$name});\n --pst-sd-dropdown-bg-color: var(--sd-color-#{$name}-bg);\n }\n }\n &.sd-bg-text-#{$name} {\n // Use the WCAG conformant text color\n color: var(--sd-color-#{$name}-bg-text) !important;\n }\n }\n\n @include legacy-backdrop-placeholder;\n\n background-color: var(--pst-sd-dropdown-bg-color) !important;\n\n // Add a left border with the same structure as our admonitions\n border-left: 0.2rem solid var(--pst-sd-dropdown-color) !important;\n\n // stylelint-disable-next-line no-duplicate-selectors\n & + div.sd-summary-content {\n border-left: 0.2rem solid var(--pst-sd-dropdown-color) !important;\n border-bottom-left-radius: calc(0.25rem - 1px);\n background-color: var(--pst-color-on-background);\n }\n\n span.sd-summary-icon {\n display: inline-flex;\n align-items: center;\n color: var(--pst-sd-dropdown-color) !important;\n\n svg {\n opacity: 1;\n }\n }\n\n // Positioning of the caret\n .sd-summary-up,\n .sd-summary-down {\n top: 0.7rem;\n }\n\n // Focus ring\n &:focus-visible {\n outline: $focus-ring-outline;\n outline-offset: -$focus-ring-width;\n }\n }\n}\n\n/*******************************************************************************\n* Buttons (which in Sphinx Design are actually links that look like buttons)\n* ref: https://sphinx-design.readthedocs.io/en/pydata-theme/badges_buttons.html#buttons\n*/\nhtml {\n .sd-btn {\n min-width: 2.25rem;\n padding: 0.3125rem 0.75rem 0.4375rem; // 5px 12px 7px\n\n &:hover {\n @include link-style-hover; // override Sphinx Design\n\n text-decoration-thickness: 1px;\n }\n }\n\n @each $name in $sd-semantic-color-names {\n .sd-btn-#{$name},\n .sd-btn-outline-#{$name} {\n &:focus-visible {\n // Override Sphinx Design's use of -highlight colors. The -highlight\n // colors are 15% darker, so this would create the effect of darkening\n // the button when focused but we just want the button to have a focus\n // ring of the same (non-highlight) color.\n background-color: var(--sd-color-#{$name}) !important;\n border-color: var(--sd-color-#{$name}) !important;\n outline: var(--sd-color-#{$name}) solid $focus-ring-width;\n outline-offset: $focus-ring-width;\n }\n }\n }\n}\n","/**\n * Sphinx togglebutton\n */\n\n.bd-content {\n @mixin chevron-down {\n .toggle-chevron-right {\n transform: rotate(90deg); // point chevron down\n transition: none; // match non-animated behavior of other chevrons on site\n }\n }\n\n @mixin chevron-up {\n .toggle-chevron-right {\n transform: rotate(-90deg); // point chevron up\n transition: none; // match non-animated behavior of other chevrons on site\n }\n }\n\n // Admonition toggles\n .admonition {\n button.toggle-button {\n color: inherit;\n\n // When disclosure widget is closed\n &.toggle-button-hidden {\n @include chevron-down;\n }\n\n // When open\n @include chevron-up;\n }\n\n // Focus ring\n // ----------\n // Sphinx-togglebutton makes the entire admonition header clickable, but\n // only the button within the header is focusable. We want the entire\n // clickable area to be surrounded with a focus ring, so that's why we use\n // the :focus-within selector, rather than a :focus-visible selector on the\n // button.\n &:focus-within {\n overflow: visible;\n\n // The complicated focus ring styles here are a consequence of the markup\n // and border styles for this particular admonition class. (For the other\n // type of admonition on this site, the focus ring style is achieved with\n // simple `outline` and `outline-offset` rules on the admonition's\n // header.) The problem is that Sphinx-togglebutton puts the admonition's\n // left border on the outermost container (rather than separately setting\n // the left border on the container's children). This makes it complicated\n // to get the focus ring to simultaneously cover the left border in the\n // header and align perfectly on the right with the body.\n .admonition-title:focus-within::before {\n content: \"\";\n transform: translateX(\n -$admonition-left-border-width\n ); // align left edges of admonition and ring\n\n width: calc(100% + $admonition-left-border-width); // align right edges\n height: 100%;\n border: $focus-ring-outline;\n border-radius: $focus-ring-width;\n }\n\n // When expanded, sharpen the bottom left and right corners of the focus ring\n &:not(.toggle-hidden) .admonition-title:focus-within::before {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n }\n\n // Details buttons\n details.toggle-details {\n // Over-ride border color to re-use our primary color\n summary {\n border-left: 3px solid var(--pst-color-primary);\n\n @include chevron-down;\n }\n\n // When expanded, sharpen the bottom left and right corners of the focus ring\n &[open] {\n @include chevron-up;\n\n :focus-visible {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n }\n}\n","/**\n * Styles for various Sphinx execution libraries to display pre-executed notebooks.\n * For now, where these define output sections, we simply revert their background\n * to be a \"light theme\" background. This ensures that inputs/outputs behave similarly,\n * because the CSS is often controlled by each package.\n * In the future, we might add dark theme support for specific packages.\n */\n\n/*******************************************************************************\n * nbsphinx\n */\nhtml div.rendered_html,\n// NBsphinx ipywidgets output selector\nhtml .jp-RenderedHTMLCommon {\n // Add some margin around the element box for the focus ring. Otherwise the\n // focus ring gets clipped because the containing elements have `overflow:\n // hidden` applied to them (via the `.lm-Widget` selector)\n margin: $focus-ring-width;\n\n table {\n table-layout: auto;\n }\n}\n\n.bd-content .nboutput {\n .output_area {\n &.rendered_html,\n .jp-RenderedHTMLCommon {\n // pandas\n table.dataframe {\n @include table-colors;\n }\n }\n\n // Dark theme special-cases\n html[data-theme=\"dark\"] & {\n &.rendered_html:not(:has(table.dataframe)),\n // ipywidgets\n .widget-subarea {\n @include cell-output-background;\n }\n\n &.stderr {\n background-color: var(--pst-color-danger);\n }\n }\n }\n}\n\n// Add extra padding to the final item in an nbsphinx container\ndiv.nblast.container {\n margin-bottom: 1rem;\n}\n\n/*******************************************************************************\n * myst NB\n */\n\ndiv.cell_output .output {\n max-width: 100%;\n overflow-x: auto;\n}\n\n.bd-content div.cell_output {\n // pandas\n table.dataframe {\n @include table-colors;\n }\n\n html[data-theme=\"dark\"] & {\n img,\n .text_html:not(:has(table.dataframe)),\n // ipywidgets\n .widget-subarea {\n @include cell-output-background;\n }\n }\n}\n\n// Prevent tables from scrunching together\n.bd-content {\n div.cell_input {\n display: flex;\n flex-direction: column;\n justify-content: stretch;\n }\n\n div.cell_input,\n div.output {\n border-radius: $admonition-border-radius;\n }\n\n div.output {\n table {\n table-layout: auto;\n }\n }\n}\n","/**\n * style for the various mapping libs based on leaflet (folium, geemap, ipyleaflet)\n * mainly ensure the good display of the maps in both themes and avoid the customization\n * of the tiles\n */\n\n/**\n * avoid border override from pydata-sphinx-theme\n * minimal selctor to get the priority\n */\nhtml[data-theme=\"dark\"] .bd-content img.leaflet-tile.leaflet-tile-loaded {\n border-radius: 0;\n padding: 0;\n}\n","/**\n * /search.html page special-cases\n */\n\n.bd-search-container {\n /*******************************************\n * Search results\n */\n // Whitespace\n div#search-results {\n > h2 {\n font-size: var(--pst-font-size-icon);\n margin-top: 1rem;\n }\n\n p.search-summary {\n color: var(--pst-color-text-muted);\n }\n }\n\n ul.search {\n margin: 0;\n list-style: none;\n\n li {\n background-image: none;\n padding: 1rem 0;\n margin: 1rem 0;\n border-top: 1px solid var(--pst-color-text-muted);\n\n // First link is the page title, it should be a bit bigger\n > a {\n font-size: 1.2em;\n }\n\n div.context,\n p.context {\n color: var(--pst-color-text-base);\n margin: 0.5em 0 0;\n\n // Add a # before page section titles to make it clear they are sections\n a::before {\n content: \"#\";\n padding-right: 0.2em;\n color: var(--pst-color-text-muted);\n }\n }\n }\n }\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/_static/swc_hpc_access_flowchart.png b/_static/swc_hpc_access_flowchart.png deleted file mode 100644 index 8594302..0000000 Binary files a/_static/swc_hpc_access_flowchart.png and /dev/null differ diff --git a/_static/webpack-macros.html b/_static/webpack-macros.html index c051fa9..72d229f 100644 --- a/_static/webpack-macros.html +++ b/_static/webpack-macros.html @@ -4,7 +4,7 @@ --> {# Load FontAwesome icons #} {% macro head_pre_icons() %} - + @@ -12,20 +12,20 @@ {% macro head_pre_assets() %} - - - + + + {% endmacro %} {% macro head_js_preload() %} - - - + + + {% endmacro %} {% macro body_post() %} - - + + {% endmacro %} \ No newline at end of file diff --git a/data_analysis/HPC-module-SLEAP.html b/data_analysis/HPC-module-SLEAP.html index 1242371..9866a83 100644 --- a/data_analysis/HPC-module-SLEAP.html +++ b/data_analysis/HPC-module-SLEAP.html @@ -18,12 +18,12 @@ - - - + + + - + @@ -34,9 +34,9 @@ - - - + + + @@ -107,7 +107,7 @@