diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 895802d..0911877 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -43,19 +43,21 @@ jobs: id: pages uses: actions/configure-pages@v5 + - name: Build root book with mdBook + run: mdbook build + + - name: Add root files + run: | + cp CNAME public/ + cp robots.txt public/ + - name: Copy PR previews # If there are no open PR's, this step will emit error messages that no # files matched and it does not look like a tar archive. These are # expected and don't indicate a problem. run: | - mkdir -p public git fetch --depth=1 origin +gh-pages:refs/remotes/origin/gh-pages - git archive --prefix=public/ refs/remotes/origin/gh-pages -- ':(glob)pr-*/**' | tar x || true - - - name: Add root files - run: | - cp CNAME public/ - cp index.html public/ + git archive --prefix=public/ refs/remotes/origin/gh-pages -- ':(glob)pr/**' | tar x || true - name: Build Compiler User Guide with mdBook run: mdbook build diff --git a/.github/workflows/pr-docs-build.yml b/.github/workflows/pr-docs-build.yml index 903d8a6..7dade6e 100644 --- a/.github/workflows/pr-docs-build.yml +++ b/.github/workflows/pr-docs-build.yml @@ -26,6 +26,9 @@ jobs: rustup update cargo install --version ${MDBOOK_VERSION} mdbook + - name: Build root book with mdBook + run: mdbook build + - name: Build Compiler User Guide with mdBook run: mdbook build working-directory: ./compiler-user-guide @@ -34,18 +37,13 @@ jobs: run: mdbook build working-directory: ./tutorial - - name: Add Index Page - run: | - mkdir -p public - cp index.html ./public/index.html - - name: Deploy to GitHub Pages uses: peaceiris/actions-gh-pages@v4 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./public # The directory mdbook builds to - # Deploy to a subdirectory like "pr-123" - destination_dir: ./pr-${{ github.event.pull_request.number }} + # Deploy to a subdirectory like "pr/123" + destination_dir: ./pr/${{ github.event.pull_request.number }} # Post a comment on the PR with the link to the preview - name: Post Preview Link Comment @@ -54,4 +52,4 @@ jobs: # Construct the URL for the preview message: | Thank you for your PR! A preview of your changes is live at - **[https://docs.clash-lang.org/pr-${{ github.event.pull_request.number }}/](https://docs.clash-lang.org/pr-${{ github.event.pull_request.number }}/)** + **[https://docs.clash-lang.org/pr/${{ github.event.pull_request.number }}/](https://docs.clash-lang.org/pr/${{ github.event.pull_request.number }}/)** diff --git a/.github/workflows/pr-docs-clean.yml b/.github/workflows/pr-docs-clean.yml index d4cc9f0..f1f1d7a 100644 --- a/.github/workflows/pr-docs-clean.yml +++ b/.github/workflows/pr-docs-clean.yml @@ -21,8 +21,8 @@ jobs: - name: Remove PR Preview Directory run: | PR_NUMBER=${{ github.event.pull_request.number }} - echo "Removing directory ./pr-${PR_NUMBER}" - rm -rf ./pr-${PR_NUMBER} + echo "Removing directory ./pr/${PR_NUMBER}" + rm -rf ./pr/${PR_NUMBER} - name: Commit and Push Deletion uses: peaceiris/actions-gh-pages@v4 diff --git a/book.toml b/book.toml new file mode 100644 index 0000000..4f9ea61 --- /dev/null +++ b/book.toml @@ -0,0 +1,8 @@ +[book] +authors = ["The Clash Developers"] +language = "en" +src = "root-src" +title = "Clash Documentation" + +[build] +build-dir = "public/" diff --git a/compiler-user-guide/theme b/compiler-user-guide/theme new file mode 120000 index 0000000..173f736 --- /dev/null +++ b/compiler-user-guide/theme @@ -0,0 +1 @@ +../theme/ \ No newline at end of file diff --git a/index.html b/index.html deleted file mode 100644 index 62ab306..0000000 --- a/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - -
- - - - -You will be redirected to the Clash Compiler User Guide soon!
- - diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..22e0f32 --- /dev/null +++ b/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: /pr/ diff --git a/root-src/SUMMARY.md b/root-src/SUMMARY.md new file mode 100644 index 0000000..bdbbd05 --- /dev/null +++ b/root-src/SUMMARY.md @@ -0,0 +1,3 @@ +# Summary + +- [Clash Documentation](./index.md) diff --git a/root-src/index.md b/root-src/index.md new file mode 100644 index 0000000..b0554ef --- /dev/null +++ b/root-src/index.md @@ -0,0 +1,8 @@ +# Clash Documentation + +Welcome to the Clash Documentation! + +Here you can find different types of documentation. + +1. [Tutorial](./tutorial/) +2. [Compiler User Guide](./compiler-user-guide/) diff --git a/compiler-user-guide/theme/book.js b/theme/book.js similarity index 100% rename from compiler-user-guide/theme/book.js rename to theme/book.js diff --git a/compiler-user-guide/theme/css/chrome.css b/theme/css/chrome.css similarity index 100% rename from compiler-user-guide/theme/css/chrome.css rename to theme/css/chrome.css diff --git a/compiler-user-guide/theme/css/general.css b/theme/css/general.css similarity index 100% rename from compiler-user-guide/theme/css/general.css rename to theme/css/general.css diff --git a/compiler-user-guide/theme/css/print.css b/theme/css/print.css similarity index 100% rename from compiler-user-guide/theme/css/print.css rename to theme/css/print.css diff --git a/compiler-user-guide/theme/css/variables.css b/theme/css/variables.css similarity index 100% rename from compiler-user-guide/theme/css/variables.css rename to theme/css/variables.css diff --git a/compiler-user-guide/theme/favicon.png b/theme/favicon.png similarity index 100% rename from compiler-user-guide/theme/favicon.png rename to theme/favicon.png diff --git a/compiler-user-guide/theme/favicon.svg b/theme/favicon.svg similarity index 100% rename from compiler-user-guide/theme/favicon.svg rename to theme/favicon.svg diff --git a/compiler-user-guide/theme/fonts/OPEN-SANS-LICENSE.txt b/theme/fonts/OPEN-SANS-LICENSE.txt similarity index 100% rename from compiler-user-guide/theme/fonts/OPEN-SANS-LICENSE.txt rename to theme/fonts/OPEN-SANS-LICENSE.txt diff --git a/compiler-user-guide/theme/fonts/SOURCE-CODE-PRO-LICENSE.txt b/theme/fonts/SOURCE-CODE-PRO-LICENSE.txt similarity index 100% rename from compiler-user-guide/theme/fonts/SOURCE-CODE-PRO-LICENSE.txt rename to theme/fonts/SOURCE-CODE-PRO-LICENSE.txt diff --git a/compiler-user-guide/theme/fonts/fonts.css b/theme/fonts/fonts.css similarity index 100% rename from compiler-user-guide/theme/fonts/fonts.css rename to theme/fonts/fonts.css diff --git a/compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-300.woff2 b/theme/fonts/open-sans-v17-all-charsets-300.woff2 similarity index 100% rename from compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-300.woff2 rename to theme/fonts/open-sans-v17-all-charsets-300.woff2 diff --git a/compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-300italic.woff2 b/theme/fonts/open-sans-v17-all-charsets-300italic.woff2 similarity index 100% rename from compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-300italic.woff2 rename to theme/fonts/open-sans-v17-all-charsets-300italic.woff2 diff --git a/compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-600.woff2 b/theme/fonts/open-sans-v17-all-charsets-600.woff2 similarity index 100% rename from compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-600.woff2 rename to theme/fonts/open-sans-v17-all-charsets-600.woff2 diff --git a/compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-600italic.woff2 b/theme/fonts/open-sans-v17-all-charsets-600italic.woff2 similarity index 100% rename from compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-600italic.woff2 rename to theme/fonts/open-sans-v17-all-charsets-600italic.woff2 diff --git a/compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-700.woff2 b/theme/fonts/open-sans-v17-all-charsets-700.woff2 similarity index 100% rename from compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-700.woff2 rename to theme/fonts/open-sans-v17-all-charsets-700.woff2 diff --git a/compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-700italic.woff2 b/theme/fonts/open-sans-v17-all-charsets-700italic.woff2 similarity index 100% rename from compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-700italic.woff2 rename to theme/fonts/open-sans-v17-all-charsets-700italic.woff2 diff --git a/compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-800.woff2 b/theme/fonts/open-sans-v17-all-charsets-800.woff2 similarity index 100% rename from compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-800.woff2 rename to theme/fonts/open-sans-v17-all-charsets-800.woff2 diff --git a/compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-800italic.woff2 b/theme/fonts/open-sans-v17-all-charsets-800italic.woff2 similarity index 100% rename from compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-800italic.woff2 rename to theme/fonts/open-sans-v17-all-charsets-800italic.woff2 diff --git a/compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-italic.woff2 b/theme/fonts/open-sans-v17-all-charsets-italic.woff2 similarity index 100% rename from compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-italic.woff2 rename to theme/fonts/open-sans-v17-all-charsets-italic.woff2 diff --git a/compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-regular.woff2 b/theme/fonts/open-sans-v17-all-charsets-regular.woff2 similarity index 100% rename from compiler-user-guide/theme/fonts/open-sans-v17-all-charsets-regular.woff2 rename to theme/fonts/open-sans-v17-all-charsets-regular.woff2 diff --git a/compiler-user-guide/theme/fonts/source-code-pro-v11-all-charsets-500.woff2 b/theme/fonts/source-code-pro-v11-all-charsets-500.woff2 similarity index 100% rename from compiler-user-guide/theme/fonts/source-code-pro-v11-all-charsets-500.woff2 rename to theme/fonts/source-code-pro-v11-all-charsets-500.woff2 diff --git a/compiler-user-guide/theme/highlight.css b/theme/highlight.css similarity index 100% rename from compiler-user-guide/theme/highlight.css rename to theme/highlight.css diff --git a/compiler-user-guide/theme/highlight.js b/theme/highlight.js similarity index 100% rename from compiler-user-guide/theme/highlight.js rename to theme/highlight.js diff --git a/compiler-user-guide/theme/index.hbs b/theme/index.hbs similarity index 100% rename from compiler-user-guide/theme/index.hbs rename to theme/index.hbs diff --git a/tutorial/theme b/tutorial/theme new file mode 120000 index 0000000..173f736 --- /dev/null +++ b/tutorial/theme @@ -0,0 +1 @@ +../theme/ \ No newline at end of file diff --git a/tutorial/theme/book.js b/tutorial/theme/book.js deleted file mode 100644 index 5df2096..0000000 --- a/tutorial/theme/book.js +++ /dev/null @@ -1,818 +0,0 @@ -'use strict'; - -/* global default_theme, default_dark_theme, default_light_theme, hljs, ClipboardJS */ - -// Fix back button cache problem -window.onunload = function() { }; - -// Global variable, shared between modules -function playground_text(playground, hidden = true) { - const code_block = playground.querySelector('code'); - - if (window.ace && code_block.classList.contains('editable')) { - const editor = window.ace.edit(code_block); - return editor.getValue(); - } else if (hidden) { - return code_block.textContent; - } else { - return code_block.innerText; - } -} - -(function codeSnippets() { - function fetch_with_timeout(url, options, timeout = 6000) { - return Promise.race([ - fetch(url, options), - new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), timeout)), - ]); - } - - const playgrounds = Array.from(document.querySelectorAll('.playground')); - if (playgrounds.length > 0) { - fetch_with_timeout('https://play.rust-lang.org/meta/crates', { - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - mode: 'cors', - }) - .then(response => response.json()) - .then(response => { - // get list of crates available in the rust playground - const playground_crates = response.crates.map(item => item['id']); - playgrounds.forEach(block => handle_crate_list_update(block, playground_crates)); - }); - } - - function handle_crate_list_update(playground_block, playground_crates) { - // update the play buttons after receiving the response - update_play_button(playground_block, playground_crates); - - // and install on change listener to dynamically update ACE editors - if (window.ace) { - const code_block = playground_block.querySelector('code'); - if (code_block.classList.contains('editable')) { - const editor = window.ace.edit(code_block); - editor.addEventListener('change', () => { - update_play_button(playground_block, playground_crates); - }); - // add Ctrl-Enter command to execute rust code - editor.commands.addCommand({ - name: 'run', - bindKey: { - win: 'Ctrl-Enter', - mac: 'Ctrl-Enter', - }, - exec: _editor => run_rust_code(playground_block), - }); - } - } - } - - // updates the visibility of play button based on `no_run` class and - // used crates vs ones available on https://play.rust-lang.org - function update_play_button(pre_block, playground_crates) { - const play_button = pre_block.querySelector('.play-button'); - - // skip if code is `no_run` - if (pre_block.querySelector('code').classList.contains('no_run')) { - play_button.classList.add('hidden'); - return; - } - - // get list of `extern crate`'s from snippet - const txt = playground_text(pre_block); - const re = /extern\s+crate\s+([a-zA-Z_0-9]+)\s*;/g; - const snippet_crates = []; - let item; - // eslint-disable-next-line no-cond-assign - while (item = re.exec(txt)) { - snippet_crates.push(item[1]); - } - - // check if all used crates are available on play.rust-lang.org - const all_available = snippet_crates.every(function(elem) { - return playground_crates.indexOf(elem) > -1; - }); - - if (all_available) { - play_button.classList.remove('hidden'); - } else { - play_button.classList.add('hidden'); - } - } - - function run_rust_code(code_block) { - let result_block = code_block.querySelector('.result'); - if (!result_block) { - result_block = document.createElement('code'); - result_block.className = 'result hljs language-bash'; - - code_block.append(result_block); - } - - const text = playground_text(code_block); - const classes = code_block.querySelector('code').classList; - let edition = '2015'; - classes.forEach(className => { - if (className.startsWith('edition')) { - edition = className.slice(7); - } - }); - const params = { - version: 'stable', - optimize: '0', - code: text, - edition: edition, - }; - - if (text.indexOf('#![feature') !== -1) { - params.version = 'nightly'; - } - - result_block.innerText = 'Running...'; - - fetch_with_timeout('https://play.rust-lang.org/evaluate.json', { - headers: { - 'Content-Type': 'application/json', - }, - method: 'POST', - mode: 'cors', - body: JSON.stringify(params), - }) - .then(response => response.json()) - .then(response => { - if (response.result.trim() === '') { - result_block.innerText = 'No output'; - result_block.classList.add('result-no-output'); - } else { - result_block.innerText = response.result; - result_block.classList.remove('result-no-output'); - } - }) - .catch(error => result_block.innerText = 'Playground Communication: ' + error.message); - } - - // Syntax highlighting Configuration - hljs.configure({ - tabReplace: ' ', // 4 spaces - languages: [], // Languages used for auto-detection - }); - - const code_nodes = Array - .from(document.querySelectorAll('code')) - // Don't highlight `inline code` blocks in headers. - .filter(function(node) { - return !node.parentElement.classList.contains('header'); - }); - - if (window.ace) { - // language-rust class needs to be removed for editable - // blocks or highlightjs will capture events - code_nodes - .filter(function(node) { - return node.classList.contains('editable'); - }) - .forEach(function(block) { - block.classList.remove('language-rust'); - }); - - code_nodes - .filter(function(node) { - return !node.classList.contains('editable'); - }) - .forEach(function(block) { - hljs.highlightBlock(block); - }); - } else { - code_nodes.forEach(function(block) { - hljs.highlightBlock(block); - }); - } - - // Adding the hljs class gives code blocks the color css - // even if highlighting doesn't apply - code_nodes.forEach(function(block) { - block.classList.add('hljs'); - }); - - Array.from(document.querySelectorAll('code.hljs')).forEach(function(block) { - - const lines = Array.from(block.querySelectorAll('.boring')); - // If no lines were hidden, return - if (!lines.length) { - return; - } - block.classList.add('hide-boring'); - - const buttons = document.createElement('div'); - buttons.className = 'buttons'; - buttons.innerHTML = ''; - - // add expand button - const pre_block = block.parentNode; - pre_block.insertBefore(buttons, pre_block.firstChild); - - pre_block.querySelector('.buttons').addEventListener('click', function(e) { - if (e.target.classList.contains('fa-eye')) { - e.target.classList.remove('fa-eye'); - e.target.classList.add('fa-eye-slash'); - e.target.title = 'Hide lines'; - e.target.setAttribute('aria-label', e.target.title); - - block.classList.remove('hide-boring'); - } else if (e.target.classList.contains('fa-eye-slash')) { - e.target.classList.remove('fa-eye-slash'); - e.target.classList.add('fa-eye'); - e.target.title = 'Show hidden lines'; - e.target.setAttribute('aria-label', e.target.title); - - block.classList.add('hide-boring'); - } - }); - }); - - if (window.playground_copyable) { - Array.from(document.querySelectorAll('pre code')).forEach(function(block) { - const pre_block = block.parentNode; - if (!pre_block.classList.contains('playground')) { - let buttons = pre_block.querySelector('.buttons'); - if (!buttons) { - buttons = document.createElement('div'); - buttons.className = 'buttons'; - pre_block.insertBefore(buttons, pre_block.firstChild); - } - - const clipButton = document.createElement('button'); - clipButton.className = 'clip-button'; - clipButton.title = 'Copy to clipboard'; - clipButton.setAttribute('aria-label', clipButton.title); - clipButton.innerHTML = ''; - - buttons.insertBefore(clipButton, buttons.firstChild); - } - }); - } - - // Process playground code blocks - Array.from(document.querySelectorAll('.playground')).forEach(function(pre_block) { - // Add play button - let buttons = pre_block.querySelector('.buttons'); - if (!buttons) { - buttons = document.createElement('div'); - buttons.className = 'buttons'; - pre_block.insertBefore(buttons, pre_block.firstChild); - } - - const runCodeButton = document.createElement('button'); - runCodeButton.className = 'fa fa-play play-button'; - runCodeButton.hidden = true; - runCodeButton.title = 'Run this code'; - runCodeButton.setAttribute('aria-label', runCodeButton.title); - - buttons.insertBefore(runCodeButton, buttons.firstChild); - runCodeButton.addEventListener('click', () => { - run_rust_code(pre_block); - }); - - if (window.playground_copyable) { - const copyCodeClipboardButton = document.createElement('button'); - copyCodeClipboardButton.className = 'clip-button'; - copyCodeClipboardButton.innerHTML = ''; - copyCodeClipboardButton.title = 'Copy to clipboard'; - copyCodeClipboardButton.setAttribute('aria-label', copyCodeClipboardButton.title); - - buttons.insertBefore(copyCodeClipboardButton, buttons.firstChild); - } - - const code_block = pre_block.querySelector('code'); - if (window.ace && code_block.classList.contains('editable')) { - const undoChangesButton = document.createElement('button'); - undoChangesButton.className = 'fa fa-history reset-button'; - undoChangesButton.title = 'Undo changes'; - undoChangesButton.setAttribute('aria-label', undoChangesButton.title); - - buttons.insertBefore(undoChangesButton, buttons.firstChild); - - undoChangesButton.addEventListener('click', function() { - const editor = window.ace.edit(code_block); - editor.setValue(editor.originalCode); - editor.clearSelection(); - }); - } - }); -})(); - -(function themes() { - const html = document.querySelector('html'); - const themeToggleButton = document.getElementById('theme-toggle'); - const themePopup = document.getElementById('theme-list'); - const themeColorMetaTag = document.querySelector('meta[name="theme-color"]'); - const themeIds = []; - themePopup.querySelectorAll('button.theme').forEach(function(el) { - themeIds.push(el.id); - }); - const stylesheets = { - ayuHighlight: document.querySelector('#ayu-highlight-css'), - tomorrowNight: document.querySelector('#tomorrow-night-css'), - highlight: document.querySelector('#highlight-css'), - }; - - function showThemes() { - themePopup.style.display = 'block'; - themeToggleButton.setAttribute('aria-expanded', true); - themePopup.querySelector('button#' + get_theme()).focus(); - } - - function updateThemeSelected() { - themePopup.querySelectorAll('.theme-selected').forEach(function(el) { - el.classList.remove('theme-selected'); - }); - const selected = get_saved_theme() ?? 'default_theme'; - let element = themePopup.querySelector('button#' + selected); - if (element === null) { - // Fall back in case there is no "Default" item. - element = themePopup.querySelector('button#' + get_theme()); - } - element.classList.add('theme-selected'); - } - - function hideThemes() { - themePopup.style.display = 'none'; - themeToggleButton.setAttribute('aria-expanded', false); - themeToggleButton.focus(); - } - - function get_saved_theme() { - let theme = null; - try { - theme = localStorage.getItem('mdbook-theme'); - } catch (e) { - // ignore error. - } - return theme; - } - - function delete_saved_theme() { - localStorage.removeItem('mdbook-theme'); - } - - function get_theme() { - const theme = get_saved_theme(); - if (theme === null || theme === undefined || !themeIds.includes(theme)) { - if (typeof default_dark_theme === 'undefined') { - // A customized index.hbs might not define this, so fall back to - // old behavior of determining the default on page load. - return default_theme; - } - return window.matchMedia('(prefers-color-scheme: dark)').matches - ? default_dark_theme - : default_light_theme; - } else { - return theme; - } - } - - let previousTheme = default_theme; - function set_theme(theme, store = true) { - let ace_theme; - - if (theme === 'coal' || theme === 'navy') { - stylesheets.ayuHighlight.disabled = true; - stylesheets.tomorrowNight.disabled = false; - stylesheets.highlight.disabled = true; - - ace_theme = 'ace/theme/tomorrow_night'; - } else if (theme === 'ayu') { - stylesheets.ayuHighlight.disabled = false; - stylesheets.tomorrowNight.disabled = true; - stylesheets.highlight.disabled = true; - ace_theme = 'ace/theme/tomorrow_night'; - } else { - stylesheets.ayuHighlight.disabled = true; - stylesheets.tomorrowNight.disabled = true; - stylesheets.highlight.disabled = false; - ace_theme = 'ace/theme/dawn'; - } - - setTimeout(function() { - themeColorMetaTag.content = getComputedStyle(document.documentElement).backgroundColor; - }, 1); - - if (window.ace && window.editors) { - window.editors.forEach(function(editor) { - editor.setTheme(ace_theme); - }); - } - - if (store) { - try { - localStorage.setItem('mdbook-theme', theme); - } catch (e) { - // ignore error. - } - } - - html.classList.remove(previousTheme); - html.classList.add(theme); - previousTheme = theme; - updateThemeSelected(); - } - - const query = window.matchMedia('(prefers-color-scheme: dark)'); - query.onchange = function() { - set_theme(get_theme(), false); - }; - - // Set theme. - set_theme(get_theme(), false); - - themeToggleButton.addEventListener('click', function() { - if (themePopup.style.display === 'block') { - hideThemes(); - } else { - showThemes(); - } - }); - - themePopup.addEventListener('click', function(e) { - let theme; - if (e.target.className === 'theme') { - theme = e.target.id; - } else if (e.target.parentElement.className === 'theme') { - theme = e.target.parentElement.id; - } else { - return; - } - if (theme === 'default_theme' || theme === null) { - delete_saved_theme(); - set_theme(get_theme(), false); - } else { - set_theme(theme); - } - }); - - themePopup.addEventListener('focusout', function(e) { - // e.relatedTarget is null in Safari and Firefox on macOS (see workaround below) - if (!!e.relatedTarget && - !themeToggleButton.contains(e.relatedTarget) && - !themePopup.contains(e.relatedTarget) - ) { - hideThemes(); - } - }); - - // Should not be needed, but it works around an issue on macOS & iOS: - // https://github.com/rust-lang/mdBook/issues/628 - document.addEventListener('click', function(e) { - if (themePopup.style.display === 'block' && - !themeToggleButton.contains(e.target) && - !themePopup.contains(e.target) - ) { - hideThemes(); - } - }); - - document.addEventListener('keydown', function(e) { - if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) { - return; - } - if (!themePopup.contains(e.target)) { - return; - } - - let li; - switch (e.key) { - case 'Escape': - e.preventDefault(); - hideThemes(); - break; - case 'ArrowUp': - e.preventDefault(); - li = document.activeElement.parentElement; - if (li && li.previousElementSibling) { - li.previousElementSibling.querySelector('button').focus(); - } - break; - case 'ArrowDown': - e.preventDefault(); - li = document.activeElement.parentElement; - if (li && li.nextElementSibling) { - li.nextElementSibling.querySelector('button').focus(); - } - break; - case 'Home': - e.preventDefault(); - themePopup.querySelector('li:first-child button').focus(); - break; - case 'End': - e.preventDefault(); - themePopup.querySelector('li:last-child button').focus(); - break; - } - }); -})(); - -(function sidebar() { - const body = document.querySelector('body'); - const sidebar = document.getElementById('sidebar'); - const sidebarLinks = document.querySelectorAll('#sidebar a'); - const sidebarToggleButton = document.getElementById('sidebar-toggle'); - const sidebarToggleAnchor = document.getElementById('sidebar-toggle-anchor'); - const sidebarResizeHandle = document.getElementById('sidebar-resize-handle'); - let firstContact = null; - - function showSidebar() { - body.classList.remove('sidebar-hidden'); - body.classList.add('sidebar-visible'); - Array.from(sidebarLinks).forEach(function(link) { - link.setAttribute('tabIndex', 0); - }); - sidebarToggleButton.setAttribute('aria-expanded', true); - sidebar.setAttribute('aria-hidden', false); - try { - localStorage.setItem('mdbook-sidebar', 'visible'); - } catch (e) { - // Ignore error. - } - } - - function hideSidebar() { - body.classList.remove('sidebar-visible'); - body.classList.add('sidebar-hidden'); - Array.from(sidebarLinks).forEach(function(link) { - link.setAttribute('tabIndex', -1); - }); - sidebarToggleButton.setAttribute('aria-expanded', false); - sidebar.setAttribute('aria-hidden', true); - try { - localStorage.setItem('mdbook-sidebar', 'hidden'); - } catch (e) { - // Ignore error. - } - } - - // Toggle sidebar - sidebarToggleAnchor.addEventListener('change', function sidebarToggle() { - if (sidebarToggleAnchor.checked) { - const current_width = parseInt( - document.documentElement.style.getPropertyValue('--sidebar-target-width'), 10); - if (current_width < 150) { - document.documentElement.style.setProperty('--sidebar-target-width', '150px'); - } - showSidebar(); - } else { - hideSidebar(); - } - }); - - sidebarResizeHandle.addEventListener('mousedown', initResize, false); - - function initResize() { - window.addEventListener('mousemove', resize, false); - window.addEventListener('mouseup', stopResize, false); - body.classList.add('sidebar-resizing'); - } - function resize(e) { - let pos = e.clientX - sidebar.offsetLeft; - if (pos < 20) { - hideSidebar(); - } else { - if (body.classList.contains('sidebar-hidden')) { - showSidebar(); - } - pos = Math.min(pos, window.innerWidth - 100); - document.documentElement.style.setProperty('--sidebar-target-width', pos + 'px'); - } - } - //on mouseup remove windows functions mousemove & mouseup - function stopResize() { - body.classList.remove('sidebar-resizing'); - window.removeEventListener('mousemove', resize, false); - window.removeEventListener('mouseup', stopResize, false); - } - - document.addEventListener('touchstart', function(e) { - firstContact = { - x: e.touches[0].clientX, - time: Date.now(), - }; - }, { passive: true }); - - document.addEventListener('touchmove', function(e) { - if (!firstContact) { - return; - } - - const curX = e.touches[0].clientX; - const xDiff = curX - firstContact.x, - tDiff = Date.now() - firstContact.time; - - if (tDiff < 250 && Math.abs(xDiff) >= 150) { - if (xDiff >= 0 && firstContact.x < Math.min(document.body.clientWidth * 0.25, 300)) { - showSidebar(); - } else if (xDiff < 0 && curX < 300) { - hideSidebar(); - } - - firstContact = null; - } - }, { passive: true }); -})(); - -(function chapterNavigation() { - document.addEventListener('keydown', function(e) { - if (e.altKey || e.ctrlKey || e.metaKey) { - return; - } - if (window.search && window.search.hasFocus()) { - return; - } - const html = document.querySelector('html'); - - function next() { - const nextButton = document.querySelector('.nav-chapters.next'); - if (nextButton) { - window.location.href = nextButton.href; - } - } - function prev() { - const previousButton = document.querySelector('.nav-chapters.previous'); - if (previousButton) { - window.location.href = previousButton.href; - } - } - function showHelp() { - const container = document.getElementById('mdbook-help-container'); - const overlay = document.getElementById('mdbook-help-popup'); - container.style.display = 'flex'; - - // Clicking outside the popup will dismiss it. - const mouseHandler = event => { - if (overlay.contains(event.target)) { - return; - } - if (event.button !== 0) { - return; - } - event.preventDefault(); - event.stopPropagation(); - document.removeEventListener('mousedown', mouseHandler); - hideHelp(); - }; - - // Pressing esc will dismiss the popup. - const escapeKeyHandler = event => { - if (event.key === 'Escape') { - event.preventDefault(); - event.stopPropagation(); - document.removeEventListener('keydown', escapeKeyHandler, true); - hideHelp(); - } - }; - document.addEventListener('keydown', escapeKeyHandler, true); - document.getElementById('mdbook-help-container') - .addEventListener('mousedown', mouseHandler); - } - function hideHelp() { - document.getElementById('mdbook-help-container').style.display = 'none'; - } - - // Usually needs the Shift key to be pressed - switch (e.key) { - case '?': - e.preventDefault(); - showHelp(); - break; - } - - // Rest of the keys are only active when the Shift key is not pressed - if (e.shiftKey) { - return; - } - - switch (e.key) { - case 'ArrowRight': - e.preventDefault(); - if (html.dir === 'rtl') { - prev(); - } else { - next(); - } - break; - case 'ArrowLeft': - e.preventDefault(); - if (html.dir === 'rtl') { - next(); - } else { - prev(); - } - break; - } - }); -})(); - -(function clipboard() { - const clipButtons = document.querySelectorAll('.clip-button'); - - function hideTooltip(elem) { - elem.firstChild.innerText = ''; - elem.className = 'clip-button'; - } - - function showTooltip(elem, msg) { - elem.firstChild.innerText = msg; - elem.className = 'clip-button tooltipped'; - } - - const clipboardSnippets = new ClipboardJS('.clip-button', { - text: function(trigger) { - hideTooltip(trigger); - const playground = trigger.closest('pre'); - return playground_text(playground, false); - }, - }); - - Array.from(clipButtons).forEach(function(clipButton) { - clipButton.addEventListener('mouseout', function(e) { - hideTooltip(e.currentTarget); - }); - }); - - clipboardSnippets.on('success', function(e) { - e.clearSelection(); - showTooltip(e.trigger, 'Copied!'); - }); - - clipboardSnippets.on('error', function(e) { - showTooltip(e.trigger, 'Clipboard error!'); - }); -})(); - -(function scrollToTop() { - const menuTitle = document.querySelector('.menu-title'); - - menuTitle.addEventListener('click', function() { - document.scrollingElement.scrollTo({ top: 0, behavior: 'smooth' }); - }); -})(); - -(function controllMenu() { - const menu = document.getElementById('menu-bar'); - - (function controllPosition() { - let scrollTop = document.scrollingElement.scrollTop; - let prevScrollTop = scrollTop; - const minMenuY = -menu.clientHeight - 50; - // When the script loads, the page can be at any scroll (e.g. if you reforesh it). - menu.style.top = scrollTop + 'px'; - // Same as parseInt(menu.style.top.slice(0, -2), but faster - let topCache = menu.style.top.slice(0, -2); - menu.classList.remove('sticky'); - let stickyCache = false; // Same as menu.classList.contains('sticky'), but faster - document.addEventListener('scroll', function() { - scrollTop = Math.max(document.scrollingElement.scrollTop, 0); - // `null` means that it doesn't need to be updated - let nextSticky = null; - let nextTop = null; - const scrollDown = scrollTop > prevScrollTop; - const menuPosAbsoluteY = topCache - scrollTop; - if (scrollDown) { - nextSticky = false; - if (menuPosAbsoluteY > 0) { - nextTop = prevScrollTop; - } - } else { - if (menuPosAbsoluteY > 0) { - nextSticky = true; - } else if (menuPosAbsoluteY < minMenuY) { - nextTop = prevScrollTop + minMenuY; - } - } - if (nextSticky === true && stickyCache === false) { - menu.classList.add('sticky'); - stickyCache = true; - } else if (nextSticky === false && stickyCache === true) { - menu.classList.remove('sticky'); - stickyCache = false; - } - if (nextTop !== null) { - menu.style.top = nextTop + 'px'; - topCache = nextTop; - } - prevScrollTop = scrollTop; - }, { passive: true }); - })(); - (function controllBorder() { - function updateBorder() { - if (menu.offsetTop === 0) { - menu.classList.remove('bordered'); - } else { - menu.classList.add('bordered'); - } - } - updateBorder(); - document.addEventListener('scroll', updateBorder, { passive: true }); - })(); -})(); diff --git a/tutorial/theme/css/chrome.css b/tutorial/theme/css/chrome.css deleted file mode 100644 index 360a653..0000000 --- a/tutorial/theme/css/chrome.css +++ /dev/null @@ -1,701 +0,0 @@ -/* CSS for UI elements (a.k.a. chrome) */ - -html { - scrollbar-color: var(--scrollbar) var(--bg); -} -#searchresults a, -.content a:link, -a:visited, -a > .hljs { - color: var(--links); -} - -/* - body-container is necessary because mobile browsers don't seem to like - overflow-x on the body tag when there is a tag. -*/ -#body-container { - /* - This is used when the sidebar pushes the body content off the side of - the screen on small screens. Without it, dragging on mobile Safari - will want to reposition the viewport in a weird way. - */ - overflow-x: clip; -} - -/* Menu Bar */ - -#menu-bar, -#menu-bar-hover-placeholder { - z-index: 101; - margin: auto calc(0px - var(--page-padding)); -} -#menu-bar { - position: relative; - display: flex; - flex-wrap: wrap; - background-color: var(--bg); - border-block-end-color: var(--bg); - border-block-end-width: 1px; - border-block-end-style: solid; -} -#menu-bar.sticky, -#menu-bar-hover-placeholder:hover + #menu-bar, -#menu-bar:hover, -html.sidebar-visible #menu-bar { - position: -webkit-sticky; - position: sticky; - top: 0 !important; -} -#menu-bar-hover-placeholder { - position: sticky; - position: -webkit-sticky; - top: 0; - height: var(--menu-bar-height); -} -#menu-bar.bordered { - border-block-end-color: var(--table-border-color); -} -#menu-bar i, #menu-bar .icon-button { - position: relative; - padding: 0 8px; - z-index: 10; - line-height: var(--menu-bar-height); - cursor: pointer; - transition: color 0.5s; -} -@media only screen and (max-width: 420px) { - #menu-bar i, #menu-bar .icon-button { - padding: 0 5px; - } -} - -.icon-button { - border: none; - background: none; - padding: 0; - color: inherit; -} -.icon-button i { - margin: 0; -} - -.right-buttons { - margin: 0 15px; -} -.right-buttons a { - text-decoration: none; -} - -.left-buttons { - display: flex; - margin: 0 5px; -} -html:not(.js) .left-buttons button { - display: none; -} - -.menu-title { - display: inline-block; - font-weight: 200; - font-size: 2.4rem; - line-height: var(--menu-bar-height); - text-align: center; - margin: 0; - flex: 1; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} -.menu-title { - cursor: pointer; -} - -.menu-bar, -.menu-bar:visited, -.nav-chapters, -.nav-chapters:visited, -.mobile-nav-chapters, -.mobile-nav-chapters:visited, -.menu-bar .icon-button, -.menu-bar a i { - color: var(--icons); -} - -.menu-bar i:hover, -.menu-bar .icon-button:hover, -.nav-chapters:hover, -.mobile-nav-chapters i:hover { - color: var(--icons-hover); -} - -/* Nav Icons */ - -.nav-chapters { - font-size: 2.5em; - text-align: center; - text-decoration: none; - - position: fixed; - top: 0; - bottom: 0; - margin: 0; - max-width: 150px; - min-width: 90px; - - display: flex; - justify-content: center; - align-content: center; - flex-direction: column; - - transition: color 0.5s, background-color 0.5s; -} - -.nav-chapters:hover { - text-decoration: none; - background-color: var(--theme-hover); - transition: background-color 0.15s, color 0.15s; -} - -.nav-wrapper { - margin-block-start: 50px; - display: none; -} - -.mobile-nav-chapters { - font-size: 2.5em; - text-align: center; - text-decoration: none; - width: 90px; - border-radius: 5px; - background-color: var(--sidebar-bg); -} - -/* Only Firefox supports flow-relative values */ -.previous { float: left; } -[dir=rtl] .previous { float: right; } - -/* Only Firefox supports flow-relative values */ -.next { - float: right; - right: var(--page-padding); -} -[dir=rtl] .next { - float: left; - right: unset; - left: var(--page-padding); -} - -/* Use the correct buttons for RTL layouts*/ -[dir=rtl] .previous i.fa-angle-left:before {content:"\f105";} -[dir=rtl] .next i.fa-angle-right:before { content:"\f104"; } - -@media only screen and (max-width: 1080px) { - .nav-wide-wrapper { display: none; } - .nav-wrapper { display: block; } -} - -/* sidebar-visible */ -@media only screen and (max-width: 1380px) { - #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wide-wrapper { display: none; } - #sidebar-toggle-anchor:checked ~ .page-wrapper .nav-wrapper { display: block; } -} - -/* Inline code */ - -:not(pre) > .hljs { - display: inline; - padding: 0.1em 0.3em; - border-radius: 3px; -} - -:not(pre):not(a) > .hljs { - color: var(--inline-code-color); - overflow-x: initial; -} - -a:hover > .hljs { - text-decoration: underline; -} - -pre { - position: relative; -} -pre > .buttons { - position: absolute; - z-index: 100; - right: 0px; - top: 2px; - margin: 0px; - padding: 2px 0px; - - color: var(--sidebar-fg); - cursor: pointer; - visibility: hidden; - opacity: 0; - transition: visibility 0.1s linear, opacity 0.1s linear; -} -pre:hover > .buttons { - visibility: visible; - opacity: 1 -} -pre > .buttons :hover { - color: var(--sidebar-active); - border-color: var(--icons-hover); - background-color: var(--theme-hover); -} -pre > .buttons i { - margin-inline-start: 8px; -} -pre > .buttons button { - cursor: inherit; - margin: 0px 5px; - padding: 4px 4px 3px 5px; - font-size: 23px; - - border-style: solid; - border-width: 1px; - border-radius: 4px; - border-color: var(--icons); - background-color: var(--theme-popup-bg); - transition: 100ms; - transition-property: color,border-color,background-color; - color: var(--icons); -} - -pre > .buttons button.clip-button { - padding: 2px 4px 0px 6px; -} -pre > .buttons button.clip-button::before { - /* clipboard image from octicons (https://github.com/primer/octicons/tree/v2.0.0) MIT license - */ - content: url('data:image/svg+xml,'); - filter: var(--copy-button-filter); -} -pre > .buttons button.clip-button:hover::before { - filter: var(--copy-button-filter-hover); -} - -@media (pointer: coarse) { - pre > .buttons button { - /* On mobile, make it easier to tap buttons. */ - padding: 0.3rem 1rem; - } - - .sidebar-resize-indicator { - /* Hide resize indicator on devices with limited accuracy */ - display: none; - } -} -pre > code { - display: block; - padding: 1rem; -} - -/* FIXME: ACE editors overlap their buttons because ACE does absolute - positioning within the code block which breaks padding. The only solution I - can think of is to move the padding to the outer pre tag (or insert a div - wrapper), but that would require fixing a whole bunch of CSS rules. -*/ -.hljs.ace_editor { - padding: 0rem 0rem; -} - -pre > .result { - margin-block-start: 10px; -} - -/* Search */ - -#searchresults a { - text-decoration: none; -} - -mark { - border-radius: 2px; - padding-block-start: 0; - padding-block-end: 1px; - padding-inline-start: 3px; - padding-inline-end: 3px; - margin-block-start: 0; - margin-block-end: -1px; - margin-inline-start: -3px; - margin-inline-end: -3px; - background-color: var(--search-mark-bg); - transition: background-color 300ms linear; - cursor: pointer; -} - -mark.fade-out { - background-color: rgba(0,0,0,0) !important; - cursor: auto; -} - -.searchbar-outer { - margin-inline-start: auto; - margin-inline-end: auto; - max-width: var(--content-max-width); -} - -#searchbar { - width: 100%; - margin-block-start: 5px; - margin-block-end: 0; - margin-inline-start: auto; - margin-inline-end: auto; - padding: 10px 16px; - transition: box-shadow 300ms ease-in-out; - border: 1px solid var(--searchbar-border-color); - border-radius: 3px; - background-color: var(--searchbar-bg); - color: var(--searchbar-fg); -} -#searchbar:focus, -#searchbar.active { - box-shadow: 0 0 3px var(--searchbar-shadow-color); -} - -.searchresults-header { - font-weight: bold; - font-size: 1em; - padding-block-start: 18px; - padding-block-end: 0; - padding-inline-start: 5px; - padding-inline-end: 0; - color: var(--searchresults-header-fg); -} - -.searchresults-outer { - margin-inline-start: auto; - margin-inline-end: auto; - max-width: var(--content-max-width); - border-block-end: 1px dashed var(--searchresults-border-color); -} - -ul#searchresults { - list-style: none; - padding-inline-start: 20px; -} -ul#searchresults li { - margin: 10px 0px; - padding: 2px; - border-radius: 2px; -} -ul#searchresults li.focus { - background-color: var(--searchresults-li-bg); -} -ul#searchresults span.teaser { - display: block; - clear: both; - margin-block-start: 5px; - margin-block-end: 0; - margin-inline-start: 20px; - margin-inline-end: 0; - font-size: 0.8em; -} -ul#searchresults span.teaser em { - font-weight: bold; - font-style: normal; -} - -/* Sidebar */ - -.sidebar { - position: fixed; - left: 0; - top: 0; - bottom: 0; - width: var(--sidebar-width); - font-size: 0.875em; - box-sizing: border-box; - -webkit-overflow-scrolling: touch; - overscroll-behavior-y: contain; - background-color: var(--sidebar-bg); - color: var(--sidebar-fg); -} -.sidebar-iframe-inner { - --padding: 10px; - - background-color: var(--sidebar-bg); - padding: var(--padding); - margin: 0; - font-size: 1.4rem; - color: var(--sidebar-fg); - min-height: calc(100vh - var(--padding) * 2); -} -.sidebar-iframe-outer { - border: none; - height: 100%; - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; -} -[dir=rtl] .sidebar { left: unset; right: 0; } -.sidebar-resizing { - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; -} -html:not(.sidebar-resizing) .sidebar { - transition: transform 0.3s; /* Animation: slide away */ -} -.sidebar code { - line-height: 2em; -} -.sidebar .sidebar-scrollbox { - overflow-y: auto; - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - padding: 10px 10px; -} -.sidebar .sidebar-resize-handle { - position: absolute; - cursor: col-resize; - width: 0; - right: calc(var(--sidebar-resize-indicator-width) * -1); - top: 0; - bottom: 0; - display: flex; - align-items: center; -} - -.sidebar-resize-handle .sidebar-resize-indicator { - width: 100%; - height: 16px; - color: var(--icons); - margin-inline-start: var(--sidebar-resize-indicator-space); - display: flex; - align-items: center; - justify-content: flex-start; -} -.sidebar-resize-handle .sidebar-resize-indicator::before { - content: ""; - width: 2px; - height: 12px; - border-left: dotted 2px currentColor; -} -.sidebar-resize-handle .sidebar-resize-indicator::after { - content: ""; - width: 2px; - height: 16px; - border-left: dotted 2px currentColor; -} - -[dir=rtl] .sidebar .sidebar-resize-handle { - left: calc(var(--sidebar-resize-indicator-width) * -1); - right: unset; -} -.js .sidebar .sidebar-resize-handle { - cursor: col-resize; - width: calc(var(--sidebar-resize-indicator-width) - var(--sidebar-resize-indicator-space)); -} -/* sidebar-hidden */ -#sidebar-toggle-anchor:not(:checked) ~ .sidebar { - transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width))); - z-index: -1; -} -[dir=rtl] #sidebar-toggle-anchor:not(:checked) ~ .sidebar { - transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width))); -} -.sidebar::-webkit-scrollbar { - background: var(--sidebar-bg); -} -.sidebar::-webkit-scrollbar-thumb { - background: var(--scrollbar); -} - -/* sidebar-visible */ -#sidebar-toggle-anchor:checked ~ .page-wrapper { - transform: translateX(calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width))); -} -[dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper { - transform: translateX(calc(0px - var(--sidebar-width) - var(--sidebar-resize-indicator-width))); -} -@media only screen and (min-width: 620px) { - #sidebar-toggle-anchor:checked ~ .page-wrapper { - transform: none; - margin-inline-start: calc(var(--sidebar-width) + var(--sidebar-resize-indicator-width)); - } - [dir=rtl] #sidebar-toggle-anchor:checked ~ .page-wrapper { - transform: none; - } -} - -.chapter { - list-style: none outside none; - padding-inline-start: 0; - line-height: 2.2em; -} - -.chapter ol { - width: 100%; -} - -.chapter li { - display: flex; - color: var(--sidebar-non-existant); -} -.chapter li a { - display: block; - padding: 0; - text-decoration: none; - color: var(--sidebar-fg); -} - -.chapter li a:hover { - color: var(--sidebar-active); -} - -.chapter li a.active { - color: var(--sidebar-active); -} - -.chapter li > a.toggle { - cursor: pointer; - display: block; - margin-inline-start: auto; - padding: 0 10px; - user-select: none; - opacity: 0.68; -} - -.chapter li > a.toggle div { - transition: transform 0.5s; -} - -/* collapse the section */ -.chapter li:not(.expanded) + li > ol { - display: none; -} - -.chapter li.chapter-item { - line-height: 1.5em; - margin-block-start: 0.6em; -} - -.chapter li.expanded > a.toggle div { - transform: rotate(90deg); -} - -.spacer { - width: 100%; - height: 3px; - margin: 5px 0px; -} -.chapter .spacer { - background-color: var(--sidebar-spacer); -} - -@media (-moz-touch-enabled: 1), (pointer: coarse) { - .chapter li a { padding: 5px 0; } - .spacer { margin: 10px 0; } -} - -.section { - list-style: none outside none; - padding-inline-start: 20px; - line-height: 1.9em; -} - -/* Theme Menu Popup */ - -.theme-popup { - position: absolute; - left: 10px; - top: var(--menu-bar-height); - z-index: 1000; - border-radius: 4px; - font-size: 0.7em; - color: var(--fg); - background: var(--theme-popup-bg); - border: 1px solid var(--theme-popup-border); - margin: 0; - padding: 0; - list-style: none; - display: none; - /* Don't let the children's background extend past the rounded corners. */ - overflow: hidden; -} -[dir=rtl] .theme-popup { left: unset; right: 10px; } -.theme-popup .default { - color: var(--icons); -} -.theme-popup .theme { - width: 100%; - border: 0; - margin: 0; - padding: 2px 20px; - line-height: 25px; - white-space: nowrap; - text-align: start; - cursor: pointer; - color: inherit; - background: inherit; - font-size: inherit; -} -.theme-popup .theme:hover { - background-color: var(--theme-hover); -} - -.theme-selected::before { - display: inline-block; - content: "✓"; - margin-inline-start: -14px; - width: 14px; -} - -/* The container for the help popup that covers the whole window. */ -#mdbook-help-container { - /* Position and size for the whole window. */ - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - /* This uses flex layout (which is set in book.js), and centers the popup - in the window.*/ - display: none; - align-items: center; - justify-content: center; - z-index: 1000; - /* Dim out the book while the popup is visible. */ - background: var(--overlay-bg); -} - -/* The popup help box. */ -#mdbook-help-popup { - box-shadow: 0 4px 24px rgba(0,0,0,0.15); - min-width: 300px; - max-width: 500px; - width: 100%; - box-sizing: border-box; - display: flex; - flex-direction: column; - align-items: center; - background-color: var(--bg); - color: var(--fg); - border-width: 1px; - border-color: var(--theme-popup-border); - border-style: solid; - border-radius: 8px; - padding: 10px; -} - -.mdbook-help-title { - text-align: center; - /* mdbook's margin for h2 is way too large. */ - margin: 10px; -} diff --git a/tutorial/theme/css/general.css b/tutorial/theme/css/general.css deleted file mode 100644 index cd8903b..0000000 --- a/tutorial/theme/css/general.css +++ /dev/null @@ -1,371 +0,0 @@ -/* Base styles and content styles */ - -:root { - /* Browser default font-size is 16px, this way 1 rem = 10px */ - font-size: 62.5%; - color-scheme: var(--color-scheme); -} - -html { - font-family: "Open Sans", sans-serif; - color: var(--fg); - background-color: var(--bg); - text-size-adjust: none; - -webkit-text-size-adjust: none; -} - -body { - margin: 0; - font-size: 1.6rem; - overflow-x: hidden; -} - -code { - font-family: var(--mono-font) !important; - font-size: var(--code-font-size); - direction: ltr !important; -} - -/* make long words/inline code not x overflow */ -main { - overflow-wrap: break-word; -} - -/* make wide tables scroll if they overflow */ -.table-wrapper { - overflow-x: auto; -} - -/* Don't change font size in headers. */ -h1 code, -h2 code, -h3 code, -h4 code, -h5 code, -h6 code { - font-size: unset; -} - -.left { - float: left; -} - -.right { - float: right; -} - -.boring { - opacity: 0.6; -} - -.hide-boring .boring { - display: none; -} - -.hidden { - display: none !important; -} - -h2, -h3 { - margin-block-start: 2.5em; -} - -h4, -h5 { - margin-block-start: 2em; -} - -.header+.header h3, -.header+.header h4, -.header+.header h5 { - margin-block-start: 1em; -} - -h1:target::before, -h2:target::before, -h3:target::before, -h4:target::before, -h5:target::before, -h6:target::before { - display: inline-block; - content: "»"; - margin-inline-start: -30px; - width: 30px; -} - -/* This is broken on Safari as of version 14, but is fixed - in Safari Technology Preview 117 which I think will be Safari 14.2. - https://bugs.webkit.org/show_bug.cgi?id=218076 -*/ -:target { - /* Safari does not support logical properties */ - scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); -} - -.page { - outline: 0; - padding: 0 var(--page-padding); - margin-block-start: calc(0px - var(--menu-bar-height)); - /* Compensate for the #menu-bar-hover-placeholder */ -} - -.page-wrapper { - box-sizing: border-box; - background-color: var(--bg); -} - -.no-js .page-wrapper, -.js:not(.sidebar-resizing) .page-wrapper { - transition: margin-left 0.3s ease, transform 0.3s ease; - /* Animation: slide away */ -} - -[dir=rtl] .js:not(.sidebar-resizing) .page-wrapper { - transition: margin-right 0.3s ease, transform 0.3s ease; - /* Animation: slide away */ -} - -.content { - overflow-y: auto; - padding: 0 5px 50px 5px; -} - -.content main { - margin-inline-start: auto; - margin-inline-end: auto; - max-width: var(--content-max-width); -} - -.content p { - line-height: 1.45em; -} - -.content ol { - line-height: 1.45em; -} - -.content ul { - line-height: 1.45em; -} - -.content a { - text-decoration: none; -} - -.content a:hover { - text-decoration: underline; -} - -.content img, -.content video { - max-width: 100%; -} - -.content .header:link, -.content .header:visited { - color: var(--fg); -} - -.content .header:link, -.content .header:visited:hover { - text-decoration: none; -} - -table { - margin: 0 auto; - border-collapse: collapse; -} - -table td { - padding: 3px 20px; - border: 1px var(--table-border-color) solid; -} - -table thead { - background: var(--table-header-bg); -} - -table thead td { - font-weight: 700; - border: none; -} - -table thead th { - padding: 3px 20px; -} - -table thead tr { - border: 1px var(--table-header-bg) solid; -} - -/* Alternate background colors for rows */ -table tbody tr:nth-child(2n) { - background: var(--table-alternate-bg); -} - - -blockquote { - margin: 20px 0; - padding: 0 20px; - color: var(--fg); - background-color: var(--quote-bg); - border-block-start: .1em solid var(--quote-border); - border-block-end: .1em solid var(--quote-border); -} - -.warning { - margin: 20px; - padding: 0 20px; - border-inline-start: 2px solid var(--warning-border); -} - -.warning:before { - position: absolute; - width: 3rem; - height: 3rem; - margin-inline-start: calc(-1.5rem - 21px); - content: "ⓘ"; - text-align: center; - background-color: var(--bg); - color: var(--warning-border); - font-weight: bold; - font-size: 2rem; -} - -blockquote .warning:before { - background-color: var(--quote-bg); -} - -.note { - margin: 20px; - padding: 0 20px; - border-inline-start: 2px solid var(--note-border); -} - -.note:before { - position: absolute; - width: 3rem; - height: 3rem; - margin-inline-start: calc(-1.5rem - 21px); - content: "ⓘ"; - text-align: center; - background-color: var(--bg); - color: var(--note-border); - font-weight: bold; - font-size: 2rem; -} - -blockquote .note:before { - background-color: var(--quote-bg); -} - -kbd { - background-color: var(--table-border-color); - border-radius: 4px; - border: solid 1px var(--theme-popup-border); - box-shadow: inset 0 -1px 0 var(--theme-hover); - display: inline-block; - font-size: var(--code-font-size); - font-family: var(--mono-font); - line-height: 10px; - padding: 4px 5px; - vertical-align: middle; -} - -sup { - /* Set the line-height for superscript and footnote references so that there - isn't an awkward space appearing above lines that contain the footnote. - - See https://github.com/rust-lang/mdBook/pull/2443#discussion_r1813773583 - for an explanation. - */ - line-height: 0; -} - -.footnote-definition { - font-size: 0.9em; -} - -/* The default spacing for a list is a little too large. */ -.footnote-definition ul, -.footnote-definition ol { - padding-left: 20px; -} - -.footnote-definition>li { - /* Required to position the ::before target */ - position: relative; -} - -.footnote-definition>li:target { - scroll-margin-top: 50vh; -} - -.footnote-reference:target { - scroll-margin-top: 50vh; -} - -/* Draws a border around the footnote (including the marker) when it is selected. - TODO: If there are multiple linkbacks, highlight which one you just came - from so you know which one to click. -*/ -.footnote-definition>li:target::before { - border: 2px solid var(--footnote-highlight); - border-radius: 6px; - position: absolute; - top: -8px; - right: -8px; - bottom: -8px; - left: -32px; - pointer-events: none; - content: ""; -} - -/* Pulses the footnote reference so you can quickly see where you left off reading. - This could use some improvement. -*/ -@media not (prefers-reduced-motion) { - .footnote-reference:target { - animation: fn-highlight 0.8s; - border-radius: 2px; - } - - @keyframes fn-highlight { - from { - background-color: var(--footnote-highlight); - } - } -} - -.tooltiptext { - position: absolute; - visibility: hidden; - color: #fff; - background-color: #333; - transform: translateX(-50%); - /* Center by moving tooltip 50% of its width left */ - left: -8px; - /* Half of the width of the icon */ - top: -35px; - font-size: 0.8em; - text-align: center; - border-radius: 6px; - padding: 5px 8px; - margin: 5px; - z-index: 1000; -} - -.tooltipped .tooltiptext { - visibility: visible; -} - -.chapter li.part-title { - color: var(--sidebar-fg); - margin: 5px 0px; - font-weight: bold; -} - -.result-no-output { - font-style: italic; -} \ No newline at end of file diff --git a/tutorial/theme/css/print.css b/tutorial/theme/css/print.css deleted file mode 100644 index 80ec3a5..0000000 --- a/tutorial/theme/css/print.css +++ /dev/null @@ -1,50 +0,0 @@ - -#sidebar, -#menu-bar, -.nav-chapters, -.mobile-nav-chapters { - display: none; -} - -#page-wrapper.page-wrapper { - transform: none !important; - margin-inline-start: 0px; - overflow-y: initial; -} - -#content { - max-width: none; - margin: 0; - padding: 0; -} - -.page { - overflow-y: initial; -} - -code { - direction: ltr !important; -} - -pre > .buttons { - z-index: 2; -} - -a, a:visited, a:active, a:hover { - color: #4183c4; - text-decoration: none; -} - -h1, h2, h3, h4, h5, h6 { - page-break-inside: avoid; - page-break-after: avoid; -} - -pre, code { - page-break-inside: avoid; - white-space: pre-wrap; -} - -.fa { - display: none !important; -} diff --git a/tutorial/theme/css/variables.css b/tutorial/theme/css/variables.css deleted file mode 100644 index 3cef8a7..0000000 --- a/tutorial/theme/css/variables.css +++ /dev/null @@ -1,337 +0,0 @@ -/* Globals */ - -:root { - --sidebar-target-width: 300px; - --sidebar-width: min(var(--sidebar-target-width), 80vw); - --sidebar-resize-indicator-width: 8px; - --sidebar-resize-indicator-space: 2px; - --page-padding: 15px; - --content-max-width: 750px; - --menu-bar-height: 50px; - --mono-font: "Source Code Pro", Consolas, "Ubuntu Mono", Menlo, "DejaVu Sans Mono", monospace, monospace; - --code-font-size: 0.875em; - /* please adjust the ace font size accordingly in editor.js */ -} - -/* Themes */ - -.ayu { - --bg: hsl(210, 25%, 8%); - --fg: #c5c5c5; - - --sidebar-bg: #14191f; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #5c6773; - --sidebar-active: #ffb454; - --sidebar-spacer: #2d334f; - - --scrollbar: var(--sidebar-fg); - - --icons: #737480; - --icons-hover: #b7b9cc; - - --links: #0096cf; - - --inline-code-color: #ffb454; - - --theme-popup-bg: #14191f; - --theme-popup-border: #5c6773; - --theme-hover: #191f26; - - --quote-bg: hsl(226, 15%, 17%); - --quote-border: hsl(226, 15%, 22%); - - --warning-border: #ff8e00; - --note-border: #a6ff00; - - --table-border-color: hsl(210, 25%, 13%); - --table-header-bg: hsl(210, 25%, 28%); - --table-alternate-bg: hsl(210, 25%, 11%); - - --searchbar-border-color: #848484; - --searchbar-bg: #424242; - --searchbar-fg: #fff; - --searchbar-shadow-color: #d4c89f; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #252932; - --search-mark-bg: #e3b171; - - --color-scheme: dark; - - /* Same as `--icons` */ - --copy-button-filter: invert(45%) sepia(6%) saturate(621%) hue-rotate(198deg) brightness(99%) contrast(85%); - /* Same as `--sidebar-active` */ - --copy-button-filter-hover: invert(68%) sepia(55%) saturate(531%) hue-rotate(341deg) brightness(104%) contrast(101%); - - --footnote-highlight: #2668a6; - - --overlay-bg: rgba(33, 40, 48, 0.4); -} - -.coal { - --bg: hsl(200, 7%, 8%); - --fg: #98a3ad; - - --sidebar-bg: #292c2f; - --sidebar-fg: #a1adb8; - --sidebar-non-existant: #505254; - --sidebar-active: #3473ad; - --sidebar-spacer: #393939; - - --scrollbar: var(--sidebar-fg); - - --icons: #43484d; - --icons-hover: #b3c0cc; - - --links: #2b79a2; - - --inline-code-color: #c5c8c6; - - --theme-popup-bg: #141617; - --theme-popup-border: #43484d; - --theme-hover: #1f2124; - - --quote-bg: hsl(234, 21%, 18%); - --quote-border: hsl(234, 21%, 23%); - - --warning-border: #ff8e00; - --note-border: #a6ff00; - - --table-border-color: hsl(200, 7%, 13%); - --table-header-bg: hsl(200, 7%, 28%); - --table-alternate-bg: hsl(200, 7%, 11%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #b7b7b7; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #98a3ad; - --searchresults-li-bg: #2b2b2f; - --search-mark-bg: #355c7d; - - --color-scheme: dark; - - /* Same as `--icons` */ - --copy-button-filter: invert(26%) sepia(8%) saturate(575%) hue-rotate(169deg) brightness(87%) contrast(82%); - /* Same as `--sidebar-active` */ - --copy-button-filter-hover: invert(36%) sepia(70%) saturate(503%) hue-rotate(167deg) brightness(98%) contrast(89%); - - --footnote-highlight: #4079ae; - - --overlay-bg: rgba(33, 40, 48, 0.4); -} - -.light, -html:not(.js) { - --bg: hsl(0, 0%, 100%); - --fg: hsl(0, 0%, 0%); - - --sidebar-bg: #fafafa; - --sidebar-fg: hsl(0, 0%, 0%); - --sidebar-non-existant: #aaaaaa; - --sidebar-active: #1f1fff; - --sidebar-spacer: #f4f4f4; - - --scrollbar: #8F8F8F; - - --icons: #747474; - --icons-hover: #000000; - - --links: #20609f; - - --inline-code-color: #301900; - - --theme-popup-bg: #fafafa; - --theme-popup-border: #cccccc; - --theme-hover: #e6e6e6; - - --quote-bg: hsl(197, 37%, 96%); - --quote-border: hsl(197, 37%, 91%); - - --warning-border: #ff8e00; - --note-border: #a6ff00; - - --table-border-color: hsl(0, 0%, 95%); - --table-header-bg: hsl(0, 0%, 80%); - --table-alternate-bg: hsl(0, 0%, 97%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #fafafa; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #e4f2fe; - --search-mark-bg: #a2cff5; - - --color-scheme: light; - - /* Same as `--icons` */ - --copy-button-filter: invert(45.49%); - /* Same as `--sidebar-active` */ - --copy-button-filter-hover: invert(14%) sepia(93%) saturate(4250%) hue-rotate(243deg) brightness(99%) contrast(130%); - - --footnote-highlight: #7e7eff; - - --overlay-bg: rgba(200, 200, 205, 0.4); -} - -.navy { - --bg: hsl(226, 23%, 11%); - --fg: #bcbdd0; - - --sidebar-bg: #282d3f; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #505274; - --sidebar-active: #2b79a2; - --sidebar-spacer: #2d334f; - - --scrollbar: var(--sidebar-fg); - - --icons: #737480; - --icons-hover: #b7b9cc; - - --links: #2b79a2; - - --inline-code-color: #c5c8c6; - - --theme-popup-bg: #161923; - --theme-popup-border: #737480; - --theme-hover: #282e40; - - --quote-bg: hsl(226, 15%, 17%); - --quote-border: hsl(226, 15%, 22%); - - --warning-border: #ff8e00; - --note-border: #a6ff00; - - --table-border-color: hsl(226, 23%, 16%); - --table-header-bg: hsl(226, 23%, 31%); - --table-alternate-bg: hsl(226, 23%, 14%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #aeaec6; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #5f5f71; - --searchresults-border-color: #5c5c68; - --searchresults-li-bg: #242430; - --search-mark-bg: #a2cff5; - - --color-scheme: dark; - - /* Same as `--icons` */ - --copy-button-filter: invert(51%) sepia(10%) saturate(393%) hue-rotate(198deg) brightness(86%) contrast(87%); - /* Same as `--sidebar-active` */ - --copy-button-filter-hover: invert(46%) sepia(20%) saturate(1537%) hue-rotate(156deg) brightness(85%) contrast(90%); - - --footnote-highlight: #4079ae; - - --overlay-bg: rgba(33, 40, 48, 0.4); -} - -.rust { - --bg: hsl(60, 9%, 87%); - --fg: #262625; - - --sidebar-bg: #3b2e2a; - --sidebar-fg: #c8c9db; - --sidebar-non-existant: #505254; - --sidebar-active: #e69f67; - --sidebar-spacer: #45373a; - - --scrollbar: var(--sidebar-fg); - - --icons: #737480; - --icons-hover: #262625; - - --links: #2b79a2; - - --inline-code-color: #6e6b5e; - - --theme-popup-bg: #e1e1db; - --theme-popup-border: #b38f6b; - --theme-hover: #99908a; - - --quote-bg: hsl(60, 5%, 75%); - --quote-border: hsl(60, 5%, 70%); - - --warning-border: #ff8e00; - --note-border: #a6ff00; - - --table-border-color: hsl(60, 9%, 82%); - --table-header-bg: #b3a497; - --table-alternate-bg: hsl(60, 9%, 84%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #fafafa; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #888; - --searchresults-li-bg: #dec2a2; - --search-mark-bg: #e69f67; - - /* Same as `--icons` */ - --copy-button-filter: invert(51%) sepia(10%) saturate(393%) hue-rotate(198deg) brightness(86%) contrast(87%); - /* Same as `--sidebar-active` */ - --copy-button-filter-hover: invert(77%) sepia(16%) saturate(1798%) hue-rotate(328deg) brightness(98%) contrast(83%); - - --footnote-highlight: #d3a17a; - - --overlay-bg: rgba(150, 150, 150, 0.25); -} - -@media (prefers-color-scheme: dark) { - html:not(.js) { - --bg: hsl(200, 7%, 8%); - --fg: #98a3ad; - - --sidebar-bg: #292c2f; - --sidebar-fg: #a1adb8; - --sidebar-non-existant: #505254; - --sidebar-active: #3473ad; - --sidebar-spacer: #393939; - - --scrollbar: var(--sidebar-fg); - - --icons: #43484d; - --icons-hover: #b3c0cc; - - --links: #2b79a2; - - --inline-code-color: #c5c8c6; - - --theme-popup-bg: #141617; - --theme-popup-border: #43484d; - --theme-hover: #1f2124; - - --quote-bg: hsl(234, 21%, 18%); - --quote-border: hsl(234, 21%, 23%); - - --warning-border: #ff8e00; - --note-border: #a6ff00; - - --table-border-color: hsl(200, 7%, 13%); - --table-header-bg: hsl(200, 7%, 28%); - --table-alternate-bg: hsl(200, 7%, 11%); - - --searchbar-border-color: #aaa; - --searchbar-bg: #b7b7b7; - --searchbar-fg: #000; - --searchbar-shadow-color: #aaa; - --searchresults-header-fg: #666; - --searchresults-border-color: #98a3ad; - --searchresults-li-bg: #2b2b2f; - --search-mark-bg: #355c7d; - - --color-scheme: dark; - - /* Same as `--icons` */ - --copy-button-filter: invert(26%) sepia(8%) saturate(575%) hue-rotate(169deg) brightness(87%) contrast(82%); - /* Same as `--sidebar-active` */ - --copy-button-filter-hover: invert(36%) sepia(70%) saturate(503%) hue-rotate(167deg) brightness(98%) contrast(89%); - } -} diff --git a/tutorial/theme/favicon.png b/tutorial/theme/favicon.png deleted file mode 100644 index a5b1aa1..0000000 Binary files a/tutorial/theme/favicon.png and /dev/null differ diff --git a/tutorial/theme/favicon.svg b/tutorial/theme/favicon.svg deleted file mode 100644 index 90e0ea5..0000000 --- a/tutorial/theme/favicon.svg +++ /dev/null @@ -1,22 +0,0 @@ - - diff --git a/tutorial/theme/fonts/OPEN-SANS-LICENSE.txt b/tutorial/theme/fonts/OPEN-SANS-LICENSE.txt deleted file mode 100644 index d645695..0000000 --- a/tutorial/theme/fonts/OPEN-SANS-LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/tutorial/theme/fonts/SOURCE-CODE-PRO-LICENSE.txt b/tutorial/theme/fonts/SOURCE-CODE-PRO-LICENSE.txt deleted file mode 100644 index 366206f..0000000 --- a/tutorial/theme/fonts/SOURCE-CODE-PRO-LICENSE.txt +++ /dev/null @@ -1,93 +0,0 @@ -Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/tutorial/theme/fonts/fonts.css b/tutorial/theme/fonts/fonts.css deleted file mode 100644 index a6b12b3..0000000 --- a/tutorial/theme/fonts/fonts.css +++ /dev/null @@ -1,100 +0,0 @@ -/* Open Sans is licensed under the Apache License, Version 2.0. See http://www.apache.org/licenses/LICENSE-2.0 */ -/* Source Code Pro is under the Open Font License. See https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL */ - -/* open-sans-300 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 300; - src: local('Open Sans Light'), local('OpenSans-Light'), - url('{{ resource "fonts/open-sans-v17-all-charsets-300.woff2" }}') format('woff2'); -} - -/* open-sans-300italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 300; - src: local('Open Sans Light Italic'), local('OpenSans-LightItalic'), - url('{{ resource "fonts/open-sans-v17-all-charsets-300italic.woff2" }}') format('woff2'); -} - -/* open-sans-regular - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - src: local('Open Sans Regular'), local('OpenSans-Regular'), - url('{{ resource "fonts/open-sans-v17-all-charsets-regular.woff2" }}') format('woff2'); -} - -/* open-sans-italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 400; - src: local('Open Sans Italic'), local('OpenSans-Italic'), - url('{{ resource "fonts/open-sans-v17-all-charsets-italic.woff2" }}') format('woff2'); -} - -/* open-sans-600 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - src: local('Open Sans SemiBold'), local('OpenSans-SemiBold'), - url('{{ resource "fonts/open-sans-v17-all-charsets-600.woff2" }}') format('woff2'); -} - -/* open-sans-600italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 600; - src: local('Open Sans SemiBold Italic'), local('OpenSans-SemiBoldItalic'), - url('{{ resource "fonts/open-sans-v17-all-charsets-600italic.woff2" }}') format('woff2'); -} - -/* open-sans-700 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 700; - src: local('Open Sans Bold'), local('OpenSans-Bold'), - url('{{ resource "fonts/open-sans-v17-all-charsets-700.woff2" }}') format('woff2'); -} - -/* open-sans-700italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 700; - src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'), - url('{{ resource "fonts/open-sans-v17-all-charsets-700italic.woff2" }}') format('woff2'); -} - -/* open-sans-800 - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 800; - src: local('Open Sans ExtraBold'), local('OpenSans-ExtraBold'), - url('{{ resource "fonts/open-sans-v17-all-charsets-800.woff2" }}') format('woff2'); -} - -/* open-sans-800italic - latin_vietnamese_latin-ext_greek-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 800; - src: local('Open Sans ExtraBold Italic'), local('OpenSans-ExtraBoldItalic'), - url('{{ resource "fonts/open-sans-v17-all-charsets-800italic.woff2" }}') format('woff2'); -} - -/* source-code-pro-500 - latin_vietnamese_latin-ext_greek_cyrillic-ext_cyrillic */ -@font-face { - font-family: 'Source Code Pro'; - font-style: normal; - font-weight: 500; - src: url('{{ resource "fonts/source-code-pro-v11-all-charsets-500.woff2" }}') format('woff2'); -} diff --git a/tutorial/theme/fonts/open-sans-v17-all-charsets-300.woff2 b/tutorial/theme/fonts/open-sans-v17-all-charsets-300.woff2 deleted file mode 100644 index 9f51be3..0000000 Binary files a/tutorial/theme/fonts/open-sans-v17-all-charsets-300.woff2 and /dev/null differ diff --git a/tutorial/theme/fonts/open-sans-v17-all-charsets-300italic.woff2 b/tutorial/theme/fonts/open-sans-v17-all-charsets-300italic.woff2 deleted file mode 100644 index 2f54544..0000000 Binary files a/tutorial/theme/fonts/open-sans-v17-all-charsets-300italic.woff2 and /dev/null differ diff --git a/tutorial/theme/fonts/open-sans-v17-all-charsets-600.woff2 b/tutorial/theme/fonts/open-sans-v17-all-charsets-600.woff2 deleted file mode 100644 index f503d55..0000000 Binary files a/tutorial/theme/fonts/open-sans-v17-all-charsets-600.woff2 and /dev/null differ diff --git a/tutorial/theme/fonts/open-sans-v17-all-charsets-600italic.woff2 b/tutorial/theme/fonts/open-sans-v17-all-charsets-600italic.woff2 deleted file mode 100644 index c99aabe..0000000 Binary files a/tutorial/theme/fonts/open-sans-v17-all-charsets-600italic.woff2 and /dev/null differ diff --git a/tutorial/theme/fonts/open-sans-v17-all-charsets-700.woff2 b/tutorial/theme/fonts/open-sans-v17-all-charsets-700.woff2 deleted file mode 100644 index 421a1ab..0000000 Binary files a/tutorial/theme/fonts/open-sans-v17-all-charsets-700.woff2 and /dev/null differ diff --git a/tutorial/theme/fonts/open-sans-v17-all-charsets-700italic.woff2 b/tutorial/theme/fonts/open-sans-v17-all-charsets-700italic.woff2 deleted file mode 100644 index 12ce3d2..0000000 Binary files a/tutorial/theme/fonts/open-sans-v17-all-charsets-700italic.woff2 and /dev/null differ diff --git a/tutorial/theme/fonts/open-sans-v17-all-charsets-800.woff2 b/tutorial/theme/fonts/open-sans-v17-all-charsets-800.woff2 deleted file mode 100644 index c94a223..0000000 Binary files a/tutorial/theme/fonts/open-sans-v17-all-charsets-800.woff2 and /dev/null differ diff --git a/tutorial/theme/fonts/open-sans-v17-all-charsets-800italic.woff2 b/tutorial/theme/fonts/open-sans-v17-all-charsets-800italic.woff2 deleted file mode 100644 index eed7d3c..0000000 Binary files a/tutorial/theme/fonts/open-sans-v17-all-charsets-800italic.woff2 and /dev/null differ diff --git a/tutorial/theme/fonts/open-sans-v17-all-charsets-italic.woff2 b/tutorial/theme/fonts/open-sans-v17-all-charsets-italic.woff2 deleted file mode 100644 index 398b68a..0000000 Binary files a/tutorial/theme/fonts/open-sans-v17-all-charsets-italic.woff2 and /dev/null differ diff --git a/tutorial/theme/fonts/open-sans-v17-all-charsets-regular.woff2 b/tutorial/theme/fonts/open-sans-v17-all-charsets-regular.woff2 deleted file mode 100644 index 8383e94..0000000 Binary files a/tutorial/theme/fonts/open-sans-v17-all-charsets-regular.woff2 and /dev/null differ diff --git a/tutorial/theme/fonts/source-code-pro-v11-all-charsets-500.woff2 b/tutorial/theme/fonts/source-code-pro-v11-all-charsets-500.woff2 deleted file mode 100644 index 7222456..0000000 Binary files a/tutorial/theme/fonts/source-code-pro-v11-all-charsets-500.woff2 and /dev/null differ diff --git a/tutorial/theme/highlight.css b/tutorial/theme/highlight.css deleted file mode 100644 index 352c79b..0000000 --- a/tutorial/theme/highlight.css +++ /dev/null @@ -1,83 +0,0 @@ -/* - * An increased contrast highlighting scheme loosely based on the - * "Base16 Atelier Dune Light" theme by Bram de Haan - * (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/dune) - * Original Base16 color scheme by Chris Kempson - * (https://github.com/chriskempson/base16) - */ - -/* Comment */ -.hljs-comment, -.hljs-quote { - color: #575757; -} - -/* Red */ -.hljs-variable, -.hljs-template-variable, -.hljs-attribute, -.hljs-attr, -.hljs-tag, -.hljs-name, -.hljs-regexp, -.hljs-link, -.hljs-name, -.hljs-selector-id, -.hljs-selector-class { - color: #d70025; -} - -/* Orange */ -.hljs-number, -.hljs-meta, -.hljs-built_in, -.hljs-builtin-name, -.hljs-literal, -.hljs-type, -.hljs-params { - color: #b21e00; -} - -/* Green */ -.hljs-string, -.hljs-symbol, -.hljs-bullet { - color: #008200; -} - -/* Blue */ -.hljs-title, -.hljs-section { - color: #0030f2; -} - -/* Purple */ -.hljs-keyword, -.hljs-selector-tag { - color: #9d00ec; -} - -.hljs { - display: block; - overflow-x: auto; - background: #f6f7f6; - color: #000; -} - -.hljs-emphasis { - font-style: italic; -} - -.hljs-strong { - font-weight: bold; -} - -.hljs-addition { - color: #22863a; - background-color: #f0fff4; -} - -.hljs-deletion { - color: #b31d28; - background-color: #ffeef0; -} diff --git a/tutorial/theme/highlight.js b/tutorial/theme/highlight.js deleted file mode 100644 index 27e7be7..0000000 --- a/tutorial/theme/highlight.js +++ /dev/null @@ -1,54 +0,0 @@ -/* - Highlight.js 10.1.1 (93fd0d73) - License: BSD-3-Clause - Copyright (c) 2006-2020, Ivan Sagalaev -*/ -var hljs=function(){"use strict";function e(n){Object.freeze(n);var t="function"==typeof n;return Object.getOwnPropertyNames(n).forEach((function(r){!Object.hasOwnProperty.call(n,r)||null===n[r]||"object"!=typeof n[r]&&"function"!=typeof n[r]||t&&("caller"===r||"callee"===r||"arguments"===r)||Object.isFrozen(n[r])||e(n[r])})),n}class n{constructor(e){void 0===e.data&&(e.data={}),this.data=e.data}ignoreMatch(){this.ignore=!0}}function t(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function r(e,...n){var t={};for(const n in e)t[n]=e[n];return n.forEach((function(e){for(const n in e)t[n]=e[n]})),t}function a(e){return e.nodeName.toLowerCase()}var i=Object.freeze({__proto__:null,escapeHTML:t,inherit:r,nodeStream:function(e){var n=[];return function e(t,r){for(var i=t.firstChild;i;i=i.nextSibling)3===i.nodeType?r+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:r,node:i}),r=e(i,r),a(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:i}));return r}(e,0),n},mergeStreams:function(e,n,r){var i=0,s="",o=[];function l(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offsetPress ← or → to navigate between chapters
- {{#if search_enabled}} -Press S or / to search in the book
- {{/if}} -Press ? to show this help
-Press Esc to hide this help
-