-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
155 changed files
with
1,565 additions
and
3,077 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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: a952154b8a439336a090848d2e1ffeb2 | ||
config: 2798ec8b10d93ebc8b3e1dde778f2601 | ||
tags: 645f666f9bcd5a90fca523b33c5a78b7 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
.sphinx-tabs { | ||
margin-bottom: 1rem; | ||
} | ||
|
||
[role="tablist"] { | ||
border-bottom: 1px solid #a0b3bf; | ||
} | ||
|
||
.sphinx-tabs-tab { | ||
position: relative; | ||
font-family: Lato,'Helvetica Neue',Arial,Helvetica,sans-serif; | ||
color: #1D5C87; | ||
line-height: 24px; | ||
margin: 0; | ||
font-size: 16px; | ||
font-weight: 400; | ||
background-color: rgba(255, 255, 255, 0); | ||
border-radius: 5px 5px 0 0; | ||
border: 0; | ||
padding: 1rem 1.5rem; | ||
margin-bottom: 0; | ||
} | ||
|
||
.sphinx-tabs-tab[aria-selected="true"] { | ||
font-weight: 700; | ||
border: 1px solid #a0b3bf; | ||
border-bottom: 1px solid white; | ||
margin: -1px; | ||
background-color: white; | ||
} | ||
|
||
.sphinx-tabs-tab:focus { | ||
z-index: 1; | ||
outline-offset: 1px; | ||
} | ||
|
||
.sphinx-tabs-panel { | ||
position: relative; | ||
padding: 1rem; | ||
border: 1px solid #a0b3bf; | ||
margin: 0px -1px -1px -1px; | ||
border-radius: 0 0 5px 5px; | ||
border-top: 0; | ||
background: white; | ||
} | ||
|
||
.sphinx-tabs-panel.code-tab { | ||
padding: 0.4rem; | ||
} | ||
|
||
.sphinx-tab img { | ||
margin-bottom: 24 px; | ||
} | ||
|
||
/* Dark theme preference styling */ | ||
|
||
@media (prefers-color-scheme: dark) { | ||
body[data-theme="auto"] .sphinx-tabs-panel { | ||
color: white; | ||
background-color: rgb(50, 50, 50); | ||
} | ||
|
||
body[data-theme="auto"] .sphinx-tabs-tab { | ||
color: white; | ||
background-color: rgba(255, 255, 255, 0.05); | ||
} | ||
|
||
body[data-theme="auto"] .sphinx-tabs-tab[aria-selected="true"] { | ||
border-bottom: 1px solid rgb(50, 50, 50); | ||
background-color: rgb(50, 50, 50); | ||
} | ||
} | ||
|
||
/* Explicit dark theme styling */ | ||
|
||
body[data-theme="dark"] .sphinx-tabs-panel { | ||
color: white; | ||
background-color: rgb(50, 50, 50); | ||
} | ||
|
||
body[data-theme="dark"] .sphinx-tabs-tab { | ||
color: white; | ||
background-color: rgba(255, 255, 255, 0.05); | ||
} | ||
|
||
body[data-theme="dark"] .sphinx-tabs-tab[aria-selected="true"] { | ||
border-bottom: 2px solid rgb(50, 50, 50); | ||
background-color: rgb(50, 50, 50); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,145 @@ | ||
try { | ||
var session = window.sessionStorage || {}; | ||
} catch (e) { | ||
var session = {}; | ||
} | ||
|
||
window.addEventListener("DOMContentLoaded", () => { | ||
const allTabs = document.querySelectorAll('.sphinx-tabs-tab'); | ||
const tabLists = document.querySelectorAll('[role="tablist"]'); | ||
|
||
allTabs.forEach(tab => { | ||
tab.addEventListener("click", changeTabs); | ||
}); | ||
|
||
tabLists.forEach(tabList => { | ||
tabList.addEventListener("keydown", keyTabs); | ||
}); | ||
|
||
// Restore group tab selection from session | ||
const lastSelected = session.getItem('sphinx-tabs-last-selected'); | ||
if (lastSelected != null) selectNamedTabs(lastSelected); | ||
}); | ||
|
||
/** | ||
* Key focus left and right between sibling elements using arrows | ||
* @param {Node} e the element in focus when key was pressed | ||
*/ | ||
function keyTabs(e) { | ||
const tab = e.target; | ||
let nextTab = null; | ||
if (e.keyCode === 39 || e.keyCode === 37) { | ||
tab.setAttribute("tabindex", -1); | ||
// Move right | ||
if (e.keyCode === 39) { | ||
nextTab = tab.nextElementSibling; | ||
if (nextTab === null) { | ||
nextTab = tab.parentNode.firstElementChild; | ||
} | ||
// Move left | ||
} else if (e.keyCode === 37) { | ||
nextTab = tab.previousElementSibling; | ||
if (nextTab === null) { | ||
nextTab = tab.parentNode.lastElementChild; | ||
} | ||
} | ||
} | ||
|
||
if (nextTab !== null) { | ||
nextTab.setAttribute("tabindex", 0); | ||
nextTab.focus(); | ||
} | ||
} | ||
|
||
/** | ||
* Select or deselect clicked tab. If a group tab | ||
* is selected, also select tab in other tabLists. | ||
* @param {Node} e the element that was clicked | ||
*/ | ||
function changeTabs(e) { | ||
// Use this instead of the element that was clicked, in case it's a child | ||
const notSelected = this.getAttribute("aria-selected") === "false"; | ||
const positionBefore = this.parentNode.getBoundingClientRect().top; | ||
const notClosable = !this.parentNode.classList.contains("closeable"); | ||
|
||
deselectTabList(this); | ||
|
||
if (notSelected || notClosable) { | ||
selectTab(this); | ||
const name = this.getAttribute("name"); | ||
selectNamedTabs(name, this.id); | ||
|
||
if (this.classList.contains("group-tab")) { | ||
// Persist during session | ||
session.setItem('sphinx-tabs-last-selected', name); | ||
} | ||
} | ||
|
||
const positionAfter = this.parentNode.getBoundingClientRect().top; | ||
const positionDelta = positionAfter - positionBefore; | ||
// Scroll to offset content resizing | ||
window.scrollTo(0, window.scrollY + positionDelta); | ||
} | ||
|
||
/** | ||
* Select tab and show associated panel. | ||
* @param {Node} tab tab to select | ||
*/ | ||
function selectTab(tab) { | ||
tab.setAttribute("aria-selected", true); | ||
|
||
// Show the associated panel | ||
document | ||
.getElementById(tab.getAttribute("aria-controls")) | ||
.removeAttribute("hidden"); | ||
} | ||
|
||
/** | ||
* Hide the panels associated with all tabs within the | ||
* tablist containing this tab. | ||
* @param {Node} tab a tab within the tablist to deselect | ||
*/ | ||
function deselectTabList(tab) { | ||
const parent = tab.parentNode; | ||
const grandparent = parent.parentNode; | ||
|
||
Array.from(parent.children) | ||
.forEach(t => t.setAttribute("aria-selected", false)); | ||
|
||
Array.from(grandparent.children) | ||
.slice(1) // Skip tablist | ||
.forEach(panel => panel.setAttribute("hidden", true)); | ||
} | ||
|
||
/** | ||
* Select grouped tabs with the same name, but no the tab | ||
* with the given id. | ||
* @param {Node} name name of grouped tab to be selected | ||
* @param {Node} clickedId id of clicked tab | ||
*/ | ||
function selectNamedTabs(name, clickedId=null) { | ||
const groupedTabs = document.querySelectorAll(`.sphinx-tabs-tab[name="${name}"]`); | ||
const tabLists = Array.from(groupedTabs).map(tab => tab.parentNode); | ||
|
||
tabLists | ||
.forEach(tabList => { | ||
// Don't want to change the tabList containing the clicked tab | ||
const clickedTab = tabList.querySelector(`[id="${clickedId}"]`); | ||
if (clickedTab === null ) { | ||
// Select first tab with matching name | ||
const tab = tabList.querySelector(`.sphinx-tabs-tab[name="${name}"]`); | ||
deselectTabList(tab); | ||
selectTab(tab); | ||
} | ||
}) | ||
} | ||
|
||
if (typeof exports === 'undefined') { | ||
exports = {}; | ||
} | ||
|
||
exports.keyTabs = keyTabs; | ||
exports.changeTabs = changeTabs; | ||
exports.selectTab = selectTab; | ||
exports.deselectTabList = deselectTabList; | ||
exports.selectNamedTabs = selectNamedTabs; |
Oops, something went wrong.