diff --git a/404.html b/404.html new file mode 100644 index 000000000..7ee932a69 --- /dev/null +++ b/404.html @@ -0,0 +1 @@ +~/tabi • 404
404
not found

The page you requested doesn't seem to exist or has not been translated to your language yet. Check the URL for errors, or return to the homepage.

La pàgina que has sol·licitat sembla que no existeix o encara no s'ha traduït al teu idioma. Comprova l'URL per detectar errors o torna a la pàgina d'inici.

La página que has solicitado parece no existir o aún no se ha traducido a tu idioma. Revisa la URL en busca de errores o regresa a la página de inicio.

\ No newline at end of file diff --git a/archive/index.html b/archive/index.html new file mode 100644 index 000000000..c9c187674 --- /dev/null +++ b/archive/index.html @@ -0,0 +1 @@ +~/tabi • Archive
Archive
\ No newline at end of file diff --git a/atom.xml b/atom.xml new file mode 100644 index 000000000..21fc32080 --- /dev/null +++ b/atom.xml @@ -0,0 +1,112 @@ + + + + + + This is a web feed + also known as an Atom feed + Subscribe + by copying the URL from the address bar into your newsreader + Visit + to learn more and get started + It's free + website + Recent posts + + + ~/tabi + tabi is a fast, lightweight, and modern Zola theme with multi-language support, optional JavaScript, and a perfect Lighthouse score. + + + Zola + 2023-09-08T00:00:00+00:00 + https://welpo.github.io/tabi/atom.xml + + Customise tabi with skins and a default theme + 2023-08-09T00:00:00+00:00 + 2023-08-10T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/customise-tabi/ + Learn how to customise tabi using skins and setting a default theme, making your site uniquely yours. + + + Add comments to your posts with these 4 comment systems + 2023-07-14T00:00:00+00:00 + 2023-07-26T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/comments/ + Discover how to enable a comments section on your posts using giscus, utterances, Hyvor Talk, or Isso, enabling reader interaction and feedback. + + + Optimise loading times with a custom font subset + 2023-04-29T00:00:00+00:00 + 2023-07-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/custom-font-subset/ + Learn how to create a custom subset that only includes the necessary glyphs. + + + Secure by default + 2023-02-22T00:00:00+00:00 + 2023-07-17T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/security/ + tabi has an easily customizable Content Security Policy (CSP) with safe defaults. Get peace of mind and an A+ on Mozilla Observatory. + + + Custom shortcodes + 2023-02-19T00:00:00+00:00 + 2023-08-26T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/shortcodes/ + This theme includes some useful custom shortcodes that you can use to enhance your posts. Whether you want to display images that adapt to light and dark themes, or format a professional-looking reference section, these custom shortcodes have got you covered. + + + Markdown examples + 2023-01-31T00:00:00+00:00 + 2023-09-01T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/markdown/ + This post showcases some examples of Markdown formatting, including a table, code blocks and tags, quotes, tables, and footnotes. + + + No mandatory JavaScript + 2023-01-06T00:00:00+00:00 + 2023-09-01T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/javascript/ + JavaScript is only used when HTML and CSS aren't enough. + + + Table of Contents + 2022-11-01T00:00:00+00:00 + 2023-09-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/toc/ + A post showcasing the optional Table of Contents and its options. + + diff --git a/blog/comments/index.html b/blog/comments/index.html new file mode 100644 index 000000000..6d0f384a3 --- /dev/null +++ b/blog/comments/index.html @@ -0,0 +1,54 @@ +~/tabi • Add comments to your posts with these 4 comment systems
Add comments to your posts with these 4 comment systems

tabi currently supports four comment systems: giscus, utterances, Hyvor Talk, and Isso.

giscus and utterances are open-source projects that let you add a comments section to your website using GitHub issues (utterances) or discussions (giscus). They are perfect for static site generators like Zola, since they enable your readers to interact and leave comments on your posts without requiring a traditional backend or database.

As they are based on GitHub, giscus and utterances require users to have a GitHub account and authorize the respective app. Alternatively, visitors can also comment directly on the corresponding GitHub discussion or issue.

Both are great tools for adding comments to your blog, but giscus has a few advantages:

  • More themes.
  • Support for reactions.
  • Comment replies and conversation view.
  • Safer: utterances requires enabling unsafe inline styles to set the height of the frame; giscus doesn't.
  • Multilanguage support: utterances is only available in English; giscus supports over 20 languages.
  • More active development: giscus' last commit, as of this post, was a two days ago. utterances' last commit was over a year ago.

Hyvor Talk is a paid privacy-focused commenting platform. It offers all of the giscus' advantages, and a few more, like moderation and spam detection.

Isso is an open-source self-hosted commenting system that stores comments in its own database. One of its main advantages is privacy; it does not share user data with third parties. It also has a lightweight and clean interface, making it easy for your visitors to leave comments. Isso also allows anonymous comments, potentially increasing user engagement on your website.

Setup

GitHub based systems

The configuration of both giscus and utterances is quite similar. First, visit the website of the system you want to enable: giscus.app or utteranc.es.

Follow the instructions on the Configuration section of the website, and set it up it to your liking. Then, set the values shown on the Enable giscus/utterances section (the script codeblock) on the proper section of your config.toml: [extra.giscus] or [extra.utterances].

giscus

giscus has a few more settings than utterances:

[extra.giscus]
+enabled_for_all_posts = false
+automatic_loading = true
+repo = "yourGithubUsername/yourRepo"
+repo_id = "YourRepoID"
+category = "Announcements"
+category_id = "YourCategoryID"
+mapping = "slug"
+strict_title_matching = 1  # 1 to enable, 0 to disable.
+enable_reactions = 1  # 1 to enable, 0 to disable.
+comment_box_above_comments = true
+light_theme = "noborder_light"
+dark_theme = "noborder_dark"
+lang = ""  # Leave blank to match the page's language.
+lazy_loading = true
+

utterances

[extra.utterances]
+enabled_for_all_posts = false
+automatic_loading = true
+repo = "yourgithubuser/yourrepo"
+issue_term = "slug"
+label = "💬"
+light_theme = "github-light"
+dark_theme = "photon-dark"
+lazy_loading = true
+

Hyvor Talk

Set up your website from the Hyvor Talk console and fill in the settings in config.toml:

[extra.hyvortalk]
+enabled_for_all_posts = false
+automatic_loading = true
+website_id = "1234"
+page_id_is_slug = true
+lang = ""
+page_author = ""  # Email (or base64 encoded email) of the author.
+lazy_loading = true
+

Isso

To enable Isso, you'll first need to install and run an Isso server (here's a useful guide). Then, complete these settings in config.toml:

[extra.isso]
+enabled_for_all_posts = false
+automatic_loading = true
+endpoint_url = "https://example.com/comments/"  # URL to Isso host.
+page_id_is_slug = true
+lang = ""
+max_comments_top = "inf"
+max_comments_nested = "5"
+avatar = true
+voting = true
+page_author_hashes = ""
+lazy_loading = true
+

Common settings

Setting enabled_for_all_posts = true for a comment system will enable it globally.

Alternatively, enable comments on an individual post's front matter by adding the name of the system (utterances, giscus, hyvortalk, or isso) = true. For example, this is how you would enable giscus:

title = "Bears, Beets, Battlestar Galactica: The Dwight Schrute Guide to Life"
+date = 2007-04-26
+description = "Lessons learned from beet farming and paper sales."
+
+[taxonomies]
+tags = ["personal", "beets"]
+
+[extra]
+giscus = true
+

If you accidentally enable more than one system, your site will fail to build with an error.

If your site has multiple languages with matching posts (like this demo), and you'd like to share comments between languages, you must use issue_term = "slug" (for giscus and utterances) or page_id_is_slug = true (for Hyvor Talk or Isso). This will use the name of the Markdown file (sans the language tag) as the identifier. All other options will create different comment sections for each language.

Live example

Below you'll find the giscus widget using the settings shown above.

\ No newline at end of file diff --git a/blog/custom-font-subset/index.html b/blog/custom-font-subset/index.html new file mode 100644 index 000000000..aabc771f0 --- /dev/null +++ b/blog/custom-font-subset/index.html @@ -0,0 +1,117 @@ +~/tabi • Optimise loading times with a custom font subset
Optimise loading times with a custom font subset

The problem

Custom fonts cause flashing text in Firefox. For a gif and more details, see this issue.

The solution

To fix this, tabi loads a subset of glyphs for the header. Since this (slightly) increases the initial load time, it's a good idea to try and minimise the size of this subset.

By default, there are subset files for English and Spanish characters (with a few symbols). These files are loaded when the Zola page/site is set to that language.

For further optimisation, you can create a custom font subset that only includes the characters used in your header.

Requirements

Install these tools:

Run pip install fonttools brotli to install both.

The script

The script below takes a config.toml file and a font file as input, extracts the necessary characters, creates a subset of the font, and generates a CSS file containing the base64 encoded subset.

#!/usr/bin/env bash
+
+usage() {
+    echo "Usage: $0 [--config | -c CONFIG_FILE] [--font | -f FONT_FILE] [--output | -o OUTPUT_PATH]"
+    echo
+    echo "Options:"
+    echo "  --config, -c   Path to the config.toml file."
+    echo "  --font, -f     Path to the font file."
+    echo "  --output, -o   Output path for the generated subset.css file (default: current directory)"
+    echo "  --help, -h     Show this help message and exit"
+}
+
+# Default output is current directory.
+output_path="."
+
+# Parse command line options
+while [ "$#" -gt 0 ]; do
+    case "$1" in
+        --config|-c)
+            config_file="$2"
+            shift 2
+            ;;
+        --font|-f)
+            font_file="$2"
+            shift 2
+            ;;
+        --output|-o)
+            output_path="$2"
+            shift 2
+            ;;
+        --help|-h)
+            usage
+            exit 0
+            ;;
+        *)
+            echo "Unknown option: $1"
+            usage
+            exit 1
+            ;;
+    esac
+done
+
+# Check if -c and -f options are provided
+if [ -z "$config_file" ]; then
+    echo "Error: --config|-c option is required."
+    usage
+    exit 1
+fi
+
+if [ -z "$font_file" ]; then
+    echo "Error: --font|-f option is required."
+    usage
+    exit 1
+fi
+
+# Check if config and font files exist.
+if [ ! -f "$config_file" ]; then
+    echo "Error: Config file '$config_file' not found."
+    exit 1
+fi
+
+if [ ! -f "$font_file" ]; then
+    echo "Error: Font file '$font_file' not found."
+    exit 1
+fi
+
+# Extract the title and menu names from the config file.
+title=$(awk -F' = ' '/^title/{print $2}' "$config_file" | tr -d '"')
+menu_names=$(awk -F' = ' '/^menu/{f=1;next} /socials/{f=0} f && /name/{print $2}' "$config_file" | cut -d',' -f1 | tr -d '"' )
+language_names=$(awk -F' = ' '/^language_name\./{print $2}' "$config_file" | tr -d '"' )
+
+# If the site is multilingual, get the menu translations.
+if [ -n "$language_names" ]; then
+    for menu_name in $menu_names; do
+        # Find the line with the menu name inside a [languages.*.translations] section and get the translated menus.
+        menu_translation=$(awk -F' = ' "/\\[languages.*\\.translations\\]/{f=1;next} /^\\[/ {f=0} f && /$menu_name =/{print \$2}" "$config_file" | tr -d '"' )
+        # Add the found menu value to the translations string
+        menu_names+="$menu_translation"
+    done
+fi
+
+# Combine the extracted strings.
+combined="$title$menu_names$language_names"
+
+# Get unique characters.
+unique_chars=$(echo "$combined" | grep -o . | sort -u | tr -d '\n')
+
+# Create a temporary file for subset.woff2.
+temp_subset=$(mktemp)
+
+# Create the subset.
+pyftsubset "$font_file" \
+    --text="$unique_chars" \
+    --layout-features="*" --flavor="woff2" --output-file="$temp_subset" --with-zopfli
+
+# Remove trailing slash from output path, if present.
+output_path=${output_path%/}
+
+# Base64 encode the temporary subset.woff2 file and create the CSS file.
+base64_encoded_font=$(base64 -i "$temp_subset")
+echo "@font-face{font-family:\"Inter Subset\";src:url(data:application/font-woff2;base64,$base64_encoded_font);}" > "$output_path/custom_subset.css"
+
+# Remove the temporary subset.woff2 file.
+rm "$temp_subset"
+

Usage

Save the script somewhere like ~/bin/subset_font. Make it executable with chmod +x ~/bin/subset_font.

Now you can run it with the required --config and --font options:

~/bin/subset_font --config path/to/config.toml --font path/to/font.woff2
+

By default, this generates a custom_subset.css file in the current directory. Use -o or --output to specify a different path:

~/bin/subset_font -c path/to/config.toml -f path/to/font.woff2 -o path/to/output
+

You should place this custom_subset.css file inside the static/ directory.

Automating with Pre-commit Hook

You might change the title or menu options of your site, making the custom subset no longer useful.

To automate the process of creating this file, you can integrate the script into a Git pre-commit hook that checks for changes in the config.toml file, runs the script, and stores the resulting CSS file in the static/ directory of your site.

  1. Create a .git/hooks/pre-commit file in your Git project, if it doesn't already exist.

  2. Make it executable with chmod +x .git/hooks/pre-commit.

  3. Add the following code to the file:

# Check if config.toml has been modified.
+if git diff --cached --name-only | grep -q "config.toml"; then
+    echo "config.toml modified. Running subset_font…"
+
+    # Call the subset_font script.
+    ~/bin/subset_font -c config.toml -f static/fonts/Inter4.woff2 -o static/
+
+    # Add the generated subset.css file to the commit.
+    git add static/custom_subset.css
+fi
+

Make sure to modify the script to match the path where you stored the subset_font script. The config and font paths should work fine with tabi's default setup.

Now, every time you commit changes to your Git project, the pre-commit hook will check for modifications in the config.toml file and automatically run the subset_font script to update the custom_subset.css file.

By the way, if you're interested in a way to automatically update the date of your Zola posts or compress your PNG files, check out this post.

If you want to use all scripts at once (compressing PNG files, updating the date, and creating the font subset), combine their code into a single .git/hooks/pre-commit file.

\ No newline at end of file diff --git a/blog/customise-tabi/index.html b/blog/customise-tabi/index.html new file mode 100644 index 000000000..f6b668a7b --- /dev/null +++ b/blog/customise-tabi/index.html @@ -0,0 +1,13 @@ +~/tabi • Customise tabi with skins and a default theme
Customise tabi with skins and a default theme

tabi can be customised in two ways: by setting the default theme (dark or light) and by choosing the main colour for the theme (skins).

Default theme

To permanently set your site to either the dark or light theme, you need to disable the theme switcher in config.toml and set your preferred theme as the default_theme.

For example, to have a permanent dark theme:

[extra]
+theme_switcher = false
+default_theme = "dark"
+

If your theme switcher is enabled, the default_theme will only be used as fallback, in case a visitor has JavaScript disabled.

Skins

Not a fan of teal? No problem! tabi has 12 skins for you to choose from. If none of these work for you, you can create your own.

A skin is a CSS file with two variables: the primary colour for the light theme, and the primary colour for the dark theme.

Enabling a skin is as easy as setting the skin variable in your config.toml with the name of the skin. For example:

[extra]
+skin = "sakura"
+

Take a look below at the available skins below.

Click on the images to switch between dark and light themes.


Teal

The default skin. If the skin variable is unset (or set to "teal"), this is what tabi looks like:


Lavender

To apply, use skin = "lavender".


Red

Switch to this by setting skin = "red".


Mint

A skin designed by 🅿️.

Activate it with skin = "mint".


Sakura

Inspired by the Japanese cherry blossom season.

To enable this skin, adjust skin = "sakura".


Blue

For this appearance, set skin = "blue".


Indigo Ingot

Indigo for blue (in light theme) and ingot for gold (in dark theme).

To activate this skin, use skin = "indigo_ingot".


Evangelion

Inspired by the colours of Evangelion Unit-01 (in dark theme) and Unit-02 (in light theme).


Monochrome

To achieve this look, set skin = "monochrome".


Low contrast orange

WARNING! This skin's light theme may have low contrast, affecting accessibility and Lighthouse rating. (Dark theme is fine.)

To use, set skin = "lowcontrast_orange".


Low contrast peach

WARNING! This skin's light theme may have low contrast, affecting accessibility and Lighthouse rating. (Dark theme is fine.)

To enable it, specify skin = "lowcontrast_peach".


Low contrast pink

WARNING! This skin's light theme may have low contrast, affecting accessibility and Lighthouse rating. (Dark theme is fine.)

For this colourscheme, choose skin = "lowcontrast_pink".


Create your own skin

You're not just limited to predefined skins. Why not create a look that's distinctively tailored to your preferences?

You can save your new skin it in either of these two directories:

  1. Inside the theme's directory: themes/tabi/sass/skins
  2. Inside your main site's directory: sass/skins (you'll need to create this folder)

Create a new .scss file (for example, your_skin.scss) in your preferred location. This file needs to have these two variables (this is the default skin, "teal"):

:root {
+    --primary-color: #087e96;
+}
+
+[data-theme='dark'] {
+    --primary-color: #91e0ee;
+}
+

Modify the colours to your taste. Once you're satisfied, update the skin variable to match your filename.

Remember to consider the accessibility of the colours you choose. Here's a link that can help you: WebAIM: Contrast Checker. The background of the light theme is #fff, and the dark one is #1f1f1f.

\ No newline at end of file diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 000000000..6d1c7b184 --- /dev/null +++ b/blog/index.html @@ -0,0 +1 @@ +~/tabi • Blog
Blog
09 August 2023

Learn how to customise tabi using skins and setting a default theme, making your site uniquely yours.

Read more →
14 July 2023

Discover how to enable a comments section on your posts using giscus, utterances, Hyvor Talk, or Isso, enabling reader interaction and feedback.

Read more →
29 April 2023

Learn how to create a custom subset that only includes the necessary glyphs.

Read more →
22 February 2023

tabi has an easily customizable Content Security Policy (CSP) with safe defaults. Get peace of mind and an A+ on Mozilla Observatory.

Read more →
19 February 2023

This theme includes some useful custom shortcodes that you can use to enhance your posts. Whether you want to display images that adapt to light and dark themes, or format a professional-looking reference section, these custom shortcodes have got you covered.

Read more →
\ No newline at end of file diff --git a/blog/javascript/index.html b/blog/javascript/index.html new file mode 100644 index 000000000..81103c950 --- /dev/null +++ b/blog/javascript/index.html @@ -0,0 +1 @@ +~/tabi • No mandatory JavaScript
No mandatory JavaScript

This theme has no mandatory JavaScript. Optionally, it can load a minimal amount to add some features that are impossible to achieve with HTML and CSS.

Globally enabled settings

  • The light/dark mode switch can be enabled by setting theme_switcher = true in the [extra] section of your config.toml (~900 bytes of JavaScript).

  • E-mail decoding (~400 bytes). To protect against spambots scraping your e-mail from your website, you can set encode_plaintext_email = true. If your site is on a public repository, for extra protection, consider setting your email as a base64-encoded string1 directly.

Settings with hierarchical override capability

The following settings can be specified for posts, sections and globally, following the hierarchy of page > section > config.toml:

To specify these settings:

  • Globally: Add them under the [extra] section in your config.toml file.
  • For a section: Add them under the [extra] section in the front matter of the section's _index.md.
  • For an individual post: Set the corresponding variables in the [extra] section of the post's front matter.

Settings that can be enabled globally or for individual posts

  • Comments. giscus (2 KB), utterances (1 KB), Hyvor Talk (~800 bytes) or Isso (1KB) can be globally enabled by setting enabled_for_all_posts = true in the right section of your config.toml (i.e. [extra.giscus], [extra.utterances], [extra.hyvortalk] or [extra.isso]). To enable comments on individual posts, set the name of the system = true (e.g. hyvortalk = true) in the post's front matter.

Other than that, it's a fast theme with HTML and CSS which works with JavaScript disabled. Just the way (most of) the web should be :-)


1

To encode your email in base64 you can use online tools or, on your terminal, run: printf 'mail@example.com' | base64.

\ No newline at end of file diff --git a/blog/markdown/index.html b/blog/markdown/index.html new file mode 100644 index 000000000..e3dc094c0 --- /dev/null +++ b/blog/markdown/index.html @@ -0,0 +1,9 @@ +~/tabi • Markdown examples
Markdown examples

$\KaTeX$

$\KaTeX$ is a fast and easy-to-use library that enables the rendering of mathematical notation, using LaTeX syntax.

You can use $\KaTeX$ inline by wrapping the expression between $ or between \\( and \\).

For example, $ \sin(x) = \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n + 1)!} x^{2n + 1} $ would render: $ \sin(x) = \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n + 1)!} x^{2n + 1} $

To display the expression on its own line and centered, wrap it around $$ or between \\[ and \\].

For example, \\[ r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i - \bar{y})^2}} \\] renders: \[ r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i - \bar{y})^2}} \]

To activate $\KaTeX$ for a post or an entire section, include katex = true within the [extra] section of the front matter. For exemple:

title = "Testing KaTeX"
+date = 2002-11-30
+
+[extra]
+katex = true
+

You may enable it globally as well, by setting katex = true in the [extra] section of your config.toml.

For enhanced performance and security, the $\KaTeX$ JavaScript, CSS, and fonts are hosted locally.

Note: After enabling $\KaTeX$, if you want to use $ without rendering a mathematical expression, escape it with a single backslash: \$.

Table

Here's an example of a table1. Its colours change depending on the current theme.
SymbolElementAtomic Number
HHydrogen1
CCarbon6
FeIron26
AuGold79

Code Block

fn main() {
+    println!("Hello, world!") -> ();
+}
+

Code tags

In Rust, you declare a mutable variable with let mut x = 5;, whereas in Python, you simply use x = 5. Similarly, to print a value in Rust, you would use println!("Value: {}", x);, but in Python, it's as straightforward as print(f"Value: {x}").

Quote

"We're all hurtling towards death. Yet here we are, for the moment, alive. Each of us knowing we're going to die. Each of us secretly believing we won't."

— Charlie Kaufman, Synecdoche, New York


1

And here's an example of a footnote!

\ No newline at end of file diff --git a/blog/page/1/index.html b/blog/page/1/index.html new file mode 100644 index 000000000..95b1b167c --- /dev/null +++ b/blog/page/1/index.html @@ -0,0 +1 @@ +Redirect

Click here to be redirected. \ No newline at end of file diff --git a/blog/page/2/index.html b/blog/page/2/index.html new file mode 100644 index 000000000..77621f942 --- /dev/null +++ b/blog/page/2/index.html @@ -0,0 +1 @@ +~/tabi • Blog

Blog
31 January 2023

This post showcases some examples of Markdown formatting, including a table, code blocks and tags, quotes, tables, and footnotes.

Read more →
06 January 2023

JavaScript is only used when HTML and CSS aren't enough.

Read more →
01 November 2022

A post showcasing the optional Table of Contents and its options.

Read more →
\ No newline at end of file diff --git a/blog/security/index.html b/blog/security/index.html new file mode 100644 index 000000000..d1da0c849 --- /dev/null +++ b/blog/security/index.html @@ -0,0 +1,9 @@ +~/tabi • Secure by default
Secure by default

The default configuration of the theme gets an A+ score on Mozilla Observatory.1

This is accomplished by programatically configuring Content Security Policy (CSP) headers based on a user-defined list of allowed domains in the config.toml file. Here's the default and recommended setup (you could remove the last directive if you don't want to embed YouTube videos):

[extra]
+allowed_domains = [
+    { directive = "font-src", domains = ["'self'", "data:"] },
+    { directive = "img-src", domains = ["'self'", "https://*", "data:"] },
+    { directive = "script-src", domains = ["'self'"] },
+    { directive = "style-src", domains = ["'self'"] },
+    { directive = "frame-src", domains = ["https://www.youtube-nocookie.com"] },
+]
+

The allowed_domains list specifies the URLs that the website should be able to connect to, and each domain in the list is associated with a CSP directive such as frame-src, connect-src, or script-src. The templates/partials/header.html file dynamically generates the CSP header based on this list.

This feature allows you to easily customize the website's security headers to allow for specific use cases, such as embedding YouTube videos, loading scripts or remote fonts (not recommended).

Note: enabling comments automatically allows scripts and frames from the comment system, as well as unsafe-inline styles when using utterances or Hyvor Talk.

1

Requires proper webserver configuration (e.g. redirecting HTTP traffic to HTTPS).

\ No newline at end of file diff --git a/blog/shortcodes/index.html b/blog/shortcodes/index.html new file mode 100644 index 000000000..5a7dba29a --- /dev/null +++ b/blog/shortcodes/index.html @@ -0,0 +1,23 @@ +~/tabi • Custom shortcodes
Custom shortcodes

Image shortcodes

Note: all image shortcodes have two optional parameters: full_width, which defaults to false (see below), and lazy_loading, which defaults to true.

Dual theme images

Useful if you want to use a different image for the light and dark themes:

The Eiffel towerThe Eiffel tower

Usage

{{ dual_theme_image(light_src="img/paris_day.webp", dark_src="img/paris_night.webp" alt="The Eiffel tower") }}
+

Invertible image

Good for graphs, line drawings, diagrams… Inverts the colours of the image. The source image will be used for the light theme.

Invertible graph

Usage

{{ invertible_image(src="img/graph.webp", alt="Invertible graph") }}
+

Dimmable image

Images with too much brightness or contrast can be jarring against a dark background. Here's an example of a photograph that dims when the dark theme is active.

Photograph of a desert, heavenly sky

Usage

{{ dimmable_image(src="img/desert_by_oskerwyld.webp", alt="Photograph of a desert, heavenly sky") }}
+

Swap image on hover

Povides an interaction where the image displayed changes as the user hovers over it. Useful for before-after comparisons, for example.

Edited picture
Original shot

Usage

{{ image_hover(default_src="img/before.webp", hovered_src="img/after.webp", default_alt="Edited picture", hovered_alt="Original shot") }}
+

Interactive image toggle

Display an image and switch to a different one on click. Ideal for highlighting differences or drawing attention to details.

Usage

{{ image_toggler(default_src="img/mojave_day.webp", toggled_src="img/mojave_night.webp", default_alt="Mojave during the day", toggled_alt="Mojave at night") }}
+

Full-width image

The image will expand to match the width of the header, which is usually wider than the article text (except on mobile/small windows).

All other image shortcodes can be made into full-width by setting the optional parameter full_width to true.

Photograph of a canal in Amsterdam

Usage

{{ full_width_image(src="img/amsterdam_by_oskerwyld.webp", alt="Photograph of a canal in Amsterdam") }}
+

Text shortcodes

Multilingual quotes

This shortcode allows you to display both the translated and original text for a quote. The quotation marks will be added automatically:

“What tranquility, to go through life in silence, greeting only friends.”

— Francisco Umbral

“Qué sosiego, ir por la vida en silencio, saludando sólo a los amigos.”

— Francisco Umbral

Usage

{{ multilingual_quote(original="Qué sosiego, ir por la vida en silencio, saludando sólo a los amigos.", translated="What tranquility, to go through life in silence, greeting only friends.", author="Francisco Umbral") }}
+

References with hanging indent

This shortcode formats a reference section with a hanging indent like so:

Alderson, E. (2015). Cybersecurity and Social Justice: A Critique of Corporate Hegemony in a Digital World. New York Journal of Technology, 11(2), 24-39. https://doi.org/10.1007/s10198-022-01497-6.

Funkhouser, M. (2012). The Social Norms of Indecency: An Analysis of Deviant Behavior in Contemporary Society. Los Angeles Journal of Sociology, 16(3), 41-58. https://doi.org/10.1093/jmp/jhx037.

Schrute, D. (2005). The Beet Farming Revolution: An Analysis of Agricultural Innovation. Scranton Agricultural Quarterly, 38(3), 67-81.

Steinbrenner, G. (1997). The Cost-Benefit Analysis of George Costanza: An Examination of Risk-Taking Behavior in the Workplace. New York Journal of Business, 12(4), 112-125.

Winger, J. A. (2010). The Art of Debate: An Examination of Rhetoric in Greendale Community College's Model United Nations. Colorado Journal of Communication Studies, 19(2), 73-86. https://doi.org/10.1093/6seaons/1movie.

Usage

{% references() %}
+
+Your references go here.
+
+Each in a new line. Markdown (links, italics…) will be rendered.
+
+{% end %}
+

Spoiler

This shortcode allows you to blur text until the user clicks on it. Like this: Goldfish have a memory span of a few

As you can see, Markdown is rendered. You can even add newlines with <br>.

This shortcode has the optional flag fixed_blur to blur a fixed placeholder ("SPOILER"), instead of blurring the actual contents. Like this: it is to wait 24 hours before filing a missing person report.

Usage

{{ spoiler(text="text to hide", fixed_blur=false) }}
+

Containers

Wide container

Use this shortcode if you want to have a wider table, paragraph, code block… On desktop, it will take up the width of the header. It will have no effect on mobile, except for tables, which will get a horizontal scroll.

TitleYearDirectorCinematographerGenreIMDbDuration
Beoning2018Lee Chang-dongHong Kyung-pyoDrama/Mystery7.5148 min
The Master2012Paul Thomas AndersonMihai Mălaimare Jr.Drama/History7.1137 min
The Tree of Life2011Terrence MalickEmmanuel LubezkiDrama6.8139 min

Usage

{% wide_container() %}
+
+Place your code block, paragraph, table… here.
+
+Markdown will of course be rendered.
+
+{% end %}
+
\ No newline at end of file diff --git a/blog/toc/index.html b/blog/toc/index.html new file mode 100644 index 000000000..b3ce0d34d --- /dev/null +++ b/blog/toc/index.html @@ -0,0 +1,25 @@ +~/tabi • Table of Contents
Table of Contents

Documentation

Enabling (and positioning) the Table of Contents

There are two ways to enable the Table of Contents (ToC). If you want it to be right below the header (like in this page) set this variable on the post's front matter:

[extra]
+toc = true
+

If you'd rather show the ToC elsewhere on your post (e.g. after an introduction), you can do so by adding a line with this content wherever you'd like the ToC to appear:

<!-- toc -->
+

You can also use the simple {{ toc() }} shortcode, which will simply write that string for you, effectively inserting the ToC (Michael Clayton's idea).

This method will render the ToC without the "Table of Contents" header. This allows you to use a different (or no) header for the ToC, or hide it like this:

Hidden ToC

The code to achieve this:

<details>
+    <summary>Hidden ToC</summary>
+    <!-- toc -->
+</details>
+

Note: If you both set toc = true and have <!-- toc --> somewhere in your text, you'll get multiple ToCs.

If you set a custom position and a custom header for the ToC, you'll probably want to hide it (see the section below) like this:

+++
+title = "Your Post's Title"
+date = 2034-01-11
+
+[extra]
+toc_ignore_pattern = "^(Table of Contents)"
++++
+
+Here goes some introductory text.
+
+### Table of Contents
+
+<!-- toc -->
+
+## First content header
+

Setting a maximum depth

You can set the maximum depth for the ToC by specifying the toc_levels variable, which takes an integer between 1 and 4:

[extra]
+toc_levels = 2
+

In this example, only the first two levels of headers would be included in the ToC, regardless of their actual HTML tags (h1, h2, h3, etc.). If you want to include only the main level of headers, set toc_levels = 1. The default toc_levels value is 3.

Keep your readers in mind when setting the toc_levels. While it can be tempting to include many nested levels for detailed navigation, a shorter and simpler ToC can often be more reader-friendly and less overwhelming. Adjust the depth according to the complexity and length of your content for the best reader experience.

Hiding headers from the ToC

You might want to hide certain headers. For example, if your article has many Figures or Tables, they might clutter the ToC. You can hide specific headers in the ToC with the toc_ignore_pattern variable.

This variable expects a regular expression (regex), as it's using Tera's matching test. The toc_ignore_pattern is tested against the text of the header, excluding the # character(s). For example, for the header ### Further reading, the text Further reading would be checked against.

Here are some example values for toc_ignore_pattern along with the headers they can hide:
toc_ignore_patternExcludes headers which…
Tablecontain "Table"
^Figurestart with "Figure"
(?i)(table|figure)start with "Table" or "Figure" (case insensitive)
\[Draft\]$end with "[Draft]".

You can test your regular expression on a site like regex101 to ensure it works as expected.

Note: "Look-around" capabilities, including look-ahead and look-behind, are not supported.

Heading 1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Heading 2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Heading 3.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Heading 4.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Heading 4.2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Heading 3.2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Heading 4

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Heading 4

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Heading 2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Heading 3.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Heading 4.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Heading 4.2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Heading 3.2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Heading 4.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Heading 4.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

\ No newline at end of file diff --git a/ca/archive/index.html b/ca/archive/index.html new file mode 100644 index 000000000..eb5dd3c85 --- /dev/null +++ b/ca/archive/index.html @@ -0,0 +1 @@ +~/tabi • Arxiu
Arxiu
\ No newline at end of file diff --git a/ca/atom.xml b/ca/atom.xml new file mode 100644 index 000000000..2bdde437d --- /dev/null +++ b/ca/atom.xml @@ -0,0 +1,112 @@ + + + + + + Aquest és un canal web + també conegut com a canal Atom + Subscriu-te + copiant l'URL de la barra d'adreces al teu lector de notícies + Visita + per aprendre més i començar + És gratuït + la web + Publicacions recents + + + ~/tabi + tabi és un tema de Zola ràpid, lleuger i modern amb JavaScript opcional i una puntuació perfecta a Lighthouse. + + + Zola + 2023-09-08T00:00:00+00:00 + https://welpo.github.io/tabi/ca/atom.xml + + Personalitza el color de tabi i el tema per defecte + 2023-08-09T00:00:00+00:00 + 2023-08-10T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/customise-tabi/ + Aprèn a personalitzar tabi fent servir skins i establint un tema per defecte, aconseguint un aspecte únic. + + + Afegeix comentaris a les teves publicacions amb aquestes 4 plataformes + 2023-07-14T00:00:00+00:00 + 2023-07-26T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/comments/ + Descobreix com habilitar una secció de comentaris a les teves publicacions utilitzant giscus, utterances, Hyvor Talk, o Isso, permetent la interacció i feedback dels lectors. + + + Optimitza la càrrega amb un subconjunt de font personalitzat + 2023-04-29T00:00:00+00:00 + 2023-07-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/custom-font-subset/ + Aprèn com crear un subconjunt personalitzat que només inclogui els glifs necessaris. + + + Seguretat per defecte + 2023-02-22T00:00:00+00:00 + 2023-07-17T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/security/ + tabi té una Política de Seguretat de Contingut (CSP) fàcilment personalitzable amb valors segurs per defecte. Obtingues tranquil·litat i un A+ en l'Observatori de Mozilla. + + + Shortcodes personalitzats + 2023-02-19T00:00:00+00:00 + 2023-08-26T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/shortcodes/ + Aquest tema inclou alguns shortcodes personalitzats útils que pots utilitzar per millorar les teves publicacions. Ja sigui per mostrar imatges que s'adapten als temes clar i fosc, o per donar format a una secció de referències amb un aspecte professional, aquests shortcodes personalitzats t'ajudaran. + + + Exemples de Markdown + 2023-01-31T00:00:00+00:00 + 2023-09-01T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/markdown/ + Aquesta publicació mostra alguns exemples de format en Markdown, incloent-hi una taula, blocs de codi i etiquetes, citacions, taules i notes a peu de pàgina. + + + Sense JavaScript obligatori + 2023-01-06T00:00:00+00:00 + 2023-09-01T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/javascript/ + JavaScript només s'utilitza quan HTML i CSS no són suficients. + + + Taula de contingut + 2022-11-01T00:00:00+00:00 + 2023-09-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/toc/ + Una publicació que mostra la taula de contingut opcional i la seva configuració. + + diff --git a/ca/blog/comments/index.html b/ca/blog/comments/index.html new file mode 100644 index 000000000..959ad81af --- /dev/null +++ b/ca/blog/comments/index.html @@ -0,0 +1,54 @@ +~/tabi • Afegeix comentaris a les teves publicacions amb aquestes 4 plataformes
Afegeix comentaris a les teves publicacions amb aquestes 4 plataformes

tabi actualment suporta quatre sistemes de comentaris: giscus i utterances, Hyvor Talk i Isso.

giscus i utterances són projectes de codi obert que et permeten afegir una secció de comentaris al teu lloc web utilitzant les «issues» (utterances) o «discussions» (giscus) de GitHub. Són perfectes per a generadors de llocs estàtics com Zola, ja que permeten als teus lectors interactuar i deixar comentaris a les teves publicacions sense requerir un backend tradicional o una base de dades.

Com que tots dos es basen en GitHub, giscus i utterances requereixen que els usuaris tinguin un compte a GitHub i autoritzin l'aplicació respectiva. Alternativament, els visitants també poden comentar directament en la discussió o «issue» corresponent a GitHub.

Ambdues són excel·lents eines per afegir comentaris al teu blog, però giscus té alguns avantatges:

  • Més temes.
  • Suport per a reaccions.
  • Respostes a comentaris i vista de conversa.
  • Més segur: utterances requereix habilitar estils en línia no segurs («unsafe inline styles») per establir l'altura del frame; giscus no.
  • Suport multilingüe: utterances només està disponible en anglès; giscus suporta més de 20 idiomes.
  • Desenvolupament més actiu: l'últim commit de giscus, en el moment d'aquesta publicació, va ser fa dos dies. L'últim commit d'utterances es va fer fa més d'un any.

Hyvor Talk és una plataforma de comentaris de pagament centrada en la privadesa. Ofereix tots els avantatges del giscus i alguns més, com la moderació i la detecció de correu brossa.

Isso és un sistema de comentaris de codi obert autoallotjat que emmagatzema els comentaris a la seva pròpia base de dades. Un dels seus principals avantatges és la privacitat; no comparteix les dades dels usuaris amb tercers. També té una interfície lleugera i neta, facilitant als teus visitants deixar comentaris. Isso també permet comentaris anònims, potencialment augmentant la participació dels usuaris a la teva pàgina web.

Configuració

Sistemes basats en GitHub

giscus y utterances requereixen una configuració similar. Primer, visita el lloc web del sistema que vulguis habilitar: giscus.app o utteranc.es.

Segueix les instruccions de la secció Configuració del lloc web, i tria les opcions que prefereixis. Finalment, estableix els valors que es mostren a la secció Habilitar giscus/utterances (el bloc de codi script) en la secció corresponent del teu config.toml: [extra.giscus] o [extra.utterances].

giscus

giscus té més opcions que utterances:

[extra.giscus]
+enabled_for_all_posts = false
+automatic_loading = true
+repo = "elTeuNomDUsuariDeGithub/elTeuRepositori"
+repo_id = "LaTevaIDdeRepositori"
+category = "Anuncis"
+category_id = "LaTevaIDdeCategoria"
+mapping = "slug"
+strict_title_matching = 1  # 1 per habilitar, 0 per deshabilitar.
+enable_reactions = 1  # 1 per habilitar, 0 per deshabilitar.
+comment_box_above_comments = true
+light_theme = "noborder_light"
+dark_theme = "noborder_dark"
+lang = ""  # Deixa en blanc perquè coincideixi amb l'idioma de la pàgina.
+lazy_loading = true
+

utterances

[extra.utterances]
+enabled_for_all_posts = false
+automatic_loading = true
+repo = "elTeuNomDUsuariDeGithub/elTeuRepositori"
+issue_term = "slug"
+label = "💬"
+light_theme = "github-light"
+dark_theme = "photon-dark"
+lazy_loading = true
+

Hyvor Talk

Configura el teu lloc web des de la consola Hyvor Talk i completa la configuració a config.toml:

[extra.hyvortalk]
+enabled_for_all_posts = false
+automatic_loading = true
+website_id = "1234"
+page_id_is_slug = true
+lang = ""
+page_author = ""  # Correu (o correu codificat en base64) de l'autor.
+lazy_loading = true
+

Isso

Per habilitar Isso, primer hauràs d'instal·lar i executar un servidor Isso (aquí tens una guia útil). Després, completa aquestes configuracions a config.toml:

[extra.isso]
+enabled_for_all_posts = false
+automatic_loading = true
+endpoint_url = "https://example.com/comments/"  # URL a Isso.
+page_id_is_slug = true
+lang = ""
+max_comments_top = "inf"
+max_comments_nested = "5"
+avatar = true
+voting = true
+page_author_hashes = ""
+lazy_loading = true
+

Configuracions comunes

La opció enabled_for_all_posts = true habilita globalment el sistema de comentaris corresponent.

Alternativament, pots habilitar els comentaris a publicacions concretes afegint el nom del sistema (utterances, giscus, hyvortalk o isso) = true. Per exemple, així és com habilitaries giscus:

title = "L'art de l'entremaliadura segons Shin-Chan
+date = 1990-02-14
+description = "Descobreix com les travessures poden canviar la teva perspectiva de vida."
+
+[taxonomies]
+tags = ["personal", "travessures"]
+
+[extra]
+giscus = true
+

Si accidentalment habilites més d'un sistema, Zola mostrarà un error.

Si el teu lloc web té múltiples idiomes amb publicacions coincidents (com aquesta demo), i t'agradaria compartir comentaris entre idiomes, has d'utilitzar issue_term = "slug" (per giscus y utterances) o page_id_is_slug = true (per Hyvor Talk o Isso). Això utilitzarà el nom de l'arxiu Markdown (sense l'etiqueta d'idioma) com a identificador. Totes les altres opcions crearan diferents seccions de comentaris per a cada idioma.

Exemple en viu

A continuació trobaràs el widget de giscus amb la configuració mostrada a dalt.

\ No newline at end of file diff --git a/ca/blog/custom-font-subset/index.html b/ca/blog/custom-font-subset/index.html new file mode 100644 index 000000000..a98a6cc1e --- /dev/null +++ b/ca/blog/custom-font-subset/index.html @@ -0,0 +1,114 @@ +~/tabi • Optimitza la càrrega amb un subconjunt de font personalitzat
Optimitza la càrrega amb un subconjunt de font personalitzat

El problema

Les fonts personalitzades causen parpelleig de text a Firefox. Per veure un gif i més detalls, mira aquesta issue.

La solució

Per solucionar això, tabi carrega un subconjunt de glifs per a l'encapçalament. Donat que això augmenta lleugerament el temps de càrrega inicial, és una bona idea intentar minimitzar la mida d'aquest subconjunt.

Per defecte, tabi inclou fitxers de subconjunts per a caràcters en anglès i espanyol (amb alguns símbols). Aquests fitxers es carreguen quan la pàgina o el lloc web de Zola està en aquest idioma.

Per a una optimització addicional, pots crear un subconjunt de fonts personalitzat que només inclogui els caràcters utilitzats en el teu encapçalament.

Requisits

Instal·la aquestes eines:

Executa pip install fonttools brotli per instal·lar totes dues.

L'script

El següent script pren un fitxer config.toml i un fitxer de font com a entrada, extreu els caràcters necessaris, crea un subconjunt de la font i genera un fitxer CSS que conté el subconjunt codificat en base64.

#!/usr/bin/env bash
+
+usage() {
+    echo "Usage: $0 [--config | -c CONFIG_FILE] [--font | -f FONT_FILE] [--output | -o OUTPUT_PATH]"
+    echo
+    echo "Options:"
+    echo "  --config, -c   Path to the config.toml file."
+    echo "  --font, -f     Path to the font file."
+    echo "  --output, -o   Output path for the generated custom_subset.css file (default: current directory)"
+    echo "  --help, -h     Show this help message and exit"
+}
+
+# La sortida per defecte és el directori actual.
+output_path="."
+
+# Opcions de la línia de comandes.
+while [ "$#" -gt 0 ]; do
+    case "$1" in
+        --config|-c)
+            config_file="$2"
+            shift 2
+            ;;
+        --font|-f)
+            font_file="$2"
+            shift 2
+            ;;
+        --output|-o)
+            output_path="$2"
+            shift 2
+            ;;
+        --help|-h)
+            usage
+            exit 0
+            ;;
+        *)
+            echo "Unknown option: $1"
+            usage
+            exit 1
+            ;;
+    esac
+done
+
+# Comprova si s'han proporcionat les opcions -c i -f.
+if [ -z "$config_file" ]; then
+    echo "Error: --config|-c option is required."
+    usage
+    exit 1
+fi
+
+if [ -z "$font_file" ]; then
+    echo "Error: --font|-f option is required."
+    usage
+    exit 1
+fi
+
+# Comprova si els fitxers de configuració i de font existeixen.
+if [ ! -f "$config_file" ]; then
+    echo "Error: Config file '$config_file' not found."
+    exit 1
+fi
+
+if [ ! -f "$font_file" ]; then
+    echo "Error: Font file '$font_file' not found."
+    exit 1
+fi
+
+# Extreu el títol i els noms del menú del fitxer de configuració.
+title=$(awk -F' = ' '/^title/{print $2}' "$config_file" | tr -d '"')
+menu_names=$(awk -F' = ' '/^menu/{f=1;next} /socials/{f=0} f && /name/{print $2}' "$config_file" | cut -d',' -f1 | tr -d '"' )
+language_names=$(awk -F' = ' '/^language_name\./{print $2}' "$config_file" | tr -d '"' )
+
+# Si el lloc web és multilingüe, obté les traduccions del menú.
+if [ -n "$language_names" ]; then
+    for menu_name in $menu_names; do
+        # Find the line with the menu name inside a [languages.*.translations] section and get the translated menus.
+        menu_translation=$(awk -F' = ' "/\\[languages.*\\.translations\\]/{f=1;next} /^\\[/ {f=0} f && /$menu_name =/{print \$2}" "$config_file" | tr -d '"' )
+        # Add the found menu value to the translations string
+        menu_names+="$menu_translation"
+    done
+fi
+
+# Combina les cadenes extretes.
+combined="$title$menu_names$language_names"
+
+# Obté els caràcters únics.
+unique_chars=$(echo "$combined" | grep -o . | sort -u | tr -d '\n')
+
+# Crea un fitxer temporal per a subset.woff2.
+temp_subset=$(mktemp)
+
+# Crea el subconjunto.
+pyftsubset "$font_file" \
+    --text="$unique_chars" \
+    --layout-features="*" --flavor="woff2" --output-file="$temp_subset" --with-zopfli
+
+# Codifica en base64 el fitxer temporal subset.woff2 i crea el fitxer CSS.
+base64_encoded_font=$(base64 -i "$temp_subset")
+echo "@font-face{font-family:\"Inter Subset\";src:url(data:application/font-woff2;base64,$base64_encoded_font);}" > "$output_path/custom_subset.css"
+
+# Elimina el fitxer temporal subset.woff2.
+rm "$temp_subset"
+

Ús

Guarda l'script a algun lloc com ~/bin/subset_font. Fes-lo executable amb chmod +x ~/bin/subset_font.

Ara pots executar-lo amb les opcions requerides --config i --font:

~/bin/subset_font --config path/to/config.toml --font path/to/font.woff2
+

De forma predeterminada, això generarà un fitxer custom_subset.css al directori actual. Utilitza -o o --output per especificar una ruta diferent:

~/bin/subset_font -c path/to/config.toml -f path/to/font.woff2 -o path/to/output
+

Col·loca aquest fitxer custom_subset.css dins del directori static/ del teu projecte de Zola.

Automatització amb un Pre-commit Hook

És possible que canviïs el títol o les opcions del menú del teu lloc web, la qual cosa faria que el subconjunt personalitzat deixés de ser útil.

Per automatitzar el procés de creació d'aquest fitxer, pots integrar l'script en un ganxo (hook) pre-commit de Git que s'activi en detectar canvis al fitxer config.toml, executi l'script i guardi el fitxer CSS resultant al directori static/ del teu lloc web.

  1. Crea un fitxer .git/hooks/pre-commit al teu projecte de Git, si encara no existeix.

  2. Fes-lo executable amb chmod +x .git/hooks/pre-commit.

  3. Afegeix el següent codi al fitxer:

# Comprova si config.toml s'ha modificat.
+if git diff --cached --name-only | grep -q "config.toml"; then
+    echo "config.toml modified. Running subset_font…"
+
+    # Executa l'script subset_font.
+    ~/bin/subset_font -c config.toml -f static/fonts/Inter4.woff2 -o static/
+
+    # Afegeix el fitxer subset.css generat al commit.
+    git add static/custom_subset.css
+fi
+

Asegura't de modificar l'script perquè coincideixi amb la ruta on has guardat l'script subset_font. Les rutes de configuració i font haurien de funcionar correctament amb la configuració predeterminada de tabi.

Ara, cada vegada que facis canvis al teu projecte de Git i facis commit, el ganxo pre-commit verificarà les modificacions al fitxer config.toml i executarà automàticament l'script subset_font per actualitzar el fitxer custom_subset.css.

Per cert, si t'interessa una forma d'actualitzar automàticament la data de les teves publicacions a Zola o comprimir automàticament els teus fitxers PNG, fes un cop d'ull a aquesta publicació.

Si desitges utilitzar tots els scripts alhora (compressió de fitxers PNG, actualització de la data i creació del subconjunt de fonts), combina el seu codi en un sol fitxer .git/hooks/pre-commit.

\ No newline at end of file diff --git a/ca/blog/customise-tabi/index.html b/ca/blog/customise-tabi/index.html new file mode 100644 index 000000000..4439a4659 --- /dev/null +++ b/ca/blog/customise-tabi/index.html @@ -0,0 +1,13 @@ +~/tabi • Personalitza el color de tabi i el tema per defecte
Personalitza el color de tabi i el tema per defecte

tabi pot ser personalitzat de dues maneres: establint el tema per defecte (fosc o clar) i triant el color principal per al tema ("skin").

Tema per defecte

Per configurar permanentment el teu lloc en el tema fosc o clar, necessites desactivar el theme_switcher a config.toml i establir el teu tema preferit (light o dark) a default_theme.

Per exemple, per tenir un tema fosc permanent:

[extra]
+theme_switcher = false
+default_theme = "dark"
+

Si el teu interruptor de mode clar/fosc està activat, el default_theme només s'utilitzarà com a reserva, en cas que un visitant tingui JavaScript desactivat.

Skins

No t'agrada l'aiguamarina? Cap problema! tabi té 12 skins per triar. Si cap d'aquestes t'agrada, pots crear la teva pròpia skin.

Una skin és un arxiu CSS amb dues variables: el color principal per al tema clar i el color principal per al tema fosc.

Activar una skin és tan fàcil com establir la variable skin a la teva config.toml amb el nom de la skin. Per exemple:

[extra]
+skin = "sakura"
+

Fes una ullada a les skins disponibles a continuació.

Fes clic a les imatges per canviar entre els temes fosc i clar.


Aiguamarina

La skin per defecte. Si la variable skin no està configurada (o és igual a "teal"), aquest és l'aspecte de tabi:


Lavanda

Per aplicar-la, utilitza skin = "lavender".


Vermell

Canvia a aquesta skin establint skin = "red".


Menta

Una skin dissenyada per 🅿️.

Activa-la amb skin = "mint".


Sakura

Inspirat per la temporada de floració dels cirerers al Japó.

Per habilitar aquesta skin, ajusta skin = "sakura".


Blau

Per activar aquesta aparença, estableix skin = "blue".


Lingot indigo

Indigo pel blau (en el tema clar) i lingot pel daurat (en el tema fosc).

Per activar aquest tema, utilitza skin = "indigo_ingot".


Evangelion

Inspirat pels colors de la Unitat Evangelion-01 (en el tema fosc) i la Unitat-02 (en el tema clar).


Monocromàtic

Per aconseguir aquesta aparença, estableix skin = "monochrome".


Taronja (baix contrast)

AVÍS! Aquesta skin en mode clar pot tenir baix contrast, afectant l'accessibilitat i la qualificació Lighthouse. (El mode fosc té bon contrast.)

Per utilitzar-la, estableix skin = "lowcontrast_orange".


Préssec (baix contrast)

AVÍS! Aquesta skin en mode clar pot tenir baix contrast, afectant l'accessibilitat i la qualificació Lighthouse. (El mode fosc té bon contrast.)

Especifica skin = "lowcontrast_peach" per utilitzar aquesta skin.


Rosa (baix contrast)

AVÍS! Aquesta skin en mode clar pot tenir baix contrast, afectant l'accessibilitat i la qualificació Lighthouse. (El mode fosc té bon contrast.)

Per utilitzar aquests colors, assigna skin = "lowcontrast_pink".


Crea la teva pròpia skin

No estàs limitat a les skins predefinides. Per què no crees un disseny únic que et representi?

Pots guardar la teva nova skin en qualsevol d'aquests dos directoris:

  1. Dins del directori del tema: themes/tabi/sass/skins
  2. Dins del directori principal del teu lloc: sass/skins (necessitaràs crear aquesta carpeta)

Crea un nou arxiu .scss (per exemple, la_teva_skin.scss) a la ubicació que prefereixis. Aquest arxiu ha de contenir aquestes dues variables (aquesta és la skin predeterminada, "teal"):

:root {
+    --primary-color: #087e96;
+}
+
+[data-theme='dark'] {
+    --primary-color: #91e0ee;
+}
+

Modifica els colors al teu gust. Una vegada estiguis satisfet, actualitza la variable skin perquè coincideixi amb el nom del teu arxiu.

Recorda tenir en compte l'accesibilitat dels colors que triis. Aquí tens un enllaç que et pot ajudar: WebAIM: Contrast Checker. El fondo del tema clar és #fff, i el del tema fosc #1f1f1f.

\ No newline at end of file diff --git a/ca/blog/index.html b/ca/blog/index.html new file mode 100644 index 000000000..1d4c05412 --- /dev/null +++ b/ca/blog/index.html @@ -0,0 +1 @@ +~/tabi • Blog
Blog
09 d’agost 2023

Aprèn a personalitzar tabi fent servir skins i establint un tema per defecte, aconseguint un aspecte únic.

Llegir més →
14 de juliol 2023

Descobreix com habilitar una secció de comentaris a les teves publicacions utilitzant giscus, utterances, Hyvor Talk, o Isso, permetent la interacció i feedback dels lectors.

Llegir més →
29 d’abril 2023

Aprèn com crear un subconjunt personalitzat que només inclogui els glifs necessaris.

Llegir més →
22 de febrer 2023

tabi té una Política de Seguretat de Contingut (CSP) fàcilment personalitzable amb valors segurs per defecte. Obtingues tranquil·litat i un A+ en l'Observatori de Mozilla.

Llegir més →
19 de febrer 2023

Aquest tema inclou alguns shortcodes personalitzats útils que pots utilitzar per millorar les teves publicacions. Ja sigui per mostrar imatges que s'adapten als temes clar i fosc, o per donar format a una secció de referències amb un aspecte professional, aquests shortcodes personalitzats t'ajudaran.

Llegir més →
\ No newline at end of file diff --git a/ca/blog/javascript/index.html b/ca/blog/javascript/index.html new file mode 100644 index 000000000..511ece053 --- /dev/null +++ b/ca/blog/javascript/index.html @@ -0,0 +1 @@ +~/tabi • Sense JavaScript obligatori
Sense JavaScript obligatori

Aquest tema no requereix JavaScript obligatori. Opcionalment, pot carregar una quantitat mínima per afegir algunes característiques que són impossibles d'aconseguir amb HTML i CSS.

Opcions habilitades globalment

  • L'interruptor de mode clar/fosc es pot habilitar configurant theme_switcher = true a la secció [extra] del teu config.toml (~900 bytes de JavaScript).

  • Decodificació de correu electrònic (~400 bytes). Per protegir contra robots de correu brossa, pots configurar encode_plaintext_email = true. Si el teu lloc web està en un repositori públic, considera utilitzar el teu email com una cadena codificada en base641.

Opcions que es poden sobreescriure de forma jeràrquica

Les següents opcions es poden especificar per a publicacions, seccions i globalment, seguint la jerarquia de pàgina > secció > config.toml:

Per especificar aquestes opcions:

  • Globalment: Afegeix-les sota la secció [extra] al teu config.toml.
  • Per a una secció: Afegeix-les sota la secció [extra] al front matter de l'_index.md de la secció.
  • Per a una publicació individual: Configura les variables corresponents a la secció [extra] del front matter de la publicació.

Opcions que es poden habilitar globalment o per a publicacions individuals

  • Comentaris. giscus (2 KB), utterances (1 KB), Hyvor Talk (~800 bytes) o Isso (1KB) es poden habilitar globalment configurant enabled_for_all_posts = true a la secció apropiada del teu config.toml ([extra.giscus], [extra.utterances], [extra.hyvortalk] o [extra.isso]). Per habilitar comentaris en publicacions individuals, configura el nom del sistema = true (per exemple, hyvortalk = true) al front matter del post.

A part d'això, és un tema ràpid amb HTML i CSS que funciona sense JavaScript. Just com hauria de ser (la majoria de) la web :-)


1

Per codificar el teu correu en base64 pots utilitzar eines en línia o, al terminal, executa: printf 'mail@example.com' | base64.

\ No newline at end of file diff --git a/ca/blog/markdown/index.html b/ca/blog/markdown/index.html new file mode 100644 index 000000000..fdfa5e1b1 --- /dev/null +++ b/ca/blog/markdown/index.html @@ -0,0 +1,9 @@ +~/tabi • Exemples de Markdown
Exemples de Markdown

$\KaTeX$

$\KaTeX$ és una llibreria ràpida i fàcil d'usar que permet representar notació matemàtica mitjançant la sintaxi LaTeX.

Pots utilitzar $\KaTeX$ en línia embolcallant l'expressió entre $ o entre \\( i \\).

Per exemple, $ \sin(x) = \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n + 1)!} x^{2n + 1} $ es renderitzarà com: $ \sin(x) = \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n + 1)!} x^{2n + 1} $

Per mostrar l'expressió en una línia pròpia i centrada, embolcalla-la amb $$ o entre \\[ i \\].

Per exemple, \\[ r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i - \bar{y})^2}} \\] es renderitzarà com: \[ r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i - \bar{y})^2}} \]

Per activar $\KaTeX$ en una publicació o secció sencera, inclou katex = true dins de la secció [extra] de les metadades. Per exemple:

title = "Provant KaTeX"
+date = 2002-11-30
+
+[extra]
+katex = true
+

Per activar-lo globalment, afeigeix katex = true a la secció [extra] del teu config.toml.

Per obtenir un millor rendiment i seguretat, els fitxers JavaScript, CSS i les tipografies de $\KaTeX$ s'allotgen localment.

Nota: Després d'activar $\KaTeX$, si vols utilitzar el caràcter $ sense renderitzar-lo com a expressió matemàtica, escapa'l amb una barra inversa: \$.

Taula

Aquí tens un exemple de taula1. Els seus colors canvien en funció del tema actual.
SímbolElementNombre atòmic
HHidrogen1
CCarboni6
FeFerro26
AuOr79

Bloc de codi

fn main() {
+    println!("Hola, món!") -> ();
+}
+

Etiquetes de codi

A Rust, declares una variable mutable amb let mut x = 5;, mentre que a Python, simplement fas x = 5. De manera similar, per imprimir un valor a Rust, utilitzaries println!("Valor: {}", x);, però a Python, és tan senzill com print(f"Valor: {x}").

Quote

«La vida, perquè sigui vida, s'ha de viure a poc a poc…»

— Mercè Rodoreda, La plaça del Diamant


1

I aquí tens un exemple de nota a peu de pàgina!

\ No newline at end of file diff --git a/ca/blog/page/1/index.html b/ca/blog/page/1/index.html new file mode 100644 index 000000000..1111353a3 --- /dev/null +++ b/ca/blog/page/1/index.html @@ -0,0 +1 @@ +Redirect

Click here to be redirected. \ No newline at end of file diff --git a/ca/blog/page/2/index.html b/ca/blog/page/2/index.html new file mode 100644 index 000000000..0f7456512 --- /dev/null +++ b/ca/blog/page/2/index.html @@ -0,0 +1 @@ +~/tabi • Blog

Blog
31 de gener 2023

Aquesta publicació mostra alguns exemples de format en Markdown, incloent-hi una taula, blocs de codi i etiquetes, citacions, taules i notes a peu de pàgina.

Llegir més →
06 de gener 2023

JavaScript només s'utilitza quan HTML i CSS no són suficients.

Llegir més →
01 de novembre 2022

Una publicació que mostra la taula de contingut opcional i la seva configuració.

Llegir més →
\ No newline at end of file diff --git a/ca/blog/security/index.html b/ca/blog/security/index.html new file mode 100644 index 000000000..d3ccc4dc7 --- /dev/null +++ b/ca/blog/security/index.html @@ -0,0 +1,9 @@ +~/tabi • Seguretat per defecte
Seguretat per defecte

La configuració per defecte del tema obté una puntuació A+ a l'Observatori de Mozilla.1

Això s'aconsegueix configurant programàticament les capçaleres de la Política de Seguretat de Contingut (CSP) basant-se en una llista de dominis permesos definida per l'usuari en el fitxer config.toml. Aquí tens la configuració per defecte i recomanada (pots eliminar l'última directiva si no vols inserir vídeos de YouTube):

[extra]
+allowed_domains = [
+    { directive = "font-src", domains = ["'self'", "data:"] },
+    { directive = "img-src", domains = ["'self'", "https://*", "data:"] },
+    { directive = "script-src", domains = ["'self'"] },
+    { directive = "style-src", domains = ["'self'"] },
+    { directive = "frame-src", domains = ["https://www.youtube-nocookie.com"] },
+]
+

La llista allowed_domains especifica les URLs a les quals el lloc web hauria de poder connectar-se, i cada domini de la llista està associat amb una directiva CSP com frame-src, connect-src o script-src. El fitxer templates/partials/header.html genera dinàmicament la capçalera CSP basant-se en aquesta llista.

Aquesta funcionalitat permet personalitzar fàcilment les capçaleres de seguretat del lloc web per permetre casos d'ús específics, com ara inserir vídeos de YouTube, carregar scripts o tipografies remotes (no recomanat).

Nota: habilitar els comentaris permet automàticament scripts i frames del sistema de comentaris corresponent, així com estils en línia no segurs en el cas de utterances i Hyvor Talk.

1

Requereix una configuració adequada del servidor web (p. ex., redirigir el trànsit HTTP a HTTPS).

\ No newline at end of file diff --git a/ca/blog/shortcodes/index.html b/ca/blog/shortcodes/index.html new file mode 100644 index 000000000..9f983a32f --- /dev/null +++ b/ca/blog/shortcodes/index.html @@ -0,0 +1,23 @@ +~/tabi • Shortcodes personalitzats
Shortcodes personalitzats

Shortcodes d'imatge

Nota: tots els shortcodes d'imatge tenen dos paràmetres opcionals: full_width, que té com a valor predeterminat false (vegeu a sota), i lazy_loading, que té com a valor predeterminat true.

Imatges per a temes duals

Útil si vols utilitzar una imatge diferent pels temes clar i fosc:

La Torre EiffelLa Torre Eiffel

Ús

{{ dual_theme_image(light_src="img/paris_day.webp", dark_src="img/paris_night.webp" alt="La Torre Eiffel") }}
+

Imatge invertible

Útil per a gràfics, dibuixos de línies, diagrames… Inverteix els colors de la imatge. La imatge original s'utilitzarà per al tema clar.

Gràfic invertible

Ús

{{ invertible_image(src="img/graph.webp", alt="Gràfic invertible") }}
+

Imatge regulable

Les imatges amb massa brillantor o contrast poden ser molestes en un fons fosc. Aquí tens un exemple d'una fotografia que s'atenua quan s'activa el tema fosc.

Fotografia d'un desert, cel celestial

Ús

{{ dimmable_image(src="img/desert_by_oskerwyld.webp", alt="Fotografia d'un desert, cel celestial") }}
+

Canvi d'imatge en passar el cursor

La imatge mostrada canvia quan l'usuari passa el cursor per sobre. Útil per a comparacions d'abans i després, per exemple.

Foto editada
Foto original

Ús

{{ image_hover(default_src="img/before.webp", hovered_src="img/after.webp", default_alt="Foto editada", hovered_alt="Foto original") }}
+

Canvi d'imatge via clic

Mostra una imatge i canvia a una diferent en fer clic. Ideal per destacar diferències o cridar l'atenció sobre detalls.

Ús

{{ image_toggler(default_src="img/mojave_day.webp", toggled_src="img/mojave_night.webp", default_alt="Mojave de dia", toggled_alt="Mojave de nit") }}
+

Imatge d'amplada completa

La imatge s'expandirà per coincidir amb l'amplada de la capçalera, que normalment és més ampla que el text de l'article (excepte en mòbil/finestres petites).

Tots els altres shortcodes d'imatges poden utilizar l'amplada completa assignant true al paràmetre opcional full_width.

Fotografia d'un canal a Àmsterdam

Ús

{{ full_width_image(src="img/amsterdam_by_oskerwyld.webp", alt="Fotografia d'un canal a Àmsterdam") }}
+

Shortcodes de text

Cites multillenguatge

Aquest shortcode permet mostrar una cita traduïda i en el llenguatge original:

«La lògica, encara que inquebrantable, no resisteix a un home que vol viure.»

— Franz Kafka

«Die Logik ist zwar unerschütterlich, aber einem Menschen, der leben will, widersteht sie nicht.»

— Franz Kafka

Ús

{{ multilingual_quote(original="Die Logik ist zwar unerschütterlich, aber einem Menschen, der leben will, widersteht sie nicht.", translated="La lògica, encara que inquebrantable, no resisteix a un home que vol viure.", author="Franz Kafka") }}
+

Referències amb sagnat invertit

Aquest shortcode formata una secció de referència amb un sagnat invertit de la següent manera:

Alderson, E. (2015). Ciberseguretat i justícia social: Una crítica a la hegemonia corporativa en un món digital. New York Journal of Technology, 11(2), 24-39. https://doi.org/10.1007/s10198-022-01497-6.

Funkhouser, M. (2012). Les normes socials d'indecència: Un anàlisi del comportament desviat a la societat contemporània. Los Angeles Journal of Sociology, 16(3), 41-58. https://doi.org/10.1093/jmp/jhx037.

Schrute, D. (2005). La revolució de l'agricultura de remolatxa: Un anàlisi de la innovació agrícola. Scranton Agricultural Quarterly, 38(3), 67-81.

Steinbrenner, G. (1997). L'anàlisi cost-benefici de George Costanza: Un anàlisi del comportament de presa de riscos en el lloc de treball. New York Journal of Business, 12(4), 112-125.

Winger, J. A. (2010). L'art del debat: Un examen de la retòrica en el model de les Nacions Unides del Greendale Community College. Colorado Journal of Communication Studies, 19(2), 73-86. https://doi.org/10.1093/6seaons/1movie.

Ús

{% references() %}
+
+Les teves referències van aquí.
+
+Cada una en una nova línia. Es renderitzarà el Markdown (enllaços, cursiva…).
+
+{% end %}
+

Spoiler

Aquest shortcode amaga el text fins que l'usuari fa clic per revelar-lo. Per exemple: A l'antiga Roma, el vomitorium era

Com veus, el Markdown es renderitza.

Aquest shortcode té l'opció fixed_blur per difuminar el text "SPOILER", en lloc de difuminar el contingut real. Per exemple: és esperar 24 hores abans de denunciar la desaparició d'una persona.

Ús

{{ spoiler(text="text a amagar", fixed_blur=false) }}
+

Contenidors

Contenidor ample

Utilitza aquest codi curt si vols tenir una taula, paràgraf, bloc de codi… més ample. A l'escriptori, ocuparà l'amplada de la capçalera. A mòbils no tindrà efecte, excepte per les taules, que guanyaran scroll horitzontal.

TítolAnyDirectorDirector de fotografiaGènereIMDbDurada
Beoning2018Lee Chang-dongHong Kyung-pyoDrama/Misteri7.5148 min
The Master2012Paul Thomas AndersonMihai Mălaimare Jr.Drama/Història7.1137 min
The Tree of Life2011Terrence MalickEmmanuel LubezkiDrama6.8139 min

Ús

{% wide_container() %}
+
+Posa el teu bloc de codi, paràgraf, taula… aquí.
+
+El Markdown, per suposat, serà interpretat.
+
+{% end %}
+
\ No newline at end of file diff --git a/ca/blog/toc/index.html b/ca/blog/toc/index.html new file mode 100644 index 000000000..07d39e764 --- /dev/null +++ b/ca/blog/toc/index.html @@ -0,0 +1,25 @@ +~/tabi • Taula de contingut
Taula de contingut

Documentació

Habilitant (i posicionant) la Taula de Contingut

Hi ha dues formes d'habilitar la Taula de Contingut (TdC). Si vols que estigui just a sota del capçalera (com en aquesta pàgina), configura aquesta variable en el front matter del teu post:

[extra]
+toc = true
+

Si prefereixes col·locar la TdC a un altre lloc (per exemple, després d'una introducció), pots fer-ho afegint una línia amb aquest contingut allà on vulguis que aparegui la TdC:

<!-- toc -->
+

També pots utilitzar el shortcode {{ toc() }}, que simplement inserirà aquest text per tu (idea de Michael Clayton).

Aquest mètode renderitzarà la TdC sense el capçalera "Taula de Contingut". Això et permet utilitzar un capçalera diferent (o cap) per la TdC, o fins i tot ocultar-la de forma predeterminada:

TdC oculta

El codi per aconseguir-ho:

<details>
+    <summary>TdC oculta</summary>
+    <!-- toc -->
+</details>
+

Nota: Si actives la TdC amb toc = true i també afegeixes <!-- toc --> en algun lloc del teu text, obtindràs múltiples TdCs.

Si col·loques la TdC en un lloc diferent del predeterminat i li afegeixes un capçalera, segurament voldràs ocultar aquest capçalera de la TdC (consulta la secció per ocultar capçaleres). Pots fer-ho així:

+++
+title = "El títol del teu post"
+date = 2034-01-11
+
+[extra]
+toc_ignore_pattern = "^(Taula de contingut)"
++++
+
+Aquí va algun text introductori.
+
+### Taula de contingut
+
+<!-- toc -->
+
+## Primer encapçalament de contingut
+

Establint la profunditat màxima

Pots establir la profunditat màxima per la TdC especificant la variable toc_levels, que accepta un número enter entre 1 i 4:

[extra]
+toc_levels = 2
+

En aquest exemple, només els dos primers nivells d'encapçalaments s'inclourien a la TdC, independentment de les seves etiquetes HTML reals (h1, h2, h3, etc.). Si vols incloure només el nivell principal d'encapçalaments, estableix toc_levels = 1. El valor per defecte de toc_levels és 3.

Tingues en compte als teus lectors quan establertis toc_levels. Encara que pot ser temptador incloure molts nivells imbricats per a una navegació detallada, una TdC més curta i senzilla sovint és més amigable i menys aclaparadora.

Ocultant capçaleres de la TdC

És possible que vulguis amagar certes capçaleres. Per exemple, si el teu article té moltes Figures o Taules, aquestes podrien saturar la TdC. Pots ocultar capçaleres específiques a la TdC configurant la variable toc_ignore_pattern en la secció [extra] del front matter del teu post.

Aquesta variable espera una expressió regular (regex), ja que utilitza el test matching de Tera. El toc_ignore_pattern es prova contra el text del capçalera. Per exemple, per a la capçalera ### Lectura addicional, només el text Lectura addicional s'utilitzaria per comprovar si coincideix amb el patró.

Aquí tens alguns valors d'exemple per a toc_ignore_pattern juntament amb les capçaleres que amagarien:
toc_ignore_patternExclou capçaleres que…
Taulacontinguin "Taula"
^Figuracomencin amb "Figura"
(?i)(taula|figura)comencin amb "Taula" o "Figura" (insensible a majúscules/minúscules)
\[Esborrany\]$acabin amb "[Esborrany]".

Pots provar la teva expressió regular en plataformes com regex101 per assegurar-te que funciona com esperes.

Nota: Les capacitats de "look-around", incloent look-ahead i look-behind, no estan suportades.

Capçalera 1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Capçalera 2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Capçalera 3.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Capçalera 4.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Capçalera 4.2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Capçalera 3.2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Capçalera 4

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Capçalera 4

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Capçalera 2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Capçalera 3.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Capçalera 4.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Capçalera 4.2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Capçalera 3.2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Capçalera 4.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Capçalera 4.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

\ No newline at end of file diff --git a/ca/index.html b/ca/index.html new file mode 100644 index 000000000..f34adc097 --- /dev/null +++ b/ca/index.html @@ -0,0 +1 @@ +~/tabi
Publicacions recents
09 d’agost 2023

Aprèn a personalitzar tabi fent servir skins i establint un tema per defecte, aconseguint un aspecte únic.

Llegir més →
14 de juliol 2023

Descobreix com habilitar una secció de comentaris a les teves publicacions utilitzant giscus, utterances, Hyvor Talk, o Isso, permetent la interacció i feedback dels lectors.

Llegir més →
29 d’abril 2023

Aprèn com crear un subconjunt personalitzat que només inclogui els glifs necessaris.

Llegir més →
22 de febrer 2023

tabi té una Política de Seguretat de Contingut (CSP) fàcilment personalitzable amb valors segurs per defecte. Obtingues tranquil·litat i un A+ en l'Observatori de Mozilla.

Llegir més →
\ No newline at end of file diff --git a/ca/projects/chu/index.html b/ca/projects/chu/index.html new file mode 100644 index 000000000..2d53d55c0 --- /dev/null +++ b/ca/projects/chu/index.html @@ -0,0 +1 @@ +~/tabi • chu
chu
  • 0 min de lectura
\ No newline at end of file diff --git a/ca/projects/index.html b/ca/projects/index.html new file mode 100644 index 000000000..33593e77b --- /dev/null +++ b/ca/projects/index.html @@ -0,0 +1 @@ +~/tabi • Projectes
Projectes
img/tabi.webp

tabi

Un tema de Zola ràpid, lleuger i modern amb JavaScript opcional.
img/chu.webp

chu

Aplicació Flask per a càrregues de fitxers segures, amb eliminació de metadades, compressió, protecció amb contrasenya i més.
img/nani.webp

nani

Script Bash per crear URL públiques a partir de fitxers o text en servidors remots.
img/spectro.webp

spectro

Script de Bash per generar espectrogrames, comparar-los, carregar-los a Imgur i proporcionar els corresponents URLs per compartir-los.
\ No newline at end of file diff --git a/ca/projects/nani/index.html b/ca/projects/nani/index.html new file mode 100644 index 000000000..d09a470e5 --- /dev/null +++ b/ca/projects/nani/index.html @@ -0,0 +1 @@ +~/tabi • nani
nani
  • 0 min de lectura
\ No newline at end of file diff --git a/ca/projects/spectro/index.html b/ca/projects/spectro/index.html new file mode 100644 index 000000000..a7414b24f --- /dev/null +++ b/ca/projects/spectro/index.html @@ -0,0 +1 @@ +~/tabi • spectro
spectro
  • 0 min de lectura
\ No newline at end of file diff --git a/ca/projects/tabi/index.html b/ca/projects/tabi/index.html new file mode 100644 index 000000000..ef9423e19 --- /dev/null +++ b/ca/projects/tabi/index.html @@ -0,0 +1 @@ +~/tabi • tabi
tabi
  • 0 min de lectura
\ No newline at end of file diff --git a/ca/tags/funcionalitat/atom.xml b/ca/tags/funcionalitat/atom.xml new file mode 100644 index 000000000..6b68a8469 --- /dev/null +++ b/ca/tags/funcionalitat/atom.xml @@ -0,0 +1,112 @@ + + + + + + Aquest és un canal web + també conegut com a canal Atom + Subscriu-te + copiant l'URL de la barra d'adreces al teu lector de notícies + Visita + per aprendre més i començar + És gratuït + la web + Publicacions recents + + + ~/tabi - funcionalitat + tabi és un tema de Zola ràpid, lleuger i modern amb JavaScript opcional i una puntuació perfecta a Lighthouse. + + + Zola + 2023-09-08T00:00:00+00:00 + https://welpo.github.io/tabi/ca/tags/funcionalitat/atom.xml + + Personalitza el color de tabi i el tema per defecte + 2023-08-09T00:00:00+00:00 + 2023-08-10T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/customise-tabi/ + Aprèn a personalitzar tabi fent servir skins i establint un tema per defecte, aconseguint un aspecte únic. + + + Afegeix comentaris a les teves publicacions amb aquestes 4 plataformes + 2023-07-14T00:00:00+00:00 + 2023-07-26T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/comments/ + Descobreix com habilitar una secció de comentaris a les teves publicacions utilitzant giscus, utterances, Hyvor Talk, o Isso, permetent la interacció i feedback dels lectors. + + + Optimitza la càrrega amb un subconjunt de font personalitzat + 2023-04-29T00:00:00+00:00 + 2023-07-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/custom-font-subset/ + Aprèn com crear un subconjunt personalitzat que només inclogui els glifs necessaris. + + + Seguretat per defecte + 2023-02-22T00:00:00+00:00 + 2023-07-17T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/security/ + tabi té una Política de Seguretat de Contingut (CSP) fàcilment personalitzable amb valors segurs per defecte. Obtingues tranquil·litat i un A+ en l'Observatori de Mozilla. + + + Shortcodes personalitzats + 2023-02-19T00:00:00+00:00 + 2023-08-26T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/shortcodes/ + Aquest tema inclou alguns shortcodes personalitzats útils que pots utilitzar per millorar les teves publicacions. Ja sigui per mostrar imatges que s'adapten als temes clar i fosc, o per donar format a una secció de referències amb un aspecte professional, aquests shortcodes personalitzats t'ajudaran. + + + Exemples de Markdown + 2023-01-31T00:00:00+00:00 + 2023-09-01T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/markdown/ + Aquesta publicació mostra alguns exemples de format en Markdown, incloent-hi una taula, blocs de codi i etiquetes, citacions, taules i notes a peu de pàgina. + + + Sense JavaScript obligatori + 2023-01-06T00:00:00+00:00 + 2023-09-01T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/javascript/ + JavaScript només s'utilitza quan HTML i CSS no són suficients. + + + Taula de contingut + 2022-11-01T00:00:00+00:00 + 2023-09-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/toc/ + Una publicació que mostra la taula de contingut opcional i la seva configuració. + + diff --git a/ca/tags/funcionalitat/index.html b/ca/tags/funcionalitat/index.html new file mode 100644 index 000000000..183944b4c --- /dev/null +++ b/ca/tags/funcionalitat/index.html @@ -0,0 +1,2 @@ + + ~/tabi • funcionalitat
funcionalitat
09 d’agost 2023

Aprèn a personalitzar tabi fent servir skins i establint un tema per defecte, aconseguint un aspecte únic.

Llegir més →
14 de juliol 2023

Descobreix com habilitar una secció de comentaris a les teves publicacions utilitzant giscus, utterances, Hyvor Talk, o Isso, permetent la interacció i feedback dels lectors.

Llegir més →
29 d’abril 2023

Aprèn com crear un subconjunt personalitzat que només inclogui els glifs necessaris.

Llegir més →
22 de febrer 2023

tabi té una Política de Seguretat de Contingut (CSP) fàcilment personalitzable amb valors segurs per defecte. Obtingues tranquil·litat i un A+ en l'Observatori de Mozilla.

Llegir més →
19 de febrer 2023

Aquest tema inclou alguns shortcodes personalitzats útils que pots utilitzar per millorar les teves publicacions. Ja sigui per mostrar imatges que s'adapten als temes clar i fosc, o per donar format a una secció de referències amb un aspecte professional, aquests shortcodes personalitzats t'ajudaran.

Llegir més →
31 de gener 2023

Aquesta publicació mostra alguns exemples de format en Markdown, incloent-hi una taula, blocs de codi i etiquetes, citacions, taules i notes a peu de pàgina.

Llegir més →
06 de gener 2023

JavaScript només s'utilitza quan HTML i CSS no són suficients.

Llegir més →
01 de novembre 2022

Una publicació que mostra la taula de contingut opcional i la seva configuració.

Llegir més →
\ No newline at end of file diff --git a/ca/tags/index.html b/ca/tags/index.html new file mode 100644 index 000000000..9f69a116a --- /dev/null +++ b/ca/tags/index.html @@ -0,0 +1,2 @@ + + ~/tabi • Etiquetes
Totes les etiquetes
\ No newline at end of file diff --git a/ca/tags/markdown/atom.xml b/ca/tags/markdown/atom.xml new file mode 100644 index 000000000..29f646015 --- /dev/null +++ b/ca/tags/markdown/atom.xml @@ -0,0 +1,46 @@ + + + + + + Aquest és un canal web + també conegut com a canal Atom + Subscriu-te + copiant l'URL de la barra d'adreces al teu lector de notícies + Visita + per aprendre més i començar + És gratuït + la web + Publicacions recents + + + ~/tabi - markdown + tabi és un tema de Zola ràpid, lleuger i modern amb JavaScript opcional i una puntuació perfecta a Lighthouse. + + + Zola + 2023-09-08T00:00:00+00:00 + https://welpo.github.io/tabi/ca/tags/markdown/atom.xml + + Exemples de Markdown + 2023-01-31T00:00:00+00:00 + 2023-09-01T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/markdown/ + Aquesta publicació mostra alguns exemples de format en Markdown, incloent-hi una taula, blocs de codi i etiquetes, citacions, taules i notes a peu de pàgina. + + + Taula de contingut + 2022-11-01T00:00:00+00:00 + 2023-09-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/toc/ + Una publicació que mostra la taula de contingut opcional i la seva configuració. + + diff --git a/ca/tags/markdown/index.html b/ca/tags/markdown/index.html new file mode 100644 index 000000000..3d2c63eb6 --- /dev/null +++ b/ca/tags/markdown/index.html @@ -0,0 +1,2 @@ + + ~/tabi • markdown
markdown
31 de gener 2023

Aquesta publicació mostra alguns exemples de format en Markdown, incloent-hi una taula, blocs de codi i etiquetes, citacions, taules i notes a peu de pàgina.

Llegir més →
01 de novembre 2022

Una publicació que mostra la taula de contingut opcional i la seva configuració.

Llegir més →
\ No newline at end of file diff --git a/ca/tags/seguretat/atom.xml b/ca/tags/seguretat/atom.xml new file mode 100644 index 000000000..a664f8ca3 --- /dev/null +++ b/ca/tags/seguretat/atom.xml @@ -0,0 +1,35 @@ + + + + + + Aquest és un canal web + també conegut com a canal Atom + Subscriu-te + copiant l'URL de la barra d'adreces al teu lector de notícies + Visita + per aprendre més i començar + És gratuït + la web + Publicacions recents + + + ~/tabi - seguretat + tabi és un tema de Zola ràpid, lleuger i modern amb JavaScript opcional i una puntuació perfecta a Lighthouse. + + + Zola + 2023-07-17T00:00:00+00:00 + https://welpo.github.io/tabi/ca/tags/seguretat/atom.xml + + Seguretat per defecte + 2023-02-22T00:00:00+00:00 + 2023-07-17T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/security/ + tabi té una Política de Seguretat de Contingut (CSP) fàcilment personalitzable amb valors segurs per defecte. Obtingues tranquil·litat i un A+ en l'Observatori de Mozilla. + + diff --git a/ca/tags/seguretat/index.html b/ca/tags/seguretat/index.html new file mode 100644 index 000000000..41dfb73a1 --- /dev/null +++ b/ca/tags/seguretat/index.html @@ -0,0 +1,2 @@ + + ~/tabi • seguretat
seguretat
22 de febrer 2023

tabi té una Política de Seguretat de Contingut (CSP) fàcilment personalitzable amb valors segurs per defecte. Obtingues tranquil·litat i un A+ en l'Observatori de Mozilla.

Llegir més →
\ No newline at end of file diff --git a/ca/tags/shortcodes/atom.xml b/ca/tags/shortcodes/atom.xml new file mode 100644 index 000000000..d38d1bacb --- /dev/null +++ b/ca/tags/shortcodes/atom.xml @@ -0,0 +1,35 @@ + + + + + + Aquest és un canal web + també conegut com a canal Atom + Subscriu-te + copiant l'URL de la barra d'adreces al teu lector de notícies + Visita + per aprendre més i començar + És gratuït + la web + Publicacions recents + + + ~/tabi - shortcodes + tabi és un tema de Zola ràpid, lleuger i modern amb JavaScript opcional i una puntuació perfecta a Lighthouse. + + + Zola + 2023-08-26T00:00:00+00:00 + https://welpo.github.io/tabi/ca/tags/shortcodes/atom.xml + + Shortcodes personalitzats + 2023-02-19T00:00:00+00:00 + 2023-08-26T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/shortcodes/ + Aquest tema inclou alguns shortcodes personalitzats útils que pots utilitzar per millorar les teves publicacions. Ja sigui per mostrar imatges que s'adapten als temes clar i fosc, o per donar format a una secció de referències amb un aspecte professional, aquests shortcodes personalitzats t'ajudaran. + + diff --git a/ca/tags/shortcodes/index.html b/ca/tags/shortcodes/index.html new file mode 100644 index 000000000..e95cd9135 --- /dev/null +++ b/ca/tags/shortcodes/index.html @@ -0,0 +1,2 @@ + + ~/tabi • shortcodes
shortcodes
19 de febrer 2023

Aquest tema inclou alguns shortcodes personalitzats útils que pots utilitzar per millorar les teves publicacions. Ja sigui per mostrar imatges que s'adapten als temes clar i fosc, o per donar format a una secció de referències amb un aspecte professional, aquests shortcodes personalitzats t'ajudaran.

Llegir més →
\ No newline at end of file diff --git a/ca/tags/tutorial/atom.xml b/ca/tags/tutorial/atom.xml new file mode 100644 index 000000000..258f99ff9 --- /dev/null +++ b/ca/tags/tutorial/atom.xml @@ -0,0 +1,79 @@ + + + + + + Aquest és un canal web + també conegut com a canal Atom + Subscriu-te + copiant l'URL de la barra d'adreces al teu lector de notícies + Visita + per aprendre més i començar + És gratuït + la web + Publicacions recents + + + ~/tabi - tutorial + tabi és un tema de Zola ràpid, lleuger i modern amb JavaScript opcional i una puntuació perfecta a Lighthouse. + + + Zola + 2023-09-08T00:00:00+00:00 + https://welpo.github.io/tabi/ca/tags/tutorial/atom.xml + + Personalitza el color de tabi i el tema per defecte + 2023-08-09T00:00:00+00:00 + 2023-08-10T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/customise-tabi/ + Aprèn a personalitzar tabi fent servir skins i establint un tema per defecte, aconseguint un aspecte únic. + + + Afegeix comentaris a les teves publicacions amb aquestes 4 plataformes + 2023-07-14T00:00:00+00:00 + 2023-07-26T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/comments/ + Descobreix com habilitar una secció de comentaris a les teves publicacions utilitzant giscus, utterances, Hyvor Talk, o Isso, permetent la interacció i feedback dels lectors. + + + Optimitza la càrrega amb un subconjunt de font personalitzat + 2023-04-29T00:00:00+00:00 + 2023-07-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/custom-font-subset/ + Aprèn com crear un subconjunt personalitzat que només inclogui els glifs necessaris. + + + Sense JavaScript obligatori + 2023-01-06T00:00:00+00:00 + 2023-09-01T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/javascript/ + JavaScript només s'utilitza quan HTML i CSS no són suficients. + + + Taula de contingut + 2022-11-01T00:00:00+00:00 + 2023-09-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/toc/ + Una publicació que mostra la taula de contingut opcional i la seva configuració. + + diff --git a/ca/tags/tutorial/index.html b/ca/tags/tutorial/index.html new file mode 100644 index 000000000..2c531050a --- /dev/null +++ b/ca/tags/tutorial/index.html @@ -0,0 +1,2 @@ + + ~/tabi • tutorial
tutorial
09 d’agost 2023

Aprèn a personalitzar tabi fent servir skins i establint un tema per defecte, aconseguint un aspecte únic.

Llegir més →
14 de juliol 2023

Descobreix com habilitar una secció de comentaris a les teves publicacions utilitzant giscus, utterances, Hyvor Talk, o Isso, permetent la interacció i feedback dels lectors.

Llegir més →
29 d’abril 2023

Aprèn com crear un subconjunt personalitzat que només inclogui els glifs necessaris.

Llegir més →
06 de gener 2023

JavaScript només s'utilitza quan HTML i CSS no són suficients.

Llegir més →
01 de novembre 2022

Una publicació que mostra la taula de contingut opcional i la seva configuració.

Llegir més →
\ No newline at end of file diff --git a/custom_subset.css b/custom_subset.css new file mode 100644 index 000000000..95361a622 --- /dev/null +++ b/custom_subset.css @@ -0,0 +1 @@ +@font-face{font-family:"Inter Subset";src:url(data:application/font-woff2;base64,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);} diff --git a/es/archive/index.html b/es/archive/index.html new file mode 100644 index 000000000..323f0255f --- /dev/null +++ b/es/archive/index.html @@ -0,0 +1 @@ +~/tabi • Archivo
Archivo
\ No newline at end of file diff --git a/es/atom.xml b/es/atom.xml new file mode 100644 index 000000000..3bd30fb1a --- /dev/null +++ b/es/atom.xml @@ -0,0 +1,112 @@ + + + + + + Esta es una fuente web + también conocida como fuente Atom + Suscríbete + copiando la URL de la barra de direcciones en tu lector de noticias + Visita + para aprender más y empezar + Es gratis + la web + Publicaciones recientes + + + ~/tabi + tabi es un tema de Zola rápido, liviano y moderno con JavaScript opcional y una puntuación perfecta en Lighthouse. + + + Zola + 2023-09-08T00:00:00+00:00 + https://welpo.github.io/tabi/es/atom.xml + + Personaliza el color de tabi y el tema predeterminado + 2023-08-09T00:00:00+00:00 + 2023-08-10T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/customise-tabi/ + Aprende a personalizar tabi usando skins y estableciendo un tema predeterminado, haciendo que tu sitio sea único. + + + Añade comentarios a tus publicaciones con estas 4 plataformas + 2023-07-14T00:00:00+00:00 + 2023-07-26T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/comments/ + Descubre cómo habilitar una sección de comentarios en tus publicaciones usando giscus, utterances, Hyvor Talk, o Isso, permitiendo la interacción y feedback de los lectores. + + + Optimiza la carga con un subconjunto de fuente personalizado + 2023-04-29T00:00:00+00:00 + 2023-07-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/custom-font-subset/ + Aprende cómo crear un subconjunto personalizado que solo incluya los glifos necesarios. + + + Seguro por defecto + 2023-02-22T00:00:00+00:00 + 2023-07-17T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/security/ + tabi tiene una Política de Seguridad de Contenido (CSP) fácilmente personalizable con configuraciones seguras. Obtén tranquilidad y una calificación de A+ en Mozilla Observatory. + + + Shortcodes personalizados + 2023-02-19T00:00:00+00:00 + 2023-08-26T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/shortcodes/ + Este tema incluye algunos shortcodes personalizados útiles que puedes utilizar para mejorar tus publicaciones. Puedes mostrar imágenes que se adapten a los temas claro y oscuro, dar formato a una sección de referencias con un aspecto profesional, y más. + + + Ejemplos de Markdown + 2023-01-31T00:00:00+00:00 + 2023-09-01T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/markdown/ + Esta publicación muestra algunos ejemplos de formato Markdown, incluyendo una tabla, bloques de código y etiquetas, citas, tablas y notas al pie de página. + + + Sin JavaScript obligatorio + 2023-01-06T00:00:00+00:00 + 2023-09-01T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/javascript/ + JavaScript solo se utiliza cuando HTML y CSS no son suficientes. + + + Tabla de contenido + 2022-11-01T00:00:00+00:00 + 2023-09-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/toc/ + Una publicación que muestra la tabla de contenido opcional así como su configuración. + + diff --git a/es/blog/comments/index.html b/es/blog/comments/index.html new file mode 100644 index 000000000..ba5494a95 --- /dev/null +++ b/es/blog/comments/index.html @@ -0,0 +1,54 @@ +~/tabi • Añade comentarios a tus publicaciones con estas 4 plataformas
Añade comentarios a tus publicaciones con estas 4 plataformas

tabi actualmente soporta cuatro sistemas de comentarios: giscus y utterances, Hyvor Talk e Isso.

giscus y utterances son proyectos de código abierto que te permiten añadir una sección de comentarios a tu sitio web usando las «issues» (utterances) o «discussions» (giscus) de GitHub. Son perfectos para generadores de sitios estáticos como Zola, ya que permiten a tus lectores interactuar y dejar comentarios en tus publicaciones sin requerir un backend tradicional ni una base de datos.

Al estar basados en GitHub, giscus y utterances requieren que los usuarios tengan una cuenta en dicha plataforma y autoricen la respectiva aplicación. Alternativamente, los visitantes también pueden comentar directamente en la discusión o «issue» correspondiente de GitHub.

Ambas son excelentes herramientas para agregar comentarios a tu blog, pero giscus tiene algunas ventajas:

  • Más temas.
  • Soporte para reacciones.
  • Respuestas a comentarios y vista de conversación.
  • Más seguro: utterances requiere habilitar estilos en línea inseguros («unsafe inline styles») para ajustar la altura del frame; giscus no.
  • Soporte multilingüe: utterances solo está disponible en inglés; giscus soporta más de 20 idiomas.
  • Desarrollo más activo: el último commit de giscus, a fecha de esta publicación, fue hace una dos días. El último commit de utterances fue hace más de un año.

Hyvor Talk es una plataforma de comentarios de pago centrada en la privacidad. Ofrece todas las ventajas de giscus y algunas más, como moderación y detección de spam.

Isso es un sistema de comentarios de código abierto y autoalojado que almacena los comentarios en su propia base de datos. Una de sus principales ventajas es la privacidad; no comparte los datos de los usuarios con terceros. También tiene una interfaz ligera y limpia, lo que facilita que tus visitantes dejen comentarios. Isso también permite comentarios anónimos, lo que podría aumentar la participación de los usuarios en tu sitio web.

Configuración

Sistemas basados en GitHub

giscus y utterances requieren una configuración similar. Primero, visita el sitio web del sistema que quieras habilitar: giscus.app o utteranc.es.

Sigue las instrucciones de la sección Configuración del sitio web, y elige las opciones que prefieras. Luego, establece los valores que se muestran en la sección Habilitar giscus/utterances (el bloque de código script) en la sección correspondiente de tu config.toml: [extra.giscus] o [extra.utterances].

giscus

giscus tiene algunos ajustes más que utterances:

[extra.giscus]
+enabled_for_all_posts = false
+automatic_loading = true
+repo = "tuNombreDeUsuarioDeGithub/tuRepositorio"
+repo_id = "TuIDdeRepositorio"
+category = "Anuncios"
+category_id = "TuIDdeCategoría"
+mapping = "slug"
+strict_title_matching = 1  # 1 para habilitar, 0 para deshabilitar.
+enable_reactions = 1  # 1 para habilitar, 0 para deshabilitar.
+comment_box_above_comments = true
+light_theme = "noborder_light"
+dark_theme = "noborder_dark"
+lang = ""  # Deja en blanco para que coincida con el idioma de la página.
+lazy_loading = true
+

utterances

[extra.utterances]
+enabled_for_all_posts = false
+automatic_loading = true
+repo = "tuNombreDeUsuarioDeGithub/tuRepositorio"
+issue_term = "slug"
+label = "💬"
+light_theme = "github-light"
+dark_theme = "photon-dark"
+lazy_loading = true
+

Hyvor Talk

Configura tu web desde la consola de Hyvor Talk y rellena las opciones en config.toml:

[extra.hyvortalk]
+enabled_for_all_posts = false
+automatic_loading = true
+website_id = "1234"
+page_id_is_slug = true
+lang = ""
+page_author = ""  # Correo (o correo codificado en base64) del autor.
+lazy_loading = true
+

Isso

Para habilitar Isso, primero necesitarás instalar y ejecutar un servidor Isso (aquí tienes una guía útil). Luego, completa estas configuraciones en config.toml:

[extra.isso]
+enabled_for_all_posts = false
+automatic_loading = true
+endpoint_url = "https://example.com/comments/"  # URL a Isso.
+page_id_is_slug = true
+lang = ""
+max_comments_top = "inf"
+max_comments_nested = "5"
+avatar = true
+voting = true
+page_author_hashes = ""
+lazy_loading = true
+

Ajustes comunes

La opción enabled_for_all_posts = true habilitará globalmente el sistema de comentarios correspondiente.

Alternativamente, puedes habilitar los comentarios en publicaciones concretas añadiendo el nombre del sistema (utterances, giscus, hyvortalk o isso) = true. Por ejemplo, así habilitarías giscus:

title = "Los molinos de viento de mi vida: reflexiones de un escudero"
+date = 1605-01-16
+description = "Mi viaje junto a Don Quijote, enfrentándome a gigantes imaginarios y descubriendo las verdaderas batallas de la vida."
+
+[taxonomies]
+tags = ["personal", "reflexiones"]
+
+[extra]
+giscus = true
+

Si accidentalmente habilitas más de un sistema, Zola mostrará un error.

Si tu web tiene múltiples idiomas con publicaciones coincidentes (como esta demo), y te gustaría compartir comentarios entre idiomas, debes usar issue_term = "slug" (en el caso de giscus y utterances) o page_id_is_slug = true (para Hyvor Talk e Isso). Esto usará el nombre del archivo Markdown (sin la etiqueta de idioma) como identificador. Todas las demás opciones crearán diferentes secciones de comentarios para cada idioma.

Ejemplo en vivo

Al final de esta publicación encontrarás el widget de giscus usando los ajustes mostrados arriba.

\ No newline at end of file diff --git a/es/blog/custom-font-subset/index.html b/es/blog/custom-font-subset/index.html new file mode 100644 index 000000000..1c3b0c1e6 --- /dev/null +++ b/es/blog/custom-font-subset/index.html @@ -0,0 +1,114 @@ +~/tabi • Optimiza la carga con un subconjunto de fuente personalizado
Optimiza la carga con un subconjunto de fuente personalizado

El problema

Las fuentes personalizadas causan parpadeo de texto en Firefox. Para ver un gif y más detalles, mira esta issue.

La solución

Para solucionar esto, tabi carga un subconjunto de glifos para el encabezado. Dado que esto aumenta ligeramente el tiempo de carga inicial, es una buena idea tratar de minimizar el tamaño de este subconjunto.

Por defecto, tabi incluye archivos de subconjuntos para caracteres en inglés y español (con algunos símbolos). Estos archivos se cargan cuando la página o el sitio de Zola está en ese idioma.

Para una optimización adicional, puedes crear un subconjunto de fuentes personalizado que solo incluya los caracteres utilizados en tu encabezado.

Requisitos

Instala estas herramientas:

Ejecuta pip install fonttools brotli para instalar ambas.

El script

El script que sigue toma un archivo config.toml y un archivo de fuente como entrada, extrae los caracteres necesarios, crea un subconjunto de la fuente y genera un archivo CSS que contiene el subconjunto codificado en base64.

#!/usr/bin/env bash
+
+usage() {
+    echo "Usage: $0 [--config | -c CONFIG_FILE] [--font | -f FONT_FILE] [--output | -o OUTPUT_PATH]"
+    echo
+    echo "Options:"
+    echo "  --config, -c   Path to the config.toml file."
+    echo "  --font, -f     Path to the font file."
+    echo "  --output, -o   Output path for the generated custom_subset.css file (default: current directory)"
+    echo "  --help, -h     Show this help message and exit"
+}
+
+# La salida predeterminada es el directorio actual.
+output_path="."
+
+# Analiza las opciones de la línea de comandos.
+while [ "$#" -gt 0 ]; do
+    case "$1" in
+        --config|-c)
+            config_file="$2"
+            shift 2
+            ;;
+        --font|-f)
+            font_file="$2"
+            shift 2
+            ;;
+        --output|-o)
+            output_path="$2"
+            shift 2
+            ;;
+        --help|-h)
+            usage
+            exit 0
+            ;;
+        *)
+            echo "Unknown option: $1"
+            usage
+            exit 1
+            ;;
+    esac
+done
+
+# Comprueba si se proporcionan las opciones -c y -f.
+if [ -z "$config_file" ]; then
+    echo "Error: --config|-c option is required."
+    usage
+    exit 1
+fi
+
+if [ -z "$font_file" ]; then
+    echo "Error: --font|-f option is required."
+    usage
+    exit 1
+fi
+
+# Comprueba si existen los archivos de configuración y de fuentes.
+if [ ! -f "$config_file" ]; then
+    echo "Error: Config file '$config_file' not found."
+    exit 1
+fi
+
+if [ ! -f "$font_file" ]; then
+    echo "Error: Font file '$font_file' not found."
+    exit 1
+fi
+
+# Extrae el título y los nombres de los menús del archivo de configuración.
+title=$(awk -F' = ' '/^title/{print $2}' "$config_file" | tr -d '"')
+menu_names=$(awk -F' = ' '/^menu/{f=1;next} /socials/{f=0} f && /name/{print $2}' "$config_file" | cut -d',' -f1 | tr -d '"' )
+language_names=$(awk -F' = ' '/^language_name\./{print $2}' "$config_file" | tr -d '"' )
+
+# Si el sitio es multilingüe, obtiene las traducciones de los menús.
+if [ -n "$language_names" ]; then
+    for menu_name in $menu_names; do
+        # Find the line with the menu name inside a [languages.*.translations] section and get the translated menus.
+        menu_translation=$(awk -F' = ' "/\\[languages.*\\.translations\\]/{f=1;next} /^\\[/ {f=0} f && /$menu_name =/{print \$2}" "$config_file" | tr -d '"' )
+        # Add the found menu value to the translations string
+        menu_names+="$menu_translation"
+    done
+fi
+
+# Combina las cadenas extraídas.
+combined="$title$menu_names$language_names"
+
+# Obtiene los caracteres únicos.
+unique_chars=$(echo "$combined" | grep -o . | sort -u | tr -d '\n')
+
+# Crea un archivo temporal para subset.woff2.
+temp_subset=$(mktemp)
+
+# Crea el subconjunto.
+pyftsubset "$font_file" \
+    --text="$unique_chars" \
+    --layout-features="*" --flavor="woff2" --output-file="$temp_subset" --with-zopfli
+
+# Codifica en Base64 el archivo temporal subset.woff2 y crea el archivo CSS.
+base64_encoded_font=$(base64 -i "$temp_subset")
+echo "@font-face{font-family:\"Inter Subset\";src:url(data:application/font-woff2;base64,$base64_encoded_font);}" > "$output_path/custom_subset.css"
+
+# Elimina el archivo temporal subset.woff2.
+rm "$temp_subset"
+

Uso

Guarda el script en algún lugar como ~/bin/subset_font. Hazlo ejecutable con chmod +x ~/bin/subset_font.

Ahora puedes ejecutarlo con las opciones requeridas --config y --font:

~/bin/subset_font --config path/to/config.toml --font path/to/font.woff2
+

De forma predeterminada, esto generará un archivo custom_subset.css en el directorio actual. Usa -o o --output para especificar una ruta diferente:

~/bin/subset_font -c path/to/config.toml -f path/to/font.woff2 -o path/to/output
+

Coloca este archivo custom_subset.css dentro del directorio static/.

Automatización con un Pre-commit Hook

Es posible que cambies el título o las opciones del menú de tu sitio, lo que haría que el subconjunto personalizado deje de ser útil.

Para automatizar el proceso de creación de este archivo, puedes integrar el script en un gancho (hook) pre-commit de Git que se active al detectar cambios en el archivo config.toml, ejecute el script y guarde el archivo CSS resultante en el directorio static/ de tu sitio.

  1. Crea un archivo .git/hooks/pre-commit en tu proyecto de Git, si aún no existe.

  2. Hazlo ejecutable con chmod +x .git/hooks/pre-commit.

  3. Agrega el siguiente código al archivo:

# Comprueba si config.toml se ha modificado.
+if git diff --cached --name-only | grep -q "config.toml"; then
+    echo "config.toml modified. Running subset_font…"
+
+    # Ejecuta el script subset_font.
+    ~/bin/subset_font -c config.toml -f static/fonts/Inter4.woff2 -o static/
+
+    # Añadie el subset.css recién generado al commit.
+    git add static/custom_subset.css
+fi
+

Asegúrate de modificar el script para que coincida con la ruta donde has guardado el script subset_font. Las rutas de configuración y fuente deberían funcionar correctamente con la configuración predeterminada de tabi.

Ahora, cada vez que hagas cambios en tu proyecto de Git y los confirmes, el gancho pre-commit verificará las modificaciones en el archivo config.toml y ejecutará automáticamente el script subset_font para actualizar el archivo custom_subset.css.

Por cierto, si te interesa una forma de actualizar automáticamente la fecha de tus publicaciones en Zola o comprimir automáticamente tus archivos PNG, echa un vistazo a esta publicación.

Si deseas utilizar todos los scripts a la vez (compresión de archivos PNG, actualización de la fecha y creación del subconjunto de fuentes), combina su código en un solo archivo .git/hooks/pre-commit.

\ No newline at end of file diff --git a/es/blog/customise-tabi/index.html b/es/blog/customise-tabi/index.html new file mode 100644 index 000000000..1eb74277d --- /dev/null +++ b/es/blog/customise-tabi/index.html @@ -0,0 +1,13 @@ +~/tabi • Personaliza el color de tabi y el tema predeterminado
Personaliza el color de tabi y el tema predeterminado

tabi puede ser personalizado de dos maneras: estableciendo el tema predeterminado (oscuro o claro) y eligiendo el color principal para el tema ("skin").

Tema predeterminado

Para configurar permanentemente tu sitio en el tema oscuro o claro, necesitas desactivar el theme_switcher en config.toml y establecer tu tema preferido (light o dark) como el default_theme.

Por ejemplo, para tener un tema oscuro permanente:

[extra]
+theme_switcher = false
+default_theme = "dark"
+

Si tu interruptor de modo claro/oscuro está activado, el default_theme sólo se usará como respaldo, en caso de que un visitante tenga JavaScript desactivado.

Skins

¿No te gusta el aguamarina? ¡No hay problema! tabi tiene 12 skins (pieles) para elegir. Si ninguna de estas te convence, puedes crear tu propia skin.

Una skin es un archivo CSS con dos variables: el color principal para el tema claro y el color principal para el tema oscuro.

Activar una skin es tan fácil como establecer la variable skin en tu config.toml con el nombre de la skin. Por ejemplo:

[extra]
+skin = "sakura"
+

Echa un vistazo a las pieles disponibles a continuación.

Haz clic en las imágenes para cambiar entre los temas oscuro y claro.


Aguamarina

La skin predeterminada. Si la variable skin no está configurada (o es igual a "teal"), este es el aspecto de tabi:


Lavanda

Aplica esta skin con skin = "lavender".


Rojo

Cambia a esta skin con la configuración skin = "red".


Menta

Una skin hecha por 🅿️.

Actívala con skin = "mint".


Sakura

Inspirada en la temporada de florecimiento de los cerezos en Japón.

Para activar esta skin, ajusta skin = "sakura".


Azul

Para lograr esta apariencia, establece skin = "blue".


Lingote índigo

Índigo por el azul (en el tema claro) y lingote por el oro (en el tema oscuro).

Para activar esta skin, usa skin = "indigo_ingot".


Evangelion

Inspirada en los colores de la Unidad-01 de Evangelion (en el tema oscuro) y el EVA-02 (en el tema claro).

Actívala con skin = "evangelion".


Monocromático

Si te gusta este look, usa skin = "monochrome".


Naranja (bajo contraste)

¡ADVERTENCIA! El tema claro de esta skin podría tener poco contraste, afectando la accesibilidad y la calificación de Lighthouse. (El tema oscuro tiene buen contraste.)

Para activarla, configura skin = "lowcontrast_orange".


Melocotón (bajo contraste)

¡ADVERTENCIA! El tema claro de esta skin podría tener poco contraste, afectando la accesibilidad y la calificación de Lighthouse. (El tema oscuro tiene buen contraste.)

Especifica skin = "lowcontrast_peach" para usar esta skin.


Rosa (bajo contraste)

¡ADVERTENCIA! El tema claro de esta skin podría tener poco contraste, afectando la accesibilidad y la calificación de Lighthouse. (El tema oscuro tiene buen contraste.)

Para usar estos colores, asigna skin = "lowcontrast_pink".


Crea tu propia skin

No estás limitado a las skins predefinidas. ¿Por qué no diseñas un aspecto único que te represente?

Puedes guardar tu nueva skin en cualquiera de estos dos directorios:

  1. Dentro del directorio del tema: themes/tabi/sass/skins
  2. Dentro del directorio principal de tu sitio: sass/skins (necesitarás crear esta carpeta)

Crea un nuevo archivo .scss (por ejemplo, tu_skin.scss) en la ubicación que prefieras. Este archivo debe contener estas dos variables (esta es la skin predeterminada, "teal"):

:root {
+    --primary-color: #087e96;
+}
+
+[data-theme='dark'] {
+    --primary-color: #91e0ee;
+}
+

Modifica los colores a tu gusto. Una vez que estés satisfecho, actualiza la variable skin para que coincida con el nombre de tu archivo.

Recuerda tener en cuenta la accesibilidad de los colores que elijas. Aquí tienes un enlace que te puede ayudar: WebAIM: Contrast Checker. El fondo del tema claro es #fff, y el del tema oscuro #1f1f1f.

\ No newline at end of file diff --git a/es/blog/index.html b/es/blog/index.html new file mode 100644 index 000000000..d13ae3b3f --- /dev/null +++ b/es/blog/index.html @@ -0,0 +1 @@ +~/tabi • Blog
Blog
09 agosto 2023

Aprende a personalizar tabi usando skins y estableciendo un tema predeterminado, haciendo que tu sitio sea único.

Leer más →
14 julio 2023

Descubre cómo habilitar una sección de comentarios en tus publicaciones usando giscus, utterances, Hyvor Talk, o Isso, permitiendo la interacción y feedback de los lectores.

Leer más →
29 abril 2023

Aprende cómo crear un subconjunto personalizado que solo incluya los glifos necesarios.

Leer más →
22 febrero 2023

tabi tiene una Política de Seguridad de Contenido (CSP) fácilmente personalizable con configuraciones seguras. Obtén tranquilidad y una calificación de A+ en Mozilla Observatory.

Leer más →
19 febrero 2023

Este tema incluye algunos shortcodes personalizados útiles que puedes utilizar para mejorar tus publicaciones. Puedes mostrar imágenes que se adapten a los temas claro y oscuro, dar formato a una sección de referencias con un aspecto profesional, y más.

Leer más →
\ No newline at end of file diff --git a/es/blog/javascript/index.html b/es/blog/javascript/index.html new file mode 100644 index 000000000..3ccd081e3 --- /dev/null +++ b/es/blog/javascript/index.html @@ -0,0 +1 @@ +~/tabi • Sin JavaScript obligatorio
Sin JavaScript obligatorio

Este tema no requiere JavaScript de manera obligatoria. Opcionalmente, puede cargar una cantidad mínima de JavaScript para añadir algunas características que son imposibles de lograr con solo HTML y CSS.

Opciones habilitadas globalmente

  • El interruptor de modo claro/oscuro puede habilitarse configurando theme_switcher = true en la sección [extra] de tu config.toml (~900 bytes de JavaScript).

  • Descodificación de correo electrónico (~400 bytes). Para proteger contra bots que recopilan correos electrónicos desde tu sitio web, puedes configurar encode_plaintext_email = true. Si tu sitio está en un repositorio público, para mayor protección, considera configurar tu email como una cadena codificada en base641.

Opciones que se pueden sobreescribir de forma jerárquica

Las siguientes opciones pueden especificarse para publicaciones, secciones y a nivel global, siguiendo la jerarquía de página > sección > config.toml:

Para especificar estas opciones:

  • Globalmente: Añádelas en la sección [extra] de tu config.toml.
  • Para una sección: Añádelas en la sección [extra] del front matter del _index.md de la sección.
  • Para una publicación individual: Configura las variables correspondientes en la sección [extra] del front matter de la publicación.

Opciones que pueden habilitarse globalmente o para publicaciones individuales

  • Comentarios. giscus (2 KB), utterances (1 KB), Hyvor Talk (~800 bytes) o Isso (1KB) pueden habilitarse globalmente configurando enabled_for_all_posts = true en la sección apropiada de tu config.toml ([extra.giscus], [extra.utterances], [extra.hyvortalk] o [extra.isso]). Para habilitar comentarios en publicaciones individuales, configura el nombre del sistema = true (por ejemplo, hyvortalk = true) en el front matter de la publicación.

Aparte de eso, es un tema rápido con HTML y CSS que funciona con JavaScript deshabilitado. Justo como debería ser (la mayoría de) la web :-)


1

Para codificar tu correo electrónico en base64 puedes usar herramientas en línea o, en tu terminal, ejecutar: printf 'mail@example.com' | base64.

\ No newline at end of file diff --git a/es/blog/markdown/index.html b/es/blog/markdown/index.html new file mode 100644 index 000000000..010e6b4a1 --- /dev/null +++ b/es/blog/markdown/index.html @@ -0,0 +1,9 @@ +~/tabi • Ejemplos de Markdown
Ejemplos de Markdown

$\KaTeX$

$\KaTeX$ es una biblioteca rápida y fácil de usar que permite la representación de notación matemática utilizando sintaxis LaTeX.

Puedes usar $\KaTeX$ en línea al envolver la expresión entre $ o entre \\( y \\).

Por ejemplo, $ \sin(x) = \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n + 1)!} x^{2n + 1} $ se mostraría como: $ \sin(x) = \sum_{n=0}^{\infty} \frac{(-1)^n}{(2n + 1)!} x^{2n + 1} $

Para mostrar la expresión en su propia línea y centrada, envuélvela entre $$ o entre \\[ y \\].

Por ejemplo, \\[ r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i - \bar{y})^2}} \\] se mostraría como: \[ r = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n}(x_i - \bar{x})^2}\sqrt{\sum_{i=1}^{n}(y_i - \bar{y})^2}} \]

Para activar $\KaTeX$ en una publicación o sección entera, incluye katex = true dentro de la sección [extra] del encabezado. Por ejemplo:

title = "Probando KaTeX"
+date = 2002-11-30
+
+[extra]
+katex = true
+

Para activarlo globalmente, añade katex = true en la sección [extra] de tu config.toml.

Para un mejor rendimiento y seguridad, el JavaScript, CSS y las fuentes de $\KaTeX$ se alojan localmente.

Nota: Después de habilitar $\KaTeX$, si deseas usar $ sin representar una expresión matemática, escápalo con una sola barra invertida: \$.

Tabla

Aquí tienes un ejemplo de una tabla1. Los colores cambian dependiendo del tema actual.
SímboloElementoNúmero atómico
HHidrógeno1
CCarbono6
FeHierro26
AuOro79

Bloque de código

fn main() {
+    println!("¡Hola, mundo!") -> ();
+}
+

Etiquetas de código

En Rust, declaras una variable mutable con let mut x = 5;, mientras que en Python, simplemente usas x = 5. De manera similar, para imprimir un valor en Rust, utilizarías println!("Valor: {}", x);, pero en Python, es tan sencillo como print(f"Valor: {x}").

Cita

«A mí me sobra el cuerpo, Orfeo, me sobra el cuerpo porque me falta alma.»

— Miguel de Unamuno, Niebla


1

¡Y aquí tienes un ejemplo de una nota al pie de página!

\ No newline at end of file diff --git a/es/blog/page/1/index.html b/es/blog/page/1/index.html new file mode 100644 index 000000000..5989c580c --- /dev/null +++ b/es/blog/page/1/index.html @@ -0,0 +1 @@ +Redirect

Click here to be redirected. \ No newline at end of file diff --git a/es/blog/page/2/index.html b/es/blog/page/2/index.html new file mode 100644 index 000000000..f634b1e93 --- /dev/null +++ b/es/blog/page/2/index.html @@ -0,0 +1 @@ +~/tabi • Blog

Blog
31 enero 2023

Esta publicación muestra algunos ejemplos de formato Markdown, incluyendo una tabla, bloques de código y etiquetas, citas, tablas y notas al pie de página.

Leer más →
06 enero 2023

JavaScript solo se utiliza cuando HTML y CSS no son suficientes.

Leer más →
01 noviembre 2022

Una publicación que muestra la tabla de contenido opcional así como su configuración.

Leer más →
\ No newline at end of file diff --git a/es/blog/security/index.html b/es/blog/security/index.html new file mode 100644 index 000000000..213591150 --- /dev/null +++ b/es/blog/security/index.html @@ -0,0 +1,9 @@ +~/tabi • Seguro por defecto
Seguro por defecto

La configuración predeterminada del tema obtiene una calificación de A+ en Mozilla Observatory.1

Esto se logra configurando programáticamente las cabeceras de la Política de Seguridad de Contenido (CSP) en función de una lista de dominios permitidos definida por el usuario en el archivo config.toml. Aquí tienes la configuración predeterminada y recomendada (puedes eliminar la última directiva si no deseas insertar videos de YouTube):

[extra]
+allowed_domains = [
+    { directive = "font-src", domains = ["'self'", "data:"] },
+    { directive = "img-src", domains = ["'self'", "https://*", "data:"] },
+    { directive = "script-src", domains = ["'self'"] },
+    { directive = "style-src", domains = ["'self'"] },
+    { directive = "frame-src", domains = ["https://www.youtube-nocookie.com"] },
+]
+

La lista allowed_domains especifica las URL a las que el sitio web debería poder conectarse, y cada dominio de la lista se asocia con una directiva CSP como frame-src, connect-src o script-src. El archivo templates/partials/header.html genera dinámicamente la cabecera CSP en función de esta lista.

Esta función permite personalizar fácilmente las cabeceras de seguridad del sitio web para permitir casos de uso específicos, como la incrustación de videos de YouTube, la carga de scripts o fuentes remotas (no recomendado).

Nota: habilitar los comentarios permite automáticamente scripts y frames del sistema de comentarios correspondiente, así como estilos unsafe-inline en el caso de utterances o Hyvor Talk.

1

Requiere una configuración adecuada del servidor web (por ejemplo, redirigir el tráfico HTTP a HTTPS).

\ No newline at end of file diff --git a/es/blog/shortcodes/index.html b/es/blog/shortcodes/index.html new file mode 100644 index 000000000..da5fa7531 --- /dev/null +++ b/es/blog/shortcodes/index.html @@ -0,0 +1,23 @@ +~/tabi • Shortcodes personalizados
Shortcodes personalizados

Shortcodes de imagen

Nota: todos los shortcodes de imagen tienen dos parámetros opcionales: full_width, que tiene como valor predeterminado false (ver más abajo), y lazy_loading, que tiene como valor predeterminado true.

Imágenes de doble tema

Útil si deseas usar una imagen diferente para los temas claro y oscuro:

La Torre EiffelLa Torre Eiffel

Uso

{{ dual_theme_image(light_src="img/paris_day.webp", dark_src="img/paris_night.webp" alt="La Torre Eiffel") }}
+

Imagen invertible

Ideal para gráficos, dibujos lineales, diagramas... Invierte los colores de la imagen. La imagen de origen se utilizará para el tema claro.

Gráfico invertible

Uso

{{ invertible_image(src="img/graph.webp", alt="Gráfico invertible") }}
+

Imagen atenuable

Las imágenes con demasiado brillo o contraste pueden ser demasiado discordantes en un fondo oscuro. Aquí tienes un ejemplo de una fotografía que se atenúa cuando el tema oscuro está activo.

Fotografía de un desierto, cielo celestial

Uso

{{ dimmable_image(src="img/desert_by_oskerwyld.webp", alt="Fotografía de un desierto, cielo celestial") }}
+

Cambio de imagen al pasar el cursor

La imagen mostrada cambia cuando el usuario pasa el cursor por encima. Útil para comparaciones de antes y después, por ejemplo.

Foto editada
Foto original

Uso

{{ image_hover(default_src="img/before.webp", hovered_src="img/after.webp", default_alt="Imagen editada", hovered_alt="Toma original") }}
+

Cambio de imagen vía click

Muestra una imagen y cambia a una diferente al hacer clic. Ideal para destacar diferencias o llamar la atención sobre detalles.

Uso

{{ image_toggler(default_src="img/mojave_day.webp", toggled_src="img/mojave_night.webp", default_alt="Mojave durante el día", toggled_alt="Mojave durante la noche") }}
+

Imagen a ancho completo

La imagen se expandirá para coincidir con el ancho del encabezado, que generalmente es más ancho que el texto del artículo (excepto en móvil/ventanas pequeñas).

Todos los otros shortcodes de imágenes pueden usar el ancho completo asignando el valor true al parámetro opcional full_width.

Fotografía de un canal en Ámsterdam

Uso

{{ full_width_image(src="img/amsterdam_by_oskerwyld.webp", alt="Fotografía de un canal en Ámsterdam") }}
+

Shortcodes de texto

Citas multilenguaje

Este shortcode permite mostrar una cita traducida y en su lenguaje original:

«Lo terrible no es sufrir o morir, sino morir en vano.»

— Jean-Paul Sartre

«Ce qui est terrible, ce n’est pas de souffrir ni de mourir, mais de mourir en vain.»

— Jean-Paul Sartre

Uso

{{ multilingual_quote(original="Ce qui est terrible, ce n’est pas de souffrir ni de mourir, mais de mourir en vain.", translated="Lo terrible no es sufrir o morir, sino morir en vano.", author="Jean-Paul Sartre") }}
+

Referencias con sangría francesa

Este shortcode formatea una sección de referencias con sangría francesa de la siguiente manera:

Alderson, E. (2015). Ciberseguridad y justicia social: Una crítica a la hegemonía corporativa en un mundo digital. New York Journal of Technology, 11(2), 24-39. https://doi.org/10.1007/s10198-022-01497-6.

Funkhouser, M. (2012). Las normas sociales de indecencia: Un análisis del comportamiento desviado en la sociedad contemporánea. Los Angeles Journal of Sociology, 16(3), 41-58. https://doi.org/10.1093/jmp/jhx037.

Schrute, D. (2005). La revolución de la agricultura de remolacha: Un análisis de la innovación agrícola. Scranton Agricultural Quarterly, 38(3), 67-81.

Steinbrenner, G. (1997). El análisis costo-beneficio de George Costanza: Un examen del comportamiento de toma de riesgos en el lugar de trabajo. New York Journal of Business, 12(4), 112-125.

Winger, J. A. (2010). El arte del debate: Un examen de la retórica en el modelo de las Naciones Unidas del Greendale Community College. Colorado Journal of Communication Studies, 19(2), 73-86. https://doi.org/10.1093/6seaons/1movie.

Uso

{% references() %}
+
+Tus referencias van aquí.
+
+Cada una en una línea nueva. Se renderizará Markdown (enlaces, cursivas…).
+
+{% end %}
+

Spoilers

Este shortcode permite ocultar texto que se revelará al hacer clic. Por ejemplo: las galletas de la fortuna tiene su origen en

Como ves, el Markdown se renderiza.

Este shortcode tiene la opción fixed_blur para difuminar el texto "SPOILER", en lugar de difuminar el contenido real. Por ejemplo: es esperar 24 horas antes de denunciar la desaparición de una persona.

Uso

{{ spoiler(text="texto que ocultar", fixed_blur=false) }}
+

Contenedores

Contenedor ancho

Utiliza este código corto si deseas tener una tabla, párrafo, bloque de código… más ancho. En escritorio, ocupará el ancho del encabezado. En móviles no tendrá efecto, excepto para las tablas, que ganarán scroll horizontal.

TítuloAñoDirectorDirector de FotografíaGéneroIMDbDuración
Beoning2018Lee Chang-dongHong Kyung-pyoDrama/Misterio7.5148 min
The Master2012Paul Thomas AndersonMihai Mălaimare Jr.Drama/Historia7.1137 min
The Tree of Life2011Terrence MalickEmmanuel LubezkiDrama6.8139 min

Uso

{% wide_container() %}
+
+Coloca tu bloque de código, párrafo, tabla… aquí.
+
+El Markdown, por supuesto, será interpretado.
+
+{% end %}
+
\ No newline at end of file diff --git a/es/blog/toc/index.html b/es/blog/toc/index.html new file mode 100644 index 000000000..c2b296970 --- /dev/null +++ b/es/blog/toc/index.html @@ -0,0 +1,25 @@ +~/tabi • Tabla de contenido
Tabla de contenido

Documentación

Habilitando (y posicionando) la Tabla de Contenido

Hay dos formas de habilitar la Tabla de Contenido (TdC). Si quieres que esté justo debajo del encabezado (como en esta página), configura esta variable en el front matter de tu post:

[extra]
+toc = true
+

Si prefieres situar la TdC en otro lugar de tu post (por ejemplo, después de una introducción), puedes hacerlo añadiendo una línea con este contenido ahí donde quieras que aparezca la TdC:

<!-- toc -->
+

También puedes usar el shortcode {{ toc() }}, que simplemente insertará ese texto por ti (idea de Michael Clayton).

Este método renderizará la TdC sin el encabezado "Tabla de contenido". Esto te permite usar un encabezado diferente (o ninguno) para la TdC, o incluso ocultarla de forma predeterminada:

TdC oculta

El código para lograr esto:

<details>
+    <summary>TdC oculta</summary>
+    <!-- toc -->
+</details>
+

Nota: Si activas la TdC a través de toc = true y además añades <!-- toc --> en algún lugar de tu texto, obtendrás múltiples TdCs.

Si colocas la TdC en algún lugar distinto al predeterminado y le añades un encabezado, seguramente quieras ocultar dicho encabezado de la TdC (consulta la sección para ocultar encabezados). Puedes lograrlo así:

+++
+title = "El título de tu post"
+date = 2034-01-11
+
+[extra]
+toc_ignore_pattern = "^(Tabla de contenido)"
++++
+
+Aquí va algún texto introductorio.
+
+### Tabla de contenido
+
+<!-- toc -->
+
+## Primer encabezado de contenido
+

Estableciendo la profundidad máxima

Puedes establecer la profundidad máxima para la TdC especificando la variable toc_levels, que acepta un número entero entre 1 y 4:

[extra]
+toc_levels = 2
+

En este ejemplo, sólo los dos primeros niveles de encabezados se incluirían en la TdC, independientemente de sus etiquetas HTML reales (h1, h2, h3, etc.). Si quieres incluir sólo el nivel principal de encabezados, establece toc_levels = 1. El valor predeterminado de toc_levels es 3.

Ten en cuenta a tus lectores al establecer toc_levels. Aunque puede ser tentador incluir muchos niveles anidados para una navegación detallada, una TdC más corta y sencilla suele ser más amigable y menos abrumadora.

Ocultando encabezados de la TdC

Es posible que quieras ocultar ciertos encabezados. Por ejemplo, si tu artículo tiene muchas Figuras o Tablas, éstas podrían saturar la TdC. Puedes ocultar encabezados específicos en la TdC configurando la variable toc_ignore_pattern en la sección [extra] del front matter de tu post.

Esta variable espera una expresión regular (regex), ya que utiliza el test matching de Tera. El toc_ignore_pattern se prueba contra el texto del encabezado. Por ejemplo, para el encabezado ### Lectura adicional, sólo el texto Lectura adicional se usaría para comprobar si concuerda con el patrón.

Aquí tienes algunos valores de ejemplo para toc_ignore_pattern junto con los encabezados que ocultarían:
toc_ignore_patternExcluye encabezados que…
Tablacontengan "Tabla"
^Figuraempiecen por "Figura"
(?i)(tabla|figura)empiecen por "Tabla" o "Figura" (insensible a mayúsculas/minúsculas)
\[Borrador\]$terminen con "[Borrador]".

Puedes probar tu expresión regular en plataformas como regex101 para asegurarte de que funciona como esperas.

Nota: Las capacidades de "look-around", incluyendo look-ahead y look-behind, no están soportadas.

Encabezado 1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Encabezado 2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Encabezado 3.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Encabezado 4.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Encabezado 4.2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Encabezado 3.2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Encabezado 4

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Encabezado 4

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Encabezado 2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Encabezado 3.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Encabezado 4.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Encabezado 4.2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Encabezado 3.2

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Encabezado 4.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

Encabezado 4.1

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed mollis augue, vel efficitur lacus. Pellentesque eu egestas mi. Etiam ultrices lectus sit amet aliquet ullamcorper. Praesent in erat quis est sagittis finibus. Etiam nec sapien in nulla interdum faucibus. Integer iaculis lorem quis arcu lobortis, non malesuada neque vehicula. Aenean nec tellus eu metus bibendum tempus. Sed rutrum urna ut commodo tempor. Vestibulum aliquet elit posuere turpis maximus condimentum. Sed urna libero, ornare eu tellus vitae, laoreet condimentum risus. Aenean elit lectus, mattis quis nibh nec, faucibus rutrum sapien. Sed iaculis consectetur mi, eget posuere turpis finibus et.

\ No newline at end of file diff --git a/es/index.html b/es/index.html new file mode 100644 index 000000000..456a60e4b --- /dev/null +++ b/es/index.html @@ -0,0 +1 @@ +~/tabi
Publicaciones recientes
09 agosto 2023

Aprende a personalizar tabi usando skins y estableciendo un tema predeterminado, haciendo que tu sitio sea único.

Leer más →
14 julio 2023

Descubre cómo habilitar una sección de comentarios en tus publicaciones usando giscus, utterances, Hyvor Talk, o Isso, permitiendo la interacción y feedback de los lectores.

Leer más →
29 abril 2023

Aprende cómo crear un subconjunto personalizado que solo incluya los glifos necesarios.

Leer más →
22 febrero 2023

tabi tiene una Política de Seguridad de Contenido (CSP) fácilmente personalizable con configuraciones seguras. Obtén tranquilidad y una calificación de A+ en Mozilla Observatory.

Leer más →
\ No newline at end of file diff --git a/es/projects/chu/index.html b/es/projects/chu/index.html new file mode 100644 index 000000000..b6687afc1 --- /dev/null +++ b/es/projects/chu/index.html @@ -0,0 +1 @@ +~/tabi • chu
chu
  • 0 min de lectura
\ No newline at end of file diff --git a/es/projects/index.html b/es/projects/index.html new file mode 100644 index 000000000..b53a56d14 --- /dev/null +++ b/es/projects/index.html @@ -0,0 +1 @@ +~/tabi • Proyectos
Proyectos
img/tabi.webp

tabi

Un tema de Zola rápido, ligero y moderno con JavaScript opcional.
img/chu.webp

chu

Aplicación Flask para subir archivos de forma segura, con eliminación de metadatos, compresión, protección con contraseña y más.
img/nani.webp

nani

Script Bash para crear URL públicas desde archivos o texto en servidores remotos.
img/spectro.webp

spectro

Script de Bash para generar espectrogramas, compararlos, subirlos a Imgur y proporcionar las correspondientes URLs para compartir.
\ No newline at end of file diff --git a/es/projects/nani/index.html b/es/projects/nani/index.html new file mode 100644 index 000000000..40c59cec8 --- /dev/null +++ b/es/projects/nani/index.html @@ -0,0 +1 @@ +~/tabi • nani
nani
  • 0 min de lectura
\ No newline at end of file diff --git a/es/projects/spectro/index.html b/es/projects/spectro/index.html new file mode 100644 index 000000000..a817e3106 --- /dev/null +++ b/es/projects/spectro/index.html @@ -0,0 +1 @@ +~/tabi • spectro
spectro
  • 0 min de lectura
\ No newline at end of file diff --git a/es/projects/tabi/index.html b/es/projects/tabi/index.html new file mode 100644 index 000000000..7064662cd --- /dev/null +++ b/es/projects/tabi/index.html @@ -0,0 +1 @@ +~/tabi • tabi
tabi
  • 0 min de lectura
\ No newline at end of file diff --git a/es/tags/funcionalidad/atom.xml b/es/tags/funcionalidad/atom.xml new file mode 100644 index 000000000..3fd528879 --- /dev/null +++ b/es/tags/funcionalidad/atom.xml @@ -0,0 +1,112 @@ + + + + + + Esta es una fuente web + también conocida como fuente Atom + Suscríbete + copiando la URL de la barra de direcciones en tu lector de noticias + Visita + para aprender más y empezar + Es gratis + la web + Publicaciones recientes + + + ~/tabi - funcionalidad + tabi es un tema de Zola rápido, liviano y moderno con JavaScript opcional y una puntuación perfecta en Lighthouse. + + + Zola + 2023-09-08T00:00:00+00:00 + https://welpo.github.io/tabi/es/tags/funcionalidad/atom.xml + + Personaliza el color de tabi y el tema predeterminado + 2023-08-09T00:00:00+00:00 + 2023-08-10T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/customise-tabi/ + Aprende a personalizar tabi usando skins y estableciendo un tema predeterminado, haciendo que tu sitio sea único. + + + Añade comentarios a tus publicaciones con estas 4 plataformas + 2023-07-14T00:00:00+00:00 + 2023-07-26T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/comments/ + Descubre cómo habilitar una sección de comentarios en tus publicaciones usando giscus, utterances, Hyvor Talk, o Isso, permitiendo la interacción y feedback de los lectores. + + + Optimiza la carga con un subconjunto de fuente personalizado + 2023-04-29T00:00:00+00:00 + 2023-07-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/custom-font-subset/ + Aprende cómo crear un subconjunto personalizado que solo incluya los glifos necesarios. + + + Seguro por defecto + 2023-02-22T00:00:00+00:00 + 2023-07-17T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/security/ + tabi tiene una Política de Seguridad de Contenido (CSP) fácilmente personalizable con configuraciones seguras. Obtén tranquilidad y una calificación de A+ en Mozilla Observatory. + + + Shortcodes personalizados + 2023-02-19T00:00:00+00:00 + 2023-08-26T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/shortcodes/ + Este tema incluye algunos shortcodes personalizados útiles que puedes utilizar para mejorar tus publicaciones. Puedes mostrar imágenes que se adapten a los temas claro y oscuro, dar formato a una sección de referencias con un aspecto profesional, y más. + + + Ejemplos de Markdown + 2023-01-31T00:00:00+00:00 + 2023-09-01T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/markdown/ + Esta publicación muestra algunos ejemplos de formato Markdown, incluyendo una tabla, bloques de código y etiquetas, citas, tablas y notas al pie de página. + + + Sin JavaScript obligatorio + 2023-01-06T00:00:00+00:00 + 2023-09-01T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/javascript/ + JavaScript solo se utiliza cuando HTML y CSS no son suficientes. + + + Tabla de contenido + 2022-11-01T00:00:00+00:00 + 2023-09-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/toc/ + Una publicación que muestra la tabla de contenido opcional así como su configuración. + + diff --git a/es/tags/funcionalidad/index.html b/es/tags/funcionalidad/index.html new file mode 100644 index 000000000..77e7bf85f --- /dev/null +++ b/es/tags/funcionalidad/index.html @@ -0,0 +1,2 @@ + + ~/tabi • funcionalidad
funcionalidad
09 agosto 2023

Aprende a personalizar tabi usando skins y estableciendo un tema predeterminado, haciendo que tu sitio sea único.

Leer más →
14 julio 2023

Descubre cómo habilitar una sección de comentarios en tus publicaciones usando giscus, utterances, Hyvor Talk, o Isso, permitiendo la interacción y feedback de los lectores.

Leer más →
29 abril 2023

Aprende cómo crear un subconjunto personalizado que solo incluya los glifos necesarios.

Leer más →
22 febrero 2023

tabi tiene una Política de Seguridad de Contenido (CSP) fácilmente personalizable con configuraciones seguras. Obtén tranquilidad y una calificación de A+ en Mozilla Observatory.

Leer más →
19 febrero 2023

Este tema incluye algunos shortcodes personalizados útiles que puedes utilizar para mejorar tus publicaciones. Puedes mostrar imágenes que se adapten a los temas claro y oscuro, dar formato a una sección de referencias con un aspecto profesional, y más.

Leer más →
31 enero 2023

Esta publicación muestra algunos ejemplos de formato Markdown, incluyendo una tabla, bloques de código y etiquetas, citas, tablas y notas al pie de página.

Leer más →
06 enero 2023

JavaScript solo se utiliza cuando HTML y CSS no son suficientes.

Leer más →
01 noviembre 2022

Una publicación que muestra la tabla de contenido opcional así como su configuración.

Leer más →
\ No newline at end of file diff --git a/es/tags/index.html b/es/tags/index.html new file mode 100644 index 000000000..16b5c5361 --- /dev/null +++ b/es/tags/index.html @@ -0,0 +1,2 @@ + + ~/tabi • Etiquetas
Todas las etiquetas
\ No newline at end of file diff --git a/es/tags/markdown/atom.xml b/es/tags/markdown/atom.xml new file mode 100644 index 000000000..eab96216b --- /dev/null +++ b/es/tags/markdown/atom.xml @@ -0,0 +1,46 @@ + + + + + + Esta es una fuente web + también conocida como fuente Atom + Suscríbete + copiando la URL de la barra de direcciones en tu lector de noticias + Visita + para aprender más y empezar + Es gratis + la web + Publicaciones recientes + + + ~/tabi - markdown + tabi es un tema de Zola rápido, liviano y moderno con JavaScript opcional y una puntuación perfecta en Lighthouse. + + + Zola + 2023-09-08T00:00:00+00:00 + https://welpo.github.io/tabi/es/tags/markdown/atom.xml + + Ejemplos de Markdown + 2023-01-31T00:00:00+00:00 + 2023-09-01T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/markdown/ + Esta publicación muestra algunos ejemplos de formato Markdown, incluyendo una tabla, bloques de código y etiquetas, citas, tablas y notas al pie de página. + + + Tabla de contenido + 2022-11-01T00:00:00+00:00 + 2023-09-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/toc/ + Una publicación que muestra la tabla de contenido opcional así como su configuración. + + diff --git a/es/tags/markdown/index.html b/es/tags/markdown/index.html new file mode 100644 index 000000000..8e8ad8382 --- /dev/null +++ b/es/tags/markdown/index.html @@ -0,0 +1,2 @@ + + ~/tabi • markdown
markdown
31 enero 2023

Esta publicación muestra algunos ejemplos de formato Markdown, incluyendo una tabla, bloques de código y etiquetas, citas, tablas y notas al pie de página.

Leer más →
01 noviembre 2022

Una publicación que muestra la tabla de contenido opcional así como su configuración.

Leer más →
\ No newline at end of file diff --git a/es/tags/seguridad/atom.xml b/es/tags/seguridad/atom.xml new file mode 100644 index 000000000..b3dfa9bdc --- /dev/null +++ b/es/tags/seguridad/atom.xml @@ -0,0 +1,35 @@ + + + + + + Esta es una fuente web + también conocida como fuente Atom + Suscríbete + copiando la URL de la barra de direcciones en tu lector de noticias + Visita + para aprender más y empezar + Es gratis + la web + Publicaciones recientes + + + ~/tabi - seguridad + tabi es un tema de Zola rápido, liviano y moderno con JavaScript opcional y una puntuación perfecta en Lighthouse. + + + Zola + 2023-07-17T00:00:00+00:00 + https://welpo.github.io/tabi/es/tags/seguridad/atom.xml + + Seguro por defecto + 2023-02-22T00:00:00+00:00 + 2023-07-17T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/security/ + tabi tiene una Política de Seguridad de Contenido (CSP) fácilmente personalizable con configuraciones seguras. Obtén tranquilidad y una calificación de A+ en Mozilla Observatory. + + diff --git a/es/tags/seguridad/index.html b/es/tags/seguridad/index.html new file mode 100644 index 000000000..9e465536f --- /dev/null +++ b/es/tags/seguridad/index.html @@ -0,0 +1,2 @@ + + ~/tabi • seguridad
seguridad
22 febrero 2023

tabi tiene una Política de Seguridad de Contenido (CSP) fácilmente personalizable con configuraciones seguras. Obtén tranquilidad y una calificación de A+ en Mozilla Observatory.

Leer más →
\ No newline at end of file diff --git a/es/tags/shortcodes/atom.xml b/es/tags/shortcodes/atom.xml new file mode 100644 index 000000000..0fd10508b --- /dev/null +++ b/es/tags/shortcodes/atom.xml @@ -0,0 +1,35 @@ + + + + + + Esta es una fuente web + también conocida como fuente Atom + Suscríbete + copiando la URL de la barra de direcciones en tu lector de noticias + Visita + para aprender más y empezar + Es gratis + la web + Publicaciones recientes + + + ~/tabi - shortcodes + tabi es un tema de Zola rápido, liviano y moderno con JavaScript opcional y una puntuación perfecta en Lighthouse. + + + Zola + 2023-08-26T00:00:00+00:00 + https://welpo.github.io/tabi/es/tags/shortcodes/atom.xml + + Shortcodes personalizados + 2023-02-19T00:00:00+00:00 + 2023-08-26T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/shortcodes/ + Este tema incluye algunos shortcodes personalizados útiles que puedes utilizar para mejorar tus publicaciones. Puedes mostrar imágenes que se adapten a los temas claro y oscuro, dar formato a una sección de referencias con un aspecto profesional, y más. + + diff --git a/es/tags/shortcodes/index.html b/es/tags/shortcodes/index.html new file mode 100644 index 000000000..4e768d354 --- /dev/null +++ b/es/tags/shortcodes/index.html @@ -0,0 +1,2 @@ + + ~/tabi • shortcodes
shortcodes
19 febrero 2023

Este tema incluye algunos shortcodes personalizados útiles que puedes utilizar para mejorar tus publicaciones. Puedes mostrar imágenes que se adapten a los temas claro y oscuro, dar formato a una sección de referencias con un aspecto profesional, y más.

Leer más →
\ No newline at end of file diff --git a/es/tags/tutorial/atom.xml b/es/tags/tutorial/atom.xml new file mode 100644 index 000000000..3ba7035a8 --- /dev/null +++ b/es/tags/tutorial/atom.xml @@ -0,0 +1,79 @@ + + + + + + Esta es una fuente web + también conocida como fuente Atom + Suscríbete + copiando la URL de la barra de direcciones en tu lector de noticias + Visita + para aprender más y empezar + Es gratis + la web + Publicaciones recientes + + + ~/tabi - tutorial + tabi es un tema de Zola rápido, liviano y moderno con JavaScript opcional y una puntuación perfecta en Lighthouse. + + + Zola + 2023-09-08T00:00:00+00:00 + https://welpo.github.io/tabi/es/tags/tutorial/atom.xml + + Personaliza el color de tabi y el tema predeterminado + 2023-08-09T00:00:00+00:00 + 2023-08-10T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/customise-tabi/ + Aprende a personalizar tabi usando skins y estableciendo un tema predeterminado, haciendo que tu sitio sea único. + + + Añade comentarios a tus publicaciones con estas 4 plataformas + 2023-07-14T00:00:00+00:00 + 2023-07-26T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/comments/ + Descubre cómo habilitar una sección de comentarios en tus publicaciones usando giscus, utterances, Hyvor Talk, o Isso, permitiendo la interacción y feedback de los lectores. + + + Optimiza la carga con un subconjunto de fuente personalizado + 2023-04-29T00:00:00+00:00 + 2023-07-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/custom-font-subset/ + Aprende cómo crear un subconjunto personalizado que solo incluya los glifos necesarios. + + + Sin JavaScript obligatorio + 2023-01-06T00:00:00+00:00 + 2023-09-01T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/javascript/ + JavaScript solo se utiliza cuando HTML y CSS no son suficientes. + + + Tabla de contenido + 2022-11-01T00:00:00+00:00 + 2023-09-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/toc/ + Una publicación que muestra la tabla de contenido opcional así como su configuración. + + diff --git a/es/tags/tutorial/index.html b/es/tags/tutorial/index.html new file mode 100644 index 000000000..1595559b3 --- /dev/null +++ b/es/tags/tutorial/index.html @@ -0,0 +1,2 @@ + + ~/tabi • tutorial
tutorial
09 agosto 2023

Aprende a personalizar tabi usando skins y estableciendo un tema predeterminado, haciendo que tu sitio sea único.

Leer más →
14 julio 2023

Descubre cómo habilitar una sección de comentarios en tus publicaciones usando giscus, utterances, Hyvor Talk, o Isso, permitiendo la interacción y feedback de los lectores.

Leer más →
29 abril 2023

Aprende cómo crear un subconjunto personalizado que solo incluya los glifos necesarios.

Leer más →
06 enero 2023

JavaScript solo se utiliza cuando HTML y CSS no son suficientes.

Leer más →
01 noviembre 2022

Una publicación que muestra la tabla de contenido opcional así como su configuración.

Leer más →
\ No newline at end of file diff --git a/feed_style.xsl b/feed_style.xsl new file mode 100644 index 000000000..025ae81f3 --- /dev/null +++ b/feed_style.xsl @@ -0,0 +1,73 @@ + + + + + + + + <xsl:value-of select="/atom:feed/atom:title"/> • Feed + + + + + + + + + +
+
+
+ , . . About Feeds . . +
+ + +
+

+
+
+ +
+
+ +
+
+ +
+ +
+ + + + + +
+
+
+
+
+
+ + +
+
diff --git a/fonts/CascadiaCode-SemiLight.woff2 b/fonts/CascadiaCode-SemiLight.woff2 new file mode 100644 index 000000000..fb0f9de2e Binary files /dev/null and b/fonts/CascadiaCode-SemiLight.woff2 differ diff --git a/fonts/Inter4.woff2 b/fonts/Inter4.woff2 new file mode 100644 index 000000000..0b74491a8 Binary files /dev/null and b/fonts/Inter4.woff2 differ diff --git a/fonts/KaTeX/KaTeX_AMS-Regular.ttf b/fonts/KaTeX/KaTeX_AMS-Regular.ttf new file mode 100644 index 000000000..c6f9a5e7c Binary files /dev/null and b/fonts/KaTeX/KaTeX_AMS-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_AMS-Regular.woff b/fonts/KaTeX/KaTeX_AMS-Regular.woff new file mode 100644 index 000000000..b804d7b33 Binary files /dev/null and b/fonts/KaTeX/KaTeX_AMS-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_AMS-Regular.woff2 b/fonts/KaTeX/KaTeX_AMS-Regular.woff2 new file mode 100644 index 000000000..0acaaff03 Binary files /dev/null and b/fonts/KaTeX/KaTeX_AMS-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Caligraphic-Bold.ttf b/fonts/KaTeX/KaTeX_Caligraphic-Bold.ttf new file mode 100644 index 000000000..9ff4a5e04 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Caligraphic-Bold.ttf differ diff --git a/fonts/KaTeX/KaTeX_Caligraphic-Bold.woff b/fonts/KaTeX/KaTeX_Caligraphic-Bold.woff new file mode 100644 index 000000000..9759710d1 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Caligraphic-Bold.woff differ diff --git a/fonts/KaTeX/KaTeX_Caligraphic-Bold.woff2 b/fonts/KaTeX/KaTeX_Caligraphic-Bold.woff2 new file mode 100644 index 000000000..f390922ec Binary files /dev/null and b/fonts/KaTeX/KaTeX_Caligraphic-Bold.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Caligraphic-Regular.ttf b/fonts/KaTeX/KaTeX_Caligraphic-Regular.ttf new file mode 100644 index 000000000..f522294ff Binary files /dev/null and b/fonts/KaTeX/KaTeX_Caligraphic-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_Caligraphic-Regular.woff b/fonts/KaTeX/KaTeX_Caligraphic-Regular.woff new file mode 100644 index 000000000..9bdd534fd Binary files /dev/null and b/fonts/KaTeX/KaTeX_Caligraphic-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_Caligraphic-Regular.woff2 b/fonts/KaTeX/KaTeX_Caligraphic-Regular.woff2 new file mode 100644 index 000000000..75344a1f9 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Caligraphic-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Fraktur-Bold.ttf b/fonts/KaTeX/KaTeX_Fraktur-Bold.ttf new file mode 100644 index 000000000..4e98259c3 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Fraktur-Bold.ttf differ diff --git a/fonts/KaTeX/KaTeX_Fraktur-Bold.woff b/fonts/KaTeX/KaTeX_Fraktur-Bold.woff new file mode 100644 index 000000000..e7730f662 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Fraktur-Bold.woff differ diff --git a/fonts/KaTeX/KaTeX_Fraktur-Bold.woff2 b/fonts/KaTeX/KaTeX_Fraktur-Bold.woff2 new file mode 100644 index 000000000..395f28bea Binary files /dev/null and b/fonts/KaTeX/KaTeX_Fraktur-Bold.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Fraktur-Regular.ttf b/fonts/KaTeX/KaTeX_Fraktur-Regular.ttf new file mode 100644 index 000000000..b8461b275 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Fraktur-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_Fraktur-Regular.woff b/fonts/KaTeX/KaTeX_Fraktur-Regular.woff new file mode 100644 index 000000000..acab069f9 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Fraktur-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_Fraktur-Regular.woff2 b/fonts/KaTeX/KaTeX_Fraktur-Regular.woff2 new file mode 100644 index 000000000..735f6948d Binary files /dev/null and b/fonts/KaTeX/KaTeX_Fraktur-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Main-Bold.ttf b/fonts/KaTeX/KaTeX_Main-Bold.ttf new file mode 100644 index 000000000..4060e627d Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-Bold.ttf differ diff --git a/fonts/KaTeX/KaTeX_Main-Bold.woff b/fonts/KaTeX/KaTeX_Main-Bold.woff new file mode 100644 index 000000000..f38136ac1 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-Bold.woff differ diff --git a/fonts/KaTeX/KaTeX_Main-Bold.woff2 b/fonts/KaTeX/KaTeX_Main-Bold.woff2 new file mode 100644 index 000000000..ab2ad21da Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-Bold.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Main-BoldItalic.ttf b/fonts/KaTeX/KaTeX_Main-BoldItalic.ttf new file mode 100644 index 000000000..dc007977e Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-BoldItalic.ttf differ diff --git a/fonts/KaTeX/KaTeX_Main-BoldItalic.woff b/fonts/KaTeX/KaTeX_Main-BoldItalic.woff new file mode 100644 index 000000000..67807b0bd Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-BoldItalic.woff differ diff --git a/fonts/KaTeX/KaTeX_Main-BoldItalic.woff2 b/fonts/KaTeX/KaTeX_Main-BoldItalic.woff2 new file mode 100644 index 000000000..5931794de Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-BoldItalic.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Main-Italic.ttf b/fonts/KaTeX/KaTeX_Main-Italic.ttf new file mode 100644 index 000000000..0e9b0f354 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-Italic.ttf differ diff --git a/fonts/KaTeX/KaTeX_Main-Italic.woff b/fonts/KaTeX/KaTeX_Main-Italic.woff new file mode 100644 index 000000000..6f43b594b Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-Italic.woff differ diff --git a/fonts/KaTeX/KaTeX_Main-Italic.woff2 b/fonts/KaTeX/KaTeX_Main-Italic.woff2 new file mode 100644 index 000000000..b50920e13 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-Italic.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Main-Regular.ttf b/fonts/KaTeX/KaTeX_Main-Regular.ttf new file mode 100644 index 000000000..dd45e1ed2 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_Main-Regular.woff b/fonts/KaTeX/KaTeX_Main-Regular.woff new file mode 100644 index 000000000..21f581296 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_Main-Regular.woff2 b/fonts/KaTeX/KaTeX_Main-Regular.woff2 new file mode 100644 index 000000000..eb24a7ba2 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Main-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Math-BoldItalic.ttf b/fonts/KaTeX/KaTeX_Math-BoldItalic.ttf new file mode 100644 index 000000000..728ce7a1e Binary files /dev/null and b/fonts/KaTeX/KaTeX_Math-BoldItalic.ttf differ diff --git a/fonts/KaTeX/KaTeX_Math-BoldItalic.woff b/fonts/KaTeX/KaTeX_Math-BoldItalic.woff new file mode 100644 index 000000000..0ae390d74 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Math-BoldItalic.woff differ diff --git a/fonts/KaTeX/KaTeX_Math-BoldItalic.woff2 b/fonts/KaTeX/KaTeX_Math-BoldItalic.woff2 new file mode 100644 index 000000000..29657023a Binary files /dev/null and b/fonts/KaTeX/KaTeX_Math-BoldItalic.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Math-Italic.ttf b/fonts/KaTeX/KaTeX_Math-Italic.ttf new file mode 100644 index 000000000..70d559b4e Binary files /dev/null and b/fonts/KaTeX/KaTeX_Math-Italic.ttf differ diff --git a/fonts/KaTeX/KaTeX_Math-Italic.woff b/fonts/KaTeX/KaTeX_Math-Italic.woff new file mode 100644 index 000000000..eb5159d4c Binary files /dev/null and b/fonts/KaTeX/KaTeX_Math-Italic.woff differ diff --git a/fonts/KaTeX/KaTeX_Math-Italic.woff2 b/fonts/KaTeX/KaTeX_Math-Italic.woff2 new file mode 100644 index 000000000..215c143fd Binary files /dev/null and b/fonts/KaTeX/KaTeX_Math-Italic.woff2 differ diff --git a/fonts/KaTeX/KaTeX_SansSerif-Bold.ttf b/fonts/KaTeX/KaTeX_SansSerif-Bold.ttf new file mode 100644 index 000000000..2f65a8a3a Binary files /dev/null and b/fonts/KaTeX/KaTeX_SansSerif-Bold.ttf differ diff --git a/fonts/KaTeX/KaTeX_SansSerif-Bold.woff b/fonts/KaTeX/KaTeX_SansSerif-Bold.woff new file mode 100644 index 000000000..8d47c02d9 Binary files /dev/null and b/fonts/KaTeX/KaTeX_SansSerif-Bold.woff differ diff --git a/fonts/KaTeX/KaTeX_SansSerif-Bold.woff2 b/fonts/KaTeX/KaTeX_SansSerif-Bold.woff2 new file mode 100644 index 000000000..cfaa3bda5 Binary files /dev/null and b/fonts/KaTeX/KaTeX_SansSerif-Bold.woff2 differ diff --git a/fonts/KaTeX/KaTeX_SansSerif-Italic.ttf b/fonts/KaTeX/KaTeX_SansSerif-Italic.ttf new file mode 100644 index 000000000..d5850df98 Binary files /dev/null and b/fonts/KaTeX/KaTeX_SansSerif-Italic.ttf differ diff --git a/fonts/KaTeX/KaTeX_SansSerif-Italic.woff b/fonts/KaTeX/KaTeX_SansSerif-Italic.woff new file mode 100644 index 000000000..7e02df963 Binary files /dev/null and b/fonts/KaTeX/KaTeX_SansSerif-Italic.woff differ diff --git a/fonts/KaTeX/KaTeX_SansSerif-Italic.woff2 b/fonts/KaTeX/KaTeX_SansSerif-Italic.woff2 new file mode 100644 index 000000000..349c06dc6 Binary files /dev/null and b/fonts/KaTeX/KaTeX_SansSerif-Italic.woff2 differ diff --git a/fonts/KaTeX/KaTeX_SansSerif-Regular.ttf b/fonts/KaTeX/KaTeX_SansSerif-Regular.ttf new file mode 100644 index 000000000..537279f6b Binary files /dev/null and b/fonts/KaTeX/KaTeX_SansSerif-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_SansSerif-Regular.woff b/fonts/KaTeX/KaTeX_SansSerif-Regular.woff new file mode 100644 index 000000000..31b84829b Binary files /dev/null and b/fonts/KaTeX/KaTeX_SansSerif-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_SansSerif-Regular.woff2 b/fonts/KaTeX/KaTeX_SansSerif-Regular.woff2 new file mode 100644 index 000000000..a90eea85f Binary files /dev/null and b/fonts/KaTeX/KaTeX_SansSerif-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Script-Regular.ttf b/fonts/KaTeX/KaTeX_Script-Regular.ttf new file mode 100644 index 000000000..fd679bf37 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Script-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_Script-Regular.woff b/fonts/KaTeX/KaTeX_Script-Regular.woff new file mode 100644 index 000000000..0e7da821e Binary files /dev/null and b/fonts/KaTeX/KaTeX_Script-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_Script-Regular.woff2 b/fonts/KaTeX/KaTeX_Script-Regular.woff2 new file mode 100644 index 000000000..b3048fc11 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Script-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Size1-Regular.ttf b/fonts/KaTeX/KaTeX_Size1-Regular.ttf new file mode 100644 index 000000000..871fd7d19 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size1-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_Size1-Regular.woff b/fonts/KaTeX/KaTeX_Size1-Regular.woff new file mode 100644 index 000000000..7f292d911 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size1-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_Size1-Regular.woff2 b/fonts/KaTeX/KaTeX_Size1-Regular.woff2 new file mode 100644 index 000000000..c5a8462fb Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size1-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Size2-Regular.ttf b/fonts/KaTeX/KaTeX_Size2-Regular.ttf new file mode 100644 index 000000000..7a212caf9 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size2-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_Size2-Regular.woff b/fonts/KaTeX/KaTeX_Size2-Regular.woff new file mode 100644 index 000000000..d241d9be2 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size2-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_Size2-Regular.woff2 b/fonts/KaTeX/KaTeX_Size2-Regular.woff2 new file mode 100644 index 000000000..e1bccfe24 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size2-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Size3-Regular.ttf b/fonts/KaTeX/KaTeX_Size3-Regular.ttf new file mode 100644 index 000000000..00bff3495 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size3-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_Size3-Regular.woff b/fonts/KaTeX/KaTeX_Size3-Regular.woff new file mode 100644 index 000000000..e6e9b658d Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size3-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_Size3-Regular.woff2 b/fonts/KaTeX/KaTeX_Size3-Regular.woff2 new file mode 100644 index 000000000..249a28662 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size3-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Size4-Regular.ttf b/fonts/KaTeX/KaTeX_Size4-Regular.ttf new file mode 100644 index 000000000..74f08921f Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size4-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_Size4-Regular.woff b/fonts/KaTeX/KaTeX_Size4-Regular.woff new file mode 100644 index 000000000..e1ec54576 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size4-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_Size4-Regular.woff2 b/fonts/KaTeX/KaTeX_Size4-Regular.woff2 new file mode 100644 index 000000000..680c13085 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Size4-Regular.woff2 differ diff --git a/fonts/KaTeX/KaTeX_Typewriter-Regular.ttf b/fonts/KaTeX/KaTeX_Typewriter-Regular.ttf new file mode 100644 index 000000000..c83252c57 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Typewriter-Regular.ttf differ diff --git a/fonts/KaTeX/KaTeX_Typewriter-Regular.woff b/fonts/KaTeX/KaTeX_Typewriter-Regular.woff new file mode 100644 index 000000000..2432419f2 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Typewriter-Regular.woff differ diff --git a/fonts/KaTeX/KaTeX_Typewriter-Regular.woff2 b/fonts/KaTeX/KaTeX_Typewriter-Regular.woff2 new file mode 100644 index 000000000..771f1af70 Binary files /dev/null and b/fonts/KaTeX/KaTeX_Typewriter-Regular.woff2 differ diff --git a/fonts/SourceSerif4Variable-Roman.ttf.woff2 b/fonts/SourceSerif4Variable-Roman.ttf.woff2 new file mode 100644 index 000000000..cca344bfa Binary files /dev/null and b/fonts/SourceSerif4Variable-Roman.ttf.woff2 differ diff --git a/img/amsterdam_by_oskerwyld.webp b/img/amsterdam_by_oskerwyld.webp new file mode 100644 index 000000000..2e84a0241 Binary files /dev/null and b/img/amsterdam_by_oskerwyld.webp differ diff --git a/img/chu.webp b/img/chu.webp new file mode 100644 index 000000000..dd4a6d156 Binary files /dev/null and b/img/chu.webp differ diff --git a/img/desert_by_oskerwyld.webp b/img/desert_by_oskerwyld.webp new file mode 100644 index 000000000..71a0f127a Binary files /dev/null and b/img/desert_by_oskerwyld.webp differ diff --git a/img/edited.webp b/img/edited.webp new file mode 100644 index 000000000..ab5ae7fe4 Binary files /dev/null and b/img/edited.webp differ diff --git a/img/graph.webp b/img/graph.webp new file mode 100644 index 000000000..5c2b9cd56 Binary files /dev/null and b/img/graph.webp differ diff --git a/img/main.webp b/img/main.webp new file mode 100644 index 000000000..174ec8750 Binary files /dev/null and b/img/main.webp differ diff --git a/img/mojave_day.webp b/img/mojave_day.webp new file mode 100644 index 000000000..dcba3fb55 Binary files /dev/null and b/img/mojave_day.webp differ diff --git a/img/mojave_night.webp b/img/mojave_night.webp new file mode 100644 index 000000000..20267c5de Binary files /dev/null and b/img/mojave_night.webp differ diff --git a/img/nani.webp b/img/nani.webp new file mode 100644 index 000000000..672a15ef0 Binary files /dev/null and b/img/nani.webp differ diff --git a/img/paris_day.webp b/img/paris_day.webp new file mode 100644 index 000000000..5dc219cd6 Binary files /dev/null and b/img/paris_day.webp differ diff --git a/img/paris_night.webp b/img/paris_night.webp new file mode 100644 index 000000000..d44511240 Binary files /dev/null and b/img/paris_night.webp differ diff --git a/img/raw.webp b/img/raw.webp new file mode 100644 index 000000000..d005c9580 Binary files /dev/null and b/img/raw.webp differ diff --git a/img/seedling.png b/img/seedling.png new file mode 100644 index 000000000..0efa5b98f Binary files /dev/null and b/img/seedling.png differ diff --git a/img/skins/blue_dark.webp b/img/skins/blue_dark.webp new file mode 100644 index 000000000..c8e4d31e0 Binary files /dev/null and b/img/skins/blue_dark.webp differ diff --git a/img/skins/blue_light.webp b/img/skins/blue_light.webp new file mode 100644 index 000000000..ff49dee7a Binary files /dev/null and b/img/skins/blue_light.webp differ diff --git a/img/skins/evangelion_dark.webp b/img/skins/evangelion_dark.webp new file mode 100644 index 000000000..23036925d Binary files /dev/null and b/img/skins/evangelion_dark.webp differ diff --git a/img/skins/evangelion_light.webp b/img/skins/evangelion_light.webp new file mode 100644 index 000000000..c3be3a8a3 Binary files /dev/null and b/img/skins/evangelion_light.webp differ diff --git a/img/skins/indigo_ingot_dark.webp b/img/skins/indigo_ingot_dark.webp new file mode 100644 index 000000000..5e316adb4 Binary files /dev/null and b/img/skins/indigo_ingot_dark.webp differ diff --git a/img/skins/indigo_ingot_light.webp b/img/skins/indigo_ingot_light.webp new file mode 100644 index 000000000..047b0d118 Binary files /dev/null and b/img/skins/indigo_ingot_light.webp differ diff --git a/img/skins/lavender_dark.webp b/img/skins/lavender_dark.webp new file mode 100644 index 000000000..478bb878e Binary files /dev/null and b/img/skins/lavender_dark.webp differ diff --git a/img/skins/lavender_light.webp b/img/skins/lavender_light.webp new file mode 100644 index 000000000..199e52168 Binary files /dev/null and b/img/skins/lavender_light.webp differ diff --git a/img/skins/lowcontrast_orange_dark.webp b/img/skins/lowcontrast_orange_dark.webp new file mode 100644 index 000000000..7d71457d0 Binary files /dev/null and b/img/skins/lowcontrast_orange_dark.webp differ diff --git a/img/skins/lowcontrast_orange_light.webp b/img/skins/lowcontrast_orange_light.webp new file mode 100644 index 000000000..f950a1a9b Binary files /dev/null and b/img/skins/lowcontrast_orange_light.webp differ diff --git a/img/skins/lowcontrast_peach_dark.webp b/img/skins/lowcontrast_peach_dark.webp new file mode 100644 index 000000000..d2d878bad Binary files /dev/null and b/img/skins/lowcontrast_peach_dark.webp differ diff --git a/img/skins/lowcontrast_peach_light.webp b/img/skins/lowcontrast_peach_light.webp new file mode 100644 index 000000000..3019b78ad Binary files /dev/null and b/img/skins/lowcontrast_peach_light.webp differ diff --git a/img/skins/lowcontrast_pink_dark.webp b/img/skins/lowcontrast_pink_dark.webp new file mode 100644 index 000000000..45aedb357 Binary files /dev/null and b/img/skins/lowcontrast_pink_dark.webp differ diff --git a/img/skins/lowcontrast_pink_light.webp b/img/skins/lowcontrast_pink_light.webp new file mode 100644 index 000000000..5121e3661 Binary files /dev/null and b/img/skins/lowcontrast_pink_light.webp differ diff --git a/img/skins/mint_dark.webp b/img/skins/mint_dark.webp new file mode 100644 index 000000000..4b56e8554 Binary files /dev/null and b/img/skins/mint_dark.webp differ diff --git a/img/skins/mint_light.webp b/img/skins/mint_light.webp new file mode 100644 index 000000000..1fd48f43a Binary files /dev/null and b/img/skins/mint_light.webp differ diff --git a/img/skins/monochrome_dark.webp b/img/skins/monochrome_dark.webp new file mode 100644 index 000000000..484de6427 Binary files /dev/null and b/img/skins/monochrome_dark.webp differ diff --git a/img/skins/monochrome_light.webp b/img/skins/monochrome_light.webp new file mode 100644 index 000000000..dfdcf6d6b Binary files /dev/null and b/img/skins/monochrome_light.webp differ diff --git a/img/skins/red_dark.webp b/img/skins/red_dark.webp new file mode 100644 index 000000000..360c0baf3 Binary files /dev/null and b/img/skins/red_dark.webp differ diff --git a/img/skins/red_light.webp b/img/skins/red_light.webp new file mode 100644 index 000000000..a628a876d Binary files /dev/null and b/img/skins/red_light.webp differ diff --git a/img/skins/sakura_dark.webp b/img/skins/sakura_dark.webp new file mode 100644 index 000000000..e923d907e Binary files /dev/null and b/img/skins/sakura_dark.webp differ diff --git a/img/skins/sakura_light.webp b/img/skins/sakura_light.webp new file mode 100644 index 000000000..a628a876d Binary files /dev/null and b/img/skins/sakura_light.webp differ diff --git a/img/skins/teal_dark.webp b/img/skins/teal_dark.webp new file mode 100644 index 000000000..496aeb790 Binary files /dev/null and b/img/skins/teal_dark.webp differ diff --git a/img/skins/teal_light.webp b/img/skins/teal_light.webp new file mode 100644 index 000000000..eada00e99 Binary files /dev/null and b/img/skins/teal_light.webp differ diff --git a/img/social_cards/archive.jpg b/img/social_cards/archive.jpg new file mode 100644 index 000000000..1e6f7ad60 Binary files /dev/null and b/img/social_cards/archive.jpg differ diff --git a/img/social_cards/blog.jpg b/img/social_cards/blog.jpg new file mode 100644 index 000000000..bbeac44d4 Binary files /dev/null and b/img/social_cards/blog.jpg differ diff --git a/img/social_cards/blog_comments.jpg b/img/social_cards/blog_comments.jpg new file mode 100644 index 000000000..97a32ce62 Binary files /dev/null and b/img/social_cards/blog_comments.jpg differ diff --git a/img/social_cards/blog_custom_font_subset.jpg b/img/social_cards/blog_custom_font_subset.jpg new file mode 100644 index 000000000..5853d397e Binary files /dev/null and b/img/social_cards/blog_custom_font_subset.jpg differ diff --git a/img/social_cards/blog_customise_tabi.jpg b/img/social_cards/blog_customise_tabi.jpg new file mode 100644 index 000000000..b2fce7937 Binary files /dev/null and b/img/social_cards/blog_customise_tabi.jpg differ diff --git a/img/social_cards/blog_javascript.jpg b/img/social_cards/blog_javascript.jpg new file mode 100644 index 000000000..f823b41e7 Binary files /dev/null and b/img/social_cards/blog_javascript.jpg differ diff --git a/img/social_cards/blog_markdown.jpg b/img/social_cards/blog_markdown.jpg new file mode 100644 index 000000000..c30464579 Binary files /dev/null and b/img/social_cards/blog_markdown.jpg differ diff --git a/img/social_cards/blog_security.jpg b/img/social_cards/blog_security.jpg new file mode 100644 index 000000000..f41e31a95 Binary files /dev/null and b/img/social_cards/blog_security.jpg differ diff --git a/img/social_cards/blog_shortcodes.jpg b/img/social_cards/blog_shortcodes.jpg new file mode 100644 index 000000000..3bcc21364 Binary files /dev/null and b/img/social_cards/blog_shortcodes.jpg differ diff --git a/img/social_cards/blog_toc.jpg b/img/social_cards/blog_toc.jpg new file mode 100644 index 000000000..0907fedf3 Binary files /dev/null and b/img/social_cards/blog_toc.jpg differ diff --git a/img/social_cards/ca.jpg b/img/social_cards/ca.jpg new file mode 100644 index 000000000..033bb6c85 Binary files /dev/null and b/img/social_cards/ca.jpg differ diff --git a/img/social_cards/ca_archive.jpg b/img/social_cards/ca_archive.jpg new file mode 100644 index 000000000..5b6b6a3a0 Binary files /dev/null and b/img/social_cards/ca_archive.jpg differ diff --git a/img/social_cards/ca_blog.jpg b/img/social_cards/ca_blog.jpg new file mode 100644 index 000000000..96b0a2d1e Binary files /dev/null and b/img/social_cards/ca_blog.jpg differ diff --git a/img/social_cards/ca_blog_comments.jpg b/img/social_cards/ca_blog_comments.jpg new file mode 100644 index 000000000..f66894548 Binary files /dev/null and b/img/social_cards/ca_blog_comments.jpg differ diff --git a/img/social_cards/ca_blog_custom_font_subset.jpg b/img/social_cards/ca_blog_custom_font_subset.jpg new file mode 100644 index 000000000..1a970e456 Binary files /dev/null and b/img/social_cards/ca_blog_custom_font_subset.jpg differ diff --git a/img/social_cards/ca_blog_customise_tabi.jpg b/img/social_cards/ca_blog_customise_tabi.jpg new file mode 100644 index 000000000..c1673d593 Binary files /dev/null and b/img/social_cards/ca_blog_customise_tabi.jpg differ diff --git a/img/social_cards/ca_blog_javascript.jpg b/img/social_cards/ca_blog_javascript.jpg new file mode 100644 index 000000000..a7aed29f1 Binary files /dev/null and b/img/social_cards/ca_blog_javascript.jpg differ diff --git a/img/social_cards/ca_blog_markdown.jpg b/img/social_cards/ca_blog_markdown.jpg new file mode 100644 index 000000000..45367669b Binary files /dev/null and b/img/social_cards/ca_blog_markdown.jpg differ diff --git a/img/social_cards/ca_blog_security.jpg b/img/social_cards/ca_blog_security.jpg new file mode 100644 index 000000000..36ca0dbab Binary files /dev/null and b/img/social_cards/ca_blog_security.jpg differ diff --git a/img/social_cards/ca_blog_shortcodes.jpg b/img/social_cards/ca_blog_shortcodes.jpg new file mode 100644 index 000000000..f10e0219a Binary files /dev/null and b/img/social_cards/ca_blog_shortcodes.jpg differ diff --git a/img/social_cards/ca_blog_toc.jpg b/img/social_cards/ca_blog_toc.jpg new file mode 100644 index 000000000..61b7ba139 Binary files /dev/null and b/img/social_cards/ca_blog_toc.jpg differ diff --git a/img/social_cards/ca_projects.jpg b/img/social_cards/ca_projects.jpg new file mode 100644 index 000000000..16aa83e0c Binary files /dev/null and b/img/social_cards/ca_projects.jpg differ diff --git a/img/social_cards/es.jpg b/img/social_cards/es.jpg new file mode 100644 index 000000000..d03480e98 Binary files /dev/null and b/img/social_cards/es.jpg differ diff --git a/img/social_cards/es_archive.jpg b/img/social_cards/es_archive.jpg new file mode 100644 index 000000000..8432eccdf Binary files /dev/null and b/img/social_cards/es_archive.jpg differ diff --git a/img/social_cards/es_blog.jpg b/img/social_cards/es_blog.jpg new file mode 100644 index 000000000..d6d04d38a Binary files /dev/null and b/img/social_cards/es_blog.jpg differ diff --git a/img/social_cards/es_blog_comments.jpg b/img/social_cards/es_blog_comments.jpg new file mode 100644 index 000000000..8cc832e45 Binary files /dev/null and b/img/social_cards/es_blog_comments.jpg differ diff --git a/img/social_cards/es_blog_custom_font_subset.jpg b/img/social_cards/es_blog_custom_font_subset.jpg new file mode 100644 index 000000000..474087b1e Binary files /dev/null and b/img/social_cards/es_blog_custom_font_subset.jpg differ diff --git a/img/social_cards/es_blog_customise_tabi.jpg b/img/social_cards/es_blog_customise_tabi.jpg new file mode 100644 index 000000000..cdc2e7ee8 Binary files /dev/null and b/img/social_cards/es_blog_customise_tabi.jpg differ diff --git a/img/social_cards/es_blog_javascript.jpg b/img/social_cards/es_blog_javascript.jpg new file mode 100644 index 000000000..86db93707 Binary files /dev/null and b/img/social_cards/es_blog_javascript.jpg differ diff --git a/img/social_cards/es_blog_markdown.jpg b/img/social_cards/es_blog_markdown.jpg new file mode 100644 index 000000000..8f0d6681a Binary files /dev/null and b/img/social_cards/es_blog_markdown.jpg differ diff --git a/img/social_cards/es_blog_security.jpg b/img/social_cards/es_blog_security.jpg new file mode 100644 index 000000000..1b53057fb Binary files /dev/null and b/img/social_cards/es_blog_security.jpg differ diff --git a/img/social_cards/es_blog_shortcodes.jpg b/img/social_cards/es_blog_shortcodes.jpg new file mode 100644 index 000000000..a8aa31521 Binary files /dev/null and b/img/social_cards/es_blog_shortcodes.jpg differ diff --git a/img/social_cards/es_blog_toc.jpg b/img/social_cards/es_blog_toc.jpg new file mode 100644 index 000000000..7ebe7a088 Binary files /dev/null and b/img/social_cards/es_blog_toc.jpg differ diff --git a/img/social_cards/es_projects.jpg b/img/social_cards/es_projects.jpg new file mode 100644 index 000000000..d67a0a555 Binary files /dev/null and b/img/social_cards/es_projects.jpg differ diff --git a/img/social_cards/index.jpg b/img/social_cards/index.jpg new file mode 100644 index 000000000..3496ae7bc Binary files /dev/null and b/img/social_cards/index.jpg differ diff --git a/img/social_cards/projects.jpg b/img/social_cards/projects.jpg new file mode 100644 index 000000000..b7d94ea3e Binary files /dev/null and b/img/social_cards/projects.jpg differ diff --git a/img/spectro.webp b/img/spectro.webp new file mode 100644 index 000000000..2fdbc3602 Binary files /dev/null and b/img/spectro.webp differ diff --git a/img/tabi.webp b/img/tabi.webp new file mode 100644 index 000000000..57da5a283 Binary files /dev/null and b/img/tabi.webp differ diff --git a/index.html b/index.html new file mode 100644 index 000000000..1ece84b13 --- /dev/null +++ b/index.html @@ -0,0 +1 @@ +~/tabi
Latest posts
09 August 2023

Learn how to customise tabi using skins and setting a default theme, making your site uniquely yours.

Read more →
14 July 2023

Discover how to enable a comments section on your posts using giscus, utterances, Hyvor Talk, or Isso, enabling reader interaction and feedback.

Read more →
29 April 2023

Learn how to create a custom subset that only includes the necessary glyphs.

Read more →
22 February 2023

tabi has an easily customizable Content Security Policy (CSP) with safe defaults. Get peace of mind and an A+ on Mozilla Observatory.

Read more →
\ No newline at end of file diff --git a/inter_subset_en.css b/inter_subset_en.css new file mode 100644 index 000000000..cafb38361 --- /dev/null +++ b/inter_subset_en.css @@ -0,0 +1 @@ +@font-face{font-family:"Inter Subset";src:url(data:application/font-woff2;base64,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);} diff --git a/inter_subset_es.css b/inter_subset_es.css new file mode 100644 index 000000000..fe802b02c --- /dev/null +++ b/inter_subset_es.css @@ -0,0 +1 @@ +@font-face{font-family:"Inter Subset";src:url(data:application/font-woff2;base64,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);} diff --git a/isso.css b/isso.css new file mode 100644 index 000000000..26d26c501 --- /dev/null +++ b/isso.css @@ -0,0 +1,374 @@ +/* ========================================================================== */ +/* Generic styling */ +/* ========================================================================== */ +#isso-thread * { + /* Reset */ + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +/* ========================================================================== */ +/* Thread heading area */ +/* ========================================================================== */ +#isso-thread { + margin: 0 auto; + padding: 0; + width: 100%; + color: var(--text-color); + font-size: 0.9em; + font-family: var(--sans-serif-font); +} + +h4.isso-thread-heading { + padding-bottom: 0.2em; + color: var(--text-color); + font-size: 1.2rem; +} + +.isso-feedlink { + float: right; + padding-left: 1em; +} + +.isso-feedlink a { + vertical-align: bottom; + font-size: 0.8em; +} + +/* ========================================================================== */ +/* Comments */ +/* ========================================================================== */ + +.isso-comment { + margin: 0 auto; + max-width: 68em; +} + +.isso-preview .isso-comment { + margin: 0; + padding-top: 0; +} + +.isso-comment:not(:first-of-type), +.isso-follow-up .isso-comment { + margin-bottom: 0.5em; + border-top: 1px solid var(--divider-color); +} + +.isso-avatar { + display: block; + float: left; + margin: 0.95em 0.95em 0; +} + +.isso-avatar svg { + border: 1px solid var(--divider-color); + border-radius: 3px; + width: 100%; + max-width: 48px; + height: 100%; + max-height: 48px; +} + +.isso-text-wrapper { + display: block; + padding: 0.3em; +} + +.isso-follow-up { + padding-left: calc(7% + 20px); +} + +.isso-comment-footer { + font-size: 0.95em; +} + +.isso-comment-header { + font-size: 0.85em; +} + +.isso-comment-header a { + text-decoration: none; +} + +/* Only for comment header, spacer between up-/downvote should have no padding */ +.isso-comment-header .isso-spacer { + padding: 0 6px; +} + +.isso-spacer, +.isso-permalink, +.isso-note, +.isso-parent { + color: var(--meta-color); + font-weight: normal; + text-shadow: none; +} + +.isso-permalink:hover, +.isso-note:hover, +.isso-parent:hover { + color: var(--hover-color); +} + +.isso-note { + float: right; +} + +.isso-author { + color: var(--text-color); + font-weight: 500; +} + +.isso-page-author-suffix { + color: var(--text-color-high-contrast); + font-weight: bold; +} + +/* Style author comments and replies */ +.isso-is-page-author>.isso-text-wrapper { + background-color: var(--bg-1); +} + +.isso-textarea, +.isso-preview { + background-color: var(--bg-2); + padding: 10px; + width: 100%; + color: var(--text-color); + font-size: 0.8em; + font-family: var(--sans-serif-font); +} + +.isso-text p { + margin-top: -0.4em; +} + +.isso-text p:last-child { + margin-bottom: 0.2em; +} + +.isso-text h1, +.isso-text h2, +.isso-text h3, +.isso-text h4, +.isso-text h5, +.isso-text h6 { + font-weight: bold; + font-size: 130%; +} + +.isso-comment-footer { + clear: left; + color: var(--meta-color); + font-size: 0.80em; +} + +.isso-feedlink, +.isso-comment-footer a { + margin: 0.4em; + padding: 0.1em; + font-weight: bold; + text-decoration: none; +} + +.isso-comment-footer .isso-votes { + color: var(--meta-color); +} + +.isso-upvote svg, +.isso-downvote svg { + position: relative; + top: .2em; +} + +.isso-upvote:hover svg, +.isso-downvote:hover svg { + fill: var(--hover-color); +} + +/* Reply postbox under existing comment */ +.isso-comment .isso-postbox { + margin-top: 0.8em; +} + +.isso-comment.isso-no-votes>*>.isso-comment-footer .isso-votes { + display: none; +} + +/* ========================================================================== */ +/* Postbox */ +/* ========================================================================== */ +.isso-postbox { + clear: right; + margin: 0 auto 2em; +} + +.isso-form-wrapper { + display: flex; + flex-direction: column; +} + +.isso-textarea, +.isso-preview { + margin-top: 0.2em; + border: 1px solid var(--divider-color); + border-radius: 5px; + width: 100%; +} + +.isso-textarea { + outline: 0; + width: 100%; + resize: none; +} + +.isso-form-wrapper input[type=checkbox] { + position: relative; + bottom: 1px; + vertical-align: middle; + margin-left: 0; +} + +.isso-notification-section { + display: none; + padding-top: .3em; + padding-bottom: 10px; + font-size: 0.90em; +} + +.isso-auth-section { + display: flex; + flex-direction: row; +} + +.isso-input-wrapper, +.isso-post-action { + display: flex; + flex-direction: column; + justify-content: flex-end; + align-items: center; + margin: 0 auto; + max-width: 35%; + font-size: 0.8em; + font-family: var(--sans-serif-font); + text-align: center; +} + +.isso-input-wrapper { + margin-right: 0.5em; +} + +.isso-input-wrapper input, +.isso-post-action input { + margin-top: auto; +} + +.isso-input-wrapper label { + display: inline-block; + margin-top: auto; + height: auto; + line-height: 1.4em; +} + +.isso-input-wrapper input { + border: 1px solid var(--divider-color); + border-radius: 5px; + background-color: var(--bg-2); + padding: 0.3em; + width: 100%; + color: var(--text-color); + line-height: 1.2em; + font-family: var(--sans-serif-font); +} + +.isso-post-action input { + cursor: pointer; + margin: 0.1em; + border: none; + border-radius: 5px; + background-color: var(--primary-color); + padding: 0.6em 1em; + color: var(--background-color); + font-size: 0.8rem; +} + +.isso-post-action { + display: block; + align-self: flex-end; + margin: 0 auto; +} + +.isso-post-action>input:hover { + opacity: 0.8; +} + +/* ========================================================================== */ +/* Postbox (preview mode) */ +/* ========================================================================== */ +.isso-preview, +.isso-post-action input[name="edit"], +.isso-postbox.isso-preview-mode>.isso-form-wrapper input[name="preview"], +.isso-postbox.isso-preview-mode>.isso-form-wrapper .isso-textarea { + display: none; +} + +.isso-postbox.isso-preview-mode>.isso-form-wrapper .isso-preview { + display: block; +} + +.isso-postbox.isso-preview-mode>.isso-form-wrapper input[name="edit"] { + display: inline; +} + +.isso-preview { + background: repeating-linear-gradient(-45deg, + var(--bg-0), + var(--bg-0) 10px, + var(--bg-2) 10px, + var(--bg-2) 20px); + background-color: var(--bg-0); +} + +/* ========================================================================== */ +/* Animations */ +/* ========================================================================== */ + +/* "target" means the comment that's being linked to, for example: + * https://example.com/blog/example/#isso-15 + */ +.isso-target { + animation: isso-target-fade 5s ease-out; +} + +@keyframes isso-target-fade { + 0% { + background-color: var(--divider-color) + } +} + +/* ========================================================================== */ +/* Media queries */ +/* ========================================================================== */ +@media screen and (max-width:600px) { + .isso-auth-section { + flex-direction: column; + text-align: center; + } + + .isso-input-wrapper { + display: block; + margin: 0 0 .4em; + max-width: 100%; + } + + .isso-input-wrapper input { + width: 100%; + } + + .isso-post-action { + margin: 0.4em auto; + width: 60%; + } +} diff --git a/isso.min.css b/isso.min.css new file mode 100644 index 000000000..7d106d1a1 --- /dev/null +++ b/isso.min.css @@ -0,0 +1 @@ +.isso-avatar svg,.isso-preview,.isso-textarea{border:1px solid var(--divider-color);width:100%}#isso-thread *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#isso-thread{margin:0 auto;padding:0;width:100%;color:var(--text-color);font-size:.9em;font-family:var(--sans-serif-font)}h4.isso-thread-heading{padding-bottom:.2em;color:var(--text-color);font-size:1.2rem}.isso-feedlink,.isso-note{float:right}.isso-feedlink a{vertical-align:bottom;font-size:.8em}.isso-comment{margin:0 auto;max-width:68em}.isso-preview .isso-comment{margin:0;padding-top:0}.isso-comment:not(:first-of-type),.isso-follow-up .isso-comment{margin-bottom:.5em;border-top:1px solid var(--divider-color)}.isso-avatar{display:block;float:left;margin:.95em .95em 0}.isso-avatar svg{border-radius:3px;max-width:48px;height:100%;max-height:48px}.isso-text-wrapper{display:block;padding:.3em}.isso-follow-up{padding-left:calc(7% + 20px)}.isso-comment-header{font-size:.85em}.isso-comment-header a{text-decoration:none}.isso-comment-header .isso-spacer{padding:0 6px}.isso-note,.isso-parent,.isso-permalink,.isso-spacer{color:var(--meta-color);font-weight:400;text-shadow:none}.isso-note:hover,.isso-parent:hover,.isso-permalink:hover{color:var(--hover-color)}.isso-author{color:var(--text-color);font-weight:500}.isso-page-author-suffix{color:var(--text-color-high-contrast);font-weight:700}.isso-input-wrapper input,.isso-preview,.isso-textarea{background-color:var(--bg-2);color:var(--text-color);font-family:var(--sans-serif-font)}.isso-is-page-author>.isso-text-wrapper{background-color:var(--bg-1)}.isso-preview,.isso-textarea{padding:10px;font-size:.8em}.isso-comment-footer,.isso-comment-footer .isso-votes{color:var(--meta-color)}.isso-text p{margin-top:-.4em}.isso-text p:last-child{margin-bottom:.2em}.isso-text h1,.isso-text h2,.isso-text h3,.isso-text h4,.isso-text h5,.isso-text h6{font-weight:700;font-size:130%}.isso-comment-footer{clear:left;font-size:.8em}.isso-comment-footer a,.isso-feedlink{margin:.4em;padding:.1em;font-weight:700;text-decoration:none}.isso-downvote svg,.isso-upvote svg{position:relative;top:.2em}.isso-downvote:hover svg,.isso-upvote:hover svg{fill:var(--hover-color)}.isso-comment .isso-postbox{margin-top:.8em}.isso-comment.isso-no-votes>*>.isso-comment-footer .isso-votes,.isso-post-action input[name=edit],.isso-postbox.isso-preview-mode>.isso-form-wrapper .isso-textarea,.isso-postbox.isso-preview-mode>.isso-form-wrapper input[name=preview],.isso-preview{display:none}.isso-postbox{clear:right;margin:0 auto 2em}.isso-form-wrapper{display:flex;flex-direction:column}.isso-preview,.isso-textarea{margin-top:.2em;border-radius:5px}.isso-textarea{outline:0;width:100%;resize:none}.isso-form-wrapper input[type=checkbox]{position:relative;bottom:1px;vertical-align:middle;margin-left:0}.isso-notification-section{display:none;padding-top:.3em;padding-bottom:10px;font-size:.9em}.isso-auth-section{display:flex;flex-direction:row}.isso-input-wrapper,.isso-post-action{display:flex;flex-direction:column;justify-content:flex-end;align-items:center;margin:0 auto;max-width:35%;font-size:.8em;font-family:var(--sans-serif-font);text-align:center}.isso-input-wrapper{margin-right:.5em}.isso-input-wrapper input,.isso-post-action input{margin-top:auto}.isso-input-wrapper label{display:inline-block;margin-top:auto;height:auto;line-height:1.4em}.isso-input-wrapper input{border:1px solid var(--divider-color);border-radius:5px;padding:.3em;width:100%;line-height:1.2em}.isso-post-action input{cursor:pointer;margin:.1em;border:none;border-radius:5px;background-color:var(--primary-color);padding:.6em 1em;color:var(--background-color);font-size:.8rem}.isso-post-action{display:block;align-self:flex-end;margin:0 auto}.isso-post-action>input:hover{opacity:.8}.isso-postbox.isso-preview-mode>.isso-form-wrapper .isso-preview{display:block}.isso-postbox.isso-preview-mode>.isso-form-wrapper input[name=edit]{display:inline}.isso-preview{background:repeating-linear-gradient(-45deg,var(--bg-0),var(--bg-0) 10px,var(--bg-2) 10px,var(--bg-2) 20px);background-color:var(--bg-0)}.isso-target{animation:5s ease-out isso-target-fade}@keyframes isso-target-fade{0%{background-color:var(--divider-color)}}@media screen and (max-width:600px){.isso-auth-section{flex-direction:column;text-align:center}.isso-input-wrapper{display:block;margin:0 0 .4em;max-width:100%}.isso-input-wrapper input{width:100%}.isso-post-action{margin:.4em auto;width:60%}} diff --git a/js/copyCodeToClipboard.js b/js/copyCodeToClipboard.js new file mode 100644 index 000000000..ba98ba3d0 --- /dev/null +++ b/js/copyCodeToClipboard.js @@ -0,0 +1,37 @@ +const changeIcon = (copyDiv, className) => { + copyDiv.classList.add(className); + setTimeout(() => copyDiv.classList.remove(className), 2500); +}; + +const addCopyEventListenerToDiv = (copyDiv, block) => { + copyDiv.addEventListener("click", () => copyCodeAndChangeIcon(copyDiv, block)); +}; + +const copyCodeAndChangeIcon = async (copyDiv, block) => { + const code = block.querySelector('table') ? getTableCode(block) : getNonTableCode(block); + try { + await navigator.clipboard.writeText(code); + changeIcon(copyDiv, "checked"); + } catch (error) { + changeIcon(copyDiv, "error"); + } +}; + +const getNonTableCode = (block) => { + return [...block.querySelectorAll('code')] + .map(code => code.textContent) + .join(''); +}; + +const getTableCode = (block) => { + return [...block.querySelectorAll('tr')] + .map(row => row.querySelector('td:last-child')?.innerText ?? '') + .join(''); +}; + +document.querySelectorAll("pre").forEach((block) => { + const copyDiv = document.createElement("div"); + copyDiv.className = "copy-code"; + block.prepend(copyDiv); + addCopyEventListenerToDiv(copyDiv, block); +}); diff --git a/js/copyCodeToClipboard.min.js b/js/copyCodeToClipboard.min.js new file mode 100644 index 000000000..9d144b1ec --- /dev/null +++ b/js/copyCodeToClipboard.min.js @@ -0,0 +1 @@ +const changeIcon=(e,t)=>{e.classList.add(t),setTimeout(()=>e.classList.remove(t),2500)},addCopyEventListenerToDiv=(e,t)=>{e.addEventListener("click",()=>copyCodeAndChangeIcon(e,t))},copyCodeAndChangeIcon=async(e,t)=>{let o=t.querySelector("table")?getTableCode(t):getNonTableCode(t);try{await navigator.clipboard.writeText(o),changeIcon(e,"checked")}catch(c){changeIcon(e,"error")}},getNonTableCode=e=>[...e.querySelectorAll("code")].map(e=>e.textContent).join(""),getTableCode=e=>[...e.querySelectorAll("tr")].map(e=>e.querySelector("td:last-child")?.innerText??"").join("");document.querySelectorAll("pre").forEach(e=>{let t=document.createElement("div");t.className="copy-code",e.prepend(t),addCopyEventListenerToDiv(t,e)}); diff --git a/js/decodeMail.js b/js/decodeMail.js new file mode 100644 index 000000000..d62c70ca4 --- /dev/null +++ b/js/decodeMail.js @@ -0,0 +1,44 @@ +(function () { + 'use strict'; + + // Utility function: Base64 Decoding. + function decodeBase64(encodedString) { + try { + // Can't use atob() directly because it doesn't support non-ascii characters. + // And non-ascii characters are allowed in email addresses and domains. + // See https://en.wikipedia.org/wiki/Email_address#Internationalization + // Code below adapted from Jackie Han: https://stackoverflow.com/a/64752311 + const byteString = atob(encodedString); + + // Convert byteString to an array of char codes. + const charCodes = [...byteString].map(char => char.charCodeAt(0)); + + // Use TypedArray.prototype.set() to copy the char codes into a Uint8Array. + const bytes = new Uint8Array(charCodes.length); + bytes.set(charCodes); + + const decoder = new TextDecoder("utf-8"); + return decoder.decode(bytes); + } catch (e) { + console.error("Failed to decode Base64 string: ", e); + return null; + } + } + + // Utility function: Update href of an element with a decoded email. + function updateEmailHref(element) { + const encodedEmail = element.getAttribute('data-encoded-email'); + const decodedEmail = decodeBase64(encodedEmail); + + if (decodedEmail) { + element.setAttribute('href', `mailto:${decodedEmail}`); + } else { + // If the decoding fails, hide the email link. + element.style.display = 'none'; + } + } + + // Fetch and process email elements with the "data-encoded-email" attribute. + const encodedEmailElements = document.querySelectorAll('[data-encoded-email]'); + encodedEmailElements.forEach(updateEmailHref); +})(); diff --git a/js/decodeMail.min.js b/js/decodeMail.min.js new file mode 100644 index 000000000..2b766a053 --- /dev/null +++ b/js/decodeMail.min.js @@ -0,0 +1 @@ +!function(){"use strict";document.querySelectorAll("[data-encoded-email]").forEach(function(e){var t=function(e){try{var t=[...atob(e)].map(e=>e.charCodeAt(0)),r=new Uint8Array(t.length);return r.set(t),new TextDecoder("utf-8").decode(r)}catch(e){return console.error("Failed to decode Base64 string: ",e),null}}(e.getAttribute("data-encoded-email"));t?e.setAttribute("href","mailto:"+t):e.style.display="none"})}(); diff --git a/js/footnoteBacklinks.js b/js/footnoteBacklinks.js new file mode 100644 index 000000000..8c2009852 --- /dev/null +++ b/js/footnoteBacklinks.js @@ -0,0 +1,33 @@ +// Assign unique IDs to the footnote references based on their hashes. +function assignReferenceIds() { + const references = document.querySelectorAll('.footnote-reference'); + for (const ref of references) { + ref.id = `ref:${ref.children[0].hash.substring(1)}`; + } +} + +// Create backlinks for each footnote definition if a corresponding reference exists. +function createFootnoteBacklinks() { + const footnotes = document.querySelectorAll('.footnote-definition'); + for (const footnote of footnotes) { + const backlinkId = `ref:${footnote.id}`; + + // Skip if there's no corresponding reference in the text (i.e. the footnote doesn't reference anything). + if (!document.getElementById(backlinkId)) continue; + + const backlink = document.createElement('a'); + backlink.href = `#${backlinkId}`; + backlink.className = 'footnote-backlink'; + backlink.textContent = '↩'; + footnote.lastElementChild.appendChild(backlink); + } +} + +// Initialise the handlers for the footnote references and definitions. +function initFootnotes() { + assignReferenceIds(); + createFootnoteBacklinks(); +} + +// Wait for the window to load, then execute the main function. +window.addEventListener('load', initFootnotes); diff --git a/js/footnoteBacklinks.min.js b/js/footnoteBacklinks.min.js new file mode 100644 index 000000000..c2175a766 --- /dev/null +++ b/js/footnoteBacklinks.min.js @@ -0,0 +1 @@ +function assignReferenceIds(){for(const e of document.querySelectorAll(".footnote-reference"))e.id="ref:"+e.children[0].hash.substring(1)}function createFootnoteBacklinks(){for(const n of document.querySelectorAll(".footnote-definition")){var e,t="ref:"+n.id;document.getElementById(t)&&((e=document.createElement("a")).href="#"+t,e.className="footnote-backlink",e.textContent="↩",n.lastElementChild.appendChild(e))}}function initFootnotes(){assignReferenceIds(),createFootnoteBacklinks()}window.addEventListener("load",initFootnotes); diff --git a/js/giscus.js b/js/giscus.js new file mode 100644 index 000000000..13ed38971 --- /dev/null +++ b/js/giscus.js @@ -0,0 +1,79 @@ +function setGiscusTheme(newTheme) { + // Get the giscus iframe. + const frame = document.querySelector('iframe.giscus-frame'); + + if (frame) { + // If the iframe exists, send a message to set the theme. + frame.contentWindow.postMessage( + { giscus: { setConfig: { theme: newTheme } } }, + 'https://giscus.app' + ); + } +} + +// Function to initialize Giscus. This function is run when the window loads. +function initGiscus() { + // Get the div that will contain the comments. + const commentsDiv = document.querySelector('.comments'); + if (commentsDiv) { + // Get the various settings from data attributes on the div. + const repo = commentsDiv.getAttribute('data-repo'); + const repoId = commentsDiv.getAttribute('data-repo-id'); + const category = commentsDiv.getAttribute('data-category'); + const categoryId = commentsDiv.getAttribute('data-category-id'); + const strictTitleMatching = commentsDiv.getAttribute('data-strict'); + const term = commentsDiv.getAttribute('data-term'); + const reactionsEnabled = commentsDiv.getAttribute('data-reactions-enabled'); + const inputPosition = commentsDiv.getAttribute('data-input-position'); + const lightTheme = commentsDiv.getAttribute('data-light-theme'); + const darkTheme = commentsDiv.getAttribute('data-dark-theme'); + const lang = commentsDiv.getAttribute('data-lang'); + const lazyLoading = commentsDiv.getAttribute('data-lazy-loading'); + + // Create a new script tag that will load the Giscus script. + const script = document.createElement('script'); + script.src = 'https://giscus.app/client.js'; + script.async = true; + + // Set the various settings as data attributes on the script tag. + script.setAttribute('data-repo', repo); + script.setAttribute('data-repo-id', repoId); + script.setAttribute('data-category', category); + script.setAttribute('data-category-id', categoryId); + script.setAttribute('data-term', term); + script.setAttribute('data-strict', strictTitleMatching); + script.setAttribute('data-reactions-enabled', reactionsEnabled); + script.setAttribute('data-emit-metadata', '0'); + script.setAttribute('data-input-position', inputPosition); + script.setAttribute('data-lang', lang); + script.setAttribute('crossorigin', 'anonymous'); + + // Set the mapping if it is provided. + const mapping = commentsDiv.getAttribute('data-mapping'); + if (mapping) { + script.setAttribute('data-mapping', mapping); + } + + // Choose the correct theme based on the current theme of the document. + const currentTheme = document.documentElement.getAttribute('data-theme') || 'light'; + const selectedTheme = currentTheme === 'dark' ? darkTheme : lightTheme; + script.setAttribute('data-theme', selectedTheme); + + // Set the loading attribute if lazy loading is enabled. + if (lazyLoading === 'true') { + script.setAttribute('data-loading', 'lazy'); + } + + // Add the script tag to the div. + commentsDiv.appendChild(script); + + // Listen for theme changes and update the Giscus theme when they occur. + window.addEventListener('themeChanged', (event) => { + const selectedTheme = event.detail.theme === 'dark' ? darkTheme : lightTheme; + setGiscusTheme(selectedTheme); + }); + } +} + +// Initialize Giscus. +initGiscus(); diff --git a/js/giscus.min.js b/js/giscus.min.js new file mode 100644 index 000000000..2846f2283 --- /dev/null +++ b/js/giscus.min.js @@ -0,0 +1 @@ +function setGiscusTheme(t){var e=document.querySelector("iframe.giscus-frame");e&&e.contentWindow.postMessage({giscus:{setConfig:{theme:t}}},"https://giscus.app")}function initGiscus(){var t=document.querySelector(".comments");if(t){var e=t.getAttribute("data-repo"),a=t.getAttribute("data-repo-id"),i=t.getAttribute("data-category"),r=t.getAttribute("data-category-id"),d=t.getAttribute("data-strict"),s=t.getAttribute("data-term"),u=t.getAttribute("data-reactions-enabled"),n=t.getAttribute("data-input-position");const b=t.getAttribute("data-light-theme"),A=t.getAttribute("data-dark-theme");var o=t.getAttribute("data-lang"),c=t.getAttribute("data-lazy-loading"),g=document.createElement("script"),e=(g.src="https://giscus.app/client.js",g.async=!0,g.setAttribute("data-repo",e),g.setAttribute("data-repo-id",a),g.setAttribute("data-category",i),g.setAttribute("data-category-id",r),g.setAttribute("data-term",s),g.setAttribute("data-strict",d),g.setAttribute("data-reactions-enabled",u),g.setAttribute("data-emit-metadata","0"),g.setAttribute("data-input-position",n),g.setAttribute("data-lang",o),g.setAttribute("crossorigin","anonymous"),t.getAttribute("data-mapping")),a=(e&&g.setAttribute("data-mapping",e),document.documentElement.getAttribute("data-theme")||"light"),i="dark"===a?A:b;g.setAttribute("data-theme",i),"true"===c&&g.setAttribute("data-loading","lazy"),t.appendChild(g),window.addEventListener("themeChanged",t=>{setGiscusTheme("dark"===t.detail.theme?A:b)})}}initGiscus(); diff --git a/js/hyvortalk.js b/js/hyvortalk.js new file mode 100644 index 000000000..c2091af97 --- /dev/null +++ b/js/hyvortalk.js @@ -0,0 +1,43 @@ +function initHyvorTalk() { + // Get the div that will contain the comments. + const commentsDiv = document.querySelector('#comments'); + if (commentsDiv) { + // Get the various settings from data attributes on the div. + const websiteId = commentsDiv.getAttribute('data-website-id'); + const pageId = commentsDiv.getAttribute('data-page-id'); + const pageLanguage = commentsDiv.getAttribute('data-page-language'); + const loading = commentsDiv.getAttribute('data-loading'); + const pageAuthor = commentsDiv.getAttribute('data-page-author'); + + // Create a new script tag that will load the Hyvor Talk script. + const script = document.createElement('script'); + script.src = 'https://talk.hyvor.com/embed/embed.js'; + script.async = true; + script.type = 'module'; + document.head.appendChild(script); + + // Create a new Hyvor Talk comments tag. + const comments = document.createElement('hyvor-talk-comments'); + comments.setAttribute('website-id', websiteId); + comments.setAttribute('page-id', pageId); + comments.setAttribute('page-language', pageLanguage); + comments.setAttribute('loading', loading); + comments.setAttribute('page-author', pageAuthor); + + // Choose the correct theme based on the current theme of the document. + const currentTheme = document.documentElement.getAttribute('data-theme') || 'light'; + comments.setAttribute('colors', currentTheme); + + // Add the Hyvor Talk comments tag to the div. + commentsDiv.appendChild(comments); + + // Listen for theme changes and update the Hyvor Talk theme when they occur. + window.addEventListener('themeChanged', (event) => { + const selectedTheme = event.detail.theme; + comments.setAttribute('colors', selectedTheme); + }); + } +} + +// Initialize HyvorTalk. +initHyvorTalk(); diff --git a/js/hyvortalk.min.js b/js/hyvortalk.min.js new file mode 100644 index 000000000..df72cf018 --- /dev/null +++ b/js/hyvortalk.min.js @@ -0,0 +1 @@ +function initHyvorTalk(){var t=document.querySelector("#comments");if(t){var e=t.getAttribute("data-website-id"),a=t.getAttribute("data-page-id"),i=t.getAttribute("data-page-language"),d=t.getAttribute("data-loading"),r=t.getAttribute("data-page-author"),n=document.createElement("script");n.src="https://talk.hyvor.com/embed/embed.js",n.async=!0,n.type="module",document.head.appendChild(n);const o=document.createElement("hyvor-talk-comments");o.setAttribute("website-id",e),o.setAttribute("page-id",a),o.setAttribute("page-language",i),o.setAttribute("loading",d),o.setAttribute("page-author",r);n=document.documentElement.getAttribute("data-theme")||"light";o.setAttribute("colors",n),t.appendChild(o),window.addEventListener("themeChanged",t=>{t=t.detail.theme;o.setAttribute("colors",t)})}}initHyvorTalk(); diff --git a/js/initializeTheme.js b/js/initializeTheme.js new file mode 100644 index 000000000..5c8a96c0f --- /dev/null +++ b/js/initializeTheme.js @@ -0,0 +1,17 @@ +(function () { + // Get the current theme from the browser's local storage. + // This allows the user's theme preference to persist across sessions. + const currentTheme = localStorage.getItem('theme'); + + // Check if the current theme is stored in local storage. + if (currentTheme) { + // If a theme is found in local storage, apply it to the document. + document.documentElement.setAttribute('data-theme', currentTheme); + } else { + // If no theme is found in local storage, determine if the user's system prefers a dark color scheme. + const isSystemDark = window.matchMedia('(prefers-color-scheme: dark)').matches; + + // Set the document's theme attribute to match the system preference. + document.documentElement.setAttribute('data-theme', isSystemDark ? 'dark' : 'light'); + } +})(); diff --git a/js/initializeTheme.min.js b/js/initializeTheme.min.js new file mode 100644 index 000000000..fa8208de4 --- /dev/null +++ b/js/initializeTheme.min.js @@ -0,0 +1 @@ +!function(){var e=localStorage.getItem("theme");e?document.documentElement.setAttribute("data-theme",e):(e=window.matchMedia("(prefers-color-scheme: dark)").matches,document.documentElement.setAttribute("data-theme",e?"dark":"light"))}(); diff --git a/js/isso.js b/js/isso.js new file mode 100644 index 000000000..3ebdb0d3b --- /dev/null +++ b/js/isso.js @@ -0,0 +1,80 @@ +// Function to initialise Isso. +function initIsso() { + // Get the div that will contain the comments. + const commentsDiv = document.querySelector('.comments'); + if (commentsDiv) { + // Get the lazy-loading setting from the div. + const lazyLoading = commentsDiv.getAttribute('data-lazy-loading') === "true"; + + // If lazy-loading is enabled, create an Intersection Observer and use it. + if (lazyLoading) { + const observer = new IntersectionObserver(entries => { + // Loop over the entries. + entries.forEach(entry => { + // If the element is in the viewport, initialize Isso. + if (entry.isIntersecting) { + loadIsso(commentsDiv); + // Once the Isso is loaded, we don't need to observe the element anymore. + observer.unobserve(commentsDiv); + } + }); + }); + + // Start observing the comments div. + observer.observe(commentsDiv); + } else { + // If lazy-loading is not enabled, initialise Isso immediately. + loadIsso(commentsDiv); + } + } +} + +// Function to load Isso. +function loadIsso(commentsDiv) { + // Get the various settings from data attributes on the div. + const endpointUrl = commentsDiv.getAttribute('data-endpoint-url'); + const pageId = commentsDiv.getAttribute('data-isso-id'); + const title = commentsDiv.getAttribute('data-title'); + const lang = commentsDiv.getAttribute('data-page-language'); + const maxCommentsTop = commentsDiv.getAttribute('data-max-comments-top'); + const maxCommentsNested = commentsDiv.getAttribute('data-max-comments-nested'); + const avatar = commentsDiv.getAttribute('data-avatar'); + const voting = commentsDiv.getAttribute('data-voting'); + const hashes = commentsDiv.getAttribute('data-page-author-hashes'); + + // Create a new script tag that will load the Isso script. + const script = document.createElement('script'); + script.src = endpointUrl + 'js/embed.min.js'; + script.async = true; + + // Set the various settings as data attributes on the script tag. + script.setAttribute('data-isso', endpointUrl); + script.setAttribute('data-isso-lang', lang); + script.setAttribute('data-isso-max-comments-top', maxCommentsTop); + script.setAttribute('data-isso-avatar', avatar); + script.setAttribute('data-isso-vote', voting); + script.setAttribute('data-isso-page-author-hashes', hashes); + script.setAttribute('data-isso-css', 'false'); + + // Set the id and data-isso-id of the Isso thread. + const section = document.createElement('section'); + section.id = 'isso-thread'; + section.setAttribute('data-isso-id', pageId); + section.setAttribute('data-title', title); + commentsDiv.appendChild(section); + + // Add the script tag to the div. + commentsDiv.appendChild(script); + + // Create a link tag for the Isso CSS. + const link = document.createElement('link'); + link.rel = 'stylesheet'; + link.type = 'text/css'; + link.href = '/isso.min.css'; + + // Add the CSS link tag to the head of the document. + document.head.appendChild(link); +} + +// Initialize Isso. +initIsso(); diff --git a/js/isso.min.js b/js/isso.min.js new file mode 100644 index 000000000..b1434210f --- /dev/null +++ b/js/isso.min.js @@ -0,0 +1 @@ +function initIsso(){const e=document.querySelector(".comments");if(e)if("true"===e.getAttribute("data-lazy-loading")){const a=new IntersectionObserver(t=>{t.forEach(t=>{t.isIntersecting&&(loadIsso(e),a.unobserve(e))})});a.observe(e)}else loadIsso(e)}function loadIsso(t){var e=t.getAttribute("data-endpoint-url"),a=t.getAttribute("data-isso-id"),s=t.getAttribute("data-title"),i=t.getAttribute("data-page-language"),o=t.getAttribute("data-max-comments-top"),r=(t.getAttribute("data-max-comments-nested"),t.getAttribute("data-avatar")),d=t.getAttribute("data-voting"),n=t.getAttribute("data-page-author-hashes"),u=document.createElement("script"),e=(u.src=e+"js/embed.min.js",u.async=!0,u.setAttribute("data-isso",e),u.setAttribute("data-isso-lang",i),u.setAttribute("data-isso-max-comments-top",o),u.setAttribute("data-isso-avatar",r),u.setAttribute("data-isso-vote",d),u.setAttribute("data-isso-page-author-hashes",n),u.setAttribute("data-isso-css","false"),document.createElement("section")),i=(e.id="isso-thread",e.setAttribute("data-isso-id",a),e.setAttribute("data-title",s),t.appendChild(e),t.appendChild(u),document.createElement("link"));i.rel="stylesheet",i.type="text/css",i.href="/isso.min.css",document.head.appendChild(i)}initIsso(); diff --git a/js/katex.min.js b/js/katex.min.js new file mode 100644 index 000000000..7c1e322f1 --- /dev/null +++ b/js/katex.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.katex=t():e.katex=t()}("undefined"!=typeof self?self:this,function(){return function(){"use strict";var e={d:function(t,$){for(var r in $)e.o($,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:$[r]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){return rC}});var $=function e(t,$){this.position=void 0;var r,_="KaTeX parse error: "+t,n=$&&$.loc;if(n&&n.start<=n.end){var a=n.lexer.input;r=n.start;var i=n.end;r===a.length?_+=" at end of input: ":_+=" at position "+(r+1)+": ";var o=a.slice(r,i).replace(/[^]/g,"$&̲");_+=(r>15?"…"+a.slice(r-15,r):a.slice(0,r))+o+(i+15":">","<":"<",'"':""","'":"'"},a=/[&><"']/g,i=function e(t){return"ordgroup"===t.type||"color"===t.type?1===t.body.length?e(t.body[0]):t:"font"===t.type?e(t.body):t},o={contains:function(e,t){return -1!==e.indexOf(t)},deflt:function(e,t){return void 0===e?t:e},escape:function(e){return String(e).replace(a,function(e){return n[e]})},hyphenate:function(e){return e.replace(_,"-$1").toLowerCase()},getBaseElem:i,isCharacterBox:function(e){var t=i(e);return"mathord"===t.type||"textord"===t.type||"atom"===t.type},protocolFromUrl:function(e){var t=/^\s*([^\\/#]*?)(?::|�*58|�*3a)/i.exec(e);return null!=t?t[1]:"_relative"}},s={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:function(e){return"#"+e}},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:function(e,t){return t.push(e),t}},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:function(e){return Math.max(0,e)},cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:function(e){return Math.max(0,e)},cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:function(e){return Math.max(0,e)},cli:"-e, --max-expand ",cliProcessor:function(e){return"Infinity"===e?1/0:parseInt(e)}},globalGroup:{type:"boolean",cli:!1}};function l(e){if(e.default)return e.default;var t=e.type,$=Array.isArray(t)?t[0]:t;if("string"!=typeof $)return $.enum[0];switch($){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}var h=function(){function e(e){for(var t in this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{},s)if(s.hasOwnProperty(t)){var $=s[t];this[t]=void 0!==e[t]?$.processor?$.processor(e[t]):e[t]:l($)}}var t=e.prototype;return t.reportNonstrict=function(e,t,$){var _=this.strict;if("function"==typeof _&&(_=_(e,t,$)),_&&"ignore"!==_){if(!0===_||"error"===_)throw new r("LaTeX-incompatible input and strict mode is set to 'error': "+t+" ["+e+"]",$);"warn"===_?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+_+"': "+t+" ["+e+"]")}},t.useStrictBehavior=function(e,t,$){var r=this.strict;if("function"==typeof r)try{r=r(e,t,$)}catch(_){r="error"}return!(!r||"ignore"===r)&&(!0===r||"error"===r||("warn"===r?("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"),!1):("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+r+"': "+t+" ["+e+"]"),!1)))},t.isTrusted=function(e){return e.url&&!e.protocol&&(e.protocol=o.protocolFromUrl(e.url)),Boolean("function"==typeof this.trust?this.trust(e):this.trust)},e}(),m=function(){function e(e,t,$){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=t,this.cramped=$}var t=e.prototype;return t.sup=function(){return c[u[this.id]]},t.sub=function(){return c[p[this.id]]},t.fracNum=function(){return c[d[this.id]]},t.fracDen=function(){return c[f[this.id]]},t.cramp=function(){return c[g[this.id]]},t.text=function(){return c[v[this.id]]},t.isTight=function(){return this.size>=2},e}(),c=[new m(0,0,!1),new m(1,0,!0),new m(2,1,!1),new m(3,1,!0),new m(4,2,!1),new m(5,2,!0),new m(6,3,!1),new m(7,3,!0)],u=[4,5,4,5,6,7,6,7],p=[5,5,5,5,7,7,7,7],d=[2,3,4,5,6,7,6,7],f=[3,3,5,5,7,7,7,7],g=[1,1,3,3,5,5,7,7],v=[0,1,2,3,2,3,2,3],b={DISPLAY:c[0],TEXT:c[2],SCRIPT:c[4],SCRIPTSCRIPT:c[6]},y=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}],x=[];function w(e){for(var t=0;t=x[t]&&e<=x[t+1])return!0;return!1}y.forEach(function(e){return e.blocks.forEach(function(e){return x.push.apply(x,e)})});var k={doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"},S=function(){function e(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}var t=e.prototype;return t.hasClass=function(e){return o.contains(this.classes,e)},t.toNode=function(){for(var e=document.createDocumentFragment(),t=0;t=5?0:e>=3?1:2]){var $=B[t]={cssEmPerMu:M.quad[t]/18};for(var r in M)M.hasOwnProperty(r)&&($[r]=M[r][t])}return B[t]}(this.size)),this._fontMetrics},t.getColor=function(){return this.phantom?"transparent":this.color},e}();H.BASESIZE=6;var I=H,R={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},O={ex:!0,em:!0,mu:!0},L=function(e){return"string"!=typeof e&&(e=e.unit),e in R||e in O||"ex"===e},D=function(e,t){var $,_;if(e.unit in R)$=R[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if("mu"===e.unit)$=t.fontMetrics().cssEmPerMu;else{if(_=t.style.isTight()?t.havingStyle(t.style.text()):t,"ex"===e.unit)$=_.fontMetrics().xHeight;else{if("em"!==e.unit)throw new r("Invalid unit: '"+e.unit+"'");$=_.fontMetrics().quad}_!==t&&($*=_.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*$,t.maxSize)},E=function(e){return+e.toFixed(4)+"em"},P=function(e){return e.filter(function(e){return e}).join(" ")},V=function(e,t,$){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=$||{},t){t.style.isTight()&&this.classes.push("mtight");var r=t.getColor();r&&(this.style.color=r)}},F=function(e){var t=document.createElement(e);for(var $ in t.className=P(this.classes),this.style)this.style.hasOwnProperty($)&&(t.style[$]=this.style[$]);for(var r in this.attributes)this.attributes.hasOwnProperty(r)&&t.setAttribute(r,this.attributes[r]);for(var _=0;_"},U=function(){function e(e,t,$,r){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,V.call(this,e,$,r),this.children=t||[]}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.hasClass=function(e){return o.contains(this.classes,e)},t.toNode=function(){return F.call(this,"span")},t.toMarkup=function(){return G.call(this,"span")},e}(),X=function(){function e(e,t,$,r){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,V.call(this,t,r),this.children=$||[],this.setAttribute("href",e)}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.hasClass=function(e){return o.contains(this.classes,e)},t.toNode=function(){return F.call(this,"a")},t.toMarkup=function(){return G.call(this,"a")},e}(),Y=function(){function e(e,t,$){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=t,this.src=e,this.classes=["mord"],this.style=$}var t=e.prototype;return t.hasClass=function(e){return o.contains(this.classes,e)},t.toNode=function(){var e=document.createElement("img");for(var t in e.src=this.src,e.alt=this.alt,e.className="mord",this.style)this.style.hasOwnProperty(t)&&(e.style[t]=this.style[t]);return e},t.toMarkup=function(){var e=""+this.alt+"=_[0]&&e<=_[1])return $.name}return null}(this.text.charCodeAt(0));o&&this.classes.push(o+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=W[this.text])}var t=e.prototype;return t.hasClass=function(e){return o.contains(this.classes,e)},t.toNode=function(){var e=document.createTextNode(this.text),t=null;for(var $ in this.italic>0&&((t=document.createElement("span")).style.marginRight=E(this.italic)),this.classes.length>0&&((t=t||document.createElement("span")).className=P(this.classes)),this.style)this.style.hasOwnProperty($)&&((t=t||document.createElement("span")).style[$]=this.style[$]);return t?(t.appendChild(e),t):e},t.toMarkup=function(){var e=!1,t="0&&($+="margin-right:"+this.italic+"em;"),this.style)this.style.hasOwnProperty(r)&&($+=o.hyphenate(r)+":"+this.style[r]+";");$&&(e=!0,t+=' style="'+o.escape($)+'"');var _=o.escape(this.text);return e?(t+=">",t+=_,t+=""):_},e}(),Z=function(){function e(e,t){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=t||{}}var t=e.prototype;return t.toNode=function(){var e=document.createElementNS("http://www.w3.org/2000/svg","svg");for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);for(var $=0;$"},e}(),K=function(){function e(e,t){this.pathName=void 0,this.alternate=void 0,this.pathName=e,this.alternate=t}var t=e.prototype;return t.toNode=function(){var e=document.createElementNS("http://www.w3.org/2000/svg","path");return this.alternate?e.setAttribute("d",this.alternate):e.setAttribute("d",k[this.pathName]),e},t.toMarkup=function(){return this.alternate?"":""},e}(),J=function(){function e(e){this.attributes=void 0,this.attributes=e||{}}var t=e.prototype;return t.toNode=function(){var e=document.createElementNS("http://www.w3.org/2000/svg","line");for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);return e},t.toMarkup=function(){var e=""},e}();function Q(e){if(e instanceof j)return e;throw Error("Expected symbolNode but got "+String(e)+".")}var ee={bin:1,close:1,inner:1,open:1,punct:1,rel:1},et={"accent-token":1,mathord:1,"op-token":1,spacing:1,textord:1},e$={math:{},text:{}},er=e$;function e_(e,t,$,r,_,n){e$[e][_]={font:t,group:$,replace:r},n&&r&&(e$[e][r]=e$[e][_])}var en="math",ea="text",ei="main",e2="accent-token",eo="close",es="inner",el="mathord",e3="op-token",e4="open",e5="punct",e1="spacing",e6="textord";e_(en,ei,"rel","≡","\\equiv",!0),e_(en,ei,"rel","≺","\\prec",!0),e_(en,ei,"rel","≻","\\succ",!0),e_(en,ei,"rel","∼","\\sim",!0),e_(en,ei,"rel","⊥","\\perp"),e_(en,ei,"rel","⪯","\\preceq",!0),e_(en,ei,"rel","⪰","\\succeq",!0),e_(en,ei,"rel","≃","\\simeq",!0),e_(en,ei,"rel","∣","\\mid",!0),e_(en,ei,"rel","≪","\\ll",!0),e_(en,ei,"rel","≫","\\gg",!0),e_(en,ei,"rel","≍","\\asymp",!0),e_(en,ei,"rel","∥","\\parallel"),e_(en,ei,"rel","⋈","\\bowtie",!0),e_(en,ei,"rel","⌣","\\smile",!0),e_(en,ei,"rel","⊑","\\sqsubseteq",!0),e_(en,ei,"rel","⊒","\\sqsupseteq",!0),e_(en,ei,"rel","≐","\\doteq",!0),e_(en,ei,"rel","⌢","\\frown",!0),e_(en,ei,"rel","∋","\\ni",!0),e_(en,ei,"rel","∝","\\propto",!0),e_(en,ei,"rel","⊢","\\vdash",!0),e_(en,ei,"rel","⊣","\\dashv",!0),e_(en,ei,"rel","∋","\\owns"),e_(en,ei,e5,".","\\ldotp"),e_(en,ei,e5,"⋅","\\cdotp"),e_(en,ei,e6,"#","\\#"),e_(ea,ei,e6,"#","\\#"),e_(en,ei,e6,"&","\\&"),e_(ea,ei,e6,"&","\\&"),e_(en,ei,e6,"ℵ","\\aleph",!0),e_(en,ei,e6,"∀","\\forall",!0),e_(en,ei,e6,"ℏ","\\hbar",!0),e_(en,ei,e6,"∃","\\exists",!0),e_(en,ei,e6,"∇","\\nabla",!0),e_(en,ei,e6,"♭","\\flat",!0),e_(en,ei,e6,"ℓ","\\ell",!0),e_(en,ei,e6,"♮","\\natural",!0),e_(en,ei,e6,"♣","\\clubsuit",!0),e_(en,ei,e6,"℘","\\wp",!0),e_(en,ei,e6,"♯","\\sharp",!0),e_(en,ei,e6,"♢","\\diamondsuit",!0),e_(en,ei,e6,"ℜ","\\Re",!0),e_(en,ei,e6,"♡","\\heartsuit",!0),e_(en,ei,e6,"ℑ","\\Im",!0),e_(en,ei,e6,"♠","\\spadesuit",!0),e_(en,ei,e6,"\xa7","\\S",!0),e_(ea,ei,e6,"\xa7","\\S"),e_(en,ei,e6,"\xb6","\\P",!0),e_(ea,ei,e6,"\xb6","\\P"),e_(en,ei,e6,"†","\\dag"),e_(ea,ei,e6,"†","\\dag"),e_(ea,ei,e6,"†","\\textdagger"),e_(en,ei,e6,"‡","\\ddag"),e_(ea,ei,e6,"‡","\\ddag"),e_(ea,ei,e6,"‡","\\textdaggerdbl"),e_(en,ei,eo,"⎱","\\rmoustache",!0),e_(en,ei,e4,"⎰","\\lmoustache",!0),e_(en,ei,eo,"⟯","\\rgroup",!0),e_(en,ei,e4,"⟮","\\lgroup",!0),e_(en,ei,"bin","∓","\\mp",!0),e_(en,ei,"bin","⊖","\\ominus",!0),e_(en,ei,"bin","⊎","\\uplus",!0),e_(en,ei,"bin","⊓","\\sqcap",!0),e_(en,ei,"bin","∗","\\ast"),e_(en,ei,"bin","⊔","\\sqcup",!0),e_(en,ei,"bin","◯","\\bigcirc",!0),e_(en,ei,"bin","∙","\\bullet",!0),e_(en,ei,"bin","‡","\\ddagger"),e_(en,ei,"bin","≀","\\wr",!0),e_(en,ei,"bin","⨿","\\amalg"),e_(en,ei,"bin","&","\\And"),e_(en,ei,"rel","⟵","\\longleftarrow",!0),e_(en,ei,"rel","⇐","\\Leftarrow",!0),e_(en,ei,"rel","⟸","\\Longleftarrow",!0),e_(en,ei,"rel","⟶","\\longrightarrow",!0),e_(en,ei,"rel","⇒","\\Rightarrow",!0),e_(en,ei,"rel","⟹","\\Longrightarrow",!0),e_(en,ei,"rel","↔","\\leftrightarrow",!0),e_(en,ei,"rel","⟷","\\longleftrightarrow",!0),e_(en,ei,"rel","⇔","\\Leftrightarrow",!0),e_(en,ei,"rel","⟺","\\Longleftrightarrow",!0),e_(en,ei,"rel","↦","\\mapsto",!0),e_(en,ei,"rel","⟼","\\longmapsto",!0),e_(en,ei,"rel","↗","\\nearrow",!0),e_(en,ei,"rel","↩","\\hookleftarrow",!0),e_(en,ei,"rel","↪","\\hookrightarrow",!0),e_(en,ei,"rel","↘","\\searrow",!0),e_(en,ei,"rel","↼","\\leftharpoonup",!0),e_(en,ei,"rel","⇀","\\rightharpoonup",!0),e_(en,ei,"rel","↙","\\swarrow",!0),e_(en,ei,"rel","↽","\\leftharpoondown",!0),e_(en,ei,"rel","⇁","\\rightharpoondown",!0),e_(en,ei,"rel","↖","\\nwarrow",!0),e_(en,ei,"rel","⇌","\\rightleftharpoons",!0),e_(en,"ams","rel","≮","\\nless",!0),e_(en,"ams","rel","","\\@nleqslant"),e_(en,"ams","rel","","\\@nleqq"),e_(en,"ams","rel","⪇","\\lneq",!0),e_(en,"ams","rel","≨","\\lneqq",!0),e_(en,"ams","rel","","\\@lvertneqq"),e_(en,"ams","rel","⋦","\\lnsim",!0),e_(en,"ams","rel","⪉","\\lnapprox",!0),e_(en,"ams","rel","⊀","\\nprec",!0),e_(en,"ams","rel","⋠","\\npreceq",!0),e_(en,"ams","rel","⋨","\\precnsim",!0),e_(en,"ams","rel","⪹","\\precnapprox",!0),e_(en,"ams","rel","≁","\\nsim",!0),e_(en,"ams","rel","","\\@nshortmid"),e_(en,"ams","rel","∤","\\nmid",!0),e_(en,"ams","rel","⊬","\\nvdash",!0),e_(en,"ams","rel","⊭","\\nvDash",!0),e_(en,"ams","rel","⋪","\\ntriangleleft"),e_(en,"ams","rel","⋬","\\ntrianglelefteq",!0),e_(en,"ams","rel","⊊","\\subsetneq",!0),e_(en,"ams","rel","","\\@varsubsetneq"),e_(en,"ams","rel","⫋","\\subsetneqq",!0),e_(en,"ams","rel","","\\@varsubsetneqq"),e_(en,"ams","rel","≯","\\ngtr",!0),e_(en,"ams","rel","","\\@ngeqslant"),e_(en,"ams","rel","","\\@ngeqq"),e_(en,"ams","rel","⪈","\\gneq",!0),e_(en,"ams","rel","≩","\\gneqq",!0),e_(en,"ams","rel","","\\@gvertneqq"),e_(en,"ams","rel","⋧","\\gnsim",!0),e_(en,"ams","rel","⪊","\\gnapprox",!0),e_(en,"ams","rel","⊁","\\nsucc",!0),e_(en,"ams","rel","⋡","\\nsucceq",!0),e_(en,"ams","rel","⋩","\\succnsim",!0),e_(en,"ams","rel","⪺","\\succnapprox",!0),e_(en,"ams","rel","≆","\\ncong",!0),e_(en,"ams","rel","","\\@nshortparallel"),e_(en,"ams","rel","∦","\\nparallel",!0),e_(en,"ams","rel","⊯","\\nVDash",!0),e_(en,"ams","rel","⋫","\\ntriangleright"),e_(en,"ams","rel","⋭","\\ntrianglerighteq",!0),e_(en,"ams","rel","","\\@nsupseteqq"),e_(en,"ams","rel","⊋","\\supsetneq",!0),e_(en,"ams","rel","","\\@varsupsetneq"),e_(en,"ams","rel","⫌","\\supsetneqq",!0),e_(en,"ams","rel","","\\@varsupsetneqq"),e_(en,"ams","rel","⊮","\\nVdash",!0),e_(en,"ams","rel","⪵","\\precneqq",!0),e_(en,"ams","rel","⪶","\\succneqq",!0),e_(en,"ams","rel","","\\@nsubseteqq"),e_(en,"ams","bin","⊴","\\unlhd"),e_(en,"ams","bin","⊵","\\unrhd"),e_(en,"ams","rel","↚","\\nleftarrow",!0),e_(en,"ams","rel","↛","\\nrightarrow",!0),e_(en,"ams","rel","⇍","\\nLeftarrow",!0),e_(en,"ams","rel","⇏","\\nRightarrow",!0),e_(en,"ams","rel","↮","\\nleftrightarrow",!0),e_(en,"ams","rel","⇎","\\nLeftrightarrow",!0),e_(en,"ams","rel","△","\\vartriangle"),e_(en,"ams",e6,"ℏ","\\hslash"),e_(en,"ams",e6,"▽","\\triangledown"),e_(en,"ams",e6,"◊","\\lozenge"),e_(en,"ams",e6,"Ⓢ","\\circledS"),e_(en,"ams",e6,"\xae","\\circledR"),e_(ea,"ams",e6,"\xae","\\circledR"),e_(en,"ams",e6,"∡","\\measuredangle",!0),e_(en,"ams",e6,"∄","\\nexists"),e_(en,"ams",e6,"℧","\\mho"),e_(en,"ams",e6,"Ⅎ","\\Finv",!0),e_(en,"ams",e6,"⅁","\\Game",!0),e_(en,"ams",e6,"‵","\\backprime"),e_(en,"ams",e6,"▲","\\blacktriangle"),e_(en,"ams",e6,"▼","\\blacktriangledown"),e_(en,"ams",e6,"■","\\blacksquare"),e_(en,"ams",e6,"⧫","\\blacklozenge"),e_(en,"ams",e6,"★","\\bigstar"),e_(en,"ams",e6,"∢","\\sphericalangle",!0),e_(en,"ams",e6,"∁","\\complement",!0),e_(en,"ams",e6,"\xf0","\\eth",!0),e_(ea,ei,e6,"\xf0","\xf0"),e_(en,"ams",e6,"╱","\\diagup"),e_(en,"ams",e6,"╲","\\diagdown"),e_(en,"ams",e6,"□","\\square"),e_(en,"ams",e6,"□","\\Box"),e_(en,"ams",e6,"◊","\\Diamond"),e_(en,"ams",e6,"\xa5","\\yen",!0),e_(ea,"ams",e6,"\xa5","\\yen",!0),e_(en,"ams",e6,"✓","\\checkmark",!0),e_(ea,"ams",e6,"✓","\\checkmark"),e_(en,"ams",e6,"ℶ","\\beth",!0),e_(en,"ams",e6,"ℸ","\\daleth",!0),e_(en,"ams",e6,"ℷ","\\gimel",!0),e_(en,"ams",e6,"ϝ","\\digamma",!0),e_(en,"ams",e6,"ϰ","\\varkappa"),e_(en,"ams",e4,"┌","\\@ulcorner",!0),e_(en,"ams",eo,"┐","\\@urcorner",!0),e_(en,"ams",e4,"└","\\@llcorner",!0),e_(en,"ams",eo,"┘","\\@lrcorner",!0),e_(en,"ams","rel","≦","\\leqq",!0),e_(en,"ams","rel","⩽","\\leqslant",!0),e_(en,"ams","rel","⪕","\\eqslantless",!0),e_(en,"ams","rel","≲","\\lesssim",!0),e_(en,"ams","rel","⪅","\\lessapprox",!0),e_(en,"ams","rel","≊","\\approxeq",!0),e_(en,"ams","bin","⋖","\\lessdot"),e_(en,"ams","rel","⋘","\\lll",!0),e_(en,"ams","rel","≶","\\lessgtr",!0),e_(en,"ams","rel","⋚","\\lesseqgtr",!0),e_(en,"ams","rel","⪋","\\lesseqqgtr",!0),e_(en,"ams","rel","≑","\\doteqdot"),e_(en,"ams","rel","≓","\\risingdotseq",!0),e_(en,"ams","rel","≒","\\fallingdotseq",!0),e_(en,"ams","rel","∽","\\backsim",!0),e_(en,"ams","rel","⋍","\\backsimeq",!0),e_(en,"ams","rel","⫅","\\subseteqq",!0),e_(en,"ams","rel","⋐","\\Subset",!0),e_(en,"ams","rel","⊏","\\sqsubset",!0),e_(en,"ams","rel","≼","\\preccurlyeq",!0),e_(en,"ams","rel","⋞","\\curlyeqprec",!0),e_(en,"ams","rel","≾","\\precsim",!0),e_(en,"ams","rel","⪷","\\precapprox",!0),e_(en,"ams","rel","⊲","\\vartriangleleft"),e_(en,"ams","rel","⊴","\\trianglelefteq"),e_(en,"ams","rel","⊨","\\vDash",!0),e_(en,"ams","rel","⊪","\\Vvdash",!0),e_(en,"ams","rel","⌣","\\smallsmile"),e_(en,"ams","rel","⌢","\\smallfrown"),e_(en,"ams","rel","≏","\\bumpeq",!0),e_(en,"ams","rel","≎","\\Bumpeq",!0),e_(en,"ams","rel","≧","\\geqq",!0),e_(en,"ams","rel","⩾","\\geqslant",!0),e_(en,"ams","rel","⪖","\\eqslantgtr",!0),e_(en,"ams","rel","≳","\\gtrsim",!0),e_(en,"ams","rel","⪆","\\gtrapprox",!0),e_(en,"ams","bin","⋗","\\gtrdot"),e_(en,"ams","rel","⋙","\\ggg",!0),e_(en,"ams","rel","≷","\\gtrless",!0),e_(en,"ams","rel","⋛","\\gtreqless",!0),e_(en,"ams","rel","⪌","\\gtreqqless",!0),e_(en,"ams","rel","≖","\\eqcirc",!0),e_(en,"ams","rel","≗","\\circeq",!0),e_(en,"ams","rel","≜","\\triangleq",!0),e_(en,"ams","rel","∼","\\thicksim"),e_(en,"ams","rel","≈","\\thickapprox"),e_(en,"ams","rel","⫆","\\supseteqq",!0),e_(en,"ams","rel","⋑","\\Supset",!0),e_(en,"ams","rel","⊐","\\sqsupset",!0),e_(en,"ams","rel","≽","\\succcurlyeq",!0),e_(en,"ams","rel","⋟","\\curlyeqsucc",!0),e_(en,"ams","rel","≿","\\succsim",!0),e_(en,"ams","rel","⪸","\\succapprox",!0),e_(en,"ams","rel","⊳","\\vartriangleright"),e_(en,"ams","rel","⊵","\\trianglerighteq"),e_(en,"ams","rel","⊩","\\Vdash",!0),e_(en,"ams","rel","∣","\\shortmid"),e_(en,"ams","rel","∥","\\shortparallel"),e_(en,"ams","rel","≬","\\between",!0),e_(en,"ams","rel","⋔","\\pitchfork",!0),e_(en,"ams","rel","∝","\\varpropto"),e_(en,"ams","rel","◀","\\blacktriangleleft"),e_(en,"ams","rel","∴","\\therefore",!0),e_(en,"ams","rel","∍","\\backepsilon"),e_(en,"ams","rel","▶","\\blacktriangleright"),e_(en,"ams","rel","∵","\\because",!0),e_(en,"ams","rel","⋘","\\llless"),e_(en,"ams","rel","⋙","\\gggtr"),e_(en,"ams","bin","⊲","\\lhd"),e_(en,"ams","bin","⊳","\\rhd"),e_(en,"ams","rel","≂","\\eqsim",!0),e_(en,ei,"rel","⋈","\\Join"),e_(en,"ams","rel","≑","\\Doteq",!0),e_(en,"ams","bin","∔","\\dotplus",!0),e_(en,"ams","bin","∖","\\smallsetminus"),e_(en,"ams","bin","⋒","\\Cap",!0),e_(en,"ams","bin","⋓","\\Cup",!0),e_(en,"ams","bin","⩞","\\doublebarwedge",!0),e_(en,"ams","bin","⊟","\\boxminus",!0),e_(en,"ams","bin","⊞","\\boxplus",!0),e_(en,"ams","bin","⋇","\\divideontimes",!0),e_(en,"ams","bin","⋉","\\ltimes",!0),e_(en,"ams","bin","⋊","\\rtimes",!0),e_(en,"ams","bin","⋋","\\leftthreetimes",!0),e_(en,"ams","bin","⋌","\\rightthreetimes",!0),e_(en,"ams","bin","⋏","\\curlywedge",!0),e_(en,"ams","bin","⋎","\\curlyvee",!0),e_(en,"ams","bin","⊝","\\circleddash",!0),e_(en,"ams","bin","⊛","\\circledast",!0),e_(en,"ams","bin","⋅","\\centerdot"),e_(en,"ams","bin","⊺","\\intercal",!0),e_(en,"ams","bin","⋒","\\doublecap"),e_(en,"ams","bin","⋓","\\doublecup"),e_(en,"ams","bin","⊠","\\boxtimes",!0),e_(en,"ams","rel","⇢","\\dashrightarrow",!0),e_(en,"ams","rel","⇠","\\dashleftarrow",!0),e_(en,"ams","rel","⇇","\\leftleftarrows",!0),e_(en,"ams","rel","⇆","\\leftrightarrows",!0),e_(en,"ams","rel","⇚","\\Lleftarrow",!0),e_(en,"ams","rel","↞","\\twoheadleftarrow",!0),e_(en,"ams","rel","↢","\\leftarrowtail",!0),e_(en,"ams","rel","↫","\\looparrowleft",!0),e_(en,"ams","rel","⇋","\\leftrightharpoons",!0),e_(en,"ams","rel","↶","\\curvearrowleft",!0),e_(en,"ams","rel","↺","\\circlearrowleft",!0),e_(en,"ams","rel","↰","\\Lsh",!0),e_(en,"ams","rel","⇈","\\upuparrows",!0),e_(en,"ams","rel","↿","\\upharpoonleft",!0),e_(en,"ams","rel","⇃","\\downharpoonleft",!0),e_(en,ei,"rel","⊶","\\origof",!0),e_(en,ei,"rel","⊷","\\imageof",!0),e_(en,"ams","rel","⊸","\\multimap",!0),e_(en,"ams","rel","↭","\\leftrightsquigarrow",!0),e_(en,"ams","rel","⇉","\\rightrightarrows",!0),e_(en,"ams","rel","⇄","\\rightleftarrows",!0),e_(en,"ams","rel","↠","\\twoheadrightarrow",!0),e_(en,"ams","rel","↣","\\rightarrowtail",!0),e_(en,"ams","rel","↬","\\looparrowright",!0),e_(en,"ams","rel","↷","\\curvearrowright",!0),e_(en,"ams","rel","↻","\\circlearrowright",!0),e_(en,"ams","rel","↱","\\Rsh",!0),e_(en,"ams","rel","⇊","\\downdownarrows",!0),e_(en,"ams","rel","↾","\\upharpoonright",!0),e_(en,"ams","rel","⇂","\\downharpoonright",!0),e_(en,"ams","rel","⇝","\\rightsquigarrow",!0),e_(en,"ams","rel","⇝","\\leadsto"),e_(en,"ams","rel","⇛","\\Rrightarrow",!0),e_(en,"ams","rel","↾","\\restriction"),e_(en,ei,e6,"‘","`"),e_(en,ei,e6,"$","\\$"),e_(ea,ei,e6,"$","\\$"),e_(ea,ei,e6,"$","\\textdollar"),e_(en,ei,e6,"%","\\%"),e_(ea,ei,e6,"%","\\%"),e_(en,ei,e6,"_","\\_"),e_(ea,ei,e6,"_","\\_"),e_(ea,ei,e6,"_","\\textunderscore"),e_(en,ei,e6,"∠","\\angle",!0),e_(en,ei,e6,"∞","\\infty",!0),e_(en,ei,e6,"′","\\prime"),e_(en,ei,e6,"△","\\triangle"),e_(en,ei,e6,"Γ","\\Gamma",!0),e_(en,ei,e6,"Δ","\\Delta",!0),e_(en,ei,e6,"Θ","\\Theta",!0),e_(en,ei,e6,"Λ","\\Lambda",!0),e_(en,ei,e6,"Ξ","\\Xi",!0),e_(en,ei,e6,"Π","\\Pi",!0),e_(en,ei,e6,"Σ","\\Sigma",!0),e_(en,ei,e6,"Υ","\\Upsilon",!0),e_(en,ei,e6,"Φ","\\Phi",!0),e_(en,ei,e6,"Ψ","\\Psi",!0),e_(en,ei,e6,"Ω","\\Omega",!0),e_(en,ei,e6,"A","Α"),e_(en,ei,e6,"B","Β"),e_(en,ei,e6,"E","Ε"),e_(en,ei,e6,"Z","Ζ"),e_(en,ei,e6,"H","Η"),e_(en,ei,e6,"I","Ι"),e_(en,ei,e6,"K","Κ"),e_(en,ei,e6,"M","Μ"),e_(en,ei,e6,"N","Ν"),e_(en,ei,e6,"O","Ο"),e_(en,ei,e6,"P","Ρ"),e_(en,ei,e6,"T","Τ"),e_(en,ei,e6,"X","Χ"),e_(en,ei,e6,"\xac","\\neg",!0),e_(en,ei,e6,"\xac","\\lnot"),e_(en,ei,e6,"⊤","\\top"),e_(en,ei,e6,"⊥","\\bot"),e_(en,ei,e6,"∅","\\emptyset"),e_(en,"ams",e6,"∅","\\varnothing"),e_(en,ei,el,"α","\\alpha",!0),e_(en,ei,el,"β","\\beta",!0),e_(en,ei,el,"γ","\\gamma",!0),e_(en,ei,el,"δ","\\delta",!0),e_(en,ei,el,"ϵ","\\epsilon",!0),e_(en,ei,el,"ζ","\\zeta",!0),e_(en,ei,el,"η","\\eta",!0),e_(en,ei,el,"θ","\\theta",!0),e_(en,ei,el,"ι","\\iota",!0),e_(en,ei,el,"κ","\\kappa",!0),e_(en,ei,el,"λ","\\lambda",!0),e_(en,ei,el,"μ","\\mu",!0),e_(en,ei,el,"ν","\\nu",!0),e_(en,ei,el,"ξ","\\xi",!0),e_(en,ei,el,"ο","\\omicron",!0),e_(en,ei,el,"π","\\pi",!0),e_(en,ei,el,"ρ","\\rho",!0),e_(en,ei,el,"σ","\\sigma",!0),e_(en,ei,el,"τ","\\tau",!0),e_(en,ei,el,"υ","\\upsilon",!0),e_(en,ei,el,"ϕ","\\phi",!0),e_(en,ei,el,"χ","\\chi",!0),e_(en,ei,el,"ψ","\\psi",!0),e_(en,ei,el,"ω","\\omega",!0),e_(en,ei,el,"ε","\\varepsilon",!0),e_(en,ei,el,"ϑ","\\vartheta",!0),e_(en,ei,el,"ϖ","\\varpi",!0),e_(en,ei,el,"ϱ","\\varrho",!0),e_(en,ei,el,"ς","\\varsigma",!0),e_(en,ei,el,"φ","\\varphi",!0),e_(en,ei,"bin","∗","*",!0),e_(en,ei,"bin","+","+"),e_(en,ei,"bin","−","-",!0),e_(en,ei,"bin","⋅","\\cdot",!0),e_(en,ei,"bin","∘","\\circ",!0),e_(en,ei,"bin","\xf7","\\div",!0),e_(en,ei,"bin","\xb1","\\pm",!0),e_(en,ei,"bin","\xd7","\\times",!0),e_(en,ei,"bin","∩","\\cap",!0),e_(en,ei,"bin","∪","\\cup",!0),e_(en,ei,"bin","∖","\\setminus",!0),e_(en,ei,"bin","∧","\\land"),e_(en,ei,"bin","∨","\\lor"),e_(en,ei,"bin","∧","\\wedge",!0),e_(en,ei,"bin","∨","\\vee",!0),e_(en,ei,e6,"√","\\surd"),e_(en,ei,e4,"⟨","\\langle",!0),e_(en,ei,e4,"∣","\\lvert"),e_(en,ei,e4,"∥","\\lVert"),e_(en,ei,eo,"?","?"),e_(en,ei,eo,"!","!"),e_(en,ei,eo,"⟩","\\rangle",!0),e_(en,ei,eo,"∣","\\rvert"),e_(en,ei,eo,"∥","\\rVert"),e_(en,ei,"rel","=","="),e_(en,ei,"rel",":",":"),e_(en,ei,"rel","≈","\\approx",!0),e_(en,ei,"rel","≅","\\cong",!0),e_(en,ei,"rel","≥","\\ge"),e_(en,ei,"rel","≥","\\geq",!0),e_(en,ei,"rel","←","\\gets"),e_(en,ei,"rel",">","\\gt",!0),e_(en,ei,"rel","∈","\\in",!0),e_(en,ei,"rel","","\\@not"),e_(en,ei,"rel","⊂","\\subset",!0),e_(en,ei,"rel","⊃","\\supset",!0),e_(en,ei,"rel","⊆","\\subseteq",!0),e_(en,ei,"rel","⊇","\\supseteq",!0),e_(en,"ams","rel","⊈","\\nsubseteq",!0),e_(en,"ams","rel","⊉","\\nsupseteq",!0),e_(en,ei,"rel","⊨","\\models"),e_(en,ei,"rel","←","\\leftarrow",!0),e_(en,ei,"rel","≤","\\le"),e_(en,ei,"rel","≤","\\leq",!0),e_(en,ei,"rel","<","\\lt",!0),e_(en,ei,"rel","→","\\rightarrow",!0),e_(en,ei,"rel","→","\\to"),e_(en,"ams","rel","≱","\\ngeq",!0),e_(en,"ams","rel","≰","\\nleq",!0),e_(en,ei,e1,"\xa0","\\ "),e_(en,ei,e1,"\xa0","\\space"),e_(en,ei,e1,"\xa0","\\nobreakspace"),e_(ea,ei,e1,"\xa0","\\ "),e_(ea,ei,e1,"\xa0"," "),e_(ea,ei,e1,"\xa0","\\space"),e_(ea,ei,e1,"\xa0","\\nobreakspace"),e_(en,ei,e1,null,"\\nobreak"),e_(en,ei,e1,null,"\\allowbreak"),e_(en,ei,e5,",",","),e_(en,ei,e5,";",";"),e_(en,"ams","bin","⊼","\\barwedge",!0),e_(en,"ams","bin","⊻","\\veebar",!0),e_(en,ei,"bin","⊙","\\odot",!0),e_(en,ei,"bin","⊕","\\oplus",!0),e_(en,ei,"bin","⊗","\\otimes",!0),e_(en,ei,e6,"∂","\\partial",!0),e_(en,ei,"bin","⊘","\\oslash",!0),e_(en,"ams","bin","⊚","\\circledcirc",!0),e_(en,"ams","bin","⊡","\\boxdot",!0),e_(en,ei,"bin","△","\\bigtriangleup"),e_(en,ei,"bin","▽","\\bigtriangledown"),e_(en,ei,"bin","†","\\dagger"),e_(en,ei,"bin","⋄","\\diamond"),e_(en,ei,"bin","⋆","\\star"),e_(en,ei,"bin","◃","\\triangleleft"),e_(en,ei,"bin","▹","\\triangleright"),e_(en,ei,e4,"{","\\{"),e_(ea,ei,e6,"{","\\{"),e_(ea,ei,e6,"{","\\textbraceleft"),e_(en,ei,eo,"}","\\}"),e_(ea,ei,e6,"}","\\}"),e_(ea,ei,e6,"}","\\textbraceright"),e_(en,ei,e4,"{","\\lbrace"),e_(en,ei,eo,"}","\\rbrace"),e_(en,ei,e4,"[","\\lbrack",!0),e_(ea,ei,e6,"[","\\lbrack",!0),e_(en,ei,eo,"]","\\rbrack",!0),e_(ea,ei,e6,"]","\\rbrack",!0),e_(en,ei,e4,"(","\\lparen",!0),e_(en,ei,eo,")","\\rparen",!0),e_(ea,ei,e6,"<","\\textless",!0),e_(ea,ei,e6,">","\\textgreater",!0),e_(en,ei,e4,"⌊","\\lfloor",!0),e_(en,ei,eo,"⌋","\\rfloor",!0),e_(en,ei,e4,"⌈","\\lceil",!0),e_(en,ei,eo,"⌉","\\rceil",!0),e_(en,ei,e6,"\\","\\backslash"),e_(en,ei,e6,"∣","|"),e_(en,ei,e6,"∣","\\vert"),e_(ea,ei,e6,"|","\\textbar",!0),e_(en,ei,e6,"∥","\\|"),e_(en,ei,e6,"∥","\\Vert"),e_(ea,ei,e6,"∥","\\textbardbl"),e_(ea,ei,e6,"~","\\textasciitilde"),e_(ea,ei,e6,"\\","\\textbackslash"),e_(ea,ei,e6,"^","\\textasciicircum"),e_(en,ei,"rel","↑","\\uparrow",!0),e_(en,ei,"rel","⇑","\\Uparrow",!0),e_(en,ei,"rel","↓","\\downarrow",!0),e_(en,ei,"rel","⇓","\\Downarrow",!0),e_(en,ei,"rel","↕","\\updownarrow",!0),e_(en,ei,"rel","⇕","\\Updownarrow",!0),e_(en,ei,e3,"∐","\\coprod"),e_(en,ei,e3,"⋁","\\bigvee"),e_(en,ei,e3,"⋀","\\bigwedge"),e_(en,ei,e3,"⨄","\\biguplus"),e_(en,ei,e3,"⋂","\\bigcap"),e_(en,ei,e3,"⋃","\\bigcup"),e_(en,ei,e3,"∫","\\int"),e_(en,ei,e3,"∫","\\intop"),e_(en,ei,e3,"∬","\\iint"),e_(en,ei,e3,"∭","\\iiint"),e_(en,ei,e3,"∏","\\prod"),e_(en,ei,e3,"∑","\\sum"),e_(en,ei,e3,"⨂","\\bigotimes"),e_(en,ei,e3,"⨁","\\bigoplus"),e_(en,ei,e3,"⨀","\\bigodot"),e_(en,ei,e3,"∮","\\oint"),e_(en,ei,e3,"∯","\\oiint"),e_(en,ei,e3,"∰","\\oiiint"),e_(en,ei,e3,"⨆","\\bigsqcup"),e_(en,ei,e3,"∫","\\smallint"),e_(ea,ei,es,"…","\\textellipsis"),e_(en,ei,es,"…","\\mathellipsis"),e_(ea,ei,es,"…","\\ldots",!0),e_(en,ei,es,"…","\\ldots",!0),e_(en,ei,es,"⋯","\\@cdots",!0),e_(en,ei,es,"⋱","\\ddots",!0),e_(en,ei,e6,"⋮","\\varvdots"),e_(en,ei,e2,"ˊ","\\acute"),e_(en,ei,e2,"ˋ","\\grave"),e_(en,ei,e2,"\xa8","\\ddot"),e_(en,ei,e2,"~","\\tilde"),e_(en,ei,e2,"ˉ","\\bar"),e_(en,ei,e2,"˘","\\breve"),e_(en,ei,e2,"ˇ","\\check"),e_(en,ei,e2,"^","\\hat"),e_(en,ei,e2,"⃗","\\vec"),e_(en,ei,e2,"˙","\\dot"),e_(en,ei,e2,"˚","\\mathring"),e_(en,ei,el,"","\\@imath"),e_(en,ei,el,"","\\@jmath"),e_(en,ei,e6,"ı","ı"),e_(en,ei,e6,"ȷ","ȷ"),e_(ea,ei,e6,"ı","\\i",!0),e_(ea,ei,e6,"ȷ","\\j",!0),e_(ea,ei,e6,"\xdf","\\ss",!0),e_(ea,ei,e6,"\xe6","\\ae",!0),e_(ea,ei,e6,"œ","\\oe",!0),e_(ea,ei,e6,"\xf8","\\o",!0),e_(ea,ei,e6,"\xc6","\\AE",!0),e_(ea,ei,e6,"Œ","\\OE",!0),e_(ea,ei,e6,"\xd8","\\O",!0),e_(ea,ei,e2,"ˊ","\\'"),e_(ea,ei,e2,"ˋ","\\`"),e_(ea,ei,e2,"ˆ","\\^"),e_(ea,ei,e2,"˜","\\~"),e_(ea,ei,e2,"ˉ","\\="),e_(ea,ei,e2,"˘","\\u"),e_(ea,ei,e2,"˙","\\."),e_(ea,ei,e2,"\xb8","\\c"),e_(ea,ei,e2,"˚","\\r"),e_(ea,ei,e2,"ˇ","\\v"),e_(ea,ei,e2,"\xa8",'\\"'),e_(ea,ei,e2,"˝","\\H"),e_(ea,ei,e2,"◯","\\textcircled");var eh={"--":!0,"---":!0,"``":!0,"''":!0};e_(ea,ei,e6,"–","--",!0),e_(ea,ei,e6,"–","\\textendash"),e_(ea,ei,e6,"—","---",!0),e_(ea,ei,e6,"—","\\textemdash"),e_(ea,ei,e6,"‘","`",!0),e_(ea,ei,e6,"‘","\\textquoteleft"),e_(ea,ei,e6,"’","'",!0),e_(ea,ei,e6,"’","\\textquoteright"),e_(ea,ei,e6,"“","``",!0),e_(ea,ei,e6,"“","\\textquotedblleft"),e_(ea,ei,e6,"”","''",!0),e_(ea,ei,e6,"”","\\textquotedblright"),e_(en,ei,e6,"\xb0","\\degree",!0),e_(ea,ei,e6,"\xb0","\\degree"),e_(ea,ei,e6,"\xb0","\\textdegree",!0),e_(en,ei,e6,"\xa3","\\pounds"),e_(en,ei,e6,"\xa3","\\mathsterling",!0),e_(ea,ei,e6,"\xa3","\\pounds"),e_(ea,ei,e6,"\xa3","\\textsterling",!0),e_(en,"ams",e6,"✠","\\maltese"),e_(ea,"ams",e6,"✠","\\maltese");for(var e0='0123456789/@."',em=0;emt&&(t=n.height),n.depth>$&&($=n.depth),n.maxFontSize>r&&(r=n.maxFontSize)}e.height=t,e.depth=$,e.maxFontSize=r},eN=function(e,t,$,r){var _=new U(e,t,$,r);return eq(_),_},eH=function(e,t,$,r){return new U(e,t,$,r)},eI=function(e){var t=new S(e);return eq(t),t},eR=function(e,t,$){var r="";switch(e){case"amsrm":r="AMS";break;case"textrm":r="Main";break;case"textsf":r="SansSerif";break;case"texttt":r="Typewriter";break;default:r=e}return r+"-"+("textbf"===t&&"textit"===$?"BoldItalic":"textbf"===t?"Bold":"textit"===t?"Italic":"Regular")},eO={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},eL={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},eD={fontMap:eO,makeSymbol:eB,mathsym:function(e,t,$,r){return void 0===r&&(r=[]),"boldsymbol"===$.font&&eA(e,"Main-Bold",t).metrics?eB(e,"Main-Bold",t,$,r.concat(["mathbf"])):"\\"===e||"main"===er[t][e].font?eB(e,"Main-Regular",t,$,r):eB(e,"AMS-Regular",t,$,r.concat(["amsrm"]))},makeSpan:eN,makeSvgSpan:eH,makeLineSpan:function(e,t,$){var r=eN([e],[],t);return r.height=Math.max($||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),r.style.borderBottomWidth=E(r.height),r.maxFontSize=1,r},makeAnchor:function(e,t,$,r){var _=new X(e,t,$,r);return eq(_),_},makeFragment:eI,wrapFragment:function(e,t){return e instanceof S?eN([],[e],t):e},makeVList:function(e,t){for(var $=function(e){if("individualShift"===e.positionType){for(var t,$=e.children,r=[$[0]],_=-$[0].shift-$[0].elem.depth,n=_,a=1;a<$.length;a++){var i=-$[a].shift-n-$[a].elem.depth,o=i-($[a-1].elem.height+$[a-1].elem.depth);n+=i,r.push({type:"kern",size:o}),r.push($[a])}return{children:r,depth:_}}if("top"===e.positionType){for(var s=e.positionData,l=0;l0&&(a.push(t2(i,t)),i=[]),a.push(_[o]));i.length>0&&a.push(t2(i,t)),$?((n=t2(tt($,t,!0))).classes=["tag"],a.push(n)):r&&a.push(r);var l=eZ(["katex-html"],a);if(l.setAttribute("aria-hidden","true"),n){var h=n.children[0];h.style.height=E(l.height+l.depth),l.depth&&(h.style.verticalAlign=E(-l.depth))}return l}function ts(e){return new S(e)}var tl=function(){function e(e,t,$){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=t||[],this.classes=$||[]}var t=e.prototype;return t.setAttribute=function(e,t){this.attributes[e]=t},t.getAttribute=function(e){return this.attributes[e]},t.toNode=function(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);this.classes.length>0&&(e.className=P(this.classes));for(var $=0;$0&&(e+=' class ="'+o.escape(P(this.classes))+'"'),e+=">";for(var $=0;$"},t.toText=function(){return this.children.map(function(e){return e.toText()}).join("")},e}(),t3=function(){function e(e){this.text=void 0,this.text=e}var t=e.prototype;return t.toNode=function(){return document.createTextNode(this.text)},t.toMarkup=function(){return o.escape(this.toText())},t.toText=function(){return this.text},e}(),t4={MathNode:tl,TextNode:t3,SpaceNode:function(){function e(e){this.width=void 0,this.character=void 0,this.width=e,this.character=e>=.05555&&e<=.05556?" ":e>=.1666&&e<=.1667?" ":e>=.2222&&e<=.2223?" ":e>=.2777&&e<=.2778?"  ":e>=-.05556&&e<=-.05555?" ⁣":e>=-.1667&&e<=-.1666?" ⁣":e>=-.2223&&e<=-.2222?" ⁣":e>=-.2778&&e<=-.2777?" ⁣":null}var t=e.prototype;return t.toNode=function(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",E(this.width)),e},t.toMarkup=function(){return this.character?""+this.character+"":''},t.toText=function(){return this.character?this.character:" "},e}(),newDocumentFragment:ts},t5=function(e,t,$){return!er[t][e]||!er[t][e].replace||55349===e.charCodeAt(0)||eh.hasOwnProperty(e)&&$&&($.fontFamily&&"tt"===$.fontFamily.slice(4,6)||$.font&&"tt"===$.font.slice(4,6))||(e=er[t][e].replace),new t4.TextNode(e)},t1=function(e){return 1===e.length?e[0]:new t4.MathNode("mrow",e)},t6=function(e,t){if("texttt"===t.fontFamily)return"monospace";if("textsf"===t.fontFamily)return"textit"===t.fontShape&&"textbf"===t.fontWeight?"sans-serif-bold-italic":"textit"===t.fontShape?"sans-serif-italic":"textbf"===t.fontWeight?"bold-sans-serif":"sans-serif";if("textit"===t.fontShape&&"textbf"===t.fontWeight)return"bold-italic";if("textit"===t.fontShape)return"italic";if("textbf"===t.fontWeight)return"bold";var $=t.font;if(!$||"mathnormal"===$)return null;var r=e.mode;if("mathit"===$)return"italic";if("boldsymbol"===$)return"textord"===e.type?"bold":"bold-italic";if("mathbf"===$)return"bold";if("mathbb"===$)return"double-struck";if("mathfrak"===$)return"fraktur";if("mathscr"===$||"mathcal"===$)return"script";if("mathsf"===$)return"sans-serif";if("mathtt"===$)return"monospace";var _=e.text;return o.contains(["\\imath","\\jmath"],_)?null:(er[r][_]&&er[r][_].replace&&(_=er[r][_].replace),A(_,eD.fontMap[$].fontName,r)?eD.fontMap[$].variant:null)},th=function(e,t,$){if(1===e.length){var r=tm(e[0],t);return $&&r instanceof tl&&"mo"===r.type&&(r.setAttribute("lspace","0em"),r.setAttribute("rspace","0em")),[r]}for(var _,n=[],a=0;a0&&(c.text=c.text.slice(0,1)+"̸"+c.text.slice(1),n.pop())}}}n.push(i),_=i}return n},t0=function(e,t,$){return t1(th(e,t,$))},tm=function(e,t){if(!e)return new t4.MathNode("mrow");if(eY[e.type])return eY[e.type](e,t);throw new r("Got group of unknown type: '"+e.type+"'")};function tc(e,t,$,r,_){var n,a=th(e,$);n=1===a.length&&a[0]instanceof tl&&o.contains(["mrow","mtable"],a[0].type)?a[0]:new t4.MathNode("mrow",a);var i=new t4.MathNode("annotation",[new t4.TextNode(t)]);i.setAttribute("encoding","application/x-tex");var s=new t4.MathNode("semantics",[n,i]),l=new t4.MathNode("math",[s]);return l.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),r&&l.setAttribute("display","block"),eD.makeSpan([_?"katex":"katex-mathml"],[l])}var tu=function(e){return new I({style:e.displayMode?b.DISPLAY:b.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},t7=function(e,t){if(t.displayMode){var $=["katex-display"];t.leqno&&$.push("leqno"),t.fleqn&&$.push("fleqn"),e=eD.makeSpan($,[e])}return e},tp=function(e,t,$){var r,_=tu($);if("mathml"===$.output)return tc(e,t,_,$.displayMode,!0);if("html"===$.output){var n=to(e,_);r=eD.makeSpan(["katex"],[n])}else{var a=tc(e,t,_,$.displayMode,!1),i=to(e,_);r=eD.makeSpan(["katex"],[a,i])}return t7(r,$)},td={widehat:"^",widecheck:"ˇ",widetilde:"~",utilde:"~",overleftarrow:"←",underleftarrow:"←",xleftarrow:"←",overrightarrow:"→",underrightarrow:"→",xrightarrow:"→",underbrace:"⏟",overbrace:"⏞",overgroup:"⏠",undergroup:"⏡",overleftrightarrow:"↔",underleftrightarrow:"↔",xleftrightarrow:"↔",Overrightarrow:"⇒",xRightarrow:"⇒",overleftharpoon:"↼",xleftharpoonup:"↼",overrightharpoon:"⇀",xrightharpoonup:"⇀",xLeftarrow:"⇐",xLeftrightarrow:"⇔",xhookleftarrow:"↩",xhookrightarrow:"↪",xmapsto:"↦",xrightharpoondown:"⇁",xleftharpoondown:"↽",xrightleftharpoons:"⇌",xleftrightharpoons:"⇋",xtwoheadleftarrow:"↞",xtwoheadrightarrow:"↠",xlongequal:"=",xtofrom:"⇄",xrightleftarrows:"⇄",xrightequilibrium:"⇌",xleftequilibrium:"⇋","\\cdrightarrow":"→","\\cdleftarrow":"←","\\cdlongequal":"="},tf={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},tg=function(e,t,$,r,_){var n,a=e.height+e.depth+$+r;if(/fbox|color|angl/.test(t)){if(n=eD.makeSpan(["stretchy",t],[],_),"fbox"===t){var i=_.color&&_.getColor();i&&(n.style.borderColor=i)}}else{var o=[];/^[bx]cancel$/.test(t)&&o.push(new J({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&o.push(new J({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var s=new Z(o,{width:"100%",height:E(a)});n=eD.makeSvgSpan([],[s],_)}return n.height=a,n.style.height=E(a),n},tv=function(e){var t=new t4.MathNode("mo",[new t4.TextNode(td[e.replace(/^\\/,"")])]);return t.setAttribute("stretchy","true"),t},tb=function(e,t){var $=function(){var $=4e5,r=e.label.slice(1);if(o.contains(["widehat","widecheck","widetilde","utilde"],r)){var _,n,a,i="ordgroup"===(u=e.base).type?u.body.length:1;if(i>5)"widehat"===r||"widecheck"===r?(_=420,$=2364,a=.42,n=r+"4"):(_=312,$=2340,a=.34,n="tilde4");else{var s=[1,1,2,2,3,3][i];"widehat"===r||"widecheck"===r?($=[0,1062,2364,2364,2364][s],_=[0,239,300,360,420][s],a=[0,.24,.3,.3,.36,.42][s],n=r+s):($=[0,600,1033,2339,2340][s],_=[0,260,286,306,312][s],a=[0,.26,.286,.3,.306,.34][s],n="tilde"+s)}var l=new K(n),h=new Z([l],{width:"100%",height:E(a),viewBox:"0 0 "+$+" "+_,preserveAspectRatio:"none"});return{span:eD.makeSvgSpan([],[h],t),minWidth:0,height:a}}var m,c,u,p=[],d=tf[r],f=d[0],g=d[1],v=d[2],b=v/1e3,y=f.length;if(1===y)m=["hide-tail"],c=[d[3]];else if(2===y)m=["halfarrow-left","halfarrow-right"],c=["xMinYMin","xMaxYMin"];else{if(3!==y)throw Error("Correct katexImagesData or update code here to support\n "+y+" children.");m=["brace-left","brace-center","brace-right"],c=["xMinYMin","xMidYMin","xMaxYMin"]}for(var x=0;x0&&(r.style.minWidth=E(_)),r};function ty(e,t){if(!e||e.type!==t)throw Error("Expected node of type "+t+", but got "+(e?"node of type "+e.type:String(e)));return e}function tx(e){var t=tw(e);if(!t)throw Error("Expected node of symbol group type, but got "+(e?"node of type "+e.type:String(e)));return t}function tw(e){return e&&("atom"===e.type||et.hasOwnProperty(e.type))?e:null}var tk=function(e,t){e&&"supsub"===e.type?(n=(a=ty(e.base,"accent")).base,e.base=n,i=function(e){if(e instanceof U)return e;throw Error("Expected span but got "+String(e)+".")}(ti(e,t)),e.base=a):n=(a=ty(e,"accent")).base;var $=ti(n,t.havingCrampedStyle()),r=0;if(a.isShifty&&o.isCharacterBox(n)){var _=o.getBaseElem(n);r=Q(ti(_,t.havingCrampedStyle())).skew}var n,a,i,s,l="\\c"===a.label,h=l?$.height+$.depth:Math.min($.height,t.fontMetrics().xHeight);if(a.isStretchy)s=tb(a,t),s=eD.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:$},{type:"elem",elem:s,wrapperClasses:["svg-align"],wrapperStyle:r>0?{width:"calc(100% - "+E(2*r)+")",marginLeft:E(2*r)}:void 0}]},t);else{"\\vec"===a.label?(m=eD.staticSvg("vec",t),c=eD.svgData.vec[1]):((m=Q(m=eD.makeOrd({mode:a.mode,text:a.label},t,"textord"))).italic=0,c=m.width,l&&(h+=m.depth)),s=eD.makeSpan(["accent-body"],[m]);var m,c,u="\\textcircled"===a.label;u&&(s.classes.push("accent-full"),h=$.height);var p=r;u||(p-=c/2),s.style.left=E(p),"\\textcircled"===a.label&&(s.style.top=".2em"),s=eD.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:$},{type:"kern",size:-h},{type:"elem",elem:s}]},t)}var d=eD.makeSpan(["mord","accent"],[s],t);return i?(i.children[0]=d,i.height=Math.max(d.height,i.height),i.classes[0]="mord",i):d},tS=function(e,t){var $=e.isStretchy?tv(e.label):new t4.MathNode("mo",[t5(e.label,e.mode)]),r=new t4.MathNode("mover",[tm(e.base,t),$]);return r.setAttribute("accent","true"),r},tz=RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(function(e){return"\\"+e}).join("|"));eW({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:function(e,t){var $=e9(t[0]),r=!tz.test(e.funcName),_=!r||"\\widehat"===e.funcName||"\\widetilde"===e.funcName||"\\widecheck"===e.funcName;return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:r,isShifty:_,base:$}},htmlBuilder:tk,mathmlBuilder:tS}),eW({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:function(e,t){var $=t[0],r=e.parser.mode;return"math"===r&&(e.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+e.funcName+" works only in text mode"),r="text"),{type:"accent",mode:r,label:e.funcName,isStretchy:!1,isShifty:!0,base:$}},htmlBuilder:tk,mathmlBuilder:tS}),eW({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:function(e,t){var $=e.parser,r=e.funcName,_=t[0];return{type:"accentUnder",mode:$.mode,label:r,base:_}},htmlBuilder:function(e,t){var $=ti(e.base,t),r=tb(e,t),_="\\utilde"===e.label?.12:0,n=eD.makeVList({positionType:"top",positionData:$.height,children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:_},{type:"elem",elem:$}]},t);return eD.makeSpan(["mord","accentunder"],[n],t)},mathmlBuilder:function(e,t){var $=tv(e.label),r=new t4.MathNode("munder",[tm(e.base,t),$]);return r.setAttribute("accentunder","true"),r}});var tM=function(e){var t=new t4.MathNode("mpadded",e?[e]:[]);return t.setAttribute("width","+0.6em"),t.setAttribute("lspace","0.3em"),t};eW({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler:function(e,t,$){var r=e.parser,_=e.funcName;return{type:"xArrow",mode:r.mode,label:_,body:t[0],below:$[0]}},htmlBuilder:function(e,t){var $,r=t.style,_=t.havingStyle(r.sup()),n=eD.wrapFragment(ti(e.body,_,t),t),a="\\x"===e.label.slice(0,2)?"x":"cd";n.classes.push(a+"-arrow-pad"),e.below&&(_=t.havingStyle(r.sub()),($=eD.wrapFragment(ti(e.below,_,t),t)).classes.push(a+"-arrow-pad"));var i,o=tb(e,t),s=-t.fontMetrics().axisHeight+.5*o.height,l=-t.fontMetrics().axisHeight-.5*o.height-.111;if((n.depth>.25||"\\xleftequilibrium"===e.label)&&(l-=n.depth),$){var h=-t.fontMetrics().axisHeight+$.height+.5*o.height+.111;i=eD.makeVList({positionType:"individualShift",children:[{type:"elem",elem:n,shift:l},{type:"elem",elem:o,shift:s},{type:"elem",elem:$,shift:h}]},t)}else i=eD.makeVList({positionType:"individualShift",children:[{type:"elem",elem:n,shift:l},{type:"elem",elem:o,shift:s}]},t);return i.children[0].children[0].children[1].classes.push("svg-align"),eD.makeSpan(["mrel","x-arrow"],[i],t)},mathmlBuilder:function(e,t){var $,r=tv(e.label);if(r.setAttribute("minsize","x"===e.label.charAt(0)?"1.75em":"3.0em"),e.body){var _=tM(tm(e.body,t));if(e.below){var n=tM(tm(e.below,t));$=new t4.MathNode("munderover",[r,n,_])}else $=new t4.MathNode("mover",[r,_])}else if(e.below){var a=tM(tm(e.below,t));$=new t4.MathNode("munder",[r,a])}else $=tM(),$=new t4.MathNode("mover",[r,$]);return $}});var tT=eD.makeSpan;function tA(e,t){var $=tt(e.body,t,!0);return tT([e.mclass],$,t)}function tB(e,t){var $,r=th(e.body,t);return"minner"===e.mclass?$=new t4.MathNode("mpadded",r):"mord"===e.mclass?e.isCharacterBox?($=r[0]).type="mi":$=new t4.MathNode("mi",r):(e.isCharacterBox?($=r[0]).type="mo":$=new t4.MathNode("mo",r),"mbin"===e.mclass?($.attributes.lspace="0.22em",$.attributes.rspace="0.22em"):"mpunct"===e.mclass?($.attributes.lspace="0em",$.attributes.rspace="0.17em"):"mopen"===e.mclass||"mclose"===e.mclass?($.attributes.lspace="0em",$.attributes.rspace="0em"):"minner"===e.mclass&&($.attributes.lspace="0.0556em",$.attributes.width="+0.1111em")),$}eW({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler:function(e,t){var $=e.parser,r=e.funcName,_=t[0];return{type:"mclass",mode:$.mode,mclass:"m"+r.slice(5),body:ej(_),isCharacterBox:o.isCharacterBox(_)}},htmlBuilder:tA,mathmlBuilder:tB});var tC=function(e){var t="ordgroup"===e.type&&e.body.length?e.body[0]:e;return"atom"!==t.type||"bin"!==t.family&&"rel"!==t.family?"mord":"m"+t.family};eW({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler:function(e,t){return{type:"mclass",mode:e.parser.mode,mclass:tC(t[0]),body:ej(t[1]),isCharacterBox:o.isCharacterBox(t[1])}}}),eW({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler:function(e,t){var $,r=e.parser,_=e.funcName,n=t[1],a=t[0];$="\\stackrel"!==_?tC(n):"mrel";var i={type:"op",mode:n.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:"\\stackrel"!==_,body:ej(n)},s={type:"supsub",mode:a.mode,base:i,sup:"\\underset"===_?null:a,sub:"\\underset"===_?a:null};return{type:"mclass",mode:r.mode,mclass:$,body:[s],isCharacterBox:o.isCharacterBox(s)}},htmlBuilder:tA,mathmlBuilder:tB}),eW({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){return{type:"pmb",mode:e.parser.mode,mclass:tC(t[0]),body:ej(t[0])}},htmlBuilder:function(e,t){var $=tt(e.body,t,!0),r=eD.makeSpan([e.mclass],$,t);return r.style.textShadow="0.02em 0.01em 0.04px",r},mathmlBuilder:function(e,t){var $=th(e.body,t),r=new t4.MathNode("mstyle",$);return r.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),r}});var tq={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},tN=function(e){return"textord"===e.type&&"@"===e.text};function tH(e,t,$){var r=tq[e];switch(r){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return $.callFunction(r,[t[0]],[t[1]]);case"\\uparrow":case"\\downarrow":var _={type:"ordgroup",mode:"math",body:[$.callFunction("\\\\cdleft",[t[0]],[]),$.callFunction("\\Big",[{type:"atom",text:r,mode:"math",family:"rel"}],[]),$.callFunction("\\\\cdright",[t[1]],[])]};return $.callFunction("\\\\cdparent",[_],[]);case"\\\\cdlongequal":return $.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":return $.callFunction("\\Big",[{type:"textord",text:"\\Vert",mode:"math"}],[]);default:return{type:"textord",text:" ",mode:"math"}}}eW({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler:function(e,t){var $=e.parser,r=e.funcName;return{type:"cdlabel",mode:$.mode,side:r.slice(4),label:t[0]}},htmlBuilder:function(e,t){var $=t.havingStyle(t.style.sup()),r=eD.wrapFragment(ti(e.label,$,t),t);return r.classes.push("cd-label-"+e.side),r.style.bottom=E(.8-r.depth),r.height=0,r.depth=0,r},mathmlBuilder:function(e,t){var $=new t4.MathNode("mrow",[tm(e.label,t)]);return($=new t4.MathNode("mpadded",[$])).setAttribute("width","0"),"left"===e.side&&$.setAttribute("lspace","-1width"),$.setAttribute("voffset","0.7em"),($=new t4.MathNode("mstyle",[$])).setAttribute("displaystyle","false"),$.setAttribute("scriptlevel","1"),$}}),eW({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler:function(e,t){return{type:"cdlabelparent",mode:e.parser.mode,fragment:t[0]}},htmlBuilder:function(e,t){var $=eD.wrapFragment(ti(e.fragment,t),t);return $.classes.push("cd-vert-arrow"),$},mathmlBuilder:function(e,t){return new t4.MathNode("mrow",[tm(e.fragment,t)])}}),eW({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){for(var $=e.parser,_=ty(t[0],"ordgroup").body,n="",a=0;a<_.length;a++)n+=ty(_[a],"textord").text;var i,o=parseInt(n);if(isNaN(o))throw new r("\\@char has non-numeric argument "+n);if(o<0||o>=1114111)throw new r("\\@char with invalid code point "+n);return o<=65535?i=String.fromCharCode(o):(o-=65536,i=String.fromCharCode(55296+(o>>10),56320+(1023&o))),{type:"textord",mode:$.mode,text:i}}});var tI=function(e,t){var $=tt(e.body,t.withColor(e.color),!1);return eD.makeFragment($)},tR=function(e,t){var $=th(e.body,t.withColor(e.color)),r=new t4.MathNode("mstyle",$);return r.setAttribute("mathcolor",e.color),r};eW({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler:function(e,t){var $=e.parser,r=ty(t[0],"color-token").color,_=t[1];return{type:"color",mode:$.mode,color:r,body:ej(_)}},htmlBuilder:tI,mathmlBuilder:tR}),eW({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler:function(e,t){var $=e.parser,r=e.breakOnTokenText,_=ty(t[0],"color-token").color;$.gullet.macros.set("\\current@color",_);var n=$.parseExpression(!0,r);return{type:"color",mode:$.mode,color:_,body:n}},htmlBuilder:tI,mathmlBuilder:tR}),eW({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler:function(e,t,$){var r=e.parser,_="["===r.gullet.future().text?r.parseSizeGroup(!0):null,n=!r.settings.displayMode||!r.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:r.mode,newLine:n,size:_&&ty(_,"size").value}},htmlBuilder:function(e,t){var $=eD.makeSpan(["mspace"],[],t);return e.newLine&&($.classes.push("newline"),e.size&&($.style.marginTop=E(D(e.size,t)))),$},mathmlBuilder:function(e,t){var $=new t4.MathNode("mspace");return e.newLine&&($.setAttribute("linebreak","newline"),e.size&&$.setAttribute("height",E(D(e.size,t)))),$}});var tO={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},tL=function(e){var t=e.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(t))throw new r("Expected a control sequence",e);return t},tD=function(e,t,$,r){var _=e.gullet.macros.get($.text);null==_&&($.noexpand=!0,_={tokens:[$],numArgs:0,unexpandable:!e.gullet.isExpandable($.text)}),e.gullet.macros.set(t,_,r)};eW({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler:function(e){var t=e.parser,$=e.funcName;t.consumeSpaces();var _=t.fetch();if(tO[_.text])return"\\global"!==$&&"\\\\globallong"!==$||(_.text=tO[_.text]),ty(t.parseFunction(),"internal");throw new r("Invalid token after macro prefix",_)}}),eW({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e){var t=e.parser,$=e.funcName,_=t.gullet.popToken(),n=_.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(n))throw new r("Expected a control sequence",_);for(var a,i=0,o=[[]];"{"!==t.gullet.future().text;)if("#"===(_=t.gullet.popToken()).text){if("{"===t.gullet.future().text){a=t.gullet.future(),o[i].push("{");break}if(_=t.gullet.popToken(),!/^[1-9]$/.test(_.text))throw new r('Invalid argument number "'+_.text+'"');if(parseInt(_.text)!==i+1)throw new r('Argument number "'+_.text+'" out of order');i++,o.push([])}else{if("EOF"===_.text)throw new r("Expected a macro definition");o[i].push(_.text)}var s=t.gullet.consumeArg().tokens;return a&&s.unshift(a),"\\edef"!==$&&"\\xdef"!==$||(s=t.gullet.expandTokens(s)).reverse(),t.gullet.macros.set(n,{tokens:s,numArgs:i,delimiters:o},$===tO[$]),{type:"internal",mode:t.mode}}}),eW({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e){var t,$,r=e.parser,_=e.funcName,n=tL(r.gullet.popToken());r.gullet.consumeSpaces();var a=("="===($=(t=r).gullet.popToken()).text&&" "===($=t.gullet.popToken()).text&&($=t.gullet.popToken()),$);return tD(r,n,a,"\\\\globallet"===_),{type:"internal",mode:r.mode}}}),eW({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e){var t=e.parser,$=e.funcName,r=tL(t.gullet.popToken()),_=t.gullet.popToken(),n=t.gullet.popToken();return tD(t,r,n,"\\\\globalfuture"===$),t.gullet.pushToken(n),t.gullet.pushToken(_),{type:"internal",mode:t.mode}}});var tE=function(e,t,$){var r=A(er.math[e]&&er.math[e].replace||e,t,$);if(!r)throw Error("Unsupported symbol "+e+" and font size "+t+".");return r},tP=function(e,t,$,r){var _=$.havingBaseStyle(t),n=eD.makeSpan(r.concat(_.sizingClasses($)),[e],$),a=_.sizeMultiplier/$.sizeMultiplier;return n.height*=a,n.depth*=a,n.maxFontSize=_.sizeMultiplier,n},tV=function(e,t,$){var r=t.havingBaseStyle($),_=(1-t.sizeMultiplier/r.sizeMultiplier)*t.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=E(_),e.height-=_,e.depth+=_},tF=function(e,t,$,r,_,n){var a,i,o,s,l=(a=e,i=t,o=_,s=r,eD.makeSymbol(a,"Size"+i+"-Regular",o,s)),h=tP(eD.makeSpan(["delimsizing","size"+t],[l],r),b.TEXT,r,n);return $&&tV(h,r,b.TEXT),h},tG=function(e,t,$){var r;return r="Size1-Regular"===t?"delim-size1":"delim-size4",{type:"elem",elem:eD.makeSpan(["delimsizinginner",r],[eD.makeSpan([],[eD.makeSymbol(e,t,$)])])}},tU=function(e,t,$){var r=z["Size4-Regular"][e.charCodeAt(0)]?z["Size4-Regular"][e.charCodeAt(0)][4]:z["Size1-Regular"][e.charCodeAt(0)][4],_=new K("inner",function(e,t){switch(e){case"⎜":return"M291 0 H417 V"+t+" H291z M291 0 H417 V"+t+" H291z";case"∣":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145z";case"∥":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145zM367 0 H410 V"+t+" H367z M367 0 H410 V"+t+" H367z";case"⎟":return"M457 0 H583 V"+t+" H457z M457 0 H583 V"+t+" H457z";case"⎢":return"M319 0 H403 V"+t+" H319z M319 0 H403 V"+t+" H319z";case"⎥":return"M263 0 H347 V"+t+" H263z M263 0 H347 V"+t+" H263z";case"⎪":return"M384 0 H504 V"+t+" H384z M384 0 H504 V"+t+" H384z";case"⏐":return"M312 0 H355 V"+t+" H312z M312 0 H355 V"+t+" H312z";case"‖":return"M257 0 H300 V"+t+" H257z M257 0 H300 V"+t+" H257zM478 0 H521 V"+t+" H478z M478 0 H521 V"+t+" H478z";default:return""}}(e,Math.round(1e3*t))),n=new Z([_],{width:E(r),height:E(t),style:"width:"+E(r),viewBox:"0 0 "+1e3*r+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"}),a=eD.makeSvgSpan([],[n],$);return a.height=t,a.style.height=E(t),a.style.width=E(r),{type:"elem",elem:a}},tX={type:"kern",size:-.008},tY=["|","\\lvert","\\rvert","\\vert"],tW=["\\|","\\lVert","\\rVert","\\Vert"],t8=function(e,t,$,r,_,n){var a,i,s,l,h="",m=0;a=s=l=e,i=null;var c="Size1-Regular";"\\uparrow"===e?s=l="⏐":"\\Uparrow"===e?s=l="‖":"\\downarrow"===e?a=s="⏐":"\\Downarrow"===e?a=s="‖":"\\updownarrow"===e?(a="\\uparrow",s="⏐",l="\\downarrow"):"\\Updownarrow"===e?(a="\\Uparrow",s="‖",l="\\Downarrow"):o.contains(tY,e)?(s="∣",h="vert",m=333):o.contains(tW,e)?(s="∥",h="doublevert",m=556):"["===e||"\\lbrack"===e?(a="⎡",s="⎢",l="⎣",c="Size4-Regular",h="lbrack",m=667):"]"===e||"\\rbrack"===e?(a="⎤",s="⎥",l="⎦",c="Size4-Regular",h="rbrack",m=667):"\\lfloor"===e||"⌊"===e?(s=a="⎢",l="⎣",c="Size4-Regular",h="lfloor",m=667):"\\lceil"===e||"⌈"===e?(a="⎡",s=l="⎢",c="Size4-Regular",h="lceil",m=667):"\\rfloor"===e||"⌋"===e?(s=a="⎥",l="⎦",c="Size4-Regular",h="rfloor",m=667):"\\rceil"===e||"⌉"===e?(a="⎤",s=l="⎥",c="Size4-Regular",h="rceil",m=667):"("===e||"\\lparen"===e?(a="⎛",s="⎜",l="⎝",c="Size4-Regular",h="lparen",m=875):")"===e||"\\rparen"===e?(a="⎞",s="⎟",l="⎠",c="Size4-Regular",h="rparen",m=875):"\\{"===e||"\\lbrace"===e?(a="⎧",i="⎨",l="⎩",s="⎪",c="Size4-Regular"):"\\}"===e||"\\rbrace"===e?(a="⎫",i="⎬",l="⎭",s="⎪",c="Size4-Regular"):"\\lgroup"===e||"⟮"===e?(a="⎧",l="⎩",s="⎪",c="Size4-Regular"):"\\rgroup"===e||"⟯"===e?(a="⎫",l="⎭",s="⎪",c="Size4-Regular"):"\\lmoustache"===e||"⎰"===e?(a="⎧",l="⎭",s="⎪",c="Size4-Regular"):"\\rmoustache"!==e&&"⎱"!==e||(a="⎫",l="⎩",s="⎪",c="Size4-Regular");var u=tE(a,c,_),p=u.height+u.depth,d=tE(s,c,_),f=d.height+d.depth,g=tE(l,c,_),v=g.height+g.depth,y=0,x=1;if(null!==i){var w=tE(i,c,_);y=w.height+w.depth,x=2}var k=p+v+y,S=k+Math.max(0,Math.ceil((t-k)/(x*f)))*x*f,z=r.fontMetrics().axisHeight;$&&(z*=r.sizeMultiplier);var M=S/2-z,T=[];if(h.length>0){var A=Math.round(1e3*S),B=function(e,t){switch(e){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+" v1759 h347 v-84\nH403z M403 1759 V0 H319 V1759 v"+t+" v1759 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+" v1759 H0 v84 H347z\nM347 1759 V0 H263 V1759 v"+t+" v1759 h84z";case"vert":return"M145 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v"+t+" v585 h43z";case"doublevert":return"M145 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v"+t+" v585 h43z\nM367 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M410 15 H367 v585 v"+t+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+t+" v1715 h263 v84 H319z\nMM319 602 V0 H403 V602 v"+t+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+t+" v1799 H0 v-84 H319z\nMM319 602 V0 H403 V602 v"+t+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+" v602 h84z\nM403 1759 V0 H319 V1759 v"+t+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+" v602 h84z\nM347 1759 V0 h-84 V1759 v"+t+" v602 h84z";case"lparen":return"M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1\nc-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349,\n-36,557 l0,"+(t+84)+"c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210,\n949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9\nc0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5,\n-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189\nl0,-"+(t+92)+"c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3,\n-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z";case"rparen":return"M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3,\n63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5\nc11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,"+(t+9)+"\nc-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664\nc-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11\nc0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17\nc242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558\nl0,-"+(t+144)+"c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,\n-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z";default:throw Error("Unknown stretchy delimiter.")}}(h,Math.round(1e3*(S-p-v))),C=new K(h,B),q=(m/1e3).toFixed(3)+"em",N=(A/1e3).toFixed(3)+"em",H=new Z([C],{width:q,height:N,viewBox:"0 0 "+m+" "+A}),I=eD.makeSvgSpan([],[H],r);I.height=A/1e3,I.style.width=q,I.style.height=N,T.push({type:"elem",elem:I})}else{if(T.push(tG(l,c,_)),T.push(tX),null===i)T.push(tU(s,S-p-v+.016,r));else{var R=(S-p-v-y)/2+.016;T.push(tU(s,R,r)),T.push(tX),T.push(tG(i,c,_)),T.push(tX),T.push(tU(s,R,r))}T.push(tX),T.push(tG(a,c,_))}var O=r.havingBaseStyle(b.TEXT),L=eD.makeVList({positionType:"bottom",positionData:M,children:T},O);return tP(eD.makeSpan(["delimsizing","mult"],[L],O),b.TEXT,r,n)},t9=function(e,t,$,r,_){var n=function(e,t,$){t*=1e3;var r,_,n,a,i,o,s,l="";switch(e){case"sqrtMain":l="M95,"+(622+(r=t)+80)+"\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl"+r/2.075+" -"+r+"\nc5.3,-9.3,12,-14,20,-14\nH400000v"+(40+r)+"H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM"+(834+r)+" 80h400000v"+(40+r)+"h-400000z";break;case"sqrtSize1":l="M263,"+(601+(_=t)+80)+"c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl"+_/2.084+" -"+_+"\nc4.7,-7.3,11,-11,19,-11\nH40000v"+(40+_)+"H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM"+(1001+_)+" 80h400000v"+(40+_)+"h-400000z";break;case"sqrtSize2":l="M983 "+(10+(n=t)+80)+"\nl"+n/3.13+" -"+n+"\nc4,-6.7,10,-10,18,-10 H400000v"+(40+n)+"\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM"+(1001+n)+" 80h400000v"+(40+n)+"h-400000z";break;case"sqrtSize3":l="M424,"+(2398+(a=t)+80)+"\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl"+a/4.223+" -"+a+"c4,-6.7,10,-10,18,-10 H400000\nv"+(40+a)+"H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M"+(1001+a)+" 80\nh400000v"+(40+a)+"h-400000z";break;case"sqrtSize4":l="M473,"+(2713+(i=t)+80)+"\nc339.3,-1799.3,509.3,-2700,510,-2702 l"+i/5.298+" -"+i+"\nc3.3,-7.3,9.3,-11,18,-11 H400000v"+(40+i)+"H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM"+(1001+i)+" 80h400000v"+(40+i)+"H1017.7z";break;case"sqrtTall":l="M702 "+((o=t)+80)+"H400000"+(40+o)+"\nH742v"+((s=$)-54-80-o)+"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 80H400000v"+(40+o)+"H742z"}return l}(e,r,$),a=new K(e,n),i=new Z([a],{width:"400em",height:E(t),viewBox:"0 0 400000 "+$,preserveAspectRatio:"xMinYMin slice"});return eD.makeSvgSpan(["hide-tail"],[i],_)},tj=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","⌊","⌋","\\lceil","\\rceil","⌈","⌉","\\surd"],tZ=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","⟮","⟯","\\lmoustache","\\rmoustache","⎰","⎱"],tK=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],tJ=[0,1.2,1.8,2.4,3],tQ=[{type:"small",style:b.SCRIPTSCRIPT},{type:"small",style:b.SCRIPT},{type:"small",style:b.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],$e=[{type:"small",style:b.SCRIPTSCRIPT},{type:"small",style:b.SCRIPT},{type:"small",style:b.TEXT},{type:"stack"}],$t=[{type:"small",style:b.SCRIPTSCRIPT},{type:"small",style:b.SCRIPT},{type:"small",style:b.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],$$=function(e){if("small"===e.type)return"Main-Regular";if("large"===e.type)return"Size"+e.size+"-Regular";if("stack"===e.type)return"Size4-Regular";throw Error("Add support for delim type '"+e.type+"' here.")},$r=function(e,t,$,r){for(var _=Math.min(2,3-r.style.size);_<$.length&&"stack"!==$[_].type;_++){var n=tE(e,$$($[_]),"math"),a=n.height+n.depth;if("small"===$[_].type&&(a*=r.havingBaseStyle($[_].style).sizeMultiplier),a>t)return $[_]}return $[$.length-1]},$_=function(e,t,$,r,_,n){"<"===e||"\\lt"===e||"⟨"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"⟩"!==e||(e="\\rangle"),a=o.contains(tK,e)?tQ:o.contains(tj,e)?$t:$e;var a,i,s,l,h,m,c,u,p,d=$r(e,t,a,r);return"small"===d.type?(i=e,s=d.style,l=$,h=r,m=_,c=n,p=tP(u=eD.makeSymbol(i,"Main-Regular",m,h),s,h,c),l&&tV(p,h,s),p):"large"===d.type?tF(e,d.size,$,r,_,n):t8(e,t,$,r,_,n)},$n={sqrtImage:function(e,t){var $,r,_=t.havingBaseSizing(),n=$r("\\surd",e*_.sizeMultiplier,$t,_),a=_.sizeMultiplier,i=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness),o=0,s=0,l=0;return"small"===n.type?(e<1?a=1:e<1.4&&(a=.7),s=(1+i)/a,($=t9("sqrtMain",o=(1+i+.08)/a,l=1e3+1e3*i+80,i,t)).style.minWidth="0.853em",r=.833/a):"large"===n.type?(l=1080*tJ[n.size],s=(tJ[n.size]+i)/a,o=(tJ[n.size]+i+.08)/a,($=t9("sqrtSize"+n.size,o,l,i,t)).style.minWidth="1.02em",r=1/a):(o=e+i+.08,s=e+i,($=t9("sqrtTall",o,l=Math.floor(1e3*e+i)+80,i,t)).style.minWidth="0.742em",r=1.056),$.height=s,$.style.height=E(o),{span:$,advanceWidth:r,ruleWidth:(t.fontMetrics().sqrtRuleThickness+i)*a}},sizedDelim:function(e,t,$,_,n){if("<"===e||"\\lt"===e||"⟨"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"⟩"!==e||(e="\\rangle"),o.contains(tj,e)||o.contains(tK,e))return tF(e,t,!1,$,_,n);if(o.contains(tZ,e))return t8(e,tJ[t],!1,$,_,n);throw new r("Illegal delimiter: '"+e+"'")},sizeToMaxHeight:tJ,customSizedDelim:$_,leftRightDelim:function(e,t,$,r,_,n){var a=r.fontMetrics().axisHeight*r.sizeMultiplier,i=5/r.fontMetrics().ptPerEm,o=Math.max(t-a,$+a);return $_(e,Math.max(o/500*901,2*o-i),!0,r,_,n)}},$a={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},$i=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","⌊","⌋","\\lceil","\\rceil","⌈","⌉","<",">","\\langle","⟨","\\rangle","⟩","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","⟮","⟯","\\lmoustache","\\rmoustache","⎰","⎱","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function $2(e,t){var $=tw(e);if($&&o.contains($i,$.text))return $;throw new r($?"Invalid delimiter '"+$.text+"' after '"+t.funcName+"'":"Invalid delimiter type '"+e.type+"'",e)}function $o(e){if(!e.body)throw Error("Bug: The leftright ParseNode wasn't fully parsed.")}eW({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:function(e,t){var $=$2(t[0],e);return{type:"delimsizing",mode:e.parser.mode,size:$a[e.funcName].size,mclass:$a[e.funcName].mclass,delim:$.text}},htmlBuilder:function(e,t){return"."===e.delim?eD.makeSpan([e.mclass]):$n.sizedDelim(e.delim,e.size,t,e.mode,[e.mclass])},mathmlBuilder:function(e){var t=[];"."!==e.delim&&t.push(t5(e.delim,e.mode));var $=new t4.MathNode("mo",t);"mopen"===e.mclass||"mclose"===e.mclass?$.setAttribute("fence","true"):$.setAttribute("fence","false"),$.setAttribute("stretchy","true");var r=E($n.sizeToMaxHeight[e.size]);return $.setAttribute("minsize",r),$.setAttribute("maxsize",r),$}}),eW({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:function(e,t){var $=e.parser.gullet.macros.get("\\current@color");if($&&"string"!=typeof $)throw new r("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:e.parser.mode,delim:$2(t[0],e).text,color:$}}}),eW({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:function(e,t){var $=$2(t[0],e),r=e.parser;++r.leftrightDepth;var _=r.parseExpression(!1);--r.leftrightDepth,r.expect("\\right",!1);var n=ty(r.parseFunction(),"leftright-right");return{type:"leftright",mode:r.mode,body:_,left:$.text,right:n.delim,rightColor:n.color}},htmlBuilder:function(e,t){$o(e);for(var $,r,_=tt(e.body,t,!0,["mopen","mclose"]),n=0,a=0,i=!1,o=0;o<_.length;o++)_[o].isMiddle?i=!0:(n=Math.max(_[o].height,n),a=Math.max(_[o].depth,a));if(n*=t.sizeMultiplier,a*=t.sizeMultiplier,$="."===e.left?ta(t,["mopen"]):$n.leftRightDelim(e.left,n,a,t,e.mode,["mopen"]),_.unshift($),i)for(var s=1;s<_.length;s++){var l=_[s].isMiddle;l&&(_[s]=$n.leftRightDelim(l.delim,n,a,l.options,e.mode,[]))}if("."===e.right)r=ta(t,["mclose"]);else{var h=e.rightColor?t.withColor(e.rightColor):t;r=$n.leftRightDelim(e.right,n,a,h,e.mode,["mclose"])}return _.push(r),eD.makeSpan(["minner"],_,t)},mathmlBuilder:function(e,t){$o(e);var $=th(e.body,t);if("."!==e.left){var r=new t4.MathNode("mo",[t5(e.left,e.mode)]);r.setAttribute("fence","true"),$.unshift(r)}if("."!==e.right){var _=new t4.MathNode("mo",[t5(e.right,e.mode)]);_.setAttribute("fence","true"),e.rightColor&&_.setAttribute("mathcolor",e.rightColor),$.push(_)}return t1($)}}),eW({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:function(e,t){var $=$2(t[0],e);if(!e.parser.leftrightDepth)throw new r("\\middle without preceding \\left",$);return{type:"middle",mode:e.parser.mode,delim:$.text}},htmlBuilder:function(e,t){var $;if("."===e.delim)$=ta(t,[]);else{$=$n.sizedDelim(e.delim,1,t,e.mode,[]);var r={delim:e.delim,options:t};$.isMiddle=r}return $},mathmlBuilder:function(e,t){var $="\\vert"===e.delim||"|"===e.delim?t5("|","text"):t5(e.delim,e.mode),r=new t4.MathNode("mo",[$]);return r.setAttribute("fence","true"),r.setAttribute("lspace","0.05em"),r.setAttribute("rspace","0.05em"),r}});var $s=function(e,t){var $,r,_,n=eD.wrapFragment(ti(e.body,t),t),a=e.label.slice(1),i=t.sizeMultiplier,s=0,l=o.isCharacterBox(e.body);if("sout"===a)($=eD.makeSpan(["stretchy","sout"])).height=t.fontMetrics().defaultRuleThickness/i,s=-.5*t.fontMetrics().xHeight;else if("phase"===a){var h=D({number:.6,unit:"pt"},t),m=D({number:.35,unit:"ex"},t);i/=t.havingBaseSizing().sizeMultiplier;var c=n.height+n.depth+h+m;n.style.paddingLeft=E(c/2+h);var u=Math.floor(1e3*c*i),p="M400000 "+(r=u)+" H0 L"+r/2+" 0 l65 45 L145 "+(r-80)+" H400000z",d=new Z([new K("phase",p)],{width:"400em",height:E(u/1e3),viewBox:"0 0 400000 "+u,preserveAspectRatio:"xMinYMin slice"});($=eD.makeSvgSpan(["hide-tail"],[d],t)).style.height=E(c),s=n.depth+h+m}else{/cancel/.test(a)?l||n.classes.push("cancel-pad"):"angl"===a?n.classes.push("anglpad"):n.classes.push("boxpad");var f=0,g=0,v=0;/box/.test(a)?(v=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness),g=f=t.fontMetrics().fboxsep+("colorbox"===a?0:v)):"angl"===a?(f=4*(v=Math.max(t.fontMetrics().defaultRuleThickness,t.minRuleThickness)),g=Math.max(0,.25-n.depth)):g=f=l?.2:0,$=tg(n,a,f,g,t),/fbox|boxed|fcolorbox/.test(a)?($.style.borderStyle="solid",$.style.borderWidth=E(v)):"angl"===a&&.049!==v&&($.style.borderTopWidth=E(v),$.style.borderRightWidth=E(v)),s=n.depth+g,e.backgroundColor&&($.style.backgroundColor=e.backgroundColor,e.borderColor&&($.style.borderColor=e.borderColor))}if(e.backgroundColor)_=eD.makeVList({positionType:"individualShift",children:[{type:"elem",elem:$,shift:s},{type:"elem",elem:n,shift:0}]},t);else{var b=/cancel|phase/.test(a)?["svg-align"]:[];_=eD.makeVList({positionType:"individualShift",children:[{type:"elem",elem:n,shift:0},{type:"elem",elem:$,shift:s,wrapperClasses:b}]},t)}return/cancel/.test(a)&&(_.height=n.height,_.depth=n.depth),/cancel/.test(a)&&!l?eD.makeSpan(["mord","cancel-lap"],[_],t):eD.makeSpan(["mord"],[_],t)},$l=function(e,t){var $=0,r=new t4.MathNode(e.label.indexOf("colorbox")>-1?"mpadded":"menclose",[tm(e.body,t)]);switch(e.label){case"\\cancel":r.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":r.setAttribute("notation","downdiagonalstrike");break;case"\\phase":r.setAttribute("notation","phasorangle");break;case"\\sout":r.setAttribute("notation","horizontalstrike");break;case"\\fbox":r.setAttribute("notation","box");break;case"\\angl":r.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if($=t.fontMetrics().fboxsep*t.fontMetrics().ptPerEm,r.setAttribute("width","+"+2*$+"pt"),r.setAttribute("height","+"+2*$+"pt"),r.setAttribute("lspace",$+"pt"),r.setAttribute("voffset",$+"pt"),"\\fcolorbox"===e.label){var _=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness);r.setAttribute("style","border: "+_+"em solid "+String(e.borderColor))}break;case"\\xcancel":r.setAttribute("notation","updiagonalstrike downdiagonalstrike")}return e.backgroundColor&&r.setAttribute("mathbackground",e.backgroundColor),r};eW({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler:function(e,t,$){var r=e.parser,_=e.funcName,n=ty(t[0],"color-token").color,a=t[1];return{type:"enclose",mode:r.mode,label:_,backgroundColor:n,body:a}},htmlBuilder:$s,mathmlBuilder:$l}),eW({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler:function(e,t,$){var r=e.parser,_=e.funcName,n=ty(t[0],"color-token").color,a=ty(t[1],"color-token").color,i=t[2];return{type:"enclose",mode:r.mode,label:_,backgroundColor:a,borderColor:n,body:i}},htmlBuilder:$s,mathmlBuilder:$l}),eW({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler:function(e,t){return{type:"enclose",mode:e.parser.mode,label:"\\fbox",body:t[0]}}}),eW({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler:function(e,t){var $=e.parser,r=e.funcName,_=t[0];return{type:"enclose",mode:$.mode,label:r,body:_}},htmlBuilder:$s,mathmlBuilder:$l}),eW({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler:function(e,t){return{type:"enclose",mode:e.parser.mode,label:"\\angl",body:t[0]}}});var $3={};function $4(e){for(var t=e.type,$=e.names,r=e.props,_=e.handler,n=e.htmlBuilder,a=e.mathmlBuilder,i={type:t,numArgs:r.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:_},o=0;o<$.length;++o)$3[$[o]]=i;n&&(eX[t]=n),a&&(eY[t]=a)}var $5={};function $1(e,t){$5[e]=t}var $6=function(){function e(e,t,$){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=e,this.start=t,this.end=$}return e.range=function(t,$){return $?t&&t.loc&&$.loc&&t.loc.lexer===$.loc.lexer?new e(t.loc.lexer,t.loc.start,$.loc.end):null:t&&t.loc},e}(),$h=function(){function e(e,t){this.text=void 0,this.loc=void 0,this.noexpand=void 0,this.treatAsRelax=void 0,this.text=e,this.loc=t}return e.prototype.range=function(t,$){return new e($,$6.range(this,t))},e}();function $0(e){var t=[];e.consumeSpaces();var $=e.fetch().text;for("\\relax"===$&&(e.consume(),e.consumeSpaces(),$=e.fetch().text);"\\hline"===$||"\\hdashline"===$;)e.consume(),t.push("\\hdashline"===$),e.consumeSpaces(),$=e.fetch().text;return t}var $m=function(e){if(!e.parser.settings.displayMode)throw new r("{"+e.envName+"} can be used only in display mode.")};function $c(e){if(-1===e.indexOf("ed"))return -1===e.indexOf("*")}function $u(e,t,$){var _=t.hskipBeforeAndAfter,n=t.addJot,a=t.cols,i=t.arraystretch,o=t.colSeparationType,s=t.autoTag,l=t.singleRow,h=t.emptySingleRow,m=t.maxNumCols,c=t.leqno;if(e.gullet.beginGroup(),l||e.gullet.macros.set("\\cr","\\\\\\relax"),!i){var u=e.gullet.expandMacroAsText("\\arraystretch");if(null==u)i=1;else if(!(i=parseFloat(u))||i<0)throw new r("Invalid \\arraystretch: "+u)}e.gullet.beginGroup();var p=[],d=[p],f=[],g=[],v=null!=s?[]:void 0;function b(){s&&e.gullet.macros.set("\\@eqnsw","1",!0)}function y(){v&&(e.gullet.macros.get("\\df@tag")?(v.push(e.subparse([new $h("\\df@tag")])),e.gullet.macros.set("\\df@tag",void 0,!0)):v.push(Boolean(s)&&"1"===e.gullet.macros.get("\\@eqnsw")))}for(b(),g.push($0(e));;){var x=e.parseExpression(!1,l?"\\end":"\\\\");e.gullet.endGroup(),e.gullet.beginGroup(),x={type:"ordgroup",mode:e.mode,body:x},$&&(x={type:"styling",mode:e.mode,style:$,body:[x]}),p.push(x);var w=e.fetch().text;if("&"===w){if(m&&p.length===m){if(l||o)throw new r("Too many tab characters: &",e.nextToken);e.settings.reportNonstrict("textEnv","Too few columns specified in the {array} column argument.")}e.consume()}else{if("\\end"===w){y(),1===p.length&&"styling"===x.type&&0===x.body[0].body.length&&(d.length>1||!h)&&d.pop(),g.length0&&(v+=.25),l.push({pos:v,isDashed:e[t]})}for(y(a[0]),$=0;$0&&(k<(T+=g)&&(k=T),T=0),e.addJot&&(k+=p),S.height=w,S.depth=k,v+=w,S.pos=v,v+=k+T,s[$]=S,y(a[$+1])}var A,B,C=v/2+t.fontMetrics().axisHeight,q=e.cols||[],N=[],H=[];if(e.tags&&e.tags.some(function(e){return e}))for($=0;$=i)){var X=void 0;(_>0||e.hskipBeforeAndAfter)&&0!==(X=o.deflt(P.pregap,c))&&((A=eD.makeSpan(["arraycolsep"],[])).style.width=E(X),N.push(A));var Y=[];for($=0;$0){for(var K=eD.makeLineSpan("hline",t,h),J=eD.makeLineSpan("hdashline",t,h),Q=[{type:"elem",elem:s,shift:0}];l.length>0;){var ee=l.pop(),et=ee.pos-C;ee.isDashed?Q.push({type:"elem",elem:J,shift:et}):Q.push({type:"elem",elem:K,shift:et})}s=eD.makeVList({positionType:"individualShift",children:Q},t)}if(0===H.length)return eD.makeSpan(["mord"],[s],t);var e$=eD.makeVList({positionType:"individualShift",children:H},t);return e$=eD.makeSpan(["tag"],[e$],t),eD.makeFragment([s,e$])},$d={c:"center ",l:"left ",r:"right "},$f=function(e,t){for(var $=[],r=new t4.MathNode("mtd",[],["mtr-glue"]),_=new t4.MathNode("mtd",[],["mml-eqn-num"]),n=0;n0){var c=e.cols,u="",p=!1,d=0,f=c.length;"separator"===c[0].type&&(h+="top ",d=1),"separator"===c[c.length-1].type&&(h+="bottom ",f-=1);for(var g=d;g0?"left ":"",h+=w[w.length-1].length>0?"right ":"";for(var k=1;k-1?"alignat":"align",a="split"===e.envName,i=$u(e.parser,{cols:_,addJot:!0,autoTag:a?void 0:$c(e.envName),emptySingleRow:!0,colSeparationType:n,maxNumCols:a?2:void 0,leqno:e.parser.settings.leqno},"display"),o=0,s={type:"ordgroup",mode:e.mode,body:[]};if(t[0]&&"ordgroup"===t[0].type){for(var l="",h=0;h0&&m&&(p=1),_[c]={type:"align",align:u,pregap:p,postgap:0}}return i.colSeparationType=m?"align":"alignat",i};$4({type:"array",names:["array","darray"],props:{numArgs:1},handler:function(e,t){var $=(tw(t[0])?[t[0]]:ty(t[0],"ordgroup").body).map(function(e){var t=tx(e).text;if(-1!=="lcr".indexOf(t))return{type:"align",align:t};if("|"===t)return{type:"separator",separator:"|"};if(":"===t)return{type:"separator",separator:":"};throw new r("Unknown column alignment: "+t,e)}),_={cols:$,hskipBeforeAndAfter:!0,maxNumCols:$.length};return $u(e.parser,_,$7(e.envName))},htmlBuilder:$p,mathmlBuilder:$f}),$4({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler:function(e){var t={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[e.envName.replace("*","")],$="c",_={hskipBeforeAndAfter:!1,cols:[{type:"align",align:$}]};if("*"===e.envName.charAt(e.envName.length-1)){var n=e.parser;if(n.consumeSpaces(),"["===n.fetch().text){if(n.consume(),n.consumeSpaces(),$=n.fetch().text,-1==="lcr".indexOf($))throw new r("Expected l or c or r",n.nextToken);n.consume(),n.consumeSpaces(),n.expect("]"),n.consume(),_.cols=[{type:"align",align:$}]}}var a=$u(e.parser,_,$7(e.envName)),i=Math.max.apply(Math,[0].concat(a.body.map(function(e){return e.length})));return a.cols=Array(i).fill({type:"align",align:$}),t?{type:"leftright",mode:e.mode,body:[a],left:t[0],right:t[1],rightColor:void 0}:a},htmlBuilder:$p,mathmlBuilder:$f}),$4({type:"array",names:["smallmatrix"],props:{numArgs:0},handler:function(e){var t=$u(e.parser,{arraystretch:.5},"script");return t.colSeparationType="small",t},htmlBuilder:$p,mathmlBuilder:$f}),$4({type:"array",names:["subarray"],props:{numArgs:1},handler:function(e,t){var $=(tw(t[0])?[t[0]]:ty(t[0],"ordgroup").body).map(function(e){var t=tx(e).text;if(-1!=="lc".indexOf(t))return{type:"align",align:t};throw new r("Unknown column alignment: "+t,e)});if($.length>1)throw new r("{subarray} can contain only one column");var _={cols:$,hskipBeforeAndAfter:!1,arraystretch:.5};if((_=$u(e.parser,_,"script")).body.length>0&&_.body[0].length>1)throw new r("{subarray} can contain only one column");return _},htmlBuilder:$p,mathmlBuilder:$f}),$4({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler:function(e){var t=$u(e.parser,{arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},$7(e.envName));return{type:"leftright",mode:e.mode,body:[t],left:e.envName.indexOf("r")>-1?".":"\\{",right:e.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:$p,mathmlBuilder:$f}),$4({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:$g,htmlBuilder:$p,mathmlBuilder:$f}),$4({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler:function(e){o.contains(["gather","gather*"],e.envName)&&$m(e);var t={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:$c(e.envName),emptySingleRow:!0,leqno:e.parser.settings.leqno};return $u(e.parser,t,"display")},htmlBuilder:$p,mathmlBuilder:$f}),$4({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:$g,htmlBuilder:$p,mathmlBuilder:$f}),$4({type:"array",names:["equation","equation*"],props:{numArgs:0},handler:function(e){$m(e);var t={autoTag:$c(e.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:e.parser.settings.leqno};return $u(e.parser,t,"display")},htmlBuilder:$p,mathmlBuilder:$f}),$4({type:"array",names:["CD"],props:{numArgs:0},handler:function(e){return $m(e),function(e){var t=[];for(e.gullet.beginGroup(),e.gullet.macros.set("\\cr","\\\\\\relax"),e.gullet.beginGroup();;){t.push(e.parseExpression(!1,"\\\\")),e.gullet.endGroup(),e.gullet.beginGroup();var $=e.fetch().text;if("&"!==$&&"\\\\"!==$){if("\\end"===$){0===t[t.length-1].length&&t.pop();break}throw new r("Expected \\\\ or \\cr or \\end",e.nextToken)}e.consume()}for(var _,n,a=[],i=[a],o=0;o-1);else{if(!("<>AV".indexOf(m)>-1))throw new r('Expected one of "<>AV=|." after @',s[h]);for(var u=0;u<2;u++){for(var p=!0,d=h+1;d=b.SCRIPT.id?$.text():b.DISPLAY:"text"===e&&$.size===b.DISPLAY.size?$=b.TEXT:"script"===e?$=b.SCRIPT:"scriptscript"===e&&($=b.SCRIPTSCRIPT),$},$k=function(e,t){var $,r=$w(e.size,t.style),_=r.fracNum(),n=r.fracDen();$=t.havingStyle(_);var a=ti(e.numer,$,t);if(e.continued){var i=8.5/t.fontMetrics().ptPerEm,o=3.5/t.fontMetrics().ptPerEm;a.height=a.height0?3*h:7*h,u=t.fontMetrics().denom1):(l>0?(m=t.fontMetrics().num2,c=h):(m=t.fontMetrics().num3,c=3*h),u=t.fontMetrics().denom2),s){var y=t.fontMetrics().axisHeight;m-a.depth-(y+.5*l)0&&(t="."===(t=e)?null:t),t};eW({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler:function(e,t){var $,r=e.parser,_=t[4],n=t[5],a=e9(t[0]),i="atom"===a.type&&"open"===a.family?$M(a.text):null,o=e9(t[1]),s="atom"===o.type&&"close"===o.family?$M(o.text):null,l=ty(t[2],"size"),h=null;$=!!l.isBlank||(h=l.value).number>0;var m="auto",c=t[3];if("ordgroup"===c.type){if(c.body.length>0){var u=ty(c.body[0],"textord");m=$z[Number(u.text)]}}else c=ty(c,"textord"),m=$z[Number(c.text)];return{type:"genfrac",mode:r.mode,numer:_,denom:n,continued:!1,hasBarLine:$,barSize:h,leftDelim:i,rightDelim:s,size:m}},htmlBuilder:$k,mathmlBuilder:$S}),eW({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler:function(e,t){var $=e.parser,r=(e.funcName,e.token);return{type:"infix",mode:$.mode,replaceWith:"\\\\abovefrac",size:ty(t[0],"size").value,token:r}}}),eW({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:function(e,t){var $=e.parser,r=(e.funcName,t[0]),_=function(e){if(!e)throw Error("Expected non-null, but got "+String(e));return e}(ty(t[1],"infix").size),n=t[2],a=_.number>0;return{type:"genfrac",mode:$.mode,numer:r,denom:n,continued:!1,hasBarLine:a,barSize:_,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:$k,mathmlBuilder:$S});var $T=function(e,t){var $,r,_=t.style;"supsub"===e.type?($=e.sup?ti(e.sup,t.havingStyle(_.sup()),t):ti(e.sub,t.havingStyle(_.sub()),t),r=ty(e.base,"horizBrace")):r=ty(e,"horizBrace");var n,a=ti(r.base,t.havingBaseStyle(b.DISPLAY)),i=tb(r,t);if(r.isOver?(n=eD.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:a},{type:"kern",size:.1},{type:"elem",elem:i}]},t)).children[0].children[0].children[1].classes.push("svg-align"):(n=eD.makeVList({positionType:"bottom",positionData:a.depth+.1+i.height,children:[{type:"elem",elem:i},{type:"kern",size:.1},{type:"elem",elem:a}]},t)).children[0].children[0].children[0].classes.push("svg-align"),$){var o=eD.makeSpan(["mord",r.isOver?"mover":"munder"],[n],t);n=r.isOver?eD.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:o},{type:"kern",size:.2},{type:"elem",elem:$}]},t):eD.makeVList({positionType:"bottom",positionData:o.depth+.2+$.height+$.depth,children:[{type:"elem",elem:$},{type:"kern",size:.2},{type:"elem",elem:o}]},t)}return eD.makeSpan(["mord",r.isOver?"mover":"munder"],[n],t)};eW({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler:function(e,t){var $=e.parser,r=e.funcName;return{type:"horizBrace",mode:$.mode,label:r,isOver:/^\\over/.test(r),base:t[0]}},htmlBuilder:$T,mathmlBuilder:function(e,t){var $=tv(e.label);return new t4.MathNode(e.isOver?"mover":"munder",[tm(e.base,t),$])}}),eW({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:function(e,t){var $=e.parser,r=t[1],_=ty(t[0],"url").url;return $.settings.isTrusted({command:"\\href",url:_})?{type:"href",mode:$.mode,href:_,body:ej(r)}:$.formatUnsupportedCmd("\\href")},htmlBuilder:function(e,t){var $=tt(e.body,t,!1);return eD.makeAnchor(e.href,[],$,t)},mathmlBuilder:function(e,t){var $=t0(e.body,t);return $ instanceof tl||($=new tl("mrow",[$])),$.setAttribute("href",e.href),$}}),eW({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:function(e,t){var $=e.parser,r=ty(t[0],"url").url;if(!$.settings.isTrusted({command:"\\url",url:r}))return $.formatUnsupportedCmd("\\url");for(var _=[],n=0;n0&&(r=D(e.totalheight,t)-$);var _=0;e.width.number>0&&(_=D(e.width,t));var n={height:E($+r)};_>0&&(n.width=E(_)),r>0&&(n.verticalAlign=E(-r));var a=new Y(e.src,e.alt,n);return a.height=$,a.depth=r,a},mathmlBuilder:function(e,t){var $=new t4.MathNode("mglyph",[]);$.setAttribute("alt",e.alt);var r=D(e.height,t),_=0;if(e.totalheight.number>0&&(_=D(e.totalheight,t)-r,$.setAttribute("valign",E(-_))),$.setAttribute("height",E(r+_)),e.width.number>0){var n=D(e.width,t);$.setAttribute("width",E(n))}return $.setAttribute("src",e.src),$}}),eW({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler:function(e,t){var $=e.parser,r=e.funcName,_=ty(t[0],"size");if($.settings.strict){var n="m"===r[1],a="mu"===_.value.unit;n?(a||$.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+r+" supports only mu units, not "+_.value.unit+" units"),"math"!==$.mode&&$.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+r+" works only in math mode")):a&&$.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+r+" doesn't support mu units")}return{type:"kern",mode:$.mode,dimension:_.value}},htmlBuilder:function(e,t){return eD.makeGlue(e.dimension,t)},mathmlBuilder:function(e,t){var $=D(e.dimension,t);return new t4.SpaceNode($)}}),eW({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){var $=e.parser,r=e.funcName,_=t[0];return{type:"lap",mode:$.mode,alignment:r.slice(5),body:_}},htmlBuilder:function(e,t){"clap"===e.alignment?($=eD.makeSpan([],[ti(e.body,t)]),$=eD.makeSpan(["inner"],[$],t)):$=eD.makeSpan(["inner"],[ti(e.body,t)]);var $,r=eD.makeSpan(["fix"],[]),_=eD.makeSpan([e.alignment],[$,r],t),n=eD.makeSpan(["strut"]);return n.style.height=E(_.height+_.depth),_.depth&&(n.style.verticalAlign=E(-_.depth)),_.children.unshift(n),_=eD.makeSpan(["thinbox"],[_],t),eD.makeSpan(["mord","vbox"],[_],t)},mathmlBuilder:function(e,t){var $=new t4.MathNode("mpadded",[tm(e.body,t)]);if("rlap"!==e.alignment){var r="llap"===e.alignment?"-1":"-0.5";$.setAttribute("lspace",r+"width")}return $.setAttribute("width","0px"),$}}),eW({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(e,t){var $=e.funcName,r=e.parser,_=r.mode;r.switchMode("math");var n="\\("===$?"\\)":"$",a=r.parseExpression(!1,n);return r.expect(n),r.switchMode(_),{type:"styling",mode:r.mode,style:"text",body:a}}}),eW({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler:function(e,t){throw new r("Mismatched "+e.funcName)}});var $B=function(e,t){switch(t.style.size){case b.DISPLAY.size:return e.display;case b.TEXT.size:return e.text;case b.SCRIPT.size:return e.script;case b.SCRIPTSCRIPT.size:return e.scriptscript;default:return e.text}};eW({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:function(e,t){return{type:"mathchoice",mode:e.parser.mode,display:ej(t[0]),text:ej(t[1]),script:ej(t[2]),scriptscript:ej(t[3])}},htmlBuilder:function(e,t){var $=$B(e,t),r=tt($,t,!1);return eD.makeFragment(r)},mathmlBuilder:function(e,t){var $=$B(e,t);return t0($,t)}});var $C=function(e,t,$,r,_,n,a){e=eD.makeSpan([],[e]);var i,s,l,h=$&&o.isCharacterBox($);if(t){var m=ti(t,r.havingStyle(_.sup()),r);s={elem:m,kern:Math.max(r.fontMetrics().bigOpSpacing1,r.fontMetrics().bigOpSpacing3-m.depth)}}if($){var c=ti($,r.havingStyle(_.sub()),r);i={elem:c,kern:Math.max(r.fontMetrics().bigOpSpacing2,r.fontMetrics().bigOpSpacing4-c.height)}}if(s&&i){var u=r.fontMetrics().bigOpSpacing5+i.elem.height+i.elem.depth+i.kern+e.depth+a;l=eD.makeVList({positionType:"bottom",positionData:u,children:[{type:"kern",size:r.fontMetrics().bigOpSpacing5},{type:"elem",elem:i.elem,marginLeft:E(-n)},{type:"kern",size:i.kern},{type:"elem",elem:e},{type:"kern",size:s.kern},{type:"elem",elem:s.elem,marginLeft:E(n)},{type:"kern",size:r.fontMetrics().bigOpSpacing5}]},r)}else if(i){var p=e.height-a;l=eD.makeVList({positionType:"top",positionData:p,children:[{type:"kern",size:r.fontMetrics().bigOpSpacing5},{type:"elem",elem:i.elem,marginLeft:E(-n)},{type:"kern",size:i.kern},{type:"elem",elem:e}]},r)}else{if(!s)return e;var d=e.depth+a;l=eD.makeVList({positionType:"bottom",positionData:d,children:[{type:"elem",elem:e},{type:"kern",size:s.kern},{type:"elem",elem:s.elem,marginLeft:E(n)},{type:"kern",size:r.fontMetrics().bigOpSpacing5}]},r)}var f=[l];if(i&&0!==n&&!h){var g=eD.makeSpan(["mspace"],[],r);g.style.marginRight=E(n),f.unshift(g)}return eD.makeSpan(["mop","op-limits"],f,r)},$q=["\\smallint"],$N=function(e,t){var $,r,_,n=!1;"supsub"===e.type?($=e.sup,r=e.sub,_=ty(e.base,"op"),n=!0):_=ty(e,"op");var a,i=t.style,s=!1;if(i.size===b.DISPLAY.size&&_.symbol&&!o.contains($q,_.name)&&(s=!0),_.symbol){var l=s?"Size2-Regular":"Size1-Regular",h="";if("\\oiint"!==_.name&&"\\oiiint"!==_.name||(h=_.name.slice(1),_.name="oiint"===h?"\\iint":"\\iiint"),a=eD.makeSymbol(_.name,l,"math",t,["mop","op-symbol",s?"large-op":"small-op"]),h.length>0){var m=a.italic,c=eD.staticSvg(h+"Size"+(s?"2":"1"),t);a=eD.makeVList({positionType:"individualShift",children:[{type:"elem",elem:a,shift:0},{type:"elem",elem:c,shift:s?.08:0}]},t),_.name="\\"+h,a.classes.unshift("mop"),a.italic=m}}else if(_.body){var u=tt(_.body,t,!0);1===u.length&&u[0]instanceof j?(a=u[0]).classes[0]="mop":a=eD.makeSpan(["mop"],u,t)}else{for(var p=[],d=1;d<_.name.length;d++)p.push(eD.mathsym(_.name[d],_.mode,t));a=eD.makeSpan(["mop"],p,t)}var f=0,g=0;return(a instanceof j||"\\oiint"===_.name||"\\oiiint"===_.name)&&!_.suppressBaseShift&&(f=(a.height-a.depth)/2-t.fontMetrics().axisHeight,g=a.italic),n?$C(a,$,r,t,i,g,f):(f&&(a.style.position="relative",a.style.top=E(f)),a)},$H=function(e,t){var $;if(e.symbol)$=new tl("mo",[t5(e.name,e.mode)]),o.contains($q,e.name)&&$.setAttribute("largeop","false");else if(e.body)$=new tl("mo",th(e.body,t));else{$=new tl("mi",[new t3(e.name.slice(1))]);var r=new tl("mo",[t5("⁡","text")]);$=e.parentIsSupSub?new tl("mrow",[$,r]):ts([$,r])}return $},$I={"∏":"\\prod","∐":"\\coprod","∑":"\\sum","⋀":"\\bigwedge","⋁":"\\bigvee","⋂":"\\bigcap","⋃":"\\bigcup","⨀":"\\bigodot","⨁":"\\bigoplus","⨂":"\\bigotimes","⨄":"\\biguplus","⨆":"\\bigsqcup"};eW({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","∏","∐","∑","⋀","⋁","⋂","⋃","⨀","⨁","⨂","⨄","⨆"],props:{numArgs:0},handler:function(e,t){var $=e.parser,r=e.funcName;return 1===r.length&&(r=$I[r]),{type:"op",mode:$.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:r}},htmlBuilder:$N,mathmlBuilder:$H}),eW({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:function(e,t){var $=e.parser,r=t[0];return{type:"op",mode:$.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:ej(r)}},htmlBuilder:$N,mathmlBuilder:$H});var $R={"∫":"\\int","∬":"\\iint","∭":"\\iiint","∮":"\\oint","∯":"\\oiint","∰":"\\oiiint"};eW({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler:function(e){var t=e.parser,$=e.funcName;return{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:$}},htmlBuilder:$N,mathmlBuilder:$H}),eW({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler:function(e){var t=e.parser,$=e.funcName;return{type:"op",mode:t.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:$}},htmlBuilder:$N,mathmlBuilder:$H}),eW({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","∫","∬","∭","∮","∯","∰"],props:{numArgs:0},handler:function(e){var t=e.parser,$=e.funcName;return 1===$.length&&($=$R[$]),{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:$}},htmlBuilder:$N,mathmlBuilder:$H});var $O=function(e,t){var $,r,_,n,a=!1;if("supsub"===e.type?($=e.sup,r=e.sub,_=ty(e.base,"operatorname"),a=!0):_=ty(e,"operatorname"),_.body.length>0){for(var i=_.body.map(function(e){var t=e.text;return"string"==typeof t?{type:"textord",mode:e.mode,text:t}:e}),o=tt(i,t.withFont("mathrm"),!0),s=0;s=0?i.setAttribute("height",E(_)):(i.setAttribute("height",E(_)),i.setAttribute("depth",E(-_))),i.setAttribute("voffset",E(_)),i}});var $D=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"];eW({type:"sizing",names:$D,props:{numArgs:0,allowedInText:!0},handler:function(e,t){var $=e.breakOnTokenText,r=e.funcName,_=e.parser,n=_.parseExpression(!1,$);return{type:"sizing",mode:_.mode,size:$D.indexOf(r)+1,body:n}},htmlBuilder:function(e,t){var $=t.havingSize(e.size);return $L(e.body,$,t)},mathmlBuilder:function(e,t){var $=t.havingSize(e.size),r=th(e.body,$),_=new t4.MathNode("mstyle",r);return _.setAttribute("mathsize",E($.sizeMultiplier)),_}}),eW({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:function(e,t,$){var r=e.parser,_=!1,n=!1,a=$[0]&&ty($[0],"ordgroup");if(a)for(var i="",o=0;o$.height+$.depth+n&&(n=(n+h-$.height-$.depth)/2);var m=o.height-$.height-n-s;$.style.paddingLeft=E(l);var c=eD.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:$,wrapperClasses:["svg-align"]},{type:"kern",size:-($.height+m)},{type:"elem",elem:o},{type:"kern",size:s}]},t);if(e.index){var u=t.havingStyle(b.SCRIPTSCRIPT),p=ti(e.index,u,t),d=.6*(c.height-c.depth),f=eD.makeVList({positionType:"shift",positionData:-d,children:[{type:"elem",elem:p}]},t),g=eD.makeSpan(["root"],[f]);return eD.makeSpan(["mord","sqrt"],[g,c],t)}return eD.makeSpan(["mord","sqrt"],[c],t)},mathmlBuilder:function(e,t){var $=e.body,r=e.index;return r?new t4.MathNode("mroot",[tm($,t),tm(r,t)]):new t4.MathNode("msqrt",[tm($,t)])}});var $E={display:b.DISPLAY,text:b.TEXT,script:b.SCRIPT,scriptscript:b.SCRIPTSCRIPT};eW({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler:function(e,t){var $=e.breakOnTokenText,r=e.funcName,_=e.parser,n=_.parseExpression(!0,$),a=r.slice(1,r.length-5);return{type:"styling",mode:_.mode,style:a,body:n}},htmlBuilder:function(e,t){var $=$E[e.style],r=t.havingStyle($).withFont("");return $L(e.body,r,t)},mathmlBuilder:function(e,t){var $=$E[e.style],r=t.havingStyle($),_=th(e.body,r),n=new t4.MathNode("mstyle",_),a={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[e.style];return n.setAttribute("scriptlevel",a[0]),n.setAttribute("displaystyle",a[1]),n}});var $P=function(e,t){var $=e.base;return $?"op"===$.type?$.limits&&(t.style.size===b.DISPLAY.size||$.alwaysHandleSupSub)?$N:null:"operatorname"===$.type?$.alwaysHandleSupSub&&(t.style.size===b.DISPLAY.size||$.limits)?$O:null:"accent"===$.type?o.isCharacterBox($.base)?tk:null:"horizBrace"===$.type&&!e.sub===$.isOver?$T:null:null};e8({type:"supsub",htmlBuilder:function(e,t){var $=$P(e,t);if($)return $(e,t);var r,_,n,a=e.base,i=e.sup,s=e.sub,l=ti(a,t),h=t.fontMetrics(),m=0,c=0,u=a&&o.isCharacterBox(a);if(i){var p=t.havingStyle(t.style.sup());r=ti(i,p,t),u||(m=l.height-p.fontMetrics().supDrop*p.sizeMultiplier/t.sizeMultiplier)}if(s){var d=t.havingStyle(t.style.sub());_=ti(s,d,t),u||(c=l.depth+d.fontMetrics().subDrop*d.sizeMultiplier/t.sizeMultiplier)}n=t.style===b.DISPLAY?h.sup1:t.style.cramped?h.sup3:h.sup2;var f,g=t.sizeMultiplier,v=E(.5/h.ptPerEm/g),y=null;if(_){var x=e.base&&"op"===e.base.type&&e.base.name&&("\\oiint"===e.base.name||"\\oiiint"===e.base.name);(l instanceof j||x)&&(y=E(-l.italic))}if(r&&_){m=Math.max(m,n,r.depth+.25*h.xHeight),c=Math.max(c,h.sub2);var w=4*h.defaultRuleThickness;if(m-r.depth-(_.height-c)0&&(m+=k,c-=k)}var S=[{type:"elem",elem:_,shift:c,marginRight:v,marginLeft:y},{type:"elem",elem:r,shift:-m,marginRight:v}];f=eD.makeVList({positionType:"individualShift",children:S},t)}else if(_){c=Math.max(c,h.sub1,_.height-.8*h.xHeight);var z=[{type:"elem",elem:_,marginLeft:y,marginRight:v}];f=eD.makeVList({positionType:"shift",positionData:c,children:z},t)}else{if(!r)throw Error("supsub must have either sup or sub.");m=Math.max(m,n,r.depth+.25*h.xHeight),f=eD.makeVList({positionType:"shift",positionData:-m,children:[{type:"elem",elem:r,marginRight:v}]},t)}var M=tn(l,"right")||"mord";return eD.makeSpan([M],[l,eD.makeSpan(["msupsub"],[f])],t)},mathmlBuilder:function(e,t){var $,r=!1;e.base&&"horizBrace"===e.base.type&&!!e.sup===e.base.isOver&&(r=!0,$=e.base.isOver),e.base&&("op"===e.base.type||"operatorname"===e.base.type)&&(e.base.parentIsSupSub=!0);var _,n=[tm(e.base,t)];if(e.sub&&n.push(tm(e.sub,t)),e.sup&&n.push(tm(e.sup,t)),r)_=$?"mover":"munder";else if(e.sub){if(e.sup){var a=e.base;_=a&&"op"===a.type&&a.limits&&t.style===b.DISPLAY||a&&"operatorname"===a.type&&a.alwaysHandleSupSub&&(t.style===b.DISPLAY||a.limits)?"munderover":"msubsup"}else{var i=e.base;_=i&&"op"===i.type&&i.limits&&(t.style===b.DISPLAY||i.alwaysHandleSupSub)||i&&"operatorname"===i.type&&i.alwaysHandleSupSub&&(i.limits||t.style===b.DISPLAY)?"munder":"msub"}}else{var o=e.base;_=o&&"op"===o.type&&o.limits&&(t.style===b.DISPLAY||o.alwaysHandleSupSub)||o&&"operatorname"===o.type&&o.alwaysHandleSupSub&&(o.limits||t.style===b.DISPLAY)?"mover":"msup"}return new t4.MathNode(_,n)}}),e8({type:"atom",htmlBuilder:function(e,t){return eD.mathsym(e.text,e.mode,t,["m"+e.family])},mathmlBuilder:function(e,t){var $=new t4.MathNode("mo",[t5(e.text,e.mode)]);if("bin"===e.family){var r=t6(e,t);"bold-italic"===r&&$.setAttribute("mathvariant",r)}else"punct"===e.family?$.setAttribute("separator","true"):"open"!==e.family&&"close"!==e.family||$.setAttribute("stretchy","false");return $}});var $V={mi:"italic",mn:"normal",mtext:"normal"};e8({type:"mathord",htmlBuilder:function(e,t){return eD.makeOrd(e,t,"mathord")},mathmlBuilder:function(e,t){var $=new t4.MathNode("mi",[t5(e.text,e.mode,t)]),r=t6(e,t)||"italic";return r!==$V[$.type]&&$.setAttribute("mathvariant",r),$}}),e8({type:"textord",htmlBuilder:function(e,t){return eD.makeOrd(e,t,"textord")},mathmlBuilder:function(e,t){var $,r=t5(e.text,e.mode,t),_=t6(e,t)||"normal";return $="text"===e.mode?new t4.MathNode("mtext",[r]):/[0-9]/.test(e.text)?new t4.MathNode("mn",[r]):"\\prime"===e.text?new t4.MathNode("mo",[r]):new t4.MathNode("mi",[r]),_!==$V[$.type]&&$.setAttribute("mathvariant",_),$}});var $F={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},$G={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};e8({type:"spacing",htmlBuilder:function(e,t){if($G.hasOwnProperty(e.text)){var $=$G[e.text].className||"";if("text"===e.mode){var _=eD.makeOrd(e,t,"textord");return _.classes.push($),_}return eD.makeSpan(["mspace",$],[eD.mathsym(e.text,e.mode,t)],t)}if($F.hasOwnProperty(e.text))return eD.makeSpan(["mspace",$F[e.text]],[],t);throw new r('Unknown type of space "'+e.text+'"')},mathmlBuilder:function(e,t){if(!$G.hasOwnProperty(e.text)){if($F.hasOwnProperty(e.text))return new t4.MathNode("mspace");throw new r('Unknown type of space "'+e.text+'"')}return new t4.MathNode("mtext",[new t4.TextNode("\xa0")])}});var $U=function(){var e=new t4.MathNode("mtd",[]);return e.setAttribute("width","50%"),e};e8({type:"tag",mathmlBuilder:function(e,t){var $=new t4.MathNode("mtable",[new t4.MathNode("mtr",[$U(),new t4.MathNode("mtd",[t0(e.body,t)]),$U(),new t4.MathNode("mtd",[t0(e.tag,t)])])]);return $.setAttribute("width","100%"),$}});var $X={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},$Y={"\\textbf":"textbf","\\textmd":"textmd"},$W={"\\textit":"textit","\\textup":"textup"},$8=function(e,t){var $=e.font;return $?$X[$]?t.withTextFontFamily($X[$]):$Y[$]?t.withTextFontWeight($Y[$]):t.withTextFontShape($W[$]):t};eW({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler:function(e,t){var $=e.parser,r=e.funcName,_=t[0];return{type:"text",mode:$.mode,body:ej(_),font:r}},htmlBuilder:function(e,t){var $=$8(e,t),r=tt(e.body,$,!0);return eD.makeSpan(["mord","text"],r,$)},mathmlBuilder:function(e,t){var $=$8(e,t);return t0(e.body,$)}}),eW({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler:function(e,t){return{type:"underline",mode:e.parser.mode,body:t[0]}},htmlBuilder:function(e,t){var $=ti(e.body,t),r=eD.makeLineSpan("underline-line",t),_=t.fontMetrics().defaultRuleThickness,n=eD.makeVList({positionType:"top",positionData:$.height,children:[{type:"kern",size:_},{type:"elem",elem:r},{type:"kern",size:3*_},{type:"elem",elem:$}]},t);return eD.makeSpan(["mord","underline"],[n],t)},mathmlBuilder:function(e,t){var $=new t4.MathNode("mo",[new t4.TextNode("‾")]);$.setAttribute("stretchy","true");var r=new t4.MathNode("munder",[tm(e.body,t),$]);return r.setAttribute("accentunder","true"),r}}),eW({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler:function(e,t){return{type:"vcenter",mode:e.parser.mode,body:t[0]}},htmlBuilder:function(e,t){var $=ti(e.body,t),r=t.fontMetrics().axisHeight,_=.5*($.height-r-($.depth+r));return eD.makeVList({positionType:"shift",positionData:_,children:[{type:"elem",elem:$}]},t)},mathmlBuilder:function(e,t){return new t4.MathNode("mpadded",[tm(e.body,t)],["vcenter"])}}),eW({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler:function(e,t,$){throw new r("\\verb ended by end of line instead of matching delimiter")},htmlBuilder:function(e,t){for(var $=re(e),r=[],_=t.havingStyle(t.style.text()),n=0;n<$.length;n++){var a=$[n];"~"===a&&(a="\\textasciitilde"),r.push(eD.makeSymbol(a,"Typewriter-Regular",e.mode,_,["mord","texttt"]))}return eD.makeSpan(["mord","text"].concat(_.sizingClasses(t)),eD.tryCombineChars(r),_)},mathmlBuilder:function(e,t){var $=new t4.TextNode(re(e)),r=new t4.MathNode("mtext",[$]);return r.setAttribute("mathvariant","monospace"),r}});var $9,$j,$Z,$K,$J,$Q,re=function(e){return e.body.replace(/ /g,e.star?"␣":"\xa0")},rt=eU,r$=RegExp("[̀-ͯ]+$"),rr=function(){function e(e,t){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=t,this.tokenRegex=RegExp("([ \r\n ]+)|\\\\(\n|[ \r ]+\n?)[ \r ]*|([!-\\[\\]-‧‪-퟿豈-￿][̀-ͯ]*|[\ud800-\udbff][\udc00-\udfff][̀-ͯ]*|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5|(\\\\[a-zA-Z@]+)[ \r\n ]*|\\\\[^\ud800-\udfff])","g"),this.catcodes={"%":14,"~":13}}var t=e.prototype;return t.setCatcode=function(e,t){this.catcodes[e]=t},t.lex=function(){var e=this.input,t=this.tokenRegex.lastIndex;if(t===e.length)return new $h("EOF",new $6(this,t,t));var $=this.tokenRegex.exec(e);if(null===$||$.index!==t)throw new r("Unexpected character: '"+e[t]+"'",new $h(e[t],new $6(this,t,t+1)));var _=$[6]||$[3]||($[2]?"\\ ":" ");if(14===this.catcodes[_]){var n=e.indexOf("\n",this.tokenRegex.lastIndex);return -1===n?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=n+1,this.lex()}return new $h(_,new $6(this,t,this.tokenRegex.lastIndex))},e}(),r_=function(){function e(e,t){void 0===e&&(e={}),void 0===t&&(t={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=t,this.builtins=e,this.undefStack=[]}var t=e.prototype;return t.beginGroup=function(){this.undefStack.push({})},t.endGroup=function(){if(0===this.undefStack.length)throw new r("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e=this.undefStack.pop();for(var t in e)e.hasOwnProperty(t)&&(null==e[t]?delete this.current[t]:this.current[t]=e[t])},t.endGroups=function(){for(;this.undefStack.length>0;)this.endGroup()},t.has=function(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)},t.get=function(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]},t.set=function(e,t,$){if(void 0===$&&($=!1),$){for(var r=0;r0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{var _=this.undefStack[this.undefStack.length-1];_&&!_.hasOwnProperty(e)&&(_[e]=this.current[e])}null==t?delete this.current[e]:this.current[e]=t},e}(),rn=$5;$9=function(e){var t=e.popToken();return e.isExpandable(t.text)&&(t.noexpand=!0,t.treatAsRelax=!0),{tokens:[t],numArgs:0}},$5["\\noexpand"]=$9,$j=function(e){var t=e.popToken();return e.expandOnce(!0),{tokens:[t],numArgs:0}},$5["\\expandafter"]=$j,$Z=function(e){return{tokens:e.consumeArgs(2)[0],numArgs:0}},$5["\\@firstoftwo"]=$Z,$K=function(e){return{tokens:e.consumeArgs(2)[1],numArgs:0}},$5["\\@secondoftwo"]=$K,$J=function(e){var t=e.consumeArgs(3);e.consumeSpaces();var $=e.future();return 1===t[0].length&&t[0][0].text===$.text?{tokens:t[1],numArgs:0}:{tokens:t[2],numArgs:0}},$5["\\@ifnextchar"]=$J,$5["\\@ifstar"]="\\@ifnextchar *{\\@firstoftwo{#1}}",$Q=function(e){var t=e.consumeArgs(2);return"text"===e.mode?{tokens:t[0],numArgs:0}:{tokens:t[1],numArgs:0}},$5["\\TextOrMath"]=$Q;var ra,ri={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};ra=function(e){var t,$,_=e.popToken(),n="";if("'"===_.text)$=8,_=e.popToken();else if('"'===_.text)$=16,_=e.popToken();else if("`"===_.text){if("\\"===(_=e.popToken()).text[0])n=_.text.charCodeAt(1);else{if("EOF"===_.text)throw new r("\\char` missing argument");n=_.text.charCodeAt(0)}}else $=10;if($){if(null==(n=ri[_.text])||n>=$)throw new r("Invalid base-"+$+" digit "+_.text);for(;null!=(t=ri[e.future().text])&&t<$;)n*=$,n+=t,e.popToken()}return"\\@char{"+n+"}"},$5["\\char"]=ra;var r2,ro,rs,rl,r3,r4,r5=function(e,t,$){var _=e.consumeArg().tokens;if(1!==_.length)throw new r("\\newcommand's first argument must be a macro name");var n=_[0].text,a=e.isDefined(n);if(a&&!t)throw new r("\\newcommand{"+n+"} attempting to redefine "+n+"; use \\renewcommand");if(!a&&!$)throw new r("\\renewcommand{"+n+"} when command "+n+" does not yet exist; use \\newcommand");var i=0;if(1===(_=e.consumeArg().tokens).length&&"["===_[0].text){for(var o="",s=e.expandNextToken();"]"!==s.text&&"EOF"!==s.text;)o+=s.text,s=e.expandNextToken();if(!o.match(/^\s*[0-9]+\s*$/))throw new r("Invalid number of arguments: "+o);i=parseInt(o),_=e.consumeArg().tokens}return e.macros.set(n,{tokens:_,numArgs:i}),""};r2=function(e){return r5(e,!1,!0)},$5["\\newcommand"]=r2,ro=function(e){return r5(e,!0,!1)},$5["\\renewcommand"]=ro,rs=function(e){return r5(e,!0,!0)},$5["\\providecommand"]=rs,rl=function(e){var t=e.consumeArgs(1)[0];return console.log(t.reverse().map(function(e){return e.text}).join("")),""},$5["\\message"]=rl,r3=function(e){var t=e.consumeArgs(1)[0];return console.error(t.reverse().map(function(e){return e.text}).join("")),""},$5["\\errmessage"]=r3,r4=function(e){var t=e.popToken(),$=t.text;return console.log(t,e.macros.get($),rt[$],er.math[$],er.text[$]),""},$5["\\show"]=r4,$5["\\bgroup"]="{",$5["\\egroup"]="}",$5["~"]="\\nobreakspace",$5["\\lq"]="`",$5["\\rq"]="'",$5["\\aa"]="\\r a",$5["\\AA"]="\\r A",$5["\\textcopyright"]="\\html@mathml{\\textcircled{c}}{\\char`\xa9}",$5["\\copyright"]="\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}",$5["\\textregistered"]="\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xae}",$5["ℬ"]="\\mathscr{B}",$5["ℰ"]="\\mathscr{E}",$5["ℱ"]="\\mathscr{F}",$5["ℋ"]="\\mathscr{H}",$5["ℐ"]="\\mathscr{I}",$5["ℒ"]="\\mathscr{L}",$5["ℳ"]="\\mathscr{M}",$5["ℛ"]="\\mathscr{R}",$5["ℭ"]="\\mathfrak{C}",$5["ℌ"]="\\mathfrak{H}",$5["ℨ"]="\\mathfrak{Z}",$5["\\Bbbk"]="\\Bbb{k}",$5["\xb7"]="\\cdotp",$5["\\llap"]="\\mathllap{\\textrm{#1}}",$5["\\rlap"]="\\mathrlap{\\textrm{#1}}",$5["\\clap"]="\\mathclap{\\textrm{#1}}",$5["\\mathstrut"]="\\vphantom{(}",$5["\\underbar"]="\\underline{\\text{#1}}",$5["\\not"]='\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}',$5["\\neq"]="\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`≠}}",$5["\\ne"]="\\neq",$5["≠"]="\\neq",$5["\\notin"]="\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`∉}}",$5["∉"]="\\notin",$5["≘"]="\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`≘}}",$5["≙"]="\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`≘}}",$5["≚"]="\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`≚}}",$5["≛"]="\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`≛}}",$5["≝"]="\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`≝}}",$5["≞"]="\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`≞}}",$5["≟"]="\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`≟}}",$5["⟂"]="\\perp",$5["‼"]="\\mathclose{!\\mkern-0.8mu!}",$5["∌"]="\\notni",$5["⌜"]="\\ulcorner",$5["⌝"]="\\urcorner",$5["⌞"]="\\llcorner",$5["⌟"]="\\lrcorner",$5["\xa9"]="\\copyright",$5["\xae"]="\\textregistered",$5["️"]="\\textregistered",$5["\\ulcorner"]='\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}',$5["\\urcorner"]='\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}',$5["\\llcorner"]='\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}',$5["\\lrcorner"]='\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}',$5["\\vdots"]="\\mathord{\\varvdots\\rule{0pt}{15pt}}",$5["⋮"]="\\vdots",$5["\\varGamma"]="\\mathit{\\Gamma}",$5["\\varDelta"]="\\mathit{\\Delta}",$5["\\varTheta"]="\\mathit{\\Theta}",$5["\\varLambda"]="\\mathit{\\Lambda}",$5["\\varXi"]="\\mathit{\\Xi}",$5["\\varPi"]="\\mathit{\\Pi}",$5["\\varSigma"]="\\mathit{\\Sigma}",$5["\\varUpsilon"]="\\mathit{\\Upsilon}",$5["\\varPhi"]="\\mathit{\\Phi}",$5["\\varPsi"]="\\mathit{\\Psi}",$5["\\varOmega"]="\\mathit{\\Omega}",$5["\\substack"]="\\begin{subarray}{c}#1\\end{subarray}",$5["\\colon"]="\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax",$5["\\boxed"]="\\fbox{$\\displaystyle{#1}$}",$5["\\iff"]="\\DOTSB\\;\\Longleftrightarrow\\;",$5["\\implies"]="\\DOTSB\\;\\Longrightarrow\\;",$5["\\impliedby"]="\\DOTSB\\;\\Longleftarrow\\;";var r1,r6={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};r1=function(e){var t="\\dotso",$=e.expandAfterFuture().text;return $ in r6?t=r6[$]:("\\not"===$.slice(0,4)||$ in er.math&&o.contains(["bin","rel"],er.math[$].group))&&(t="\\dotsb"),t},$5["\\dots"]=r1;var rh,r0,rm,rc,ru={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};rh=function(e){return e.future().text in ru?"\\ldots\\,":"\\ldots"},$5["\\dotso"]=rh,r0=function(e){var t=e.future().text;return t in ru&&","!==t?"\\ldots\\,":"\\ldots"},$5["\\dotsc"]=r0,rm=function(e){return e.future().text in ru?"\\@cdots\\,":"\\@cdots"},$5["\\cdots"]=rm,$5["\\dotsb"]="\\cdots",$5["\\dotsm"]="\\cdots",$5["\\dotsi"]="\\!\\cdots",$5["\\dotsx"]="\\ldots\\,",$5["\\DOTSI"]="\\relax",$5["\\DOTSB"]="\\relax",$5["\\DOTSX"]="\\relax",$5["\\tmspace"]="\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax",$5["\\,"]="\\tmspace+{3mu}{.1667em}",$5["\\thinspace"]="\\,",$5["\\>"]="\\mskip{4mu}",$5["\\:"]="\\tmspace+{4mu}{.2222em}",$5["\\medspace"]="\\:",$5["\\;"]="\\tmspace+{5mu}{.2777em}",$5["\\thickspace"]="\\;",$5["\\!"]="\\tmspace-{3mu}{.1667em}",$5["\\negthinspace"]="\\!",$5["\\negmedspace"]="\\tmspace-{4mu}{.2222em}",$5["\\negthickspace"]="\\tmspace-{5mu}{.277em}",$5["\\enspace"]="\\kern.5em ",$5["\\enskip"]="\\hskip.5em\\relax",$5["\\quad"]="\\hskip1em\\relax",$5["\\qquad"]="\\hskip2em\\relax",$5["\\tag"]="\\@ifstar\\tag@literal\\tag@paren",$5["\\tag@paren"]="\\tag@literal{({#1})}",rc=function(e){if(e.macros.get("\\df@tag"))throw new r("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"},$5["\\tag@literal"]=rc,$5["\\bmod"]="\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}",$5["\\pod"]="\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)",$5["\\pmod"]="\\pod{{\\rm mod}\\mkern6mu#1}",$5["\\mod"]="\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1",$5["\\newline"]="\\\\\\relax",$5["\\TeX"]="\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}";var r7,rp,rd=E(z["Main-Regular"][84][1]-.7*z["Main-Regular"][65][1]);r7="\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+rd+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}",$5["\\LaTeX"]=r7,rp="\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+rd+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}",$5["\\KaTeX"]=rp,$5["\\hspace"]="\\@ifstar\\@hspacer\\@hspace",$5["\\@hspace"]="\\hskip #1\\relax",$5["\\@hspacer"]="\\rule{0pt}{0pt}\\hskip #1\\relax",$5["\\ordinarycolon"]=":",$5["\\vcentcolon"]="\\mathrel{\\mathop\\ordinarycolon}",$5["\\dblcolon"]='\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}',$5["\\coloneqq"]='\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}',$5["\\Coloneqq"]='\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}',$5["\\coloneq"]='\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}',$5["\\Coloneq"]='\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}',$5["\\eqqcolon"]='\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}',$5["\\Eqqcolon"]='\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}',$5["\\eqcolon"]='\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}',$5["\\Eqcolon"]='\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}',$5["\\colonapprox"]='\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}',$5["\\Colonapprox"]='\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}',$5["\\colonsim"]='\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}',$5["\\Colonsim"]='\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}',$5["∷"]="\\dblcolon",$5["∹"]="\\eqcolon",$5["≔"]="\\coloneqq",$5["≕"]="\\eqqcolon",$5["⩴"]="\\Coloneqq",$5["\\ratio"]="\\vcentcolon",$5["\\coloncolon"]="\\dblcolon",$5["\\colonequals"]="\\coloneqq",$5["\\coloncolonequals"]="\\Coloneqq",$5["\\equalscolon"]="\\eqqcolon",$5["\\equalscoloncolon"]="\\Eqqcolon",$5["\\colonminus"]="\\coloneq",$5["\\coloncolonminus"]="\\Coloneq",$5["\\minuscolon"]="\\eqcolon",$5["\\minuscoloncolon"]="\\Eqcolon",$5["\\coloncolonapprox"]="\\Colonapprox",$5["\\coloncolonsim"]="\\Colonsim",$5["\\simcolon"]="\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}",$5["\\simcoloncolon"]="\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}",$5["\\approxcolon"]="\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}",$5["\\approxcoloncolon"]="\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}",$5["\\notni"]="\\html@mathml{\\not\\ni}{\\mathrel{\\char`∌}}",$5["\\limsup"]="\\DOTSB\\operatorname*{lim\\,sup}",$5["\\liminf"]="\\DOTSB\\operatorname*{lim\\,inf}",$5["\\injlim"]="\\DOTSB\\operatorname*{inj\\,lim}",$5["\\projlim"]="\\DOTSB\\operatorname*{proj\\,lim}",$5["\\varlimsup"]="\\DOTSB\\operatorname*{\\overline{lim}}",$5["\\varliminf"]="\\DOTSB\\operatorname*{\\underline{lim}}",$5["\\varinjlim"]="\\DOTSB\\operatorname*{\\underrightarrow{lim}}",$5["\\varprojlim"]="\\DOTSB\\operatorname*{\\underleftarrow{lim}}",$5["\\gvertneqq"]="\\html@mathml{\\@gvertneqq}{≩}",$5["\\lvertneqq"]="\\html@mathml{\\@lvertneqq}{≨}",$5["\\ngeqq"]="\\html@mathml{\\@ngeqq}{≱}",$5["\\ngeqslant"]="\\html@mathml{\\@ngeqslant}{≱}",$5["\\nleqq"]="\\html@mathml{\\@nleqq}{≰}",$5["\\nleqslant"]="\\html@mathml{\\@nleqslant}{≰}",$5["\\nshortmid"]="\\html@mathml{\\@nshortmid}{∤}",$5["\\nshortparallel"]="\\html@mathml{\\@nshortparallel}{∦}",$5["\\nsubseteqq"]="\\html@mathml{\\@nsubseteqq}{⊈}",$5["\\nsupseteqq"]="\\html@mathml{\\@nsupseteqq}{⊉}",$5["\\varsubsetneq"]="\\html@mathml{\\@varsubsetneq}{⊊}",$5["\\varsubsetneqq"]="\\html@mathml{\\@varsubsetneqq}{⫋}",$5["\\varsupsetneq"]="\\html@mathml{\\@varsupsetneq}{⊋}",$5["\\varsupsetneqq"]="\\html@mathml{\\@varsupsetneqq}{⫌}",$5["\\imath"]="\\html@mathml{\\@imath}{ı}",$5["\\jmath"]="\\html@mathml{\\@jmath}{ȷ}",$5["\\llbracket"]="\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`⟦}}",$5["\\rrbracket"]="\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`⟧}}",$5["⟦"]="\\llbracket",$5["⟧"]="\\rrbracket",$5["\\lBrace"]="\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`⦃}}",$5["\\rBrace"]="\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`⦄}}",$5["⦃"]="\\lBrace",$5["⦄"]="\\rBrace",$5["\\minuso"]="\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`⦵}}",$5["⦵"]="\\minuso",$5["\\darr"]="\\downarrow",$5["\\dArr"]="\\Downarrow",$5["\\Darr"]="\\Downarrow",$5["\\lang"]="\\langle",$5["\\rang"]="\\rangle",$5["\\uarr"]="\\uparrow",$5["\\uArr"]="\\Uparrow",$5["\\Uarr"]="\\Uparrow",$5["\\N"]="\\mathbb{N}",$5["\\R"]="\\mathbb{R}",$5["\\Z"]="\\mathbb{Z}",$5["\\alef"]="\\aleph",$5["\\alefsym"]="\\aleph",$5["\\Alpha"]="\\mathrm{A}",$5["\\Beta"]="\\mathrm{B}",$5["\\bull"]="\\bullet",$5["\\Chi"]="\\mathrm{X}",$5["\\clubs"]="\\clubsuit",$5["\\cnums"]="\\mathbb{C}",$5["\\Complex"]="\\mathbb{C}",$5["\\Dagger"]="\\ddagger",$5["\\diamonds"]="\\diamondsuit",$5["\\empty"]="\\emptyset",$5["\\Epsilon"]="\\mathrm{E}",$5["\\Eta"]="\\mathrm{H}",$5["\\exist"]="\\exists",$5["\\harr"]="\\leftrightarrow",$5["\\hArr"]="\\Leftrightarrow",$5["\\Harr"]="\\Leftrightarrow",$5["\\hearts"]="\\heartsuit",$5["\\image"]="\\Im",$5["\\infin"]="\\infty",$5["\\Iota"]="\\mathrm{I}",$5["\\isin"]="\\in",$5["\\Kappa"]="\\mathrm{K}",$5["\\larr"]="\\leftarrow",$5["\\lArr"]="\\Leftarrow",$5["\\Larr"]="\\Leftarrow",$5["\\lrarr"]="\\leftrightarrow",$5["\\lrArr"]="\\Leftrightarrow",$5["\\Lrarr"]="\\Leftrightarrow",$5["\\Mu"]="\\mathrm{M}",$5["\\natnums"]="\\mathbb{N}",$5["\\Nu"]="\\mathrm{N}",$5["\\Omicron"]="\\mathrm{O}",$5["\\plusmn"]="\\pm",$5["\\rarr"]="\\rightarrow",$5["\\rArr"]="\\Rightarrow",$5["\\Rarr"]="\\Rightarrow",$5["\\real"]="\\Re",$5["\\reals"]="\\mathbb{R}",$5["\\Reals"]="\\mathbb{R}",$5["\\Rho"]="\\mathrm{P}",$5["\\sdot"]="\\cdot",$5["\\sect"]="\\S",$5["\\spades"]="\\spadesuit",$5["\\sub"]="\\subset",$5["\\sube"]="\\subseteq",$5["\\supe"]="\\supseteq",$5["\\Tau"]="\\mathrm{T}",$5["\\thetasym"]="\\vartheta",$5["\\weierp"]="\\wp",$5["\\Zeta"]="\\mathrm{Z}",$5["\\argmin"]="\\DOTSB\\operatorname*{arg\\,min}",$5["\\argmax"]="\\DOTSB\\operatorname*{arg\\,max}",$5["\\plim"]="\\DOTSB\\mathop{\\operatorname{plim}}\\limits",$5["\\bra"]="\\mathinner{\\langle{#1}|}",$5["\\ket"]="\\mathinner{|{#1}\\rangle}",$5["\\braket"]="\\mathinner{\\langle{#1}\\rangle}",$5["\\Bra"]="\\left\\langle#1\\right|",$5["\\Ket"]="\\left|#1\\right\\rangle";var rf,rg,rv=function(e){return function(t){var $=t.consumeArg().tokens,r=t.consumeArg().tokens,_=t.consumeArg().tokens,n=t.consumeArg().tokens,a=t.macros.get("|"),i=t.macros.get("\\|");t.macros.beginGroup();var o=function(t){return function($){e&&($.macros.set("|",a),_.length&&$.macros.set("\\|",i));var n=t;return!t&&_.length&&"|"===$.future().text&&($.popToken(),n=!0),{tokens:n?_:r,numArgs:0}}};t.macros.set("|",o(!1)),_.length&&t.macros.set("\\|",o(!0));var s=t.consumeArg().tokens,l=t.expandTokens([].concat(n,s,$));return t.macros.endGroup(),{tokens:l.reverse(),numArgs:0}}};rf=rv(!1),$5["\\bra@ket"]=rf,rg=rv(!0),$5["\\bra@set"]=rg,$5["\\Braket"]="\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}",$5["\\Set"]="\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}",$5["\\set"]="\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}",$5["\\angln"]="{\\angl n}",$5["\\blue"]="\\textcolor{##6495ed}{#1}",$5["\\orange"]="\\textcolor{##ffa500}{#1}",$5["\\pink"]="\\textcolor{##ff00af}{#1}",$5["\\red"]="\\textcolor{##df0030}{#1}",$5["\\green"]="\\textcolor{##28ae7b}{#1}",$5["\\gray"]="\\textcolor{gray}{#1}",$5["\\purple"]="\\textcolor{##9d38bd}{#1}",$5["\\blueA"]="\\textcolor{##ccfaff}{#1}",$5["\\blueB"]="\\textcolor{##80f6ff}{#1}",$5["\\blueC"]="\\textcolor{##63d9ea}{#1}",$5["\\blueD"]="\\textcolor{##11accd}{#1}",$5["\\blueE"]="\\textcolor{##0c7f99}{#1}",$5["\\tealA"]="\\textcolor{##94fff5}{#1}",$5["\\tealB"]="\\textcolor{##26edd5}{#1}",$5["\\tealC"]="\\textcolor{##01d1c1}{#1}",$5["\\tealD"]="\\textcolor{##01a995}{#1}",$5["\\tealE"]="\\textcolor{##208170}{#1}",$5["\\greenA"]="\\textcolor{##b6ffb0}{#1}",$5["\\greenB"]="\\textcolor{##8af281}{#1}",$5["\\greenC"]="\\textcolor{##74cf70}{#1}",$5["\\greenD"]="\\textcolor{##1fab54}{#1}",$5["\\greenE"]="\\textcolor{##0d923f}{#1}",$5["\\goldA"]="\\textcolor{##ffd0a9}{#1}",$5["\\goldB"]="\\textcolor{##ffbb71}{#1}",$5["\\goldC"]="\\textcolor{##ff9c39}{#1}",$5["\\goldD"]="\\textcolor{##e07d10}{#1}",$5["\\goldE"]="\\textcolor{##a75a05}{#1}",$5["\\redA"]="\\textcolor{##fca9a9}{#1}",$5["\\redB"]="\\textcolor{##ff8482}{#1}",$5["\\redC"]="\\textcolor{##f9685d}{#1}",$5["\\redD"]="\\textcolor{##e84d39}{#1}",$5["\\redE"]="\\textcolor{##bc2612}{#1}",$5["\\maroonA"]="\\textcolor{##ffbde0}{#1}",$5["\\maroonB"]="\\textcolor{##ff92c6}{#1}",$5["\\maroonC"]="\\textcolor{##ed5fa6}{#1}",$5["\\maroonD"]="\\textcolor{##ca337c}{#1}",$5["\\maroonE"]="\\textcolor{##9e034e}{#1}",$5["\\purpleA"]="\\textcolor{##ddd7ff}{#1}",$5["\\purpleB"]="\\textcolor{##c6b9fc}{#1}",$5["\\purpleC"]="\\textcolor{##aa87ff}{#1}",$5["\\purpleD"]="\\textcolor{##7854ab}{#1}",$5["\\purpleE"]="\\textcolor{##543b78}{#1}",$5["\\mintA"]="\\textcolor{##f5f9e8}{#1}",$5["\\mintB"]="\\textcolor{##edf2df}{#1}",$5["\\mintC"]="\\textcolor{##e0e5cc}{#1}",$5["\\grayA"]="\\textcolor{##f6f7f7}{#1}",$5["\\grayB"]="\\textcolor{##f0f1f2}{#1}",$5["\\grayC"]="\\textcolor{##e3e5e6}{#1}",$5["\\grayD"]="\\textcolor{##d6d8da}{#1}",$5["\\grayE"]="\\textcolor{##babec2}{#1}",$5["\\grayF"]="\\textcolor{##888d93}{#1}",$5["\\grayG"]="\\textcolor{##626569}{#1}",$5["\\grayH"]="\\textcolor{##3b3e40}{#1}",$5["\\grayI"]="\\textcolor{##21242c}{#1}",$5["\\kaBlue"]="\\textcolor{##314453}{#1}",$5["\\kaGreen"]="\\textcolor{##71B307}{#1}";var rb={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0},ry=function(){function e(e,t,$){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new r_(rn,t.macros),this.mode=$,this.stack=[]}var t=e.prototype;return t.feed=function(e){this.lexer=new rr(e,this.settings)},t.switchMode=function(e){this.mode=e},t.beginGroup=function(){this.macros.beginGroup()},t.endGroup=function(){this.macros.endGroup()},t.endGroups=function(){this.macros.endGroups()},t.future=function(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]},t.popToken=function(){return this.future(),this.stack.pop()},t.pushToken=function(e){this.stack.push(e)},t.pushTokens=function(e){var t;(t=this.stack).push.apply(t,e)},t.scanArgument=function(e){var t,$,r;if(e){if(this.consumeSpaces(),"["!==this.future().text)return null;t=this.popToken();var _=this.consumeArg(["]"]);r=_.tokens,$=_.end}else{var n=this.consumeArg();r=n.tokens,t=n.start,$=n.end}return this.pushToken(new $h("EOF",$.loc)),this.pushTokens(r),t.range($,"")},t.consumeSpaces=function(){for(;" "===this.future().text;)this.stack.pop()},t.consumeArg=function(e){var t=[],$=e&&e.length>0;$||this.consumeSpaces();var _,n=this.future(),a=0,i=0;do{if(_=this.popToken(),t.push(_),"{"===_.text)++a;else if("}"===_.text){if(-1==--a)throw new r("Extra }",_)}else if("EOF"===_.text)throw new r("Unexpected end of input in a macro argument, expected '"+(e&&$?e[i]:"}")+"'",_);if(e&&$){if((0===a||1===a&&"{"===e[i])&&_.text===e[i]){if(++i===e.length){t.splice(-i,i);break}}else i=0}}while(0!==a||$);return"{"===n.text&&"}"===t[t.length-1].text&&(t.pop(),t.shift()),t.reverse(),{tokens:t,start:n,end:_}},t.consumeArgs=function(e,t){if(t){if(t.length!==e+1)throw new r("The length of delimiters doesn't match the number of args!");for(var $=t[0],_=0;_<$.length;_++){var n=this.popToken();if($[_]!==n.text)throw new r("Use of the macro doesn't match its definition",n)}}for(var a=[],i=0;ithis.settings.maxExpand)throw new r("Too many expansions: infinite loop or need to increase maxExpand setting");var n=_.tokens,a=this.consumeArgs(_.numArgs,_.delimiters);if(_.numArgs)for(var i=(n=n.slice()).length-1;i>=0;--i){var o,s=n[i];if("#"===s.text){if(0===i)throw new r("Incomplete placeholder at end of macro body",s);if("#"===(s=n[--i]).text)n.splice(i+1,1);else{if(!/^[1-9]$/.test(s.text))throw new r("Not a valid argument number",s);(o=n).splice.apply(o,[i,2].concat(a[+s.text-1]))}}}return this.pushTokens(n),n},t.expandAfterFuture=function(){return this.expandOnce(),this.future()},t.expandNextToken=function(){for(;;){var e=this.expandOnce();if(e instanceof $h)return e.treatAsRelax&&(e.text="\\relax"),this.stack.pop()}throw Error()},t.expandMacro=function(e){return this.macros.has(e)?this.expandTokens([new $h(e)]):void 0},t.expandTokens=function(e){var t=[],$=this.stack.length;for(this.pushTokens(e);this.stack.length>$;){var r=this.expandOnce(!0);r instanceof $h&&(r.treatAsRelax&&(r.noexpand=!1,r.treatAsRelax=!1),t.push(this.stack.pop()))}return t},t.expandMacroAsText=function(e){var t=this.expandMacro(e);return t?t.map(function(e){return e.text}).join(""):t},t._getExpansion=function(e){var t=this.macros.get(e);if(null==t)return t;if(1===e.length){var $=this.lexer.catcodes[e];if(null!=$&&13!==$)return}var r="function"==typeof t?t(this):t;if("string"==typeof r){var _=0;if(-1!==r.indexOf("#"))for(var n=r.replace(/##/g,"");-1!==n.indexOf("#"+(_+1));)++_;for(var a=new rr(r,this.settings),i=[],o=a.lex();"EOF"!==o.text;)i.push(o),o=a.lex();return i.reverse(),{tokens:i,numArgs:_}}return r},t.isDefined=function(e){return this.macros.has(e)||rt.hasOwnProperty(e)||er.math.hasOwnProperty(e)||er.text.hasOwnProperty(e)||rb.hasOwnProperty(e)},t.isExpandable=function(e){var t=this.macros.get(e);return null!=t?"string"==typeof t||"function"==typeof t||!t.unexpandable:rt.hasOwnProperty(e)&&!rt[e].primitive},e}(),rx=/^[\u208a\u208b\u208c\u208d\u208e\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2090\u2091\u2095\u1d62\u2c7c\u2096\u2097\u2098\u2099\u2092\u209a\u1d63\u209b\u209c\u1d64\u1d65\u2093\u1d66\u1d67\u1d68\u1d69\u1d6a]/,rw=Object.freeze({"₊":"+","₋":"-","₌":"=","₍":"(","₎":")","₀":"0","₁":"1","₂":"2","₃":"3","₄":"4","₅":"5","₆":"6","₇":"7","₈":"8","₉":"9",ₐ:"a",ₑ:"e",ₕ:"h",ᵢ:"i",ⱼ:"j",ₖ:"k",ₗ:"l",ₘ:"m",ₙ:"n",ₒ:"o",ₚ:"p",ᵣ:"r",ₛ:"s",ₜ:"t",ᵤ:"u",ᵥ:"v",ₓ:"x",ᵦ:"β",ᵧ:"γ",ᵨ:"ρ",ᵩ:"ϕ",ᵪ:"χ","⁺":"+","⁻":"-","⁼":"=","⁽":"(","⁾":")","⁰":"0","\xb9":"1","\xb2":"2","\xb3":"3","⁴":"4","⁵":"5","⁶":"6","⁷":"7","⁸":"8","⁹":"9",ᴬ:"A",ᴮ:"B",ᴰ:"D",ᴱ:"E",ᴳ:"G",ᴴ:"H",ᴵ:"I",ᴶ:"J",ᴷ:"K",ᴸ:"L",ᴹ:"M",ᴺ:"N",ᴼ:"O",ᴾ:"P",ᴿ:"R",ᵀ:"T",ᵁ:"U",ⱽ:"V",ᵂ:"W",ᵃ:"a",ᵇ:"b",ᶜ:"c",ᵈ:"d",ᵉ:"e",ᶠ:"f",ᵍ:"g",ʰ:"h",ⁱ:"i",ʲ:"j",ᵏ:"k",ˡ:"l",ᵐ:"m",ⁿ:"n",ᵒ:"o",ᵖ:"p",ʳ:"r",ˢ:"s",ᵗ:"t",ᵘ:"u",ᵛ:"v",ʷ:"w",ˣ:"x",ʸ:"y",ᶻ:"z",ᵝ:"β",ᵞ:"γ",ᵟ:"δ",ᵠ:"ϕ",ᵡ:"χ",ᶿ:"θ"}),rk={"́":{text:"\\'",math:"\\acute"},"̀":{text:"\\`",math:"\\grave"},"̈":{text:'\\"',math:"\\ddot"},"̃":{text:"\\~",math:"\\tilde"},"̄":{text:"\\=",math:"\\bar"},"̆":{text:"\\u",math:"\\breve"},"̌":{text:"\\v",math:"\\check"},"̂":{text:"\\^",math:"\\hat"},"̇":{text:"\\.",math:"\\dot"},"̊":{text:"\\r",math:"\\mathring"},"̋":{text:"\\H"},"̧":{text:"\\c"}},rS={á:"\xe1",à:"\xe0",ä:"\xe4",ǟ:"ǟ",ã:"\xe3",ā:"ā",ă:"ă",ắ:"ắ",ằ:"ằ",ẵ:"ẵ",ǎ:"ǎ",â:"\xe2",ấ:"ấ",ầ:"ầ",ẫ:"ẫ",ȧ:"ȧ",ǡ:"ǡ",å:"\xe5",ǻ:"ǻ",ḃ:"ḃ",ć:"ć",ḉ:"ḉ",č:"č",ĉ:"ĉ",ċ:"ċ",ç:"\xe7",ď:"ď",ḋ:"ḋ",ḑ:"ḑ",é:"\xe9",è:"\xe8",ë:"\xeb",ẽ:"ẽ",ē:"ē",ḗ:"ḗ",ḕ:"ḕ",ĕ:"ĕ",ḝ:"ḝ",ě:"ě",ê:"\xea",ế:"ế",ề:"ề",ễ:"ễ",ė:"ė",ȩ:"ȩ",ḟ:"ḟ",ǵ:"ǵ",ḡ:"ḡ",ğ:"ğ",ǧ:"ǧ",ĝ:"ĝ",ġ:"ġ",ģ:"ģ",ḧ:"ḧ",ȟ:"ȟ",ĥ:"ĥ",ḣ:"ḣ",ḩ:"ḩ",í:"\xed",ì:"\xec",ï:"\xef",ḯ:"ḯ",ĩ:"ĩ",ī:"ī",ĭ:"ĭ",ǐ:"ǐ",î:"\xee",ǰ:"ǰ",ĵ:"ĵ",ḱ:"ḱ",ǩ:"ǩ",ķ:"ķ",ĺ:"ĺ",ľ:"ľ",ļ:"ļ",ḿ:"ḿ",ṁ:"ṁ",ń:"ń",ǹ:"ǹ",ñ:"\xf1",ň:"ň",ṅ:"ṅ",ņ:"ņ",ó:"\xf3",ò:"\xf2",ö:"\xf6",ȫ:"ȫ",õ:"\xf5",ṍ:"ṍ",ṏ:"ṏ",ȭ:"ȭ",ō:"ō",ṓ:"ṓ",ṑ:"ṑ",ŏ:"ŏ",ǒ:"ǒ",ô:"\xf4",ố:"ố",ồ:"ồ",ỗ:"ỗ",ȯ:"ȯ",ȱ:"ȱ",ő:"ő",ṕ:"ṕ",ṗ:"ṗ",ŕ:"ŕ",ř:"ř",ṙ:"ṙ",ŗ:"ŗ",ś:"ś",ṥ:"ṥ",š:"š",ṧ:"ṧ",ŝ:"ŝ",ṡ:"ṡ",ş:"ş",ẗ:"ẗ",ť:"ť",ṫ:"ṫ",ţ:"ţ",ú:"\xfa",ù:"\xf9",ü:"\xfc",ǘ:"ǘ",ǜ:"ǜ",ǖ:"ǖ",ǚ:"ǚ",ũ:"ũ",ṹ:"ṹ",ū:"ū",ṻ:"ṻ",ŭ:"ŭ",ǔ:"ǔ",û:"\xfb",ů:"ů",ű:"ű",ṽ:"ṽ",ẃ:"ẃ",ẁ:"ẁ",ẅ:"ẅ",ŵ:"ŵ",ẇ:"ẇ",ẘ:"ẘ",ẍ:"ẍ",ẋ:"ẋ",ý:"\xfd",ỳ:"ỳ",ÿ:"\xff",ỹ:"ỹ",ȳ:"ȳ",ŷ:"ŷ",ẏ:"ẏ",ẙ:"ẙ",ź:"ź",ž:"ž",ẑ:"ẑ",ż:"ż",Á:"\xc1",À:"\xc0",Ä:"\xc4",Ǟ:"Ǟ",Ã:"\xc3",Ā:"Ā",Ă:"Ă",Ắ:"Ắ",Ằ:"Ằ",Ẵ:"Ẵ",Ǎ:"Ǎ",Â:"\xc2",Ấ:"Ấ",Ầ:"Ầ",Ẫ:"Ẫ",Ȧ:"Ȧ",Ǡ:"Ǡ",Å:"\xc5",Ǻ:"Ǻ",Ḃ:"Ḃ",Ć:"Ć",Ḉ:"Ḉ",Č:"Č",Ĉ:"Ĉ",Ċ:"Ċ",Ç:"\xc7",Ď:"Ď",Ḋ:"Ḋ",Ḑ:"Ḑ",É:"\xc9",È:"\xc8",Ë:"\xcb",Ẽ:"Ẽ",Ē:"Ē",Ḗ:"Ḗ",Ḕ:"Ḕ",Ĕ:"Ĕ",Ḝ:"Ḝ",Ě:"Ě",Ê:"\xca",Ế:"Ế",Ề:"Ề",Ễ:"Ễ",Ė:"Ė",Ȩ:"Ȩ",Ḟ:"Ḟ",Ǵ:"Ǵ",Ḡ:"Ḡ",Ğ:"Ğ",Ǧ:"Ǧ",Ĝ:"Ĝ",Ġ:"Ġ",Ģ:"Ģ",Ḧ:"Ḧ",Ȟ:"Ȟ",Ĥ:"Ĥ",Ḣ:"Ḣ",Ḩ:"Ḩ",Í:"\xcd",Ì:"\xcc",Ï:"\xcf",Ḯ:"Ḯ",Ĩ:"Ĩ",Ī:"Ī",Ĭ:"Ĭ",Ǐ:"Ǐ",Î:"\xce",İ:"İ",Ĵ:"Ĵ",Ḱ:"Ḱ",Ǩ:"Ǩ",Ķ:"Ķ",Ĺ:"Ĺ",Ľ:"Ľ",Ļ:"Ļ",Ḿ:"Ḿ",Ṁ:"Ṁ",Ń:"Ń",Ǹ:"Ǹ",Ñ:"\xd1",Ň:"Ň",Ṅ:"Ṅ",Ņ:"Ņ",Ó:"\xd3",Ò:"\xd2",Ö:"\xd6",Ȫ:"Ȫ",Õ:"\xd5",Ṍ:"Ṍ",Ṏ:"Ṏ",Ȭ:"Ȭ",Ō:"Ō",Ṓ:"Ṓ",Ṑ:"Ṑ",Ŏ:"Ŏ",Ǒ:"Ǒ",Ô:"\xd4",Ố:"Ố",Ồ:"Ồ",Ỗ:"Ỗ",Ȯ:"Ȯ",Ȱ:"Ȱ",Ő:"Ő",Ṕ:"Ṕ",Ṗ:"Ṗ",Ŕ:"Ŕ",Ř:"Ř",Ṙ:"Ṙ",Ŗ:"Ŗ",Ś:"Ś",Ṥ:"Ṥ",Š:"Š",Ṧ:"Ṧ",Ŝ:"Ŝ",Ṡ:"Ṡ",Ş:"Ş",Ť:"Ť",Ṫ:"Ṫ",Ţ:"Ţ",Ú:"\xda",Ù:"\xd9",Ü:"\xdc",Ǘ:"Ǘ",Ǜ:"Ǜ",Ǖ:"Ǖ",Ǚ:"Ǚ",Ũ:"Ũ",Ṹ:"Ṹ",Ū:"Ū",Ṻ:"Ṻ",Ŭ:"Ŭ",Ǔ:"Ǔ",Û:"\xdb",Ů:"Ů",Ű:"Ű",Ṽ:"Ṽ",Ẃ:"Ẃ",Ẁ:"Ẁ",Ẅ:"Ẅ",Ŵ:"Ŵ",Ẇ:"Ẇ",Ẍ:"Ẍ",Ẋ:"Ẋ",Ý:"\xdd",Ỳ:"Ỳ",Ÿ:"Ÿ",Ỹ:"Ỹ",Ȳ:"Ȳ",Ŷ:"Ŷ",Ẏ:"Ẏ",Ź:"Ź",Ž:"Ž",Ẑ:"Ẑ",Ż:"Ż",ά:"ά",ὰ:"ὰ",ᾱ:"ᾱ",ᾰ:"ᾰ",έ:"έ",ὲ:"ὲ",ή:"ή",ὴ:"ὴ",ί:"ί",ὶ:"ὶ",ϊ:"ϊ",ΐ:"ΐ",ῒ:"ῒ",ῑ:"ῑ",ῐ:"ῐ",ό:"ό",ὸ:"ὸ",ύ:"ύ",ὺ:"ὺ",ϋ:"ϋ",ΰ:"ΰ",ῢ:"ῢ",ῡ:"ῡ",ῠ:"ῠ",ώ:"ώ",ὼ:"ὼ",Ύ:"Ύ",Ὺ:"Ὺ",Ϋ:"Ϋ",Ῡ:"Ῡ",Ῠ:"Ῠ",Ώ:"Ώ",Ὼ:"Ὼ"},rz=function(){function e(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new ry(e,t,this.mode),this.settings=t,this.leftrightDepth=0}var t=e.prototype;return t.expect=function(e,t){if(void 0===t&&(t=!0),this.fetch().text!==e)throw new r("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()},t.consume=function(){this.nextToken=null},t.fetch=function(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken},t.switchMode=function(e){this.mode=e,this.gullet.switchMode(e)},t.parse=function(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}},t.subparse=function(e){var t=this.nextToken;this.consume(),this.gullet.pushToken(new $h("}")),this.gullet.pushTokens(e);var $=this.parseExpression(!1);return this.expect("}"),this.nextToken=t,$},t.parseExpression=function(t,$){for(var r=[];;){"math"===this.mode&&this.consumeSpaces();var _=this.fetch();if(-1!==e.endOfExpression.indexOf(_.text)||$&&_.text===$||t&&rt[_.text]&&rt[_.text].infix)break;var n=this.parseAtom($);if(!n)break;"internal"!==n.type&&r.push(n)}return"text"===this.mode&&this.formLigatures(r),this.handleInfixNodes(r)},t.handleInfixNodes=function(e){for(var t,$=-1,_=0;_=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+t[0]+'" used in math mode',e);var i,o=er[this.mode][t].group,s=$6.range(e);n=i=ee.hasOwnProperty(o)?{type:"atom",mode:this.mode,family:o,loc:s,text:t}:{type:o,mode:this.mode,loc:s,text:t}}else{if(!(t.charCodeAt(0)>=128))return null;this.settings.strict&&(w(t.charCodeAt(0))?"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'" ('+t.charCodeAt(0)+")",e)),n={type:"textord",mode:"text",loc:$6.range(e),text:t}}if(this.consume(),a)for(var l=0;l0&&(r.push({type:"text",data:e.slice(0,$)}),e=e.slice($));var n=t.findIndex(function(t){return e.startsWith(t.left)});if(-1===($=a(t[n].right,e,t[n].left.length)))break;var o=e.slice(0,$+t[n].right.length),s=i.test(o)?o:e.slice(t[n].left.length,$);r.push({type:"math",data:s,rawData:o,display:t[n].display}),e=e.slice($+t[n].right.length)}return""!==e&&r.push({type:"text",data:e}),r},s=function(e,t){var $=o(e,t.delimiters);if(1===$.length&&"text"===$[0].type)return null;for(var r=document.createDocumentFragment(),_=0;_<$.length;_++)if("text"===$[_].type)r.appendChild(document.createTextNode($[_].data));else{var a=document.createElement("span"),i=$[_].data;t.displayMode=$[_].display;try{t.preProcess&&(i=t.preProcess(i)),n().render(i,a,t)}catch(s){if(!(s instanceof n().ParseError))throw s;t.errorCallback("KaTeX auto-render: Failed to parse `"+$[_].data+"` with ",s),r.appendChild(document.createTextNode($[_].rawData));continue}r.appendChild(a)}return r},l=function e(t,$){for(var r=0;r { + // Retrieve the button element. + const loadCommentsButton = document.querySelector('#load-comments'); + + // If the button exists… + if (loadCommentsButton) { + // Add a "click" event listener to the button. + loadCommentsButton.addEventListener('click', () => { + // Create a new "script" HTML element. + const script = document.createElement('script'); + + // Set the source of the script to the URL in the button's "data-script-src" attribute. + script.src = loadCommentsButton.dataset.scriptSrc; + + // Load asynchronously. + script.async = true; + + // Add the script element to the end of the document body, which causes the script to start loading and executing. + document.body.appendChild(script); + + // Hide the button after it's clicked. + loadCommentsButton.style.display = 'none'; + }); + } +}); diff --git a/js/loadComments.min.js b/js/loadComments.min.js new file mode 100644 index 000000000..ef1465389 --- /dev/null +++ b/js/loadComments.min.js @@ -0,0 +1 @@ +document.addEventListener("DOMContentLoaded",()=>{const t=document.querySelector("#load-comments");t&&t.addEventListener("click",()=>{var e=document.createElement("script");e.src=t.dataset.scriptSrc,e.async=!0,document.body.appendChild(e),t.style.display="none"})}); diff --git a/js/themeSwitcher.js b/js/themeSwitcher.js new file mode 100644 index 000000000..a83869651 --- /dev/null +++ b/js/themeSwitcher.js @@ -0,0 +1,37 @@ +// Get the theme switcher button element. +const themeSwitcher = document.querySelector(".theme-switcher"); + +// Retrieve theme from either the localStorage or the data-theme attribute on the document element. +let currentTheme = localStorage.getItem("theme") || document.documentElement.getAttribute('data-theme'); + +// Function to set theme +function setTheme(theme, saveToLocalStorage = false) { + document.documentElement.setAttribute("data-theme", theme); + currentTheme = theme; + + if (saveToLocalStorage) { + localStorage.setItem("theme", theme); + } + + // Dispatch a custom event for comment systems. + const event = new CustomEvent("themeChanged", { + detail: { theme: theme } + }); + window.dispatchEvent(event); +} + +// Function to switch between dark and light themes. +function switchTheme() { + // Set the new theme based on the current theme. + const newTheme = currentTheme === "dark" ? "light" : "dark"; + setTheme(newTheme, true); // Save the theme to localStorage when the user changes it. +} + +// Initialize the theme switcher button. +themeSwitcher.addEventListener("click", switchTheme, false); + +// Update the theme based on system preference if the user hasn't manually changed the theme. +window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", e => { + const newTheme = e.matches ? "dark" : "light"; + setTheme(newTheme); +}); diff --git a/js/themeSwitcher.min.js b/js/themeSwitcher.min.js new file mode 100644 index 000000000..d70026980 --- /dev/null +++ b/js/themeSwitcher.min.js @@ -0,0 +1 @@ +const themeSwitcher=document.querySelector(".theme-switcher");let currentTheme=localStorage.getItem("theme")||document.documentElement.getAttribute("data-theme");function setTheme(e,t=!1){document.documentElement.setAttribute("data-theme",e),currentTheme=e,t&&localStorage.setItem("theme",e);t=new CustomEvent("themeChanged",{detail:{theme:e}});window.dispatchEvent(t)}function switchTheme(){setTheme("dark"===currentTheme?"light":"dark",!0)}themeSwitcher.addEventListener("click",switchTheme,!1),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e=>{setTheme(e.matches?"dark":"light")}); diff --git a/js/utterances.js b/js/utterances.js new file mode 100644 index 000000000..784e7725a --- /dev/null +++ b/js/utterances.js @@ -0,0 +1,62 @@ +function setUtterancesTheme(newTheme) { + // Get the frame with class "utterances-frame". + const frame = document.querySelector(".utterances-frame"); + + if (frame) { + // If the iframe exists, send a message to set the theme. + frame.contentWindow.postMessage( + { type: 'set-theme', theme: newTheme }, + 'https://utteranc.es' + ); + } +} + +function initUtterances() { + // Get the comments div. + const commentsDiv = document.querySelector('.comments'); + + // Check if the comments div exists. + if (commentsDiv) { + // Get all necessary attributes for initializing Utterances. + const repo = commentsDiv.getAttribute('data-repo'); + const issueTerm = commentsDiv.getAttribute('data-issue-term'); + const label = commentsDiv.getAttribute('data-label'); + const lightTheme = commentsDiv.getAttribute('data-light-theme'); + const darkTheme = commentsDiv.getAttribute('data-dark-theme'); + const lazyLoading = commentsDiv.getAttribute('data-lazy-loading'); + + // Create a new script element. + const script = document.createElement('script'); + script.src = 'https://utteranc.es/client.js'; + script.async = true; + script.setAttribute('repo', repo); + script.setAttribute('issue-term', issueTerm); + script.setAttribute('label', label); + + // Set the initial theme. + const currentTheme = document.documentElement.getAttribute('data-theme') || 'light'; + const selectedTheme = currentTheme === 'dark' ? darkTheme : lightTheme; + script.setAttribute('theme', selectedTheme); + + script.setAttribute('crossorigin', 'anonymous'); + + // Enable lazy loading if specified. + if (lazyLoading === 'true') { + script.setAttribute('data-loading', 'lazy'); + } + + // Append the script to the comments div. + commentsDiv.appendChild(script); + + // Listen for themeChanged event to update the theme. + window.addEventListener('themeChanged', (event) => { + // Determine the new theme based on the event detail. + const selectedTheme = event.detail.theme === 'dark' ? darkTheme : lightTheme; + // Set the new theme. + setUtterancesTheme(selectedTheme); + }); + } +} + +// Initialize Utterances. +initUtterances(); diff --git a/js/utterances.min.js b/js/utterances.min.js new file mode 100644 index 000000000..992de3bd8 --- /dev/null +++ b/js/utterances.min.js @@ -0,0 +1 @@ +function setUtterancesTheme(t){var e=document.querySelector(".utterances-frame");e&&e.contentWindow.postMessage({type:"set-theme",theme:t},"https://utteranc.es")}function initUtterances(){var t=document.querySelector(".comments");if(t){const a=t.getAttribute("data-repo"),r=t.getAttribute("data-issue-term"),n=t.getAttribute("data-label"),i=t.getAttribute("data-light-theme"),s=t.getAttribute("data-dark-theme"),u=t.getAttribute("data-lazy-loading"),d=document.createElement("script");d.src="https://utteranc.es/client.js",d.async=!0,d.setAttribute("repo",a),d.setAttribute("issue-term",r),d.setAttribute("label",n);var e="dark"===(document.documentElement.getAttribute("data-theme")||"light")?s:i;d.setAttribute("theme",e),d.setAttribute("crossorigin","anonymous"),"true"===u&&d.setAttribute("data-loading","lazy"),t.appendChild(d),window.addEventListener("themeChanged",t=>{setUtterancesTheme("dark"===t.detail.theme?s:i)})}}initUtterances(); diff --git a/katex.min.css b/katex.min.css new file mode 100644 index 000000000..0c4a035e0 --- /dev/null +++ b/katex.min.css @@ -0,0 +1 @@ +@font-face{font-family:KaTeX_AMS;font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_AMS-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_AMS-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_AMS-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:700;src:url(fonts/KaTeX/KaTeX_Caligraphic-Bold.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Caligraphic-Bold.woff) format("woff"),url(fonts/KaTeX/KaTeX_Caligraphic-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Caligraphic;font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_Caligraphic-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Caligraphic-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_Caligraphic-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:700;src:url(fonts/KaTeX/KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Fraktur-Bold.woff) format("woff"),url(fonts/KaTeX/KaTeX_Fraktur-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Fraktur;font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Fraktur-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_Fraktur-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:700;src:url(fonts/KaTeX/KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Main-Bold.woff) format("woff"),url(fonts/KaTeX/KaTeX_Main-Bold.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:700;src:url(fonts/KaTeX/KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Main-BoldItalic.woff) format("woff"),url(fonts/KaTeX/KaTeX_Main-BoldItalic.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:italic;font-weight:400;src:url(fonts/KaTeX/KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Main-Italic.woff) format("woff"),url(fonts/KaTeX/KaTeX_Main-Italic.ttf) format("truetype")}@font-face{font-family:KaTeX_Main;font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Main-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_Main-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:700;src:url(fonts/KaTeX/KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Math-BoldItalic.woff) format("woff"),url(fonts/KaTeX/KaTeX_Math-BoldItalic.ttf) format("truetype")}@font-face{font-family:KaTeX_Math;font-style:italic;font-weight:400;src:url(fonts/KaTeX/KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Math-Italic.woff) format("woff"),url(fonts/KaTeX/KaTeX_Math-Italic.ttf) format("truetype")}@font-face{font-family:"KaTeX_SansSerif";font-style:normal;font-weight:700;src:url(fonts/KaTeX/KaTeX_SansSerif-Bold.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_SansSerif-Bold.woff) format("woff"),url(fonts/KaTeX/KaTeX_SansSerif-Bold.ttf) format("truetype")}@font-face{font-family:"KaTeX_SansSerif";font-style:italic;font-weight:400;src:url(fonts/KaTeX/KaTeX_SansSerif-Italic.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_SansSerif-Italic.woff) format("woff"),url(fonts/KaTeX/KaTeX_SansSerif-Italic.ttf) format("truetype")}@font-face{font-family:"KaTeX_SansSerif";font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_SansSerif-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_SansSerif-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_SansSerif-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Script;font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Script-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_Script-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size1;font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Size1-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_Size1-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size2;font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Size2-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_Size2-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size3;font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Size3-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_Size3-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Size4;font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Size4-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_Size4-Regular.ttf) format("truetype")}@font-face{font-family:KaTeX_Typewriter;font-style:normal;font-weight:400;src:url(fonts/KaTeX/KaTeX_Typewriter-Regular.woff2) format("woff2"),url(fonts/KaTeX/KaTeX_Typewriter-Regular.woff) format("woff"),url(fonts/KaTeX/KaTeX_Typewriter-Regular.ttf) format("truetype")}.katex{text-rendering:auto;font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0}.katex *{-ms-high-contrast-adjust:none!important;border-color:currentColor}.katex .katex-version:after{content:"0.16.4"}.katex .katex-mathml{clip:rect(1px,1px,1px,1px);border:0;height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-style:italic;font-weight:700}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{border-collapse:collapse;display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;position:relative;vertical-align:bottom}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;font-size:1px;min-width:2px;vertical-align:bottom;width:2px}.katex .vbox{align-items:baseline;display:inline-flex;flex-direction:column}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-flex;flex-direction:row}.katex .thinbox{max-width:0;width:0}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{position:relative;width:0}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{border:0 solid;display:inline-block;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{border-bottom-style:solid;display:inline-block;width:100%}.katex .hdashline{border-bottom-style:dashed;display:inline-block;width:100%}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;display:block;height:inherit;position:absolute;width:100%}.katex svg path{stroke:none}.katex img{border-style:none;max-height:none;max-width:none;min-height:0;min-width:0}.katex .stretchy{display:block;overflow:hidden;position:relative;width:100%}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{overflow:hidden;position:relative;width:100%}.katex .halfarrow-left{left:0;overflow:hidden;position:absolute;width:50.2%}.katex .halfarrow-right{overflow:hidden;position:absolute;right:0;width:50.2%}.katex .brace-left{left:0;overflow:hidden;position:absolute;width:25.1%}.katex .brace-center{left:25%;overflow:hidden;position:absolute;width:50%}.katex .brace-right{overflow:hidden;position:absolute;right:0;width:25.1%}.katex .x-arrow-pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em 0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{border:.04em solid;box-sizing:border-box}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex .angl{border-right:.049em solid;border-top:.049em solid;box-sizing:border-box;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-num:before{content:"(" counter(katexEqnNo) ")";counter-increment:katexEqnNo}.katex .mml-eqn-num:before{content:"(" counter(mmlEqnNo) ")";counter-increment:mmlEqnNo}.katex .mtr-glue{width:50%}.katex .cd-vert-arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-right{display:inline-block;left:calc(50% + .3em);position:absolute;text-align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{padding-left:2em;text-align:left}body{counter-reset:katexEqnNo mmlEqnNo} diff --git a/main.css b/main.css new file mode 100644 index 000000000..1502e978a --- /dev/null +++ b/main.css @@ -0,0 +1 @@ +.archive{margin-top:4vmin}.archive .listing-title{font-size:1.5rem;margin-bottom:1rem}.archive .listing-item{padding:.2rem 1rem;margin-bottom:.5rem;display:flex;gap:1rem}.archive .listing-item .post-time{min-width:5rem;text-align:left;padding-left:1vmin}.archive .listing-item .post-time .date{color:var(--meta-color);white-space:nowrap}.archive ul{list-style:none;padding:0;margin:0}.archive li{margin-bottom:1.3rem}.cards{display:grid;grid-template-columns:repeat(auto-fill, minmax(300px, 1fr));grid-template-rows:auto;gap:24px;padding:12px 0;margin-top:4vmin}.card{min-height:100px;background:var(--bg-2);box-shadow:rgba(0,0,0,.15) 1.95px 1.95px 2.6px;overflow:hidden}.card-info{padding:0 24px 24px 24px}.card-title{margin-top:.7em}.card-image{border:unset;width:100%}.card-image-placeholder{height:12px;width:100%}.card-description{margin-top:.5em;overflow:hidden}@media all and (max-width: 720px){.cards{gap:18px}}code{background-color:var(--bg-1);padding:.1em .2em;font-family:var(--code-font);font-size:.9rem}code mark{background-color:var(--codeblock-highlight);color:inherit;filter:brightness(110%);display:block}code table{width:100%;margin:0rem;border-collapse:collapse;border-spacing:0rem;text-align:left}code table td,code table th,code table tr{border:none;padding:0rem}code table tbody td:first-child{user-select:none;width:2rem;text-align:left}code table tbody tr:nth-child(even){background-color:inherit}a:hover code{background-color:inherit}pre{overflow:hidden;position:relative;display:block;line-height:1.4;overflow-x:auto;padding:2.4rem 1rem 1rem;border-radius:5px}pre code{display:block;overflow-x:auto;white-space:pre;font-size:.8rem;background-color:rgba(0,0,0,0);color:inherit;padding:0rem;border:0rem;border-radius:5px}pre code::before{content:attr(data-lang);display:block;background-color:var(--primary-color);color:var(--hover-color);padding:.3rem;padding-left:1rem;width:calc(100% - 1.3rem);height:.9rem;font-size:.65rem;position:absolute;text-align:left;text-transform:uppercase;top:0;left:0}.copy-code{z-index:1;-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M217.002-67.694q-37.732 0-64.02-26.288-26.287-26.287-26.287-64.019V-707.69h77.999v549.689q0 4.615 3.846 8.462 3.846 3.846 8.462 3.846h451.689v77.999H217.002Zm175.999-175.999q-37.733 0-64.02-26.287T302.694-334v-463.383q0-37.732 26.287-64.02 26.287-26.287 64.02-26.287h365.383q37.732 0 64.019 26.287 26.288 26.288 26.288 64.02V-334q0 37.733-26.288 64.02-26.287 26.287-64.019 26.287H393.001Zm0-77.998h365.383q4.615 0 8.462-3.847 3.846-3.846 3.846-8.462v-463.383q0-4.616-3.846-8.462-3.847-3.846-8.462-3.846H393.001q-4.616 0-8.462 3.846-3.847 3.846-3.847 8.462V-334q0 4.616 3.847 8.462 3.846 3.847 8.462 3.847Zm-12.309 0v-488V-321.691Z'/%3E%3C/svg%3E");background:var(--hover-color);cursor:pointer;position:absolute;height:.9rem;width:.9rem;background-size:contain;color:#fff;right:.7rem;top:.3rem;align-self:center}.copy-code.checked{-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M395-253 194-455l83-83 118 117 288-287 83 84-371 371Z'/%3E%3C/svg%3E");height:1rem;width:1rem}.copy-code.error{-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960' %3E%3Cpath d='M479.386-248Q509-248 529-267.386q20-19.386 20-49T529.614-366.5q-19.386-20.5-49-20.5T431-366.886q-20 20.114-20 49.728t19.386 49.386q19.386 19.772 49 19.772ZM416-431h128v-265H416v265Zm64.276 381q-88.916 0-167.743-33.104-78.828-33.103-137.577-91.852-58.749-58.749-91.852-137.535Q50-391.277 50-480.458q0-89.438 33.162-167.491 33.163-78.053 92.175-136.942 59.011-58.889 137.533-91.999Q391.393-910 480.458-910q89.428 0 167.518 33.093T784.94-784.94q58.874 58.874 91.967 137.215Q910-569.385 910-480.192q0 89.192-33.11 167.518-33.11 78.326-91.999 137.337-58.889 59.012-137.167 92.174Q569.447-50 480.276-50Z'/%3E%3C/svg%3E")}.utterances-frame{width:100%}.comments{border-top:var(--divider-color) solid .5px;border-bottom:var(--divider-color) solid .5px;margin-top:2rem;padding-top:2rem;padding-bottom:2rem}.comments iframe{border:none;width:100%;margin:0;max-width:100%;aspect-ratio:inherit}.comments .load-comments-button{display:block;font-family:var(--sans-serif-font);color:inherit;font-size:.95rem;background:none;border:none;padding:.5em 1em;margin:.5em auto;cursor:pointer;text-decoration:none}footer{margin-top:auto;margin-bottom:1.4rem;font-family:var(--post-font-family)}footer section{display:flex;flex-direction:column;align-items:center;gap:0rem}footer nav{display:flex;margin:0 0rem}.socials{justify-content:center;flex-grow:0;display:flex;flex-wrap:wrap;align-items:flex-end}.socials svg{max-height:15px}.socials ul{gap:5px}.social{background-image:unset;padding:.5vmin;display:flex;justify-content:center;align-items:center}.social>img{color:#000;aspect-ratio:1/1;width:1.5rem;height:auto}.social:hover>img{filter:invert(1)}[data-theme=dark] .social:hover>img{filter:invert(0)}[data-theme=dark] .social>img{filter:invert(1)}.credits{font-size:.88rem;color:var(--meta-color);text-align:center}.credits p{margin:0}.header-anchor{display:inline-flex;align-items:center;justify-content:center;position:absolute;width:1.9rem;margin-left:-2rem;padding-right:.3rem;opacity:0;user-select:none;height:100%}@media (max-width: 500px){.header-anchor{display:none}}.link-icon{-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M14.78 3.653a3.936 3.936 0 1 1 5.567 5.567l-3.627 3.627a3.936 3.936 0 0 1-5.88-.353.75.75 0 0 0-1.18.928 5.436 5.436 0 0 0 8.12.486l3.628-3.628a5.436 5.436 0 1 0-7.688-7.688l-3 3a.75.75 0 0 0 1.06 1.061l3-3Z'%3E%3C/path%3E%3Cpath d='M7.28 11.153a3.936 3.936 0 0 1 5.88.353.75.75 0 0 0 1.18-.928 5.436 5.436 0 0 0-8.12-.486L2.592 13.72a5.436 5.436 0 1 0 7.688 7.688l3-3a.75.75 0 1 0-1.06-1.06l-3 3a3.936 3.936 0 0 1-5.567-5.568l3.627-3.627Z'%3E%3C/path%3E%3C/svg%3E");background:var(--text-color);align-self:center;cursor:pointer;width:1rem;height:1rem}h1:hover .header-anchor,h2:hover .header-anchor,h3:hover .header-anchor,h4:hover .header-anchor,h5:hover .header-anchor,h6:hover .header-anchor{opacity:1}h1 .header-anchor:hover,h2 .header-anchor:hover,h3 .header-anchor:hover,h4 .header-anchor:hover,h5 .header-anchor:hover,h6 .header-anchor:hover{background-color:rgba(0,0,0,0)}header{font-family:"Inter Subset",var(--sans-serif-font);width:100%}.page-header{font-size:3em;line-height:100%;font-family:var(--header-font);margin:4rem 0px 1rem 0px}.navbar{max-width:var(--max-layout-width);display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:1em 0;margin:0 auto}.nav-navs{display:flex;flex-wrap:wrap}.nav-navs ul{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:1px;list-style:none;padding:0;margin:0}.nav-links{font-size:1em;font-weight:340;text-decoration:none;justify-content:right;color:var(--text-color);padding:.66rem;line-height:2.5}.home-title{font-size:1.7em;font-weight:450;padding:.12rem;margin-left:-.12rem;border:none;color:var(--primary-color);text-decoration:none}.meta{color:var(--meta-color);letter-spacing:-.4px;font-size:.8rem;font-weight:300;padding:0;padding-top:.7vmin;padding-bottom:3vmin;line-height:1.4rem}.meta a{color:var(--meta-color);text-decoration-color:none;font-weight:inherit;text-decoration:none}.meta ul,.meta li{font-family:var(--sans-serif-font);list-style-type:none;display:inline}.language-switcher{margin-left:.5rem;margin-right:.5rem;display:flex;align-items:center;justify-content:center}.language-switcher-icon{-webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 96 960 960'>ul{margin:0;padding:0}}hr{border:none;height:1px;background-color:var(--divider-color);margin:3.5rem 0 1rem}.footnote-reference{font-family:var(--serif-font);font-size:.7rem}.footnote-definition{margin-bottom:.6rem}.footnote-definition sup{font-family:var(--serif-font);font-size:.75rem;margin-right:.15rem}.footnote-definition p{display:inline}.footnote-backlink{font-size:.8rem;margin-left:.2rem}.references p{text-indent:-2.4rem;margin-left:2.4rem}.info-box{border:1px solid var(--primary-color);border-left-width:.3rem;padding:1rem;margin-top:1rem;margin-bottom:1rem;border-radius:10px;text-align:center}.quote-container{border:none}.quote-toggle{display:none}.quote-label{font-family:var(--sans-serif-font);cursor:pointer;color:var(--meta-color);text-align:center;text-decoration:none;font-size:.75rem;border-radius:5px;display:none}.quote-toggle:not(:checked)~.quote .translated .quote-label-original,.quote-toggle:checked~.quote .original .quote-label-translate{display:inline}.original{display:none}.quote-toggle:checked~.quote .original{display:block}.quote-toggle:checked~.quote .translated{display:none}.pagination{display:flex;justify-content:space-between;align-items:center;margin-top:2rem;font-size:1em;list-style:none;padding:0}.pagination .page-item .disabled{opacity:.5;pointer-events:none}.pagination .page-numbers{font-size:.9rem;color:var(--meta-color)}.bloglist-container{display:grid;grid-template-columns:1fr}.bloglist-row{background-color:var(--navbar-color);display:flex;align-items:flex-start;padding:2.5rem 0}.bloglist-row .date{font-size:.9rem;font-weight:300;color:var(--meta-color);width:13.5rem}.bloglist-row .bloglist-tags{margin-top:.1rem}.bloglist-row .bloglist-tags .tag{margin-right:.7rem;font-size:.75rem;font-weight:400;text-transform:uppercase}.bloglist-row .bloglist-content{flex:1}.bloglist-row .bloglist-content .bloglist-title{font-size:1.2em;font-weight:bold}.bloglist-row .bloglist-content .bloglist-title a{color:var(--text-color-high-contrast);font-weight:550}.bloglist-row .bloglist-content .bloglist-title a:hover{color:var(--hover-color)}.bloglist-row .bloglist-content .description p{margin:.5rem 0 1rem;color:var(--text-color);font-size:.9rem;font-weight:250;line-height:1.5rem}.all-posts{font-size:1.3rem;font-weight:350}@media only screen and (max-width: 1100px){.bloglist-row{flex-direction:column;align-items:flex-start;padding:2rem 0}.date{margin-bottom:0;width:100%}.bloglist-content{width:100%}}#button-container{display:flex;position:fixed;right:2rem;bottom:2rem;flex-direction:column;gap:.6rem;z-index:2}#button-container #toc-button,#button-container #comments-button,#button-container #top-button{display:flex;justify-content:center;align-items:center;z-index:2;cursor:pointer;border:none;border-radius:50%;background-color:var(--bg-1);padding:.4rem;width:1rem;height:1rem;text-align:center}#button-container #toc-button:hover,#button-container #comments-button:hover,#button-container #top-button:hover{background-color:var(--bg-3)}#button-container #toc-button:hover svg,#button-container #comments-button:hover svg,#button-container #top-button:hover svg{fill:var(--primary-color)}#button-container #toc-button:hover::before,#button-container #comments-button:hover::before,#button-container #top-button:hover::before{background-color:rgba(0,0,0,0)}#button-container #toc-button svg,#button-container #comments-button svg,#button-container #top-button svg{fill:var(--text-color);width:1rem;height:1rem}#button-container #toc-floating-container #toc-button{position:relative;z-index:2}#button-container #toc-floating-container .toc-container{margin:0;margin-top:.7rem}#button-container #toc-floating-container .toc-content{display:none;position:absolute;right:0;bottom:100%;z-index:2;margin-bottom:.7rem;box-shadow:rgba(0,0,0,.15) 1.95px 1.95px 2.6px;border:1px solid var(--divider-color);border-radius:5px;background-color:var(--background-color);padding-right:1rem;max-height:70vh;overflow-y:auto;font-size:.8rem;text-align:left;white-space:nowrap}#button-container #toc-floating-container .toc-content ul{padding-left:1rem;list-style:none}#button-container #toc-floating-container .toggle{display:none}#button-container #toc-floating-container .toggle:checked+.overlay,#button-container #toc-floating-container .toggle:checked+.overlay+#toc-button+.toc-content{display:block}#button-container #toc-floating-container .toggle:checked+.overlay+#toc-button svg{fill:var(--primary-color)}#button-container #toc-floating-container .overlay{display:none;position:fixed;top:0;right:0;bottom:0;left:0;opacity:40%;z-index:1;background:var(--background-color)}@media (max-width: 700px){#button-container{display:none !important}}.spoiler-toggle{display:none}.spoiler-content{cursor:help;display:inline-block}.spoiler-content .spoiler-hidden{filter:blur(6px);user-select:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.spoiler-content .spoiler-hidden a{pointer-events:none}.spoiler-toggle:checked+.spoiler-content .spoiler-hidden{filter:none;user-select:auto}.spoiler-toggle:checked+.spoiler-content .spoiler-hidden a{pointer-events:auto}.spoiler-container.fixed-blur .spoiler-content:before{content:"SPOILER";filter:blur(6px);display:inline-block}.spoiler-container.fixed-blur .spoiler-content .spoiler-hidden{display:none}.spoiler-container.fixed-blur .spoiler-toggle:checked+.spoiler-content:before{content:none}.spoiler-container.fixed-blur .spoiler-toggle:checked+.spoiler-content .spoiler-hidden{display:inline}:root{--rosewater: #f2d5cf;--flamingo: #eebebe;--pink: #f4b8e4;--mauve: #ca9ee6;--red: #e78284;--maroon: #ea999c;--peach: #ef9f76;--yellow: #e5c890;--green: #a6d189;--teal: #81c8be;--sky: #99d1db;--blue: #8caaee;--lavender: #b4befe;--text: #cdd6f4;--overlay0: #737994}.z-code{color:var(--text);background-color:var(--codeblock-bg)}.z-comment{color:var(--overlay0);font-style:italic}.z-string{color:var(--green)}.z-string.z-regexp{color:var(--sky)}.z-constant.z-numeric,.z-string.z-regexp{color:var(--sky)}.z-constant.z-character.z-escape{color:var(--sky)}.z-constant.z-language{color:var(--lavender)}.z-support.z-function.z-builtin.z-variable.z-other.z-constant{color:var(--sky)}.z-keyword{color:var(--red)}.z-keyword.z-control.z-loop,.z-keyword.z-control.z-conditional,.z-keyword.z-control.z-c++{color:var(--mauve)}.z-keyword.z-control.z-return,.z-keyword.z-control.z-flow.z-return{color:var(--pink)}.z-support.z-type.z-exception{color:var(--sky)}.z-keyword.z-operator{color:var(--teal)}.z-punctuation.z-accessor{color:var(--teal)}.z-punctuation.z-section{color:var(--text)}.z-keyword.z-control.z-import.z-include{color:var(--peach)}.z-storage{color:var(--red)}.z-storage.z-type{color:var(--yellow)}.z-storage.z-modifier{color:var(--red)}.z-entity.z-name.z-namespace,.z-meta.z-path,.z-storage.z-type.z-class{color:var(--rosewater)}.z-entity.z-name.z-label{color:var(--blue)}.z-keyword.z-declaration.z-class{color:var(--red)}.z-entity.z-name.z-class,.z-meta.z-toc-list.z-full-identifier{color:var(--teal)}.z-entity.z-other.z-inherited-class{color:var(--teal)}.z-entity.z-name.z-function{color:var(--blue);font-style:italic}.z-variable.z-function{color:var(--blue);font-style:italic}.z-entity.z-name.z-function.z-preprocessor,.z-keyword.z-control.z-import{color:var(--red)}.z-entity.z-name.z-function.z-constructor,.z-entity.z-name.z-function.z-destructor{color:var(--lavender)}.z-variable.z-parameter.z-function{color:var(--rosewater)}.z-keyword.z-declaration.z-function{color:var(--maroon)}.z-support.z-function{color:var(--teal)}.z-support.z-constant{color:var(--blue)}.z-support.z-type,.z-support.z-class{color:var(--blue);font-style:italic}.z-variable.z-function{color:var(--blue)}.z-variable.z-parameter{color:var(--rosewater)}.z-variable.z-other{color:var(--text)}.z-variable.z-other.z-member{color:var(--rosewater)}.z-variable.z-language{color:var(--peach)}.z-entity.z-name.z-tag{color:var(--sky)}.z-entity.z-other.z-attribute-name{color:var(--mauve);font-style:italic}.z-punctuation.z-definition.z-tag{color:var(--maroon)}.z-markup.z-underline.z-link.z-markdown{color:var(--rosewater);font-style:underline;font-style:italic}.z-comment.z-block.z-markdown,.z-meta.z-code-fence{color:var(--peach);font-style:italic}.z-markup.z-raw.z-code-fence,.z-markup.z-raw.z-inline{color:var(--peach);font-style:italic}.z-punctuation.z-definition.z-heading,.z-entity.z-name.z-section{color:var(--blue)}.z-markup.z-italic{color:var(--maroon);font-style:italic}.z-markup.z-bold{color:var(--maroon);font-weight:bold}.z-constant.z-character.z-escape,.z-source.z-shell.z-bash .z-meta.z-function.z-shell .z-meta.z-compound.z-shell .z-meta.z-function-call.z-identifier.z-shell{color:var(--pink)}.z-variable.z-language.z-shell{color:var(--red)}.z-source.z-lua .z-meta.z-function.z-lua .z-meta.z-block.z-lua .z-meta.z-mapping.z-value.z-lua .z-meta.z-mapping.z-key.z-lua .z-string.z-unquoted.z-key.z-lua{color:var(--lavender)}.z-source.z-lua .z-meta.z-function.z-lua .z-meta.z-block.z-lua .z-meta.z-mapping.z-key.z-lua .z-string.z-unquoted.z-key.z-lua{color:var(--flamingo)}.z-entity.z-name.z-constant.z-java{color:var(--peach)}.z-support.z-type.z-property-name.z-css{color:var(--flamingo)}.z-support.z-constant.z-property-value.z-css{color:var(--text)}.z-constant.z-numeric.z-suffix.z-css,.z-keyword.z-other.z-unit.z-css,.z-variable.z-other.z-custom-property.z-name.z-css,.z-support.z-type.z-custom-property.z-name.z-css,.z-punctuation.z-definition.z-custom-property.z-css{color:var(--peach)}.z-entity.z-name.z-tag.z-css{color:var(--lavender)}.z-variable.z-other.z-sass{color:var(--peach)}.z-invalid{color:var(--text);background-color:var(--red)}.z-invalid.z-deprecated{color:var(--text);background-color:var(--mauve)}.z-meta.z-diff{color:--OVERLAY0}.z-meta.z-diff.z-header{color:--OVERLAY0}.z-markup.z-deleted{color:var(--red)}.z-markup.z-inserted{color:var(--green)}.z-markup.z-changed{color:var(--yellow)}.z-message.z-error{color:var(--red)}table{border-spacing:0;border-collapse:collapse;text-align:center;font:inherit;overflow:hidden;border-style:hidden !important;margin:1rem auto;border-radius:5px}table th,table td{padding:6px 13px;border:1px solid var(--bg-1);font-size:large}table thead tr{background-color:var(--primary-color);color:var(--hover-color)}table thead tr code{background-color:rgba(0,0,0,0)}table tbody tr:nth-child(even){background-color:var(--bg-0)}table details,table summary{font-family:inherit !important}.tag-cloud{margin-top:4vmin}.tag-cloud ul{list-style:none;padding:0;margin:0}.tag-cloud .tags-item{margin-top:1rem}.theme-switcher{align-self:center;margin-left:.5rem;width:1rem;height:1rem;position:relative;cursor:pointer;-webkit-mask:var(--theme-switcher-svg);background:var(--text-color)}@font-face{font-family:"Inter";src:local("Inter"),url("fonts/Inter4.woff2") format("woff2");font-display:swap}@font-face{font-family:"Source Serif";src:local("Source Serif"),url("fonts/SourceSerif4Variable-Roman.ttf.woff2") format("woff2");font-display:swap}@font-face{font-family:"Cascadia Code";src:local("Cascadia Code"),url("fonts/CascadiaCode-SemiLight.woff2") format("woff2");font-display:swap}:root{color-scheme:light;--max-layout-width: 1000px;--normal-layout-width: 600px;--medium-layout-width: 400px;--small-layout-width: 200px;--sans-serif-font: "Inter", Helvetica, Arial, sans-serif;--serif-font: "Source Serif", "Georgia", serif;--code-font: "Cascadia Code";font-family:var(--sans-serif-font);line-height:190%;--background-color: white;--bg-0: #f0f0f0;--bg-1: #e7e7e7;--bg-2: #fefefe;--bg-3: #d8dcdd;--hover-color: white;--primary-color: #087E96;--divider-color: #d7d7d7;--text-color: #222226;--text-color-high-contrast: #313333;--meta-color: #5b5b65;--codeblock-bg: #26232e;--codeblock-highlight: #3d3949;--theme-switcher-svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath d='M283.211 512c78.962 0 151.079-35.925 198.857-94.792 7.068-8.708-.639-21.43-11.562-19.35-124.203 23.654-238.262-71.576-238.262-196.954 0-72.222 38.662-138.635 101.498-174.394 9.686-5.512 7.25-20.197-3.756-22.23A258.156 258.156 0 0 0 283.211 0c-141.309 0-256 114.511-256 256 0 141.309 114.511 256 256 256z'/%3E%3C/svg%3E%0A")}[data-theme=dark]{color-scheme:dark;--background-color: #1f1f1f;--bg-0: #2f2f2f;--bg-1: #3c3c3c;--bg-2: #171717;--bg-3: #535555;--hover-color: black;--primary-color: #91e0ee;--divider-color: #4a4a4a;--text-color: #D4D4D4;--text-color-high-contrast: #eceeef;--meta-color: #B0B0B0;--codeblock-bg: #19181e;--codeblock-highlight: #292929;--theme-switcher-svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 96 960 960' %3E%3Cpath d='M480 776q-83 0-141.5-58.5T280 576q0-83 58.5-141.5T480 376q83 0 141.5 58.5T680 576q0 83-58.5 141.5T480 776ZM80 616q-17 0-28.5-11.5T40 576q0-17 11.5-28.5T80 536h80q17 0 28.5 11.5T200 576q0 17-11.5 28.5T160 616H80Zm720 0q-17 0-28.5-11.5T760 576q0-17 11.5-28.5T800 536h80q17 0 28.5 11.5T920 576q0 17-11.5 28.5T880 616h-80ZM480 296q-17 0-28.5-11.5T440 256v-80q0-17 11.5-28.5T480 136q17 0 28.5 11.5T520 176v80q0 17-11.5 28.5T480 296Zm0 720q-17 0-28.5-11.5T440 976v-80q0-17 11.5-28.5T480 856q17 0 28.5 11.5T520 896v80q0 17-11.5 28.5T480 1016ZM226 378l-43-42q-12-11-11.5-28t11.5-29q12-12 29-12t28 12l42 43q11 12 11 28t-11 28q-11 12-27.5 11.5T226 378Zm494 495-42-43q-11-12-11-28.5t11-27.5q11-12 27.5-11.5T734 774l43 42q12 11 11.5 28T777 873q-12 12-29 12t-28-12Zm-42-495q-12-11-11.5-27.5T678 322l42-43q11-12 28-11.5t29 11.5q12 12 12 29t-12 28l-43 42q-12 11-28 11t-28-11ZM183 873q-12-12-12-29t12-28l43-42q12-11 28.5-11t27.5 11q12 11 11.5 27.5T282 830l-42 43q-11 12-28 11.5T183 873Z'/%3E%3C/svg%3E")}[data-theme=dark] .invertible-image{filter:invert(0.88)}[data-theme=dark] .dimmable-image{filter:brightness(.8) contrast(1.2)}html{background-color:var(--background-color);color:var(--text-color);line-height:1.6em;text-rendering:optimizeLegibility}body{display:flex;flex-direction:column;min-height:100vh;margin:0 5vmin;padding:0}.content{width:100%;max-width:var(--max-layout-width);margin:0 auto;margin-top:6vmin;margin-bottom:4rem;word-wrap:break-word}article{max-width:calc(var(--max-layout-width) - 12rem);margin:0 auto}article p,article li,article details,article summary{font-family:var(--serif-font)}article .full-width{max-width:calc(100% + 12rem);margin-left:-6rem;margin-right:-6rem}.section-title{display:block;font-size:2.2em;margin-bottom:0em;margin-left:0;margin-right:0;font-weight:550;color:var(--text-color-high-contrast)}.last-updated{margin-top:-5vmin}h1,h2,h3,h4,h5,h6{position:relative}h1{display:block;font-size:1.5em;margin-top:.67em;margin-bottom:0em;margin-left:0;margin-right:0;font-weight:550}h2{display:block;font-size:1.4em;margin-top:.5em;margin-bottom:0em;margin-left:0;margin-right:0;font-weight:550}h3{display:block;font-size:1.2em;margin-top:.3em;margin-bottom:0em;margin-left:0;margin-right:0;font-weight:550}h4{display:block;font-size:1em;margin-top:.83em;margin-bottom:0em;margin-left:0;margin-right:0;font-weight:550}h5{display:block;font-size:1em;margin-top:.83em;margin-bottom:0em;margin-left:0;margin-right:0;font-weight:normal}p{margin-top:.4rem;margin-bottom:max(2.3vmin,24px);line-height:2rem;font-size:1em}strong{font-weight:620}.centered-text{text-align:center}.subheader{margin-bottom:2rem}@media only screen and (max-width: 1000px){.content{max-width:var(--normal-layout-width)}body{margin:0 32px}article .full-width{max-width:none;margin-left:0;margin-right:0;display:block;overflow-x:auto}}@media only screen and (max-width: 600px){.content{max-width:var(--medium-layout-width);margin-top:0rem}article{margin-top:1.3rem}body{margin:0 16px}}@media only screen and (max-width: 300px){.content{max-width:var(--small-layout-width)}}@media all and (min-width: 600px){html{font-size:16.5px}}@media all and (min-width: 960px){html{font-size:20px}} \ No newline at end of file diff --git a/no_js.css b/no_js.css new file mode 100644 index 000000000..0294a308c --- /dev/null +++ b/no_js.css @@ -0,0 +1 @@ +.js{display:none} diff --git a/projects/chu/index.html b/projects/chu/index.html new file mode 100644 index 000000000..6b879e443 --- /dev/null +++ b/projects/chu/index.html @@ -0,0 +1 @@ +~/tabi • chu
chu
  • 0 min read
\ No newline at end of file diff --git a/projects/index.html b/projects/index.html new file mode 100644 index 000000000..69b2336bb --- /dev/null +++ b/projects/index.html @@ -0,0 +1 @@ +~/tabi • Projects
Projects
img/tabi.webp

tabi

A fast, lightweight and modern Zola theme with optional JavaScript.
img/chu.webp

chu

Flask app for secure file uploads, with metadata removal, compression, password protection, and more.
img/nani.webp

nani

Bash script to create public URLs from files or text on remote servers.
img/spectro.webp

spectro

Bash script to generate spectrograms, compare them, upload them to Imgur, and provide the corresponding URLs for sharing.
\ No newline at end of file diff --git a/projects/nani/index.html b/projects/nani/index.html new file mode 100644 index 000000000..023c64e43 --- /dev/null +++ b/projects/nani/index.html @@ -0,0 +1 @@ +~/tabi • nani
nani
  • 0 min read
\ No newline at end of file diff --git a/projects/spectro/index.html b/projects/spectro/index.html new file mode 100644 index 000000000..f220e0e2a --- /dev/null +++ b/projects/spectro/index.html @@ -0,0 +1 @@ +~/tabi • spectro
spectro
  • 0 min read
\ No newline at end of file diff --git a/projects/tabi/index.html b/projects/tabi/index.html new file mode 100644 index 000000000..4803f15df --- /dev/null +++ b/projects/tabi/index.html @@ -0,0 +1 @@ +~/tabi • tabi
tabi
  • 0 min read
\ No newline at end of file diff --git a/robots.txt b/robots.txt new file mode 100644 index 000000000..76468d8c2 --- /dev/null +++ b/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Disallow: +Allow: / +Sitemap: https://welpo.github.io/tabi/sitemap.xml diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 000000000..76768634c --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,219 @@ + + + + https://welpo.github.io/tabi/ + + + https://welpo.github.io/tabi/archive/ + + + https://welpo.github.io/tabi/blog/ + + + https://welpo.github.io/tabi/blog/comments/ + 2023-07-26 + + + https://welpo.github.io/tabi/blog/custom-font-subset/ + 2023-07-08 + + + https://welpo.github.io/tabi/blog/customise-tabi/ + 2023-08-10 + + + https://welpo.github.io/tabi/blog/javascript/ + 2023-09-01 + + + https://welpo.github.io/tabi/blog/markdown/ + 2023-09-01 + + + https://welpo.github.io/tabi/blog/page/1/ + + + https://welpo.github.io/tabi/blog/page/2/ + + + https://welpo.github.io/tabi/blog/security/ + 2023-07-17 + + + https://welpo.github.io/tabi/blog/shortcodes/ + 2023-08-26 + + + https://welpo.github.io/tabi/blog/toc/ + 2023-09-08 + + + https://welpo.github.io/tabi/ca/ + + + https://welpo.github.io/tabi/ca/archive/ + + + https://welpo.github.io/tabi/ca/blog/ + + + https://welpo.github.io/tabi/ca/blog/comments/ + 2023-07-26 + + + https://welpo.github.io/tabi/ca/blog/custom-font-subset/ + 2023-07-08 + + + https://welpo.github.io/tabi/ca/blog/customise-tabi/ + 2023-08-10 + + + https://welpo.github.io/tabi/ca/blog/javascript/ + 2023-09-01 + + + https://welpo.github.io/tabi/ca/blog/markdown/ + 2023-09-01 + + + https://welpo.github.io/tabi/ca/blog/page/1/ + + + https://welpo.github.io/tabi/ca/blog/page/2/ + + + https://welpo.github.io/tabi/ca/blog/security/ + 2023-07-17 + + + https://welpo.github.io/tabi/ca/blog/shortcodes/ + 2023-08-26 + + + https://welpo.github.io/tabi/ca/blog/toc/ + 2023-09-08 + + + https://welpo.github.io/tabi/ca/projects/ + + + https://welpo.github.io/tabi/ca/projects/chu/ + + + https://welpo.github.io/tabi/ca/projects/nani/ + + + https://welpo.github.io/tabi/ca/projects/spectro/ + + + https://welpo.github.io/tabi/ca/projects/tabi/ + + + https://welpo.github.io/tabi/es/ + + + https://welpo.github.io/tabi/es/archive/ + + + https://welpo.github.io/tabi/es/blog/ + + + https://welpo.github.io/tabi/es/blog/comments/ + 2023-07-26 + + + https://welpo.github.io/tabi/es/blog/custom-font-subset/ + 2023-07-08 + + + https://welpo.github.io/tabi/es/blog/customise-tabi/ + 2023-08-10 + + + https://welpo.github.io/tabi/es/blog/javascript/ + 2023-09-01 + + + https://welpo.github.io/tabi/es/blog/markdown/ + 2023-09-01 + + + https://welpo.github.io/tabi/es/blog/page/1/ + + + https://welpo.github.io/tabi/es/blog/page/2/ + + + https://welpo.github.io/tabi/es/blog/security/ + 2023-07-17 + + + https://welpo.github.io/tabi/es/blog/shortcodes/ + 2023-08-26 + + + https://welpo.github.io/tabi/es/blog/toc/ + 2023-09-08 + + + https://welpo.github.io/tabi/es/projects/ + + + https://welpo.github.io/tabi/es/projects/chu/ + + + https://welpo.github.io/tabi/es/projects/nani/ + + + https://welpo.github.io/tabi/es/projects/spectro/ + + + https://welpo.github.io/tabi/es/projects/tabi/ + + + https://welpo.github.io/tabi/projects/ + + + https://welpo.github.io/tabi/projects/chu/ + + + https://welpo.github.io/tabi/projects/nani/ + + + https://welpo.github.io/tabi/projects/spectro/ + + + https://welpo.github.io/tabi/projects/tabi/ + + + https://welpo.github.io/tabi/tags/ + + + https://welpo.github.io/tabi/tags/funcionalidad/ + + + https://welpo.github.io/tabi/tags/funcionalitat/ + + + https://welpo.github.io/tabi/tags/markdown/ + + + https://welpo.github.io/tabi/tags/security/ + + + https://welpo.github.io/tabi/tags/seguretat/ + + + https://welpo.github.io/tabi/tags/seguridad/ + + + https://welpo.github.io/tabi/tags/shortcodes/ + + + https://welpo.github.io/tabi/tags/showcase/ + + + https://welpo.github.io/tabi/tags/tutorial/ + + diff --git a/skins/blue.css b/skins/blue.css new file mode 100644 index 000000000..bca6d11e9 --- /dev/null +++ b/skins/blue.css @@ -0,0 +1 @@ +:root{--primary-color: #3271E7}[data-theme=dark]{--primary-color: #6cacff} \ No newline at end of file diff --git a/skins/evangelion.css b/skins/evangelion.css new file mode 100644 index 000000000..511c7630a --- /dev/null +++ b/skins/evangelion.css @@ -0,0 +1 @@ +:root{--primary-color: #d12e36}[data-theme=dark]{--primary-color: #c09bd9} \ No newline at end of file diff --git a/skins/indigo_ingot.css b/skins/indigo_ingot.css new file mode 100644 index 000000000..71c936c15 --- /dev/null +++ b/skins/indigo_ingot.css @@ -0,0 +1 @@ +:root{--primary-color: #1460bd}[data-theme=dark]{--primary-color: #e6c212} \ No newline at end of file diff --git a/skins/lavender.css b/skins/lavender.css new file mode 100644 index 000000000..a60fc58b7 --- /dev/null +++ b/skins/lavender.css @@ -0,0 +1 @@ +:root{--primary-color: #9055d8}[data-theme=dark]{--primary-color: #cba2e8} \ No newline at end of file diff --git a/skins/lowcontrast_orange.css b/skins/lowcontrast_orange.css new file mode 100644 index 000000000..3b3cf70b2 --- /dev/null +++ b/skins/lowcontrast_orange.css @@ -0,0 +1 @@ +:root{--primary-color: #f56a00}[data-theme=dark]{--primary-color: #ec984f} \ No newline at end of file diff --git a/skins/lowcontrast_peach.css b/skins/lowcontrast_peach.css new file mode 100644 index 000000000..f3bdf0f90 --- /dev/null +++ b/skins/lowcontrast_peach.css @@ -0,0 +1 @@ +:root{--primary-color: #ffa057}[data-theme=dark]{--primary-color: #ffab7f} \ No newline at end of file diff --git a/skins/lowcontrast_pink.css b/skins/lowcontrast_pink.css new file mode 100644 index 000000000..4f2489270 --- /dev/null +++ b/skins/lowcontrast_pink.css @@ -0,0 +1 @@ +:root{--primary-color: #ee59d2}[data-theme=dark]{--primary-color: #f49ee9} \ No newline at end of file diff --git a/skins/mint.css b/skins/mint.css new file mode 100644 index 000000000..c3c5a34ac --- /dev/null +++ b/skins/mint.css @@ -0,0 +1 @@ +:root{--primary-color: #00804d}[data-theme=dark]{--primary-color: #00b86e} \ No newline at end of file diff --git a/skins/monochrome.css b/skins/monochrome.css new file mode 100644 index 000000000..bfd415955 --- /dev/null +++ b/skins/monochrome.css @@ -0,0 +1 @@ +:root{--primary-color: #727272}[data-theme=dark]{--primary-color: #b3b3b3} \ No newline at end of file diff --git a/skins/red.css b/skins/red.css new file mode 100644 index 000000000..1074ae823 --- /dev/null +++ b/skins/red.css @@ -0,0 +1 @@ +:root{--primary-color: #ca4963}[data-theme=dark]{--primary-color: #ea535f} \ No newline at end of file diff --git a/skins/sakura.css b/skins/sakura.css new file mode 100644 index 000000000..28343a94d --- /dev/null +++ b/skins/sakura.css @@ -0,0 +1 @@ +:root{--primary-color: #D33C5C}[data-theme=dark]{--primary-color: #fabed2} \ No newline at end of file diff --git a/skins/teal.css b/skins/teal.css new file mode 100644 index 000000000..6bd4bf8b8 --- /dev/null +++ b/skins/teal.css @@ -0,0 +1 @@ +:root{--primary-color: #087e96}[data-theme=dark]{--primary-color: #91e0ee} \ No newline at end of file diff --git a/social_icons/LICENSE b/social_icons/LICENSE new file mode 100644 index 000000000..993facc0b --- /dev/null +++ b/social_icons/LICENSE @@ -0,0 +1 @@ +All icons in this directory are downloaded from [FontAwesome](https://fontawesome.com/). They are part of the [free offer](https://fontawesome.com/license/free) and are licensed under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/). \ No newline at end of file diff --git a/social_icons/apple.svg b/social_icons/apple.svg new file mode 100644 index 000000000..d0532d53b --- /dev/null +++ b/social_icons/apple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/bitcoin.svg b/social_icons/bitcoin.svg new file mode 100644 index 000000000..941d9b087 --- /dev/null +++ b/social_icons/bitcoin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/deviantart.svg b/social_icons/deviantart.svg new file mode 100644 index 000000000..7dbd0b627 --- /dev/null +++ b/social_icons/deviantart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/diaspora.svg b/social_icons/diaspora.svg new file mode 100644 index 000000000..55527b53e --- /dev/null +++ b/social_icons/diaspora.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/discord.svg b/social_icons/discord.svg new file mode 100644 index 000000000..f0dfeab51 --- /dev/null +++ b/social_icons/discord.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/discourse.svg b/social_icons/discourse.svg new file mode 100644 index 000000000..343bea650 --- /dev/null +++ b/social_icons/discourse.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/email.svg b/social_icons/email.svg new file mode 100644 index 000000000..85245e206 --- /dev/null +++ b/social_icons/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/ethereum.svg b/social_icons/ethereum.svg new file mode 100644 index 000000000..af202de35 --- /dev/null +++ b/social_icons/ethereum.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/etsy.svg b/social_icons/etsy.svg new file mode 100644 index 000000000..ebc040aad --- /dev/null +++ b/social_icons/etsy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/facebook.svg b/social_icons/facebook.svg new file mode 100644 index 000000000..0afaf7a25 --- /dev/null +++ b/social_icons/facebook.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/github.svg b/social_icons/github.svg new file mode 100644 index 000000000..e32807ad9 --- /dev/null +++ b/social_icons/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/gitlab.svg b/social_icons/gitlab.svg new file mode 100644 index 000000000..b577d3f38 --- /dev/null +++ b/social_icons/gitlab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/google.svg b/social_icons/google.svg new file mode 100644 index 000000000..b3776b0f5 --- /dev/null +++ b/social_icons/google.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/hacker-news.svg b/social_icons/hacker-news.svg new file mode 100644 index 000000000..23e3980f9 --- /dev/null +++ b/social_icons/hacker-news.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/instagram.svg b/social_icons/instagram.svg new file mode 100644 index 000000000..89f63c404 --- /dev/null +++ b/social_icons/instagram.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/linkedin.svg b/social_icons/linkedin.svg new file mode 100644 index 000000000..d54fcf594 --- /dev/null +++ b/social_icons/linkedin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/mastodon.svg b/social_icons/mastodon.svg new file mode 100644 index 000000000..5e12f81ca --- /dev/null +++ b/social_icons/mastodon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/paypal.svg b/social_icons/paypal.svg new file mode 100644 index 000000000..efdc81af0 --- /dev/null +++ b/social_icons/paypal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/pinterest.svg b/social_icons/pinterest.svg new file mode 100644 index 000000000..eb977c2b8 --- /dev/null +++ b/social_icons/pinterest.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/quora.svg b/social_icons/quora.svg new file mode 100644 index 000000000..375d3027a --- /dev/null +++ b/social_icons/quora.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/reddit.svg b/social_icons/reddit.svg new file mode 100644 index 000000000..a8a3a96e7 --- /dev/null +++ b/social_icons/reddit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/rss.svg b/social_icons/rss.svg new file mode 100644 index 000000000..b86288616 --- /dev/null +++ b/social_icons/rss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/skype.svg b/social_icons/skype.svg new file mode 100644 index 000000000..3369aba68 --- /dev/null +++ b/social_icons/skype.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/slack.svg b/social_icons/slack.svg new file mode 100644 index 000000000..0dbc26d18 --- /dev/null +++ b/social_icons/slack.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/snapchat.svg b/social_icons/snapchat.svg new file mode 100644 index 000000000..2cd79ddd8 --- /dev/null +++ b/social_icons/snapchat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/soundcloud.svg b/social_icons/soundcloud.svg new file mode 100644 index 000000000..4724d740a --- /dev/null +++ b/social_icons/soundcloud.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/spotify.svg b/social_icons/spotify.svg new file mode 100644 index 000000000..1d393ba38 --- /dev/null +++ b/social_icons/spotify.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/stack-exchange.svg b/social_icons/stack-exchange.svg new file mode 100644 index 000000000..0a3177f50 --- /dev/null +++ b/social_icons/stack-exchange.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/stack-overflow.svg b/social_icons/stack-overflow.svg new file mode 100644 index 000000000..2ca50c7bd --- /dev/null +++ b/social_icons/stack-overflow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/steam.svg b/social_icons/steam.svg new file mode 100644 index 000000000..b61f37423 --- /dev/null +++ b/social_icons/steam.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/telegram.svg b/social_icons/telegram.svg new file mode 100644 index 000000000..02f48c060 --- /dev/null +++ b/social_icons/telegram.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/twitter.svg b/social_icons/twitter.svg new file mode 100644 index 000000000..0778f7252 --- /dev/null +++ b/social_icons/twitter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/vimeo.svg b/social_icons/vimeo.svg new file mode 100644 index 000000000..d98368e1b --- /dev/null +++ b/social_icons/vimeo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/whatsapp.svg b/social_icons/whatsapp.svg new file mode 100644 index 000000000..d25914255 --- /dev/null +++ b/social_icons/whatsapp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/social_icons/youtube.svg b/social_icons/youtube.svg new file mode 100644 index 000000000..287dca293 --- /dev/null +++ b/social_icons/youtube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 000000000..0cfb3a700 --- /dev/null +++ b/tags/index.html @@ -0,0 +1,2 @@ + + ~/tabi •
All tags
\ No newline at end of file diff --git a/tags/markdown/atom.xml b/tags/markdown/atom.xml new file mode 100644 index 000000000..63a3508bb --- /dev/null +++ b/tags/markdown/atom.xml @@ -0,0 +1,46 @@ + + + + + + This is a web feed + also known as an Atom feed + Subscribe + by copying the URL from the address bar into your newsreader + Visit + to learn more and get started + It's free + website + Recent posts + + + ~/tabi - markdown + tabi is a fast, lightweight, and modern Zola theme with multi-language support, optional JavaScript, and a perfect Lighthouse score. + + + Zola + 2023-09-08T00:00:00+00:00 + https://welpo.github.io/tabi/tags/markdown/atom.xml + + Markdown examples + 2023-01-31T00:00:00+00:00 + 2023-09-01T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/markdown/ + This post showcases some examples of Markdown formatting, including a table, code blocks and tags, quotes, tables, and footnotes. + + + Table of Contents + 2022-11-01T00:00:00+00:00 + 2023-09-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/toc/ + A post showcasing the optional Table of Contents and its options. + + diff --git a/tags/markdown/index.html b/tags/markdown/index.html new file mode 100644 index 000000000..490d37589 --- /dev/null +++ b/tags/markdown/index.html @@ -0,0 +1,2 @@ + + ~/tabi • markdown
markdown
31 January 2023

This post showcases some examples of Markdown formatting, including a table, code blocks and tags, quotes, tables, and footnotes.

Read more →
01 November 2022

A post showcasing the optional Table of Contents and its options.

Read more →
\ No newline at end of file diff --git a/tags/security/atom.xml b/tags/security/atom.xml new file mode 100644 index 000000000..e8da6979a --- /dev/null +++ b/tags/security/atom.xml @@ -0,0 +1,35 @@ + + + + + + This is a web feed + also known as an Atom feed + Subscribe + by copying the URL from the address bar into your newsreader + Visit + to learn more and get started + It's free + website + Recent posts + + + ~/tabi - security + tabi is a fast, lightweight, and modern Zola theme with multi-language support, optional JavaScript, and a perfect Lighthouse score. + + + Zola + 2023-07-17T00:00:00+00:00 + https://welpo.github.io/tabi/tags/security/atom.xml + + Secure by default + 2023-02-22T00:00:00+00:00 + 2023-07-17T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/security/ + tabi has an easily customizable Content Security Policy (CSP) with safe defaults. Get peace of mind and an A+ on Mozilla Observatory. + + diff --git a/tags/security/index.html b/tags/security/index.html new file mode 100644 index 000000000..83716ab55 --- /dev/null +++ b/tags/security/index.html @@ -0,0 +1,2 @@ + + ~/tabi • security
security
22 February 2023

tabi has an easily customizable Content Security Policy (CSP) with safe defaults. Get peace of mind and an A+ on Mozilla Observatory.

Read more →
\ No newline at end of file diff --git a/tags/shortcodes/atom.xml b/tags/shortcodes/atom.xml new file mode 100644 index 000000000..157e6f8c6 --- /dev/null +++ b/tags/shortcodes/atom.xml @@ -0,0 +1,35 @@ + + + + + + This is a web feed + also known as an Atom feed + Subscribe + by copying the URL from the address bar into your newsreader + Visit + to learn more and get started + It's free + website + Recent posts + + + ~/tabi - shortcodes + tabi is a fast, lightweight, and modern Zola theme with multi-language support, optional JavaScript, and a perfect Lighthouse score. + + + Zola + 2023-08-26T00:00:00+00:00 + https://welpo.github.io/tabi/tags/shortcodes/atom.xml + + Custom shortcodes + 2023-02-19T00:00:00+00:00 + 2023-08-26T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/shortcodes/ + This theme includes some useful custom shortcodes that you can use to enhance your posts. Whether you want to display images that adapt to light and dark themes, or format a professional-looking reference section, these custom shortcodes have got you covered. + + diff --git a/tags/shortcodes/index.html b/tags/shortcodes/index.html new file mode 100644 index 000000000..2da36917e --- /dev/null +++ b/tags/shortcodes/index.html @@ -0,0 +1,2 @@ + + ~/tabi • shortcodes
shortcodes
19 February 2023

This theme includes some useful custom shortcodes that you can use to enhance your posts. Whether you want to display images that adapt to light and dark themes, or format a professional-looking reference section, these custom shortcodes have got you covered.

Read more →
\ No newline at end of file diff --git a/tags/showcase/atom.xml b/tags/showcase/atom.xml new file mode 100644 index 000000000..b35bfccde --- /dev/null +++ b/tags/showcase/atom.xml @@ -0,0 +1,112 @@ + + + + + + This is a web feed + also known as an Atom feed + Subscribe + by copying the URL from the address bar into your newsreader + Visit + to learn more and get started + It's free + website + Recent posts + + + ~/tabi - showcase + tabi is a fast, lightweight, and modern Zola theme with multi-language support, optional JavaScript, and a perfect Lighthouse score. + + + Zola + 2023-09-08T00:00:00+00:00 + https://welpo.github.io/tabi/tags/showcase/atom.xml + + Customise tabi with skins and a default theme + 2023-08-09T00:00:00+00:00 + 2023-08-10T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/customise-tabi/ + Learn how to customise tabi using skins and setting a default theme, making your site uniquely yours. + + + Add comments to your posts with these 4 comment systems + 2023-07-14T00:00:00+00:00 + 2023-07-26T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/comments/ + Discover how to enable a comments section on your posts using giscus, utterances, Hyvor Talk, or Isso, enabling reader interaction and feedback. + + + Optimise loading times with a custom font subset + 2023-04-29T00:00:00+00:00 + 2023-07-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/custom-font-subset/ + Learn how to create a custom subset that only includes the necessary glyphs. + + + Secure by default + 2023-02-22T00:00:00+00:00 + 2023-07-17T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/security/ + tabi has an easily customizable Content Security Policy (CSP) with safe defaults. Get peace of mind and an A+ on Mozilla Observatory. + + + Custom shortcodes + 2023-02-19T00:00:00+00:00 + 2023-08-26T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/shortcodes/ + This theme includes some useful custom shortcodes that you can use to enhance your posts. Whether you want to display images that adapt to light and dark themes, or format a professional-looking reference section, these custom shortcodes have got you covered. + + + Markdown examples + 2023-01-31T00:00:00+00:00 + 2023-09-01T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/markdown/ + This post showcases some examples of Markdown formatting, including a table, code blocks and tags, quotes, tables, and footnotes. + + + No mandatory JavaScript + 2023-01-06T00:00:00+00:00 + 2023-09-01T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/javascript/ + JavaScript is only used when HTML and CSS aren't enough. + + + Table of Contents + 2022-11-01T00:00:00+00:00 + 2023-09-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/toc/ + A post showcasing the optional Table of Contents and its options. + + diff --git a/tags/showcase/index.html b/tags/showcase/index.html new file mode 100644 index 000000000..bb3986b36 --- /dev/null +++ b/tags/showcase/index.html @@ -0,0 +1,2 @@ + + ~/tabi • showcase
showcase
09 August 2023

Learn how to customise tabi using skins and setting a default theme, making your site uniquely yours.

Read more →
14 July 2023

Discover how to enable a comments section on your posts using giscus, utterances, Hyvor Talk, or Isso, enabling reader interaction and feedback.

Read more →
29 April 2023

Learn how to create a custom subset that only includes the necessary glyphs.

Read more →
22 February 2023

tabi has an easily customizable Content Security Policy (CSP) with safe defaults. Get peace of mind and an A+ on Mozilla Observatory.

Read more →
19 February 2023

This theme includes some useful custom shortcodes that you can use to enhance your posts. Whether you want to display images that adapt to light and dark themes, or format a professional-looking reference section, these custom shortcodes have got you covered.

Read more →
31 January 2023

This post showcases some examples of Markdown formatting, including a table, code blocks and tags, quotes, tables, and footnotes.

Read more →
06 January 2023

JavaScript is only used when HTML and CSS aren't enough.

Read more →
01 November 2022

A post showcasing the optional Table of Contents and its options.

Read more →
\ No newline at end of file diff --git a/tags/tutorial/atom.xml b/tags/tutorial/atom.xml new file mode 100644 index 000000000..e6a4cdf61 --- /dev/null +++ b/tags/tutorial/atom.xml @@ -0,0 +1,79 @@ + + + + + + This is a web feed + also known as an Atom feed + Subscribe + by copying the URL from the address bar into your newsreader + Visit + to learn more and get started + It's free + website + Recent posts + + + ~/tabi - tutorial + tabi is a fast, lightweight, and modern Zola theme with multi-language support, optional JavaScript, and a perfect Lighthouse score. + + + Zola + 2023-09-08T00:00:00+00:00 + https://welpo.github.io/tabi/tags/tutorial/atom.xml + + Customise tabi with skins and a default theme + 2023-08-09T00:00:00+00:00 + 2023-08-10T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/customise-tabi/ + Learn how to customise tabi using skins and setting a default theme, making your site uniquely yours. + + + Add comments to your posts with these 4 comment systems + 2023-07-14T00:00:00+00:00 + 2023-07-26T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/comments/ + Discover how to enable a comments section on your posts using giscus, utterances, Hyvor Talk, or Isso, enabling reader interaction and feedback. + + + Optimise loading times with a custom font subset + 2023-04-29T00:00:00+00:00 + 2023-07-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/custom-font-subset/ + Learn how to create a custom subset that only includes the necessary glyphs. + + + No mandatory JavaScript + 2023-01-06T00:00:00+00:00 + 2023-09-01T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/javascript/ + JavaScript is only used when HTML and CSS aren't enough. + + + Table of Contents + 2022-11-01T00:00:00+00:00 + 2023-09-08T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/toc/ + A post showcasing the optional Table of Contents and its options. + + diff --git a/tags/tutorial/index.html b/tags/tutorial/index.html new file mode 100644 index 000000000..10c390f8b --- /dev/null +++ b/tags/tutorial/index.html @@ -0,0 +1,2 @@ + + ~/tabi • tutorial
tutorial
09 August 2023

Learn how to customise tabi using skins and setting a default theme, making your site uniquely yours.

Read more →
14 July 2023

Discover how to enable a comments section on your posts using giscus, utterances, Hyvor Talk, or Isso, enabling reader interaction and feedback.

Read more →
29 April 2023

Learn how to create a custom subset that only includes the necessary glyphs.

Read more →
06 January 2023

JavaScript is only used when HTML and CSS aren't enough.

Read more →
01 November 2022

A post showcasing the optional Table of Contents and its options.

Read more →
\ No newline at end of file