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

404

The page you've requested seems to be missing or hasn't been translated into your language yet. Check the URL for errors or go back 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/about/index.html b/about/index.html new file mode 100644 index 000000000..6ac475c00 --- /dev/null +++ b/about/index.html @@ -0,0 +1 @@ +~/tabi • About

About

Welcome to the demo of tabi, a theme for Zola, a fast static site generator.

tabi is the creation of Óscar Fernández (welpo on GitHub), initially designed for his personal site. It is a feature-rich, modern theme that provides sane (and safe) defaults.

Looking for detailed instructions or tips on using tabi? The blog and archive sections feature the theme's documentation, offering a variety of articles from feature overviews to step-by-step guides.

Features

tabi supports multiple languages, customisable appearance, comment integrations, and much more, all with an emphasis on performance (all JavaScript is optional) and security.

Contributing

Contributions are much appreciated! We appreciate bug reports, improvements to translations or documentation (however minor), feature requests… Check out the Contributing Guidelines to learn how you can help. Thank you!

License

The code is available under the MIT license.

\ No newline at end of file diff --git a/archive/index.html b/archive/index.html new file mode 100644 index 000000000..7c98a4024 --- /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..9704cf7f8 --- /dev/null +++ b/atom.xml @@ -0,0 +1,114 @@ + + + + + This is a web feed, also known as an Atom feed. Subscribe by copying the URL from the address bar into your newsreader. Visit About Feeds to learn more and get started. It's free. + Visit 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-12T00:00:00+00:00 + https://welpo.github.io/tabi/atom.xml + + Lost in Translation? Not with tabi's Multilingual Capabilities + 2023-09-12T00:00:00+00:00 + 2023-09-12T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/faq-languages/ + Master the art of serving a global audience through tabi's built-in multilingual features. Learn how to change the default language, add multilingual support, and contribute your own translations. + + + 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..0b80713e6 --- /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..7b9a2beda --- /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..09a2dc72f --- /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/faq-languages/index.html b/blog/faq-languages/index.html new file mode 100644 index 000000000..10d11e101 --- /dev/null +++ b/blog/faq-languages/index.html @@ -0,0 +1,13 @@ +~/tabi • Lost in Translation? Not with tabi's Multilingual Capabilities

Lost in Translation? Not with tabi's Multilingual Capabilities

To broaden your reach to a global audience, tabi streamlines the process of building multilingual websites. In this guide, we'll walk you through everything you need to know—from setting a default language for your site to contributing your own translations. Let's get started!

Frequently Asked Questions

What languages does tabi support?

tabi supports the following languages:

  • Catalan
  • Chinese (Simplified)
  • English
  • French
  • German
  • Hindi
  • Italian
  • Japanese
  • Korean
  • Portuguese (European)
  • Russian
  • Spanish
  • Ukranian

For an always up to date list of supported languages, refer to the i18n directory in the tabi repository.

How do I set a default language for my site?

You can set the default language for your site by defining the default_language variable in your config.toml file.

For instance, if you want (Simplified) Chinese to be the primary language, simply add this line to config.toml:

base_url = "https://welpo.github.io/tabi"
+title = "~/tabi"
+default_language = "zh"
+

All of tabi's text strings will be translated to that language, if supported.

How does tabi handle multilingual support?

Zola automatically generates URLs for each non-default language like this: {base_url}/{language_code}/{post}.

tabi facilitates the navigation between languages by adding a language switcher to the navigation bar (only shown when there's more than one language enabled).

If you scroll up to the navigation bar, you'll see the language switcher (the globe icon). Hovering over it will display a dropdown with the available languages. Clicking on a language's name will take you to the same page in that language.

If a specific page is not available in a language, tabi will display a 404 page with the text:

The page you've requested seems to be missing or hasn't been translated into your language yet. Check the URL for errors or go back to the homepage.

This text will be shown once for each language enabled on your site. You can see this page in action here.

How do I enable multilingual support?

To enable multilingual support, you need to set the languages variable in your config.toml file. For example, if want an English-default site with support for Hindi and Spanish, you can set up your config.toml like so:

base_url = "https://example.com"
+title = "My Site"
+default_language = "en"
+
+[languages.hi]
+title = "मेरी वेबसाइट"
+
+[languages.es]
+title = "Mi web"
+

On each language's section, you can set other variables like taxonomies, description, whether to generate a feed… Refer to Zola's multilingual support documentation for more information.

What are these two letter codes?

The two letter codes are ISO 639-1 language codes. They are used to identify languages in a standardised way.

tabi uses these codes to allow navigation between languages and translate the theme.

How do I customise or override a specific text string on my website?

tabi looks for the strings files in the following order. $base_directory is where your Zola site resides (where config.toml is stored):

  1. $base_directory + "i18n"
  2. $base_directory + "themes/tabi/i18n"

So if you create i18n/en.toml in your base directory, tabi will read the strings from that file instead of the default English strings. You can do this for any language, supported or not.

Make sure to copy the entire file for that language first, or the theme will fall back to the default English strings.

What happens if a translation is missing or incomplete?

If a string is not found in the language file, tabi will fall back to the default English string.

My language is not supported. Can I contribute a translation?

Please do! We are always looking to add support for more languages. You can contribute a translation by creating a pull request in the tabi repository.

You can use the English file as a base to translate the strings to your language. Please make sure to follow the same structure.

The file should be named after the two letter code of your language, and should be a TOML file. For example, if you want to add support for Swahili, you can create a file named sw.toml in the i18n directory.

Note: when testing your translation, you might need to restart zola serve to see the changes, as Zola doesn't always detect changes in the TOML files.

I've found an error in a translation. How do I fix it?

If you find an error in a translation, you can create an issue or a pull request in the tabi repository.

How do I update the translations after a theme update?

If you didn't customise the translations, simply updating the theme will update the translations.

If you did, you will need to manually update the translations. You can do this by copying the new strings from the corresponding files, and pasting them in your custom file.

Does tabi translate my content?

No. tabi only translates the theme's text strings. You will need to translate your content yourself.

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

Blog

12 September 2023

Lost in Translation? Not with tabi's Multilingual Capabilities

Master the art of serving a global audience through tabi's built-in multilingual features. Learn how to change the default language, add multilingual support, and contribute your own translations.

Read more →
09 August 2023

Customise tabi with skins and a default theme

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

Read more →
14 July 2023

Add comments to your posts with these 4 comment systems

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

Optimise loading times with a custom font subset

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

Read more →
22 February 2023

Secure by default

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/blog/javascript/index.html b/blog/javascript/index.html new file mode 100644 index 000000000..e3aee5ef7 --- /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..20c949343 --- /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..f825c993e --- /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..352d36994 --- /dev/null +++ b/blog/page/2/index.html @@ -0,0 +1 @@ +~/tabi • Blog

Blog

19 February 2023

Custom 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.

Read more →
31 January 2023

Markdown examples

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

Read more →
06 January 2023

No mandatory JavaScript

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

Read more →
01 November 2022

Table of Contents

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..e2fff22bb --- /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..e73d37b75 --- /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..a87b6769e --- /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/about/index.html b/ca/about/index.html new file mode 100644 index 000000000..203062255 --- /dev/null +++ b/ca/about/index.html @@ -0,0 +1 @@ +~/tabi • Sobre mi

Sobre mi

Benvingut a la demo de tabi, un tema per a Zola, un generador de llocs web estàtics rapidíssim.

tabi és una obra d'Óscar Fernández (welpo a GitHub), inicialment creat per al seu lloc personal. És un tema modern i ple de funcionalitats que ofereix configuracions predefinides raonables i segures.

Busques instruccions detallades o consells sobre com utilitzar tabi? Les seccions del blog i de l'arxiu contenen la documentació del tema, que inclou des de mostres de funcions fins a guies detallades.

Característiques

tabi ofereix suport per a diversos idiomes, aparença personalitzable, integració de comentaris, i molt més, tot amb un enfocament en el rendiment (tot el JavaScript és opcional) i la seguretat.

Contribucions

Tota aportació és benvinguda! Agraïm els informes d'errors, millores en traduccions o documentació (per mínimes que siguin), sol·licituds de noves funcions… Consulta les Pautes de Contribució per saber com pots contribuir. Gràcies!

Llicència

El codi està disponible sota la llicència MIT.

\ No newline at end of file diff --git a/ca/archive/index.html b/ca/archive/index.html new file mode 100644 index 000000000..69f2b3cb7 --- /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..479ee7d54 --- /dev/null +++ b/ca/atom.xml @@ -0,0 +1,114 @@ + + + + + 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 About Feeds per aprendre més i començar. És gratuït. + Visita 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-12T00:00:00+00:00 + https://welpo.github.io/tabi/ca/atom.xml + + Lost in Translation? Explora les capacitats multilingües de tabi + 2023-09-12T00:00:00+00:00 + 2023-09-12T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/faq-languages/ + Descobreix com tabi t'ajuda a connectar amb una audiència global gràcies a les seves funcions multilingües. Aprèn a canviar la llengua per defecte, afegir més llengües i aportar les teves pròpies traduccions. + + + 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..a82a01940 --- /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..eed95904a --- /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..b1cfba899 --- /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/faq-languages/index.html b/ca/blog/faq-languages/index.html new file mode 100644 index 000000000..72ebdd191 --- /dev/null +++ b/ca/blog/faq-languages/index.html @@ -0,0 +1,13 @@ +~/tabi • Lost in Translation? Explora les capacitats multilingües de tabi

Lost in Translation? Explora les capacitats multilingües de tabi

tabi simplifica el procés de creació de llocs web multilingües perquè puguis connectar amb una audiència global. En aquesta guia, t'explicarem tot el que necessites saber, des de com configurar la llengua principal en el teu lloc fins a com contribuir amb les teves pròpies traduccions. Comencem!

Preguntes Freqüents

Quines llengües admet tabi?

tabi admet les següents llengües:

  • Alemany
  • Anglès
  • Català
  • Coreà
  • Espanyol
  • Francès
  • Hindi
  • Italià
  • Japonès
  • Portuguès (Europeu)
  • Rus
  • Ucraïnès
  • Xinès (Simplificat)

Per a una llista sempre actualitzada de llengües suportades, consulta la carpeta i18n en el repositori de tabi.

Com estableixo la llengua predeterminada del meu lloc?

Pots definir la llengua principal del teu lloc configurant la variable default_language a config.toml.

Per exemple, si vols que la llengua principal sigui el Xinès, simplement afegeix aquesta línia a l'arxiu config.toml:

base_url = "https://welpo.github.io/tabi"
+title = "~/tabi"
+default_language = "zh"
+

tabi es traduirà a aquesta llengua, si està suportada.

Com gestiona tabi el suport multilingüe?

Zola genera automàticament URLs per a cada llengua que no sigui la predeterminada de la següent manera: {base_url}/{codi_idioma}/{post}.

tabi facilita la navegació entre llengües afegint un commutador de llengua en la barra de navegació (que només es mostra quan hi ha més d'una llengua habilitada).

Si pujes a la barra de navegació, veuràs el commutador de llengua. En passar el cursor sobre ell, es mostrarà un desplegable amb les llengües disponibles. Si fas clic en el nom d'una llengua, et portarà a la mateixa pàgina en aquesta llengua.

Si una pàgina específica no està disponible en una llengua, tabi mostrarà una pàgina 404 amb el text:

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.

Aquest text es mostrarà una vegada per cada llengua activada en el teu lloc. Pots veure aquesta pàgina en acció aquí.

Com activo el suport multilingüe?

Per habilitar el suport per a diverses llengües, necessites configurar la variable languages a config.toml. Per exemple, si vols un lloc amb anglès com a llengua principal que també admeti hindi i espanyol, pots configurar el teu config.toml de la següent manera:

base_url = "https://example.com"
+title = "My Site"
+default_language = "en"
+
+[languages.hi]
+title = "मेरी वेबसाइट"
+
+[languages.es]
+title = "El meu web"
+

En cada secció de llengua pots establir altres variables com taxonomies, description… Consulta la documentació de suport multilingüe de Zola per a més informació.

Què són aquests codis de dues lletres?

Els codis de dues lletres són codis d'idioma ISO 639-1, que serveixen per identificar idiomes d'una manera estandarditzada.

tabi utilitza aquests codis per permetre la navegació entre idiomes i traduir el tema.

Com personalitzo o reemplaço una cadena de text específica al meu lloc web?

tabi cerca els fitxers de cadenes en el següent ordre. $base_directory és on resideix el teu lloc Zola (allà on està config.toml):

  1. $base_directory + "i18n"
  2. $base_directory + "themes/tabi/i18n"

Per tant, si crees i18n/ca.toml al teu directori base, tabi llegirà les cadenes de text d'aquest fitxer en lloc de les cadenes predeterminades en català. Pots fer això per a qualsevol idioma, suportat o no.

Assegura't de copiar tot el fitxer per a aquest idioma primer, o el tema utilitzarà l'anglès per les claus que faltin.

Què passa si falta una traducció o està incompleta?

Si una cadena no es troba en el fitxer d'idioma, tabi recorrerà a la cadena predeterminada en català.

El meu idioma no està suportat. Puc contribuir amb una traducció?

És clar! Sempre estem buscant afegir suport per a més idiomes. Pots contribuir amb una traducció creant una Pull Request al repositori de tabi.

Pots utilitzar el fitxer en català com a base per traduir les cadenes al teu idioma. Assegura't de mantenir la mateixa estructura.

El fitxer ha de portar el nom del codi de dues lletres del teu idioma i ha de ser un fitxer TOML. Per exemple, si vols afegir suport per al suahili, pots crear un fitxer anomenat sw.toml al directori i18n.

Nota: quan provis la teva traducció, és possible que necessitis reiniciar zola serve per veure els canvis, ja que Zola no sempre detecta canvis en els fitxers TOML.

He trobat un error en una traducció. Com el corregeixo?

Si trobes un error en una traducció, pots crear un problema o una sol·licitud d'extracció al repositori de tabi.

Com actualitzo les traduccions després d'una actualització del tema?

Si no vas personalitzar les traduccions, simplement actualitza el tema.

Si ho vas fer, hauràs d'actualitzar manualment les traduccions. Pots fer-ho copiant les noves cadenes dels fitxers corresponents i enganxant-les al teu fitxer personalitzat.

tabi tradueix el meu contingut?

No. tabi només tradueix les cadenes de text del tema. Hauràs de traduir el teu contingut tu mateix.

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

Blog

12 de setembre 2023

Lost in Translation? Explora les capacitats multilingües de tabi

Descobreix com tabi t'ajuda a connectar amb una audiència global gràcies a les seves funcions multilingües. Aprèn a canviar la llengua per defecte, afegir més llengües i aportar les teves pròpies traduccions.

Llegir més →
09 d’agost 2023

Personalitza el color de tabi i el tema per defecte

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

Afegeix comentaris a les teves publicacions amb aquestes 4 plataformes

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

Optimitza la càrrega amb un subconjunt de font personalitzat

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

Llegir més →
22 de febrer 2023

Seguretat per defecte

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/blog/javascript/index.html b/ca/blog/javascript/index.html new file mode 100644 index 000000000..890e8adae --- /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..8df859d07 --- /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..6e9655471 --- /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..7f0bb5316 --- /dev/null +++ b/ca/blog/page/2/index.html @@ -0,0 +1 @@ +~/tabi • Blog

Blog

19 de febrer 2023

Shortcodes personalitzats

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

Exemples de 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.

Llegir més →
06 de gener 2023

Sense JavaScript obligatori

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

Llegir més →
01 de novembre 2022

Taula de contingut

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..dfbe095d7 --- /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..022452ec5 --- /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..ba01615a9 --- /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..95cfe5a90 --- /dev/null +++ b/ca/index.html @@ -0,0 +1 @@ +~/tabi

Publicacions recents

12 de setembre 2023

Lost in Translation? Explora les capacitats multilingües de tabi

Descobreix com tabi t'ajuda a connectar amb una audiència global gràcies a les seves funcions multilingües. Aprèn a canviar la llengua per defecte, afegir més llengües i aportar les teves pròpies traduccions.

Llegir més →
09 d’agost 2023

Personalitza el color de tabi i el tema per defecte

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

Afegeix comentaris a les teves publicacions amb aquestes 4 plataformes

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

Optimitza la càrrega amb un subconjunt de font personalitzat

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

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..6585a780d --- /dev/null +++ b/ca/projects/chu/index.html @@ -0,0 +1 @@ +~/tabi • chu

chu

    chu és una aplicació per pujar arxius creada amb Python, Flask i uWSGI. Aquest projecte integra diverses tècniques d'optimització per fer que la pujada d'arxius sigui no només més senzilla, sinó també més intel·ligent.

    Veure a GitHub

    Característiques tècniques

    • Eficiència a través de la compressió: Utilitza compressió Lepton JPEG i optipng per assolir un estalvi d'espai d'fins al 22%.

    • Mesures de seguretat: Implementa límits de grandària de pujada, controls d'extensió i autenticació amb contrasenya.

    • Facilitat d'ús: Genera una URL per a cada arxiu pujat amb èxit, permetent noms d'arxiu aleatoris o definits per l'usuari.

    • Eliminació de metadades: Elimina les metadades dels arxius per millorar la privacitat.

    • Grandària de pujada configurable: Ofereix la possibilitat d'establir límits a la grandària dels arxius pujats.

    • Controls específics d'extensió: Proporciona configuracions per restringir les pujades a extensions d'arxiu específiques.

    • Resposta d'URL directa: Després de cada pujada exitosa, retorna una URL que apunta a l'arxiu.

    \ No newline at end of file diff --git a/ca/projects/index.html b/ca/projects/index.html new file mode 100644 index 000000000..aeee7c1af --- /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 suport multilingüe.
    img/chu.webp

    chu

    Aplicació Flask per pujar arxius de manera segura, amb eliminació de metadades, compressió, protecció amb contrasenya i més.
    img/nani.webp

    nani

    Script Bash per crear URLs públiques a partir d'arxius o text en servidors remots.
    img/spectro.webp

    spectro

    Script en Bash per generar espectrogrames, comparar-los, pujar-los a Imgur i proporcionar les URL corresponents per compartir.
    \ 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..d1154e90a --- /dev/null +++ b/ca/projects/nani/index.html @@ -0,0 +1,35 @@ +~/tabi • nani

    nani

      Si treballes en un servidor remot, saps que compartir arxius amb altres persones pot ser un procés feixuc. nani és un script en Bash dissenyat per simplificar aquesta tasca. Amb una sola comanda, pots convertir arxius locals o URLs en enllaços accessibles, facilitant el procés de compartir directament des del teu servidor.

      Veure a GitHub

      Característiques clau

      • Tot tipus d'arxius: gestiona directoris, arxius FLAC, arxius de text i fins i tot URLs a vídeos.

      • Personalitzable: adapta els ajustos editant l'script o un arxiu de configuració.

      • Notificacions: notificacions a l'escriptori i integració amb el portaretrats per a una millor experiència.

      Inici ràpid

      1. Col·loca nani en un directori dins del teu PATH.
      2. Fes que l'script sigui executable.

      Per a passos d'instal·lació més detallats, consulta la documentació completa.

      Ús

      nani Ruta/A/foto.png
      +https://example.com/nani/hjRGLZB.png
      +

      Compartir un directori mantenint el seu nom original:

      nani -o Ruta/A/Directori
      +https://example.com/nani/Directori.zip
      +

      Pots configurar diverses opcions a través dels paràmetres. Aquí tens la sortida de nani --help:

      Usage: nani [options] <infile>
      +Provides public URL from input.
      +
      +Input handling:
      +    Directory                       Will be stored using zip (or symbolic link)
      +    FLAC                            Can be transcoded to MP3
      +    Text (html, php...)             Extension can be set to .txt
      +    Other files                     New copy/hard link/symbolic link at output directory
      +    URL to video (e.g: youtube)     Downloaded using yt-dlp
      +    Other URLs                      Downloaded using wget
      +
      +Modify the first lines of the script to change how nani behaves: quiet mode,
      +enabling/disabling transcoding, length of the string, extension truncation...
      +
      +Settings and options:
      +    -a, --alias      Revert the hard link setting
      +    -c, --cleanup    Remove all files on /nani/ except index.html
      +    -h, --help       Display this help and exit
      +    -i, --insert     Open nano to enter text. Saved in output directory as .txt
      +    -k, --keep       Output dir becomes /nani/k/, to set different cleanup rules
      +    -l, --list       List files in output directory /nani/
      +    -n, --name       Use custom name (e.g. nani -n DesiredName <file>)
      +    -N, --notify     Revert the notify option
      +    -o, --original   Preserve original file name
      +    -p, --push       Send push notification
      +    -q, --quiet      Revert the quiet setting
      +    -s, --string     Force a certain string length (e.g. nani -s 32 <file>)
      +    -t, --transcode  Revert the transcode setting
      +    -x, --xclip      Revert the xclip setting
      +    -y, --symbolic   Create a symbolic link for files and directories
      +
      \ 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..e820e69ec --- /dev/null +++ b/ca/projects/spectro/index.html @@ -0,0 +1,24 @@ +~/tabi • spectro

      spectro

        Transforma fitxers d'àudio en espectrogrames amb format BBCode de manera senzilla amb spectro. Aquest script en Bash suporta una àmplia varietat de formats d'àudio com Ogg, MP3, FLAC, AAC i més.

        Espectrograma de Jardin du Sommeil Chant d'Amour Sur La Nuit Grandissante, de Tourette

        Veure a GitHub

        Característiques

        • Suport de múltiples formats: Ogg, MP3, FLAC, AAC, ape, WMA, MP4 i WAV.
        • Sortida en BBCode: Genera automàticament BBCode per a fòrums o llocs web.
        • Processament per lots: Pot gestionar directoris sencers o fitxers específics.
        • Extensible: Opcions per a personalització, incloent l'emmagatzemament local i la pujada a Imgur.

        Inici ràpid

        1. Descarrega spectro en un directori dins del teu PATH, per exemple, ~/bin.
        2. Atorga permisos d'execució: chmod +x spectro.

        Ús

        Generar BBCode per a un directori complet:

        spectro Path/To/Directory/
        +

        Sortida:

        [hide=Spectrograms][size=3]
        +[url=https://i.imgur.com/ClzzbP8.png]01. Jardin Du Sommeil.flac[/url]
        +[/size][/hide]
        +

        Generar BBCode per a fitxers específics:

        spectro arxiu1.flac arxiu2.mp3
        +

        Opcions addicionals i configuracions estan disponibles. Consulta spectro --help:

        Usage: spectro [options] <audio_files>
        +Generate BBCode-formatted spectrograms from audio files.
        +
        +Options:
        +    -c, --compare     Create a .gif comparison of spectrograms (requires ImageMagick)
        +    -d, --double      Create both zoomed and full spectrograms
        +    -h, --help        Display this help and exit
        +    -l, --local       Save spectrograms locally
        +    -o, --optipng     Reverse optipng setting
        +    -p, --parallel    Compatible with 'parallel'
        +    -q, --quiet       Suppress 'Uploading' text
        +    -s, --sha         Display SHA value
        +    -t, --text        Use [url] or [img] tags
        +    -z, --zoom        Create zoomed-in spectrogram
        +
        +Examples:
        +    spectro -ol DirectoryWithMusic/
        +    printf "[hide=Spectrograms][size=3]" && ls | parallel -k spectro -p; printf "[/size][/hide]"
        +
        \ 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..32c0dc660 --- /dev/null +++ b/ca/projects/tabi/index.html @@ -0,0 +1 @@ +~/tabi • tabi

        tabi

          tabi és un tema modern i ric en característiques per a Zola, un generador de llocs web estàtics molt ràpid.

          Modes clar i fosc de tabi

          Veure a GitHub

          Característiques

          Pràctiques de desenvolupament

          • Conventional Commits i Gitmoji: els missatges de commit segueixen formats estandarditzats per facilitar la llegibilitat.

          • Seguiment d'incidències: cada error o nova funcionalitat té el seu propi tiquet, que s'enllaça amb els commits de codi i PRs o problemes relacionats.

          • Comentaris detallats: els tiquets es documenten amb imatges, vídeos i descripcions detallades per facilitar una comunicació i resolució de problemes efectives.

          • Referències creuades: enllacem tots els tiquets amb els commits de codi, pull requests o problemes relacionats per a una traçabilitat completa.

          Evolució del projecte

          tabi va néixer com a disseny per al meu lloc web personal, osc.garden. Malgrat les seves arrels personals, des del principi es van implementar bones pràctiques per assegurar la qualitat i la mantenibilitat. Des d'aleshores, el tema ha aconseguit atraure una comunitat activa de col·laboradors a GitHub.

          Inicia el teu recorregut com a escriptor amb tabi

          Tens alguna cosa a dir. Potser vols parlar sobre com els lingüistes encara no han acordat una definició de "paraula", o sobre la teva experiència explorant els diferents palos del flamenc, o de com vas aconseguir resoldre un error d'un projecte de codi obert popular.

          tabi t'ofereix la base ideal per al teu espai d'escriptura, permetent-te centrar-te en les teves paraules mentre Zola i tabi s'encarreguen de l'aspecte tècnic. Submergeix-te en el món dels blogs amb un sistema que fa que cada publicació sigui un plaer escriure i llegir. La teva veu té valor; comparteix-la amb el món.

          \ 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..57b869974 --- /dev/null +++ b/ca/tags/funcionalitat/atom.xml @@ -0,0 +1,114 @@ + + + + + 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 About Feeds per aprendre més i començar. És gratuït. + Visita 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-12T00:00:00+00:00 + https://welpo.github.io/tabi/ca/tags/funcionalitat/atom.xml + + Lost in Translation? Explora les capacitats multilingües de tabi + 2023-09-12T00:00:00+00:00 + 2023-09-12T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/faq-languages/ + Descobreix com tabi t'ajuda a connectar amb una audiència global gràcies a les seves funcions multilingües. Aprèn a canviar la llengua per defecte, afegir més llengües i aportar les teves pròpies traduccions. + + + 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..72d85acf0 --- /dev/null +++ b/ca/tags/funcionalitat/index.html @@ -0,0 +1 @@ +~/tabi • funcionalitat

          funcionalitat

          12 September 2023

          Lost in Translation? Explora les capacitats multilingües de tabi

          Descobreix com tabi t'ajuda a connectar amb una audiència global gràcies a les seves funcions multilingües. Aprèn a canviar la llengua per defecte, afegir més llengües i aportar les teves pròpies traduccions.

          Read more →
          09 August 2023

          Personalitza el color de tabi i el tema per defecte

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

          Read more →
          14 July 2023

          Afegeix comentaris a les teves publicacions amb aquestes 4 plataformes

          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.

          Read more →
          29 April 2023

          Optimitza la càrrega amb un subconjunt de font personalitzat

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

          Read more →
          22 February 2023

          Seguretat per defecte

          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.

          Read more →
          19 February 2023

          Shortcodes personalitzats

          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.

          Read more →
          31 January 2023

          Exemples de 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.

          Read more →
          06 January 2023

          Sense JavaScript obligatori

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

          Read more →
          01 November 2022

          Taula de contingut

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

          Read more →
          \ No newline at end of file diff --git a/ca/tags/index.html b/ca/tags/index.html new file mode 100644 index 000000000..1f920c40a --- /dev/null +++ b/ca/tags/index.html @@ -0,0 +1 @@ +~/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..78fd9e6c0 --- /dev/null +++ b/ca/tags/markdown/atom.xml @@ -0,0 +1,37 @@ + + + + + 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 About Feeds per aprendre més i començar. És gratuït. + Visita 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..ba8b678b0 --- /dev/null +++ b/ca/tags/markdown/index.html @@ -0,0 +1 @@ +~/tabi • markdown

          markdown

          31 January 2023

          Exemples de 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.

          Read more →
          01 November 2022

          Taula de contingut

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

          Read more →
          \ No newline at end of file diff --git a/ca/tags/preguntes-frequents/atom.xml b/ca/tags/preguntes-frequents/atom.xml new file mode 100644 index 000000000..138c2ae07 --- /dev/null +++ b/ca/tags/preguntes-frequents/atom.xml @@ -0,0 +1,26 @@ + + + + + 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 About Feeds per aprendre més i començar. És gratuït. + Visita la web + Publicacions recents + ~/tabi - Preguntes Freqüents + tabi és un tema de Zola ràpid, lleuger i modern amb JavaScript opcional i una puntuació perfecta a Lighthouse. + + + Zola + 2023-09-12T00:00:00+00:00 + https://welpo.github.io/tabi/ca/tags/preguntes-frequents/atom.xml + + Lost in Translation? Explora les capacitats multilingües de tabi + 2023-09-12T00:00:00+00:00 + 2023-09-12T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/faq-languages/ + Descobreix com tabi t'ajuda a connectar amb una audiència global gràcies a les seves funcions multilingües. Aprèn a canviar la llengua per defecte, afegir més llengües i aportar les teves pròpies traduccions. + + diff --git a/ca/tags/preguntes-frequents/index.html b/ca/tags/preguntes-frequents/index.html new file mode 100644 index 000000000..a862d2f20 --- /dev/null +++ b/ca/tags/preguntes-frequents/index.html @@ -0,0 +1 @@ +~/tabi • Preguntes Freqüents

          Preguntes Freqüents

          12 September 2023

          Lost in Translation? Explora les capacitats multilingües de tabi

          Descobreix com tabi t'ajuda a connectar amb una audiència global gràcies a les seves funcions multilingües. Aprèn a canviar la llengua per defecte, afegir més llengües i aportar les teves pròpies traduccions.

          Read more →
          \ 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..5fbff7913 --- /dev/null +++ b/ca/tags/seguretat/atom.xml @@ -0,0 +1,26 @@ + + + + + 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 About Feeds per aprendre més i començar. És gratuït. + Visita 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..3e08209d7 --- /dev/null +++ b/ca/tags/seguretat/index.html @@ -0,0 +1 @@ +~/tabi • seguretat

          seguretat

          22 February 2023

          Seguretat per defecte

          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.

          Read more →
          \ 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..21d76e87f --- /dev/null +++ b/ca/tags/shortcodes/atom.xml @@ -0,0 +1,26 @@ + + + + + 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 About Feeds per aprendre més i començar. És gratuït. + Visita 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..bb4f5968f --- /dev/null +++ b/ca/tags/shortcodes/index.html @@ -0,0 +1 @@ +~/tabi • shortcodes

          shortcodes

          19 February 2023

          Shortcodes personalitzats

          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.

          Read more →
          \ 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..e5d765e3a --- /dev/null +++ b/ca/tags/tutorial/atom.xml @@ -0,0 +1,81 @@ + + + + + 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 About Feeds per aprendre més i començar. És gratuït. + Visita 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-12T00:00:00+00:00 + https://welpo.github.io/tabi/ca/tags/tutorial/atom.xml + + Lost in Translation? Explora les capacitats multilingües de tabi + 2023-09-12T00:00:00+00:00 + 2023-09-12T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/ca/blog/faq-languages/ + Descobreix com tabi t'ajuda a connectar amb una audiència global gràcies a les seves funcions multilingües. Aprèn a canviar la llengua per defecte, afegir més llengües i aportar les teves pròpies traduccions. + + + 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..8c0852637 --- /dev/null +++ b/ca/tags/tutorial/index.html @@ -0,0 +1 @@ +~/tabi • tutorial

          tutorial

          12 September 2023

          Lost in Translation? Explora les capacitats multilingües de tabi

          Descobreix com tabi t'ajuda a connectar amb una audiència global gràcies a les seves funcions multilingües. Aprèn a canviar la llengua per defecte, afegir més llengües i aportar les teves pròpies traduccions.

          Read more →
          09 August 2023

          Personalitza el color de tabi i el tema per defecte

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

          Read more →
          14 July 2023

          Afegeix comentaris a les teves publicacions amb aquestes 4 plataformes

          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.

          Read more →
          29 April 2023

          Optimitza la càrrega amb un subconjunt de font personalitzat

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

          Read more →
          06 January 2023

          Sense JavaScript obligatori

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

          Read more →
          01 November 2022

          Taula de contingut

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

          Read more →
          \ No newline at end of file diff --git a/custom_subset.css b/custom_subset.css new file mode 100644 index 000000000..6234dc193 --- /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/about/index.html b/es/about/index.html new file mode 100644 index 000000000..81f22cc66 --- /dev/null +++ b/es/about/index.html @@ -0,0 +1 @@ +~/tabi • Sobre mí

          Sobre mí

          Bienvenido a la demo de tabi, un tema para Zola, un rapidísimo generador de sitios estáticos.

          tabi es obra de Óscar Fernández (welpo en GitHub), inicialmente creado para su página personal. Es un tema moderno y lleno de funcionalidades que ofrece configuraciones predeterminadas sensatas y seguras.

          ¿Buscas instrucciones detalladas o consejos sobre cómo utilizar tabi? Las secciones del blog y del archivo contienen la documentación del tema, que incluye desde muestras de funciones hasta guías detalladas.

          Características

          tabi ofrece soporte para varios idiomas, apariencia personalizable, integración de comentarios, y mucho más, todo con un enfoque en el rendimiento (todo el JavaScript es opcional) y la seguridad.

          Contribuciones

          ¡Toda aportación es bienvenida! Agradecemos los reportes de errores, mejoras en traducciones o documentación (por mínimas que sean), solicitudes de nuevas funciones… Consulta las Pautas de Contribución para saber cómo puedes contribuir. ¡Gracias!

          Licencia

          El código está disponible bajo la licencia MIT.

          \ No newline at end of file diff --git a/es/archive/index.html b/es/archive/index.html new file mode 100644 index 000000000..f8c523d86 --- /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..e3ef2ca01 --- /dev/null +++ b/es/atom.xml @@ -0,0 +1,114 @@ + + + + + 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 About Feeds para aprender más y empezar. Es gratis. + Visita 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-12T00:00:00+00:00 + https://welpo.github.io/tabi/es/atom.xml + + ¿Lost in Translation? Explora las capacidades multilingües de tabi + 2023-09-12T00:00:00+00:00 + 2023-09-12T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/faq-languages/ + Descubre cómo tabi te ayuda a conectar con una audiencia global gracias a sus funciones multilingües. Aprende a cambiar el idioma por defecto, añadir más idiomas y aportar tus propias traducciones. + + + 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..edfd4e3f4 --- /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..ba4080840 --- /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..f1ec5cc77 --- /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/faq-languages/index.html b/es/blog/faq-languages/index.html new file mode 100644 index 000000000..003264a10 --- /dev/null +++ b/es/blog/faq-languages/index.html @@ -0,0 +1,13 @@ +~/tabi • ¿Lost in Translation? Explora las capacidades multilingües de tabi

          ¿Lost in Translation? Explora las capacidades multilingües de tabi

          tabi simplifica el proceso de crear sitios web multilingües para que puedas conectar con una audiencia global. En esta guía, te explicaremos todo lo que necesitas saber, desde cómo configurar el idioma principal en tu sitio hasta cómo contribuir con tus propias traducciones. ¡Empecemos!

          Preguntas Frecuentes

          ¿Qué idiomas admite tabi?

          tabi admite los siguientes idiomas:

          • Alemán
          • Catalán
          • Chino (Simplificado)
          • Coreano
          • Español
          • Francés
          • Hindi
          • Inglés
          • Italiano
          • Japonés
          • Portugués (Europeo)
          • Ruso
          • Ucraniano

          Para una lista siempre actualizada de idiomas soportados, consulta la carpeta i18n en el repositorio de tabi.

          ¿Cómo establezco el idioma predeterminado de mi sitio?

          Puedes definir el idioma principal de tu sitio configurando la variable default_language en tu archivo config.toml.

          Por ejemplo, si deseas que el idioma principal sea el Chino, simplemente añade esta línea al archivo config.toml:

          base_url = "https://welpo.github.io/tabi"
          +title = "~/tabi"
          +default_language = "zh"
          +

          tabi se traducirá a ese idioma, si está soportado.

          ¿Cómo gestiona tabi el soporte multilingüe?

          Zola genera automáticamente URLs para cada idioma que no sea el predeterminado de la siguiente manera: {base_url}/{código_idioma}/{post}.

          tabi facilita la navegación entre idiomas añadiendo un conmutador de idioma en la barra de navegación (que sólo se muestra cuando hay más de un idioma habilitado).

          Si subes a la barra de navegación, verás el conmutador de idioma. Al pasar el cursor sobre él, se mostrará un desplegable con los idiomas disponibles. Si haces clic en el nombre de un idioma, te llevará a la misma página en ese idioma.

          Si una página específica no está disponible en un idioma, tabi mostrará una página 404 con el texto:

          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.

          Este texto se mostrará una vez por cada idioma activado en tu sitio. Puedes ver esta página en acción aquí.

          ¿Cómo activo el soporte multilingüe?

          Para habilitar el soporte para varios idiomas, necesitas configurar la variable languages en config.toml. Por ejemplo, si quieres un sitio con inglés como idioma principal que también admita hindi y español, puedes configurar tu config.toml de la siguiente manera:

          base_url = "https://example.com"
          +title = "My Site"
          +default_language = "en"
          +
          +[languages.hi]
          +title = "मेरी वेबसाइट"
          +
          +[languages.es]
          +title = "Mi web"
          +

          En cada sección de idioma puedes establecer otras variables como taxonomies, description… Consulta la documentación de soporte multilingüe de Zola para más información.

          ¿Qué son estos códigos de dos letras?

          Los códigos de dos letras son códigos de idioma ISO 639-1, que sirven para identificar idiomas de una manera estandarizada.

          tabi utiliza estos códigos para permitir la navegación entre idiomas y traducir el tema.

          ¿Cómo personalizo o reemplazo una cadena de texto específica en mi sitio web?

          tabi busca los archivos de cadenas en el siguiente orden. $base_directory es donde reside tu sitio Zola (donde se guarda config.toml):

          1. $base_directory + "i18n"
          2. $base_directory + "themes/tabi/i18n"

          Por lo tanto, si creas i18n/en.toml en tu directorio base, tabi leerá las cadenas de texto de ese archivo en lugar de las cadenas predeterminadas en inglés. Puedes hacer esto para cualquier idioma, soportado o no.

          Asegúrate de copiar todo el archivo para ese idioma primero, o el tema usará el inglés para las claves faltantes.

          ¿Qué pasa si falta una traducción o está incompleta?

          Si una cadena no se encuentra en el archivo de idioma, tabi recurrirá a la cadena predeterminada en inglés.

          Mi idioma no está soportado. ¿Puedo contribuir con una traducción?

          ¡Por supuesto! Siempre estamos buscando añadir soporte para más idiomas. Puedes contribuir con una traducción creando una Pull Request en el repositorio de tabi.

          Puedes usar el archivo en inglés como base para traducir las cadenas a tu idioma. Asegúrate de mantener la misma estructura.

          El archivo debe llevar el nombre del código de dos letras de tu idioma y debe ser un archivo TOML. Por ejemplo, si quieres añadir soporte para el suajili, puedes crear un archivo llamado sw.toml en el directorio i18n.

          Nota: cuando pruebes tu traducción, es posible que necesites reiniciar zola serve para ver los cambios, ya que Zola no siempre detecta cambios en los archivos TOML.

          He encontrado un error en una traducción. ¿Cómo lo corrijo?

          Si encuentras un error en una traducción, puedes crear un problema o una solicitud de extracción en el repositorio de tabi.

          ¿Cómo actualizo las traducciones después de una actualización del tema?

          Si no personalizaste las traducciones, basta con actualizar el tema.

          Si lo hiciste, tendrás que actualizar manualmente las traducciones. Puedes hacerlo copiando las nuevas cadenas de los archivos correspondientes y pegándolas en tu archivo personalizado.

          ¿tabi traduce el contenido de mi sitio?

          No. tabi sólo traduce el tema. Los posts deberás traducirlos tú mismo.

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

          Blog

          12 septiembre 2023

          ¿Lost in Translation? Explora las capacidades multilingües de tabi

          Descubre cómo tabi te ayuda a conectar con una audiencia global gracias a sus funciones multilingües. Aprende a cambiar el idioma por defecto, añadir más idiomas y aportar tus propias traducciones.

          Leer más →
          09 agosto 2023

          Personaliza el color de tabi y el tema predeterminado

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

          Leer más →
          14 julio 2023

          Añade comentarios a tus publicaciones con estas 4 plataformas

          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

          Optimiza la carga con un subconjunto de fuente personalizado

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

          Leer más →
          22 febrero 2023

          Seguro por defecto

          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/blog/javascript/index.html b/es/blog/javascript/index.html new file mode 100644 index 000000000..17257e404 --- /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..f43817bf6 --- /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..0be7b5ac2 --- /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..6587c0f88 --- /dev/null +++ b/es/blog/page/2/index.html @@ -0,0 +1 @@ +~/tabi • Blog

          Blog

          19 febrero 2023

          Shortcodes personalizados

          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

          Ejemplos de 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.

          Leer más →
          06 enero 2023

          Sin JavaScript obligatorio

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

          Leer más →
          01 noviembre 2022

          Tabla de contenido

          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..1d5cc35e6 --- /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..7edc081c1 --- /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..0fe8b5b37 --- /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..9cec0ea69 --- /dev/null +++ b/es/index.html @@ -0,0 +1 @@ +~/tabi

          Publicaciones recientes

          12 septiembre 2023

          ¿Lost in Translation? Explora las capacidades multilingües de tabi

          Descubre cómo tabi te ayuda a conectar con una audiencia global gracias a sus funciones multilingües. Aprende a cambiar el idioma por defecto, añadir más idiomas y aportar tus propias traducciones.

          Leer más →
          09 agosto 2023

          Personaliza el color de tabi y el tema predeterminado

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

          Leer más →
          14 julio 2023

          Añade comentarios a tus publicaciones con estas 4 plataformas

          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

          Optimiza la carga con un subconjunto de fuente personalizado

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

          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..e88c3adfb --- /dev/null +++ b/es/projects/chu/index.html @@ -0,0 +1 @@ +~/tabi • chu

          chu

            chu es un subidor de archivos creado con Python, Flask y uWSGI. Este proyecto integra diversas técnicas de optimización para hacer que la subida de archivos sea no solo más sencilla, sino también más inteligente.

            Ver en GitHub

            Características técnicas

            • Eficiencia a través de la compresión: Utiliza compresión Lepton JPEG y optipng para lograr un ahorro de espacio de hasta el 22%.

            • Medidas de seguridad: Implementa límites de tamaño de subida, controles de extensión y autenticación con contraseña.

            • Facilidad de uso: Genera una URL para cada archivo subido con éxito, permitiendo nombres de archivo aleatorios o definidos por el usuario.

            • Eliminación de metadatos: Elimina los metadatos de los archivos por privacidad.

            • Tamaño de subida configurable: Ofrece la posibilidad de establecer límites al tamaño de los archivos subidos.

            • Controles específicos de extensión: Proporciona configuraciones para restringir las subidas a extensiones de archivo específicas.

            • Respuesta de URL directa: Tras cada subida exitosa, devuelve una URL que apunta al archivo.

            \ No newline at end of file diff --git a/es/projects/index.html b/es/projects/index.html new file mode 100644 index 000000000..9c89df9cd --- /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 soporte multilingüe.
            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 URLs públicas a partir de archivos o texto en servidores remotos.
            img/spectro.webp

            spectro

            Script en Bash para generar espectrogramas, compararlos, subirlos a Imgur y proporcionar las URL correspondientes 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..c597484eb --- /dev/null +++ b/es/projects/nani/index.html @@ -0,0 +1,35 @@ +~/tabi • nani

            nani

              Si trabajas en un servidor remoto, sabrás que compartir archivos con otras personas puede ser un proceso tedioso. nani es un script en Bash diseñado para simplificar esta tarea. Con un solo comando, puedes convertir archivos locales en enlaces públicos, facilitando el proceso de compartir directamente desde tu servidor.

              Ver en GitHub

              Características clave

              • Todo tipo de archivos: maneja directorios, archivos FLAC, archivos de texto e incluso URLs a vídeos.

              • Personalizable: adapta los ajustes editando el script o un archivo de configuración.

              • Notificaciones: notificaciones en el escritorio e integración con el portapapeles para una mejor experiencia.

              Inicio rápido

              1. Coloca nani en un directorio dentro de tu PATH.
              2. Haz el script ejecutable.

              Para pasos de instalación más detallados, consulta la documentación completa.

              Uso

              nani Ruta/A/foto.png
              +https://example.com/nani/hjRGLZB.png
              +

              Compartir un directorio manteniendo su nombre original:

              nani -o Ruta/A/Directorio
              +https://example.com/nani/Directorio.zip
              +

              Puedes configurar varias opciones a través de los parámetros. Aquí tienes la salida de nani --help:

              Usage: nani [options] <infile>
              +Provides public URL from input.
              +
              +Input handling:
              +    Directory                       Will be stored using zip (or symbolic link)
              +    FLAC                            Can be transcoded to MP3
              +    Text (html, php...)             Extension can be set to .txt
              +    Other files                     New copy/hard link/symbolic link at output directory
              +    URL to video (e.g: youtube)     Downloaded using yt-dlp
              +    Other URLs                      Downloaded using wget
              +
              +Modify the first lines of the script to change how nani behaves: quiet mode,
              +enabling/disabling transcoding, length of the string, extension truncation...
              +
              +Settings and options:
              +    -a, --alias      Revert the hard link setting
              +    -c, --cleanup    Remove all files on /nani/ except index.html
              +    -h, --help       Display this help and exit
              +    -i, --insert     Open nano to enter text. Saved in output directory as .txt
              +    -k, --keep       Output dir becomes /nani/k/, to set different cleanup rules
              +    -l, --list       List files in output directory /nani/
              +    -n, --name       Use custom name (e.g. nani -n DesiredName <file>)
              +    -N, --notify     Revert the notify option
              +    -o, --original   Preserve original file name
              +    -p, --push       Send push notification
              +    -q, --quiet      Revert the quiet setting
              +    -s, --string     Force a certain string length (e.g. nani -s 32 <file>)
              +    -t, --transcode  Revert the transcode setting
              +    -x, --xclip      Revert the xclip setting
              +    -y, --symbolic   Create a symbolic link for files and directories
              +
              \ 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..e07307a5c --- /dev/null +++ b/es/projects/spectro/index.html @@ -0,0 +1,24 @@ +~/tabi • spectro

              spectro

                Transforma archivos de audio en espectrogramas con formato BBCode de manera sencilla con spectro. Este script en Bash soporta una amplia variedad de formatos de audio como Ogg, MP3, FLAC, AAC y más.

                Espectrograma de Jardin du Sommeil Chant d'Amour Sur La Nuit Grandissante, de Tourette

                Ver en GitHub

                Características

                • Soporte de múltiples formatos: Ogg, MP3, FLAC, AAC, ape, WMA, MP4 y WAV.
                • Salida en BBCode: Genera automáticamente BBCode para foros o sitios web.
                • Procesamiento por lotes: Puede manejar directorios enteros o archivos específicos.
                • Extensible: Opciones para personalización, incluido el almacenamiento local y la subida a Imgur.

                Inicio rápido

                1. Descarga spectro en un directorio dentro de tu PATH, por ejemplo, ~/bin.
                2. Otorga permisos de ejecución: chmod +x spectro.

                Para una guía completa de instalación, lee la documentación completa.

                Uso

                Generar BBCode para un directorio completo:

                spectro Path/To/Directory/
                +

                Salida:

                [hide=Spectrograms][size=3]
                +[url=https://i.imgur.com/ClzzbP8.png]01. Jardin Du Sommeil.flac[/url]
                +[/size][/hide]
                +

                Generar BBCode para archivos específicos:

                spectro archivo1.flac archivo2.mp3
                +

                Opciones adicionales y configuraciones están disponibles. Consulta spectro --help:

                Usage: spectro [options] <audio_files>
                +Generate BBCode-formatted spectrograms from audio files.
                +
                +Options:
                +    -c, --compare     Create a .gif comparison of spectrograms (requires ImageMagick)
                +    -d, --double      Create both zoomed and full spectrograms
                +    -h, --help        Display this help and exit
                +    -l, --local       Save spectrograms locally
                +    -o, --optipng     Reverse optipng setting
                +    -p, --parallel    Compatible with 'parallel'
                +    -q, --quiet       Suppress 'Uploading' text
                +    -s, --sha         Display SHA value
                +    -t, --text        Use [url] or [img] tags
                +    -z, --zoom        Create zoomed-in spectrogram
                +
                +Examples:
                +    spectro -ol DirectoryWithMusic/
                +    printf "[hide=Spectrograms][size=3]" && ls | parallel -k spectro -p; printf "[/size][/hide]"
                +
                \ 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..b89ea04a6 --- /dev/null +++ b/es/projects/tabi/index.html @@ -0,0 +1 @@ +~/tabi • tabi

                tabi

                  tabi es un tema moderno y rico en funcionalidad para Zola, un generador de sitios web estáticos muy rápido.

                  Modos claro y oscuro de tabi

                  Ver en GitHub

                  Características

                  Prácticas de desarrollo

                  • Conventional Commits y Gitmoji: los mensajes de commit siguen formatos estandarizados para mejorar la legibilidad.

                  • Seguimiento de problemas: cada error o nueva funcionalidad tiene su propio ticket, que se vincula a los commits de código y PRs o problemas relacionados.

                  • Comentarios detallados: los tickets se documentan con imágenes, vídeos y descripciones detalladas para facilitar una comunicación y resolución de problemas efectivas.

                  • Referencias cruzadas: enlazamos todos los tickets con los commits de código, pull requests o problemas relacionados para una rastreabilidad completa.

                  Evolución del proyecto

                  tabi nació como diseño para mi sitio personal, osc.garden. A pesar de sus raíces personales, desde el principio se implementaron buenas prácticas para asegurar la calidad y mantenibilidad. Desde entonces, el tema ha logrado atraer a una comunidad activa de contribuyentes en GitHub.

                  Empieza tu aventura escribiendo con tabi

                  Tienes algo que decir. Tal vez se trate de cómo los lingüistas aún no han acordado una definición de "palabra", o sobre tu experiencia explorando los diferentes palos del flamenco, o de cómo lograste resolver un fallo de un proyecto de código abierto popular.

                  tabi te ofrece la base ideal para tu espacio de escritura, permitiéndote centrarte en tus palabras mientras Zola y tabi se encargan del aspecto técnicos. Sumérgete en el mundo de los blogs con un sistema que hace que cada publicación sea un placer escribir y leer. Tu voz tiene valor; compártela con el mundo.

                  \ 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..8bd2af9ec --- /dev/null +++ b/es/tags/funcionalidad/atom.xml @@ -0,0 +1,114 @@ + + + + + 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 About Feeds para aprender más y empezar. Es gratis. + Visita 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-12T00:00:00+00:00 + https://welpo.github.io/tabi/es/tags/funcionalidad/atom.xml + + ¿Lost in Translation? Explora las capacidades multilingües de tabi + 2023-09-12T00:00:00+00:00 + 2023-09-12T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/faq-languages/ + Descubre cómo tabi te ayuda a conectar con una audiencia global gracias a sus funciones multilingües. Aprende a cambiar el idioma por defecto, añadir más idiomas y aportar tus propias traducciones. + + + 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..e567ce30f --- /dev/null +++ b/es/tags/funcionalidad/index.html @@ -0,0 +1 @@ +~/tabi • funcionalidad

                  funcionalidad

                  12 September 2023

                  ¿Lost in Translation? Explora las capacidades multilingües de tabi

                  Descubre cómo tabi te ayuda a conectar con una audiencia global gracias a sus funciones multilingües. Aprende a cambiar el idioma por defecto, añadir más idiomas y aportar tus propias traducciones.

                  Read more →
                  09 August 2023

                  Personaliza el color de tabi y el tema predeterminado

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

                  Read more →
                  14 July 2023

                  Añade comentarios a tus publicaciones con estas 4 plataformas

                  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.

                  Read more →
                  29 April 2023

                  Optimiza la carga con un subconjunto de fuente personalizado

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

                  Read more →
                  22 February 2023

                  Seguro por defecto

                  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.

                  Read more →
                  19 February 2023

                  Shortcodes personalizados

                  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.

                  Read more →
                  31 January 2023

                  Ejemplos de 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.

                  Read more →
                  06 January 2023

                  Sin JavaScript obligatorio

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

                  Read more →
                  01 November 2022

                  Tabla de contenido

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

                  Read more →
                  \ No newline at end of file diff --git a/es/tags/index.html b/es/tags/index.html new file mode 100644 index 000000000..dd7e2d8b9 --- /dev/null +++ b/es/tags/index.html @@ -0,0 +1 @@ +~/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..19d5bb9da --- /dev/null +++ b/es/tags/markdown/atom.xml @@ -0,0 +1,37 @@ + + + + + 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 About Feeds para aprender más y empezar. Es gratis. + Visita 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..0b690f2a9 --- /dev/null +++ b/es/tags/markdown/index.html @@ -0,0 +1 @@ +~/tabi • markdown

                  markdown

                  31 January 2023

                  Ejemplos de 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.

                  Read more →
                  01 November 2022

                  Tabla de contenido

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

                  Read more →
                  \ No newline at end of file diff --git a/es/tags/preguntas-frecuentes/atom.xml b/es/tags/preguntas-frecuentes/atom.xml new file mode 100644 index 000000000..4efbc7a68 --- /dev/null +++ b/es/tags/preguntas-frecuentes/atom.xml @@ -0,0 +1,26 @@ + + + + + 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 About Feeds para aprender más y empezar. Es gratis. + Visita la web + Publicaciones recientes + ~/tabi - Preguntas Frecuentes + tabi es un tema de Zola rápido, liviano y moderno con JavaScript opcional y una puntuación perfecta en Lighthouse. + + + Zola + 2023-09-12T00:00:00+00:00 + https://welpo.github.io/tabi/es/tags/preguntas-frecuentes/atom.xml + + ¿Lost in Translation? Explora las capacidades multilingües de tabi + 2023-09-12T00:00:00+00:00 + 2023-09-12T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/faq-languages/ + Descubre cómo tabi te ayuda a conectar con una audiencia global gracias a sus funciones multilingües. Aprende a cambiar el idioma por defecto, añadir más idiomas y aportar tus propias traducciones. + + diff --git a/es/tags/preguntas-frecuentes/index.html b/es/tags/preguntas-frecuentes/index.html new file mode 100644 index 000000000..f378c016e --- /dev/null +++ b/es/tags/preguntas-frecuentes/index.html @@ -0,0 +1 @@ +~/tabi • Preguntas Frecuentes

                  Preguntas Frecuentes

                  12 September 2023

                  ¿Lost in Translation? Explora las capacidades multilingües de tabi

                  Descubre cómo tabi te ayuda a conectar con una audiencia global gracias a sus funciones multilingües. Aprende a cambiar el idioma por defecto, añadir más idiomas y aportar tus propias traducciones.

                  Read more →
                  \ 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..b127b1402 --- /dev/null +++ b/es/tags/seguridad/atom.xml @@ -0,0 +1,26 @@ + + + + + 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 About Feeds para aprender más y empezar. Es gratis. + Visita 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..862bf9e9d --- /dev/null +++ b/es/tags/seguridad/index.html @@ -0,0 +1 @@ +~/tabi • seguridad

                  seguridad

                  22 February 2023

                  Seguro por defecto

                  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.

                  Read more →
                  \ 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..b805104c6 --- /dev/null +++ b/es/tags/shortcodes/atom.xml @@ -0,0 +1,26 @@ + + + + + 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 About Feeds para aprender más y empezar. Es gratis. + Visita 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..32cfcac7e --- /dev/null +++ b/es/tags/shortcodes/index.html @@ -0,0 +1 @@ +~/tabi • shortcodes

                  shortcodes

                  19 February 2023

                  Shortcodes personalizados

                  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.

                  Read more →
                  \ 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..b084c4b17 --- /dev/null +++ b/es/tags/tutorial/atom.xml @@ -0,0 +1,81 @@ + + + + + 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 About Feeds para aprender más y empezar. Es gratis. + Visita 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-12T00:00:00+00:00 + https://welpo.github.io/tabi/es/tags/tutorial/atom.xml + + ¿Lost in Translation? Explora las capacidades multilingües de tabi + 2023-09-12T00:00:00+00:00 + 2023-09-12T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/es/blog/faq-languages/ + Descubre cómo tabi te ayuda a conectar con una audiencia global gracias a sus funciones multilingües. Aprende a cambiar el idioma por defecto, añadir más idiomas y aportar tus propias traducciones. + + + 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..1f9f4b054 --- /dev/null +++ b/es/tags/tutorial/index.html @@ -0,0 +1 @@ +~/tabi • tutorial

                  tutorial

                  12 September 2023

                  ¿Lost in Translation? Explora las capacidades multilingües de tabi

                  Descubre cómo tabi te ayuda a conectar con una audiencia global gracias a sus funciones multilingües. Aprende a cambiar el idioma por defecto, añadir más idiomas y aportar tus propias traducciones.

                  Read more →
                  09 August 2023

                  Personaliza el color de tabi y el tema predeterminado

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

                  Read more →
                  14 July 2023

                  Añade comentarios a tus publicaciones con estas 4 plataformas

                  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.

                  Read more →
                  29 April 2023

                  Optimiza la carga con un subconjunto de fuente personalizado

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

                  Read more →
                  06 January 2023

                  Sin JavaScript obligatorio

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

                  Read more →
                  01 November 2022

                  Tabla de contenido

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

                  Read more →
                  \ No newline at end of file diff --git a/feed_style.xsl b/feed_style.xsl new file mode 100644 index 000000000..a53c20dfd --- /dev/null +++ b/feed_style.xsl @@ -0,0 +1,83 @@ + + + + + + + + <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/light_dark_tabi.webp b/img/light_dark_tabi.webp new file mode 100644 index 000000000..8025a0480 Binary files /dev/null and b/img/light_dark_tabi.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/about.ca.jpg b/img/social_cards/about.ca.jpg new file mode 100644 index 000000000..6104cdc8a Binary files /dev/null and b/img/social_cards/about.ca.jpg differ diff --git a/img/social_cards/about.es.jpg b/img/social_cards/about.es.jpg new file mode 100644 index 000000000..809bd3ac7 Binary files /dev/null and b/img/social_cards/about.es.jpg differ diff --git a/img/social_cards/about.jpg b/img/social_cards/about.jpg new file mode 100644 index 000000000..4117d1826 Binary files /dev/null and b/img/social_cards/about.jpg differ diff --git a/img/social_cards/archive.jpg b/img/social_cards/archive.jpg new file mode 100644 index 000000000..640559ea8 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..821e9abfd 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..404757940 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..7bb8b2625 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..c91dc95c5 Binary files /dev/null and b/img/social_cards/blog_customise_tabi.jpg differ diff --git a/img/social_cards/blog_faq_languages.jpg b/img/social_cards/blog_faq_languages.jpg new file mode 100644 index 000000000..1b54ca8e8 Binary files /dev/null and b/img/social_cards/blog_faq_languages.jpg differ diff --git a/img/social_cards/blog_javascript.jpg b/img/social_cards/blog_javascript.jpg new file mode 100644 index 000000000..fa5dde9bf 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..98e7a5bbd 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..154cb9890 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..3a60ea16f 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..534e3cd44 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..985bb7c54 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..5ab38ee91 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..635563cb2 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..06d3294a7 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..573ff8826 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..8703e9da9 Binary files /dev/null and b/img/social_cards/ca_blog_customise_tabi.jpg differ diff --git a/img/social_cards/ca_blog_faq_languages.jpg b/img/social_cards/ca_blog_faq_languages.jpg new file mode 100644 index 000000000..87acc3531 Binary files /dev/null and b/img/social_cards/ca_blog_faq_languages.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..4ac3b4f85 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..a94d2b5e2 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..725da83fc 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..d6daafba0 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..bf6ca88b7 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..5de0a33ed Binary files /dev/null and b/img/social_cards/ca_projects.jpg differ diff --git a/img/social_cards/ca_projects_chu.jpg b/img/social_cards/ca_projects_chu.jpg new file mode 100644 index 000000000..d6a216c24 Binary files /dev/null and b/img/social_cards/ca_projects_chu.jpg differ diff --git a/img/social_cards/ca_projects_nani.jpg b/img/social_cards/ca_projects_nani.jpg new file mode 100644 index 000000000..a5e960a1e Binary files /dev/null and b/img/social_cards/ca_projects_nani.jpg differ diff --git a/img/social_cards/ca_projects_spectro.jpg b/img/social_cards/ca_projects_spectro.jpg new file mode 100644 index 000000000..92c710fd9 Binary files /dev/null and b/img/social_cards/ca_projects_spectro.jpg differ diff --git a/img/social_cards/ca_projects_tabi.jpg b/img/social_cards/ca_projects_tabi.jpg new file mode 100644 index 000000000..6fec2e658 Binary files /dev/null and b/img/social_cards/ca_projects_tabi.jpg differ diff --git a/img/social_cards/es.jpg b/img/social_cards/es.jpg new file mode 100644 index 000000000..c56f3649b 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..d70cbeb0a 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..dde3e7d87 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..b6713fb2e 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..8bddf80be 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..2ddcdcfbb Binary files /dev/null and b/img/social_cards/es_blog_customise_tabi.jpg differ diff --git a/img/social_cards/es_blog_faq_languages.jpg b/img/social_cards/es_blog_faq_languages.jpg new file mode 100644 index 000000000..47e5305eb Binary files /dev/null and b/img/social_cards/es_blog_faq_languages.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..21547c71e 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..103467739 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..3a898a248 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..f9a36dca9 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..355cc058e 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..ebd96895e Binary files /dev/null and b/img/social_cards/es_projects.jpg differ diff --git a/img/social_cards/es_projects_chu.jpg b/img/social_cards/es_projects_chu.jpg new file mode 100644 index 000000000..d785fab42 Binary files /dev/null and b/img/social_cards/es_projects_chu.jpg differ diff --git a/img/social_cards/es_projects_nani.jpg b/img/social_cards/es_projects_nani.jpg new file mode 100644 index 000000000..520a87636 Binary files /dev/null and b/img/social_cards/es_projects_nani.jpg differ diff --git a/img/social_cards/es_projects_spectro.jpg b/img/social_cards/es_projects_spectro.jpg new file mode 100644 index 000000000..3fcfae696 Binary files /dev/null and b/img/social_cards/es_projects_spectro.jpg differ diff --git a/img/social_cards/es_projects_tabi.jpg b/img/social_cards/es_projects_tabi.jpg new file mode 100644 index 000000000..4d58e5b3a Binary files /dev/null and b/img/social_cards/es_projects_tabi.jpg differ diff --git a/img/social_cards/index.jpg b/img/social_cards/index.jpg new file mode 100644 index 000000000..d8c846df3 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..dce4ac006 Binary files /dev/null and b/img/social_cards/projects.jpg differ diff --git a/img/social_cards/projects_chu.jpg b/img/social_cards/projects_chu.jpg new file mode 100644 index 000000000..04f860af5 Binary files /dev/null and b/img/social_cards/projects_chu.jpg differ diff --git a/img/social_cards/projects_nani.jpg b/img/social_cards/projects_nani.jpg new file mode 100644 index 000000000..a4549083d Binary files /dev/null and b/img/social_cards/projects_nani.jpg differ diff --git a/img/social_cards/projects_spectro.jpg b/img/social_cards/projects_spectro.jpg new file mode 100644 index 000000000..4c17ea5d2 Binary files /dev/null and b/img/social_cards/projects_spectro.jpg differ diff --git a/img/social_cards/projects_tabi.jpg b/img/social_cards/projects_tabi.jpg new file mode 100644 index 000000000..11f51c8f8 Binary files /dev/null and b/img/social_cards/projects_tabi.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/spectrogram.webp b/img/spectrogram.webp new file mode 100644 index 000000000..c472e7b3b Binary files /dev/null and b/img/spectrogram.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..37e970473 --- /dev/null +++ b/index.html @@ -0,0 +1 @@ +~/tabi

                  Latest posts

                  12 September 2023

                  Lost in Translation? Not with tabi's Multilingual Capabilities

                  Master the art of serving a global audience through tabi's built-in multilingual features. Learn how to change the default language, add multilingual support, and contribute your own translations.

                  Read more →
                  09 August 2023

                  Customise tabi with skins and a default theme

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

                  Read more →
                  14 July 2023

                  Add comments to your posts with these 4 comment systems

                  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

                  Optimise loading times with a custom font subset

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

                  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..652db4831 --- /dev/null +++ b/js/isso.js @@ -0,0 +1,81 @@ +// 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-max-comments-nested', maxCommentsNested); + 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..833eafff3 --- /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");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"),(e=document.createElement("section")).id="isso-thread",e.setAttribute("data-isso-id",a),e.setAttribute("data-title",s),t.appendChild(e),t.appendChild(u),(i=document.createElement("link")).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..4d51e4080 --- /dev/null +++ b/main.css @@ -0,0 +1 @@ +.archive{margin-top:4vmin}.archive .listing-title{margin-bottom:1rem;font-size:1.5rem}.archive .listing-item{display:flex;gap:1rem;margin-bottom:.5rem;padding:.2rem 1rem}.archive .listing-item .post-time{padding-left:1vmin;min-width:5rem;text-align:left}.archive .listing-item .post-time .date{color:var(--meta-color);white-space:nowrap}.archive ul{margin:0;padding:0;list-style:none}.archive li{margin-bottom:1.3rem}.cards{display:grid;grid-template-rows:auto;grid-template-columns:repeat(auto-fill, minmax(300px, 1fr));gap:24px;margin-top:4vmin;padding:12px 0}.card{box-shadow:rgba(0,0,0,.15) 1.95px 1.95px 2.6px;background:var(--bg-2);min-height:100px;overflow:hidden}.card-info{padding:0 24px 24px 24px}.card-title{margin-top:.7em}.card-image{border:unset;width:100%}.card-image-placeholder{width:100%;height:12px}.card-description{margin-top:.5em;overflow:hidden}@media all and (max-width: 720px){.cards{gap:18px}}code{border-radius:5px;background-color:var(--bg-1);padding:.1em .2em;font-size:.9rem;font-family:var(--code-font)}code mark{display:block;filter:brightness(110%);background-color:var(--codeblock-highlight);color:inherit}code table{margin:0rem;border-collapse:collapse;border-spacing:0rem;width:100%;text-align:left}code table td,code table th,code table tr{border:none;padding:0rem}code table tbody td:first-child{width:2rem;user-select:none;text-align:left}code table tbody tr:nth-child(even){background-color:inherit}a:hover code{background-color:inherit}pre{display:block;position:relative;border-radius:5px;padding:2.4rem 1rem 1rem;overflow:hidden;overflow-x:auto;line-height:1.4}pre code{display:block;border:0rem;border-radius:5px;background-color:rgba(0,0,0,0);padding:0rem;overflow-x:auto;color:inherit;font-size:.8rem;white-space:pre}pre code::before{display:block;position:absolute;top:0;left:0;background-color:var(--primary-color);padding:.3rem;padding-left:1rem;width:calc(100% - 1.3rem);height:.9rem;content:attr(data-lang);color:var(--hover-color);font-size:.65rem;text-align:left;text-transform:uppercase}.copy-code{-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");position:absolute;top:.3rem;right:.7rem;align-self:center;z-index:1;cursor:pointer;background:var(--hover-color);background-size:contain;width:.9rem;height:.9rem;color:#fff}.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");width:1rem;height: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{margin-top:2rem;border-top:var(--divider-color) solid .5px;border-bottom:var(--divider-color) solid .5px;padding-top:2rem;padding-bottom:2rem}.comments iframe{margin:0;border:none;aspect-ratio:inherit;width:100%;max-width:100%}.comments .load-comments-button{display:block;cursor:pointer;margin:.5em auto;border:none;background:none;padding:.5em 1em;color:inherit;font-size:.95rem;font-family:var(--sans-serif-font);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{display:flex;flex-grow:0;flex-wrap:wrap;justify-content:center;align-items:flex-end}.socials svg{max-height:15px}.socials ul{gap:5px}.social{display:flex;justify-content:center;align-items:center;background-image:unset;padding:.5vmin}.social>img{aspect-ratio:1/1;width:1.5rem;height:auto;color:#000}.social:hover>img{filter:invert(1)}[data-theme=dark] .social:hover>img{filter:invert(0)}[data-theme=dark] .social>img{filter:invert(1)}.credits{color:var(--meta-color);font-size:.88rem;text-align:center}.credits p{margin:0}.header-anchor{display:inline-flex;position:absolute;justify-content:center;align-items:center;opacity:0;margin-left:-2rem;padding-right:.3rem;width:1.9rem;height:100%;user-select:none}@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");align-self:center;cursor:pointer;background:var(--text-color);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{width:100%;font-family:"Inter Subset",var(--sans-serif-font)}.page-header{margin:4rem 0px 1rem 0px;font-size:3em;line-height:100%;font-family:var(--header-font)}.navbar{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between;align-items:center;margin:0 auto;padding:1em 0;max-width:var(--max-layout-width)}.nav-navs{display:flex;flex-wrap:wrap}.nav-navs ul{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:1px;margin:0;padding:0;list-style:none}.nav-links{justify-content:right;padding:.66rem;color:var(--text-color);font-weight:340;font-size:1em;line-height:2.5;text-decoration:none}.home-title{margin-left:-.12rem;border:none;padding:.12rem;color:var(--primary-color);font-weight:450;font-size:1.7em;text-decoration:none}.meta{padding:0;padding-top:.7vmin;padding-bottom:3vmin;color:var(--meta-color);font-weight:300;font-size:.8rem;line-height:1.4rem;letter-spacing:-.4px}.meta a{color:var(--meta-color);font-weight:inherit;text-decoration:none;text-decoration-color:none}.meta ul,.meta li{display:inline;font-family:var(--sans-serif-font);list-style-type:none}.language-switcher{display:flex;justify-content:center;align-items:center;margin-right:.5rem;margin-left:.5rem}.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{margin:3.5rem 0 1rem;border:none;background-color:var(--divider-color);height:1px}.footnote-reference{font-size:.7rem;font-family:var(--serif-font)}.footnote-definition{margin-bottom:.6rem}.footnote-definition sup{margin-right:.15rem;font-size:.75rem;font-family:var(--serif-font)}.footnote-definition p{display:inline}.footnote-backlink{margin-left:.2rem;font-size:.8rem}.references p{margin-left:2.4rem;text-indent:-2.4rem}.info-box{margin-top:1rem;margin-bottom:1rem;border:1px solid var(--primary-color);border-left-width:.3rem;border-radius:10px;padding:1rem;text-align:center}#page-content{margin-top:4vmin}.quote-container{border:none}.quote-toggle{display:none}.quote-label{display:none;cursor:pointer;border-radius:5px;color:var(--meta-color);font-size:.75rem;font-family:var(--sans-serif-font);text-align:center;text-decoration: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;padding:0;font-size:1em;list-style:none}.pagination .page-item .disabled{opacity:.5;pointer-events:none}.pagination .page-numbers{color:var(--meta-color);font-size:.9rem}.bloglist-container{display:grid;grid-template-columns:1fr}.bloglist-row{display:flex;align-items:flex-start;background-color:var(--navbar-color);padding:2.5rem 0}.bloglist-row .date{width:13.5rem;color:var(--meta-color);font-weight:300;font-size:.9rem}.bloglist-row .bloglist-tags{margin-top:.1rem}.bloglist-row .bloglist-tags .tag{margin-right:.7rem;font-weight:400;font-size:.75rem;text-transform:uppercase}.bloglist-row .bloglist-content{flex:1}.bloglist-row .bloglist-content .bloglist-title{margin:0;font-weight:bold;font-size:1.2em}.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-weight:250;font-size:.9rem;line-height:1.5rem}.all-posts{font-weight:350;font-size:1.3rem}@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{display:inline-block;cursor:help}.spoiler-content .spoiler-hidden{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;filter:blur(6px);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{display:inline-block;filter:blur(6px);content:"SPOILER"}.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{background-color:var(--codeblock-bg);color:var(--text)}.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{background-color:var(--red);color:var(--text)}.z-invalid.z-deprecated{background-color:var(--mauve);color:var(--text)}.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{margin:1rem auto;border-style:hidden !important;border-radius:5px;border-collapse:collapse;border-spacing:0;overflow:hidden;font:inherit;text-align:center}table th,table td{border:1px solid var(--bg-1);padding:6px 13px;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{margin:0;padding:0;list-style:none}.tag-cloud .tags-item{margin-top:1rem}.theme-switcher{-webkit-mask:var(--theme-switcher-svg);position:relative;align-self:center;cursor:pointer;margin-left:.5rem;background:var(--text-color);width:1rem;height:1rem}@font-face{src:local("Inter"),url("fonts/Inter4.woff2") format("woff2");font-family:"Inter";font-display:swap}@font-face{src:local("Source Serif"),url("fonts/SourceSerif4Variable-Roman.ttf.woff2") format("woff2");font-family:"Source Serif";font-display:swap}@font-face{src:local("Cascadia Code"),url("fonts/CascadiaCode-SemiLight.woff2") format("woff2");font-family:"Cascadia Code";font-display:swap}:root{--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";--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: #383444;--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");color-scheme:light;line-height:190%;font-family:var(--sans-serif-font)}[data-theme=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: #282834;--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");color-scheme:dark}[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;margin:0 5vmin;padding:0;min-height:100vh}.content{word-wrap:break-word;margin:0 auto;margin-top:6vmin;margin-bottom:4rem;width:100%;max-width:var(--max-layout-width)}article{margin:0 auto;max-width:calc(var(--max-layout-width) - 12rem)}article p,article li,article details,article summary{font-family:var(--serif-font)}article strong{font-weight:620}article .full-width{margin-right:-6rem;margin-left:-6rem;max-width:calc(100% + 12rem)}.section-title{display:block;margin:0;color:var(--text-color-high-contrast);font-weight:550;font-size:2.2em}.last-updated{margin-top:-5vmin}h1,h2,h3,h4,h5,h6{position:relative}h1{display:block;margin-top:.67em;margin-right:0;margin-bottom:0em;margin-left:0;font-weight:550;font-size:1.5em}h2{display:block;margin-top:.5em;margin-right:0;margin-bottom:0em;margin-left:0;font-weight:550;font-size:1.4em}h3{display:block;margin-top:.3em;margin-right:0;margin-bottom:0em;margin-left:0;font-weight:550;font-size:1.2em}h4{display:block;margin-top:.83em;margin-right:0;margin-bottom:0em;margin-left:0;font-weight:550;font-size:1em}h5{display:block;margin-top:.83em;margin-right:0;margin-bottom:0em;margin-left:0;font-weight:normal;font-size:1em}p{margin-top:.4rem;margin-bottom:max(2.3vmin,24px);font-size:1em;line-height:2rem}strong{font-weight:580}.centered-text{text-align:center}.center-content{display:flex;flex-direction:column;justify-content:center;align-items:center;margin:0;width:100%;height:100vh;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{display:block;margin-right:0;margin-left:0;max-width:none;overflow-x:auto}}@media only screen and (max-width: 600px){.content{margin-top:0rem;max-width:var(--medium-layout-width)}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..e10aa4c12 --- /dev/null +++ b/projects/chu/index.html @@ -0,0 +1 @@ +~/tabi • chu

                  chu

                    chu is a Python-based file uploader built using Python, Flask, and uWSGI. It integrates multiple optimization techniques to make file uploads not just simpler, but smarter.

                    View on GitHub

                    Technical Features

                    • Efficiency Through Compression: Uses Lepton JPEG Compression and optipng to achieve up to 22% space savings.

                    • Security Measures: Implements upload size limits, extension controls, and password-based authentication.

                    • Ease of Use: Generates a URL for each successfully uploaded file, accommodates either random or user-defined filenames.

                    • Metadata Purging: Removes metadata from files for enhanced privacy.

                    • Configurable Upload Size: Allows users to set limits on the size of uploaded files.

                    • Extension-Specific Controls: Provides settings to restrict uploads to specific file extensions.

                    • Direct URL Response: After each successful upload, returns a URL pointing to the file.

                    \ No newline at end of file diff --git a/projects/index.html b/projects/index.html new file mode 100644 index 000000000..5901c4cef --- /dev/null +++ b/projects/index.html @@ -0,0 +1 @@ +~/tabi • Projects

                    Projects

                    img/tabi.webp

                    tabi

                    A fast, lightweight, and modern Zola theme with multi-language support.
                    img/chu.webp

                    chu

                    Python-based file uploader using Flask and uWSGI, focused on efficiency and security.
                    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..cadba155d --- /dev/null +++ b/projects/nani/index.html @@ -0,0 +1,35 @@ +~/tabi • nani

                    nani

                      If you're working on a remote server, you know that sharing files with others can often involve multiple steps. nani is a Bash script designed to streamline this process. By executing a single command, you can convert local files or URLs into accessible links, allowing for easier sharing right from your server.

                      View on GitHub

                      Key Features

                      • Multiple File Types: Handles directories, FLAC files, text files, and even URLs to videos.
                      • Customisable: Tailor settings via a config file or runtime flags.
                      • Notifications: Desktop notifications and clipboard integration for a better experience.

                      Quick Start

                      1. Place nani in a directory within your PATH.
                      2. Make the script executable.

                      For detailed installation steps, read the full documentation.

                      Usage

                      nani Path/To/picture.png
                      +https://example.com/nani/hjRGLZB.png
                      +

                      Share a directory keeping its original name:

                      nani -o Path/To/Directory
                      +https://example.com/nani/Directory.zip
                      +

                      Additional control is available through flags. Here's the output of nani --help:

                      Usage: nani [options] <infile>
                      +Provides public URL from input.
                      +
                      +Input handling:
                      +    Directory                       Will be stored using zip (or symbolic link)
                      +    FLAC                            Can be transcoded to MP3
                      +    Text (html, php...)             Extension can be set to .txt
                      +    Other files                     New copy/hard link/symbolic link at output directory
                      +    URL to video (e.g: youtube)     Downloaded using yt-dlp
                      +    Other URLs                      Downloaded using wget
                      +
                      +Modify the first lines of the script to change how nani behaves: quiet mode,
                      +enabling/disabling transcoding, length of the string, extension truncation...
                      +
                      +Settings and options:
                      +    -a, --alias      Revert the hard link setting
                      +    -c, --cleanup    Remove all files on /nani/ except index.html
                      +    -h, --help       Display this help and exit
                      +    -i, --insert     Open nano to enter text. Saved in output directory as .txt
                      +    -k, --keep       Output dir becomes /nani/k/, to set different cleanup rules
                      +    -l, --list       List files in output directory /nani/
                      +    -n, --name       Use custom name (e.g. nani -n DesiredName <file>)
                      +    -N, --notify     Revert the notify option
                      +    -o, --original   Preserve original file name
                      +    -p, --push       Send push notification
                      +    -q, --quiet      Revert the quiet setting
                      +    -s, --string     Force a certain string length (e.g. nani -s 32 <file>)
                      +    -t, --transcode  Revert the transcode setting
                      +    -x, --xclip      Revert the xclip setting
                      +    -y, --symbolic   Create a symbolic link for files and directories
                      +
                      \ No newline at end of file diff --git a/projects/spectro/index.html b/projects/spectro/index.html new file mode 100644 index 000000000..b73f7984a --- /dev/null +++ b/projects/spectro/index.html @@ -0,0 +1,24 @@ +~/tabi • spectro

                      spectro

                        Transform audio files into BBCode-formatted spectrograms effortlessly with spectro. This Bash script supports a wide array of audio formats such as Ogg, MP3, FLAC, AAC, and more.

                        Spectrogram of Jardin du Sommeil Chant d'Amour Sur La Nuit Grandissante, by Tourette

                        View on GitHub

                        Features

                        • Versatile Format Support: Ogg, MP3, FLAC, AAC, ape, WMA, MP4, and WAV.
                        • BBCode Output: Automatically generates BBCode for forums or websites.
                        • Batch Processing: Can handle entire directories or specific files.
                        • Extensible: Options for customisation including local storage and imgur uploading.

                        Quick Start

                        1. Download spectro to a directory within your PATH, for example, ~/bin.
                        2. Grant execute permissions: chmod +x spectro.

                        For a complete installation guide, read the full documentation.

                        Usage

                        Generate BBCode for an Entire Directory:

                        spectro Path/To/Directory/
                        +

                        Output:

                        [hide=Spectrograms][size=3]
                        +[url=https://i.imgur.com/ClzzbP8.png]01. Jardin Du Sommeil.flac[/url]
                        +[/size][/hide]
                        +

                        Generate BBCode for Specific Files:

                        spectro file1.flac file2.mp3
                        +

                        Additional options and configurations are available. See spectro --help:

                        Usage: spectro [options] <audio_files>
                        +Generate BBCode-formatted spectrograms from audio files.
                        +
                        +Options:
                        +    -c, --compare     Create a .gif comparison of spectrograms (requires ImageMagick)
                        +    -d, --double      Create both zoomed and full spectrograms
                        +    -h, --help        Display this help and exit
                        +    -l, --local       Save spectrograms locally
                        +    -o, --optipng     Reverse optipng setting
                        +    -p, --parallel    Compatible with 'parallel'
                        +    -q, --quiet       Suppress 'Uploading' text
                        +    -s, --sha         Display SHA value
                        +    -t, --text        Use [url] or [img] tags
                        +    -z, --zoom        Create zoomed-in spectrogram
                        +
                        +Examples:
                        +    spectro -ol DirectoryWithMusic/
                        +    printf "[hide=Spectrograms][size=3]" && ls | parallel -k spectro -p; printf "[/size][/hide]"
                        +
                        \ No newline at end of file diff --git a/projects/tabi/index.html b/projects/tabi/index.html new file mode 100644 index 000000000..44d2657d3 --- /dev/null +++ b/projects/tabi/index.html @@ -0,0 +1 @@ +~/tabi • tabi

                        tabi

                          tabi is a modern, feature-rich theme for Zola, a fast static site generator.

                          tabi light and dark mode

                          View on GitHub

                          Features

                          Development Practices

                          • Conventional Commits & Gitmoji: Commit messages follow standardised formats to enhance readability.

                          • Issue Tracking: Each bug or new feature has its dedicated ticket, which is linked to any consequent code commits and related PRs or issues.

                          • Comprehensive Commentary: Tickets are documented with images, videos, and detailed descriptions to facilitate effective communication and problem-solving.

                          • Cross-Referencing: We link all tickets to the relevant code commits, pull requests, or related issues for complete traceability.

                          Project Evolution

                          tabi was originally designed for my personal website, osc.garden. Despite its origins for personal use, best practices were implemented from the outset to ensure quality and maintainability. The theme has since grown to attract a vibrant community of contributors on GitHub.

                          Start Your Writing Journey with tabi

                          You have something to say. Perhaps it's about how linguists haven't agreed on a definition of "word" yet, or about your journey exploring the different flamenco palos, or about how you managed to solve a bug in a popular open-source project.

                          tabi provides the ideal foundation for your writing space, letting you focus on your words while Zola and tabi take care of the technical side. Step into the world of blogging with a system that makes each post a joy to write and to read. Your voice has value—share it with the world.

                          \ 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..78366b929 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,249 @@ + + + + https://welpo.github.io/tabi/ + + + https://welpo.github.io/tabi/about/ + + + 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/faq-languages/ + 2023-09-12 + + + 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/about/ + + + 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/faq-languages/ + 2023-09-12 + + + 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/about/ + + + 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/faq-languages/ + 2023-09-12 + + + 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/faq/ + + + 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/preguntas-frecuentes/ + + + https://welpo.github.io/tabi/tags/preguntes-frequents/ + + + 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/x.svg b/social_icons/x.svg new file mode 100644 index 000000000..f5feed78f --- /dev/null +++ b/social_icons/x.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/faq/atom.xml b/tags/faq/atom.xml new file mode 100644 index 000000000..34888c16a --- /dev/null +++ b/tags/faq/atom.xml @@ -0,0 +1,26 @@ + + + + + This is a web feed, also known as an Atom feed. Subscribe by copying the URL from the address bar into your newsreader. Visit About Feeds to learn more and get started. It's free. + Visit website + Recent posts + ~/tabi - FAQ + tabi is a fast, lightweight, and modern Zola theme with multi-language support, optional JavaScript, and a perfect Lighthouse score. + + + Zola + 2023-09-12T00:00:00+00:00 + https://welpo.github.io/tabi/tags/faq/atom.xml + + Lost in Translation? Not with tabi's Multilingual Capabilities + 2023-09-12T00:00:00+00:00 + 2023-09-12T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/faq-languages/ + Master the art of serving a global audience through tabi's built-in multilingual features. Learn how to change the default language, add multilingual support, and contribute your own translations. + + diff --git a/tags/faq/index.html b/tags/faq/index.html new file mode 100644 index 000000000..69b0c00ce --- /dev/null +++ b/tags/faq/index.html @@ -0,0 +1 @@ +~/tabi • FAQ

                          FAQ

                          12 September 2023

                          Lost in Translation? Not with tabi's Multilingual Capabilities

                          Master the art of serving a global audience through tabi's built-in multilingual features. Learn how to change the default language, add multilingual support, and contribute your own translations.

                          Read more →
                          \ No newline at end of file diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 000000000..708accd6c --- /dev/null +++ b/tags/index.html @@ -0,0 +1 @@ +~/tabi • Tags

                          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..2a459f893 --- /dev/null +++ b/tags/markdown/atom.xml @@ -0,0 +1,37 @@ + + + + + This is a web feed, also known as an Atom feed. Subscribe by copying the URL from the address bar into your newsreader. Visit About Feeds to learn more and get started. It's free. + Visit 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..7b595288d --- /dev/null +++ b/tags/markdown/index.html @@ -0,0 +1 @@ +~/tabi • markdown

                          markdown

                          31 January 2023

                          Markdown examples

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

                          Read more →
                          01 November 2022

                          Table of Contents

                          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..da2c44170 --- /dev/null +++ b/tags/security/atom.xml @@ -0,0 +1,26 @@ + + + + + This is a web feed, also known as an Atom feed. Subscribe by copying the URL from the address bar into your newsreader. Visit About Feeds to learn more and get started. It's free. + Visit 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..d8cd9ef33 --- /dev/null +++ b/tags/security/index.html @@ -0,0 +1 @@ +~/tabi • security

                          security

                          22 February 2023

                          Secure by default

                          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..227559be8 --- /dev/null +++ b/tags/shortcodes/atom.xml @@ -0,0 +1,26 @@ + + + + + This is a web feed, also known as an Atom feed. Subscribe by copying the URL from the address bar into your newsreader. Visit About Feeds to learn more and get started. It's free. + Visit 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..5fa35e6d1 --- /dev/null +++ b/tags/shortcodes/index.html @@ -0,0 +1 @@ +~/tabi • shortcodes

                          shortcodes

                          19 February 2023

                          Custom 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.

                          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..e4e40203f --- /dev/null +++ b/tags/showcase/atom.xml @@ -0,0 +1,114 @@ + + + + + This is a web feed, also known as an Atom feed. Subscribe by copying the URL from the address bar into your newsreader. Visit About Feeds to learn more and get started. It's free. + Visit 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-12T00:00:00+00:00 + https://welpo.github.io/tabi/tags/showcase/atom.xml + + Lost in Translation? Not with tabi's Multilingual Capabilities + 2023-09-12T00:00:00+00:00 + 2023-09-12T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/faq-languages/ + Master the art of serving a global audience through tabi's built-in multilingual features. Learn how to change the default language, add multilingual support, and contribute your own translations. + + + 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..2e86ba516 --- /dev/null +++ b/tags/showcase/index.html @@ -0,0 +1 @@ +~/tabi • showcase

                          showcase

                          12 September 2023

                          Lost in Translation? Not with tabi's Multilingual Capabilities

                          Master the art of serving a global audience through tabi's built-in multilingual features. Learn how to change the default language, add multilingual support, and contribute your own translations.

                          Read more →
                          09 August 2023

                          Customise tabi with skins and a default theme

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

                          Read more →
                          14 July 2023

                          Add comments to your posts with these 4 comment systems

                          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

                          Optimise loading times with a custom font subset

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

                          Read more →
                          22 February 2023

                          Secure by default

                          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

                          Custom 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.

                          Read more →
                          31 January 2023

                          Markdown examples

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

                          Read more →
                          06 January 2023

                          No mandatory JavaScript

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

                          Read more →
                          01 November 2022

                          Table of Contents

                          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..1223bbb8b --- /dev/null +++ b/tags/tutorial/atom.xml @@ -0,0 +1,81 @@ + + + + + This is a web feed, also known as an Atom feed. Subscribe by copying the URL from the address bar into your newsreader. Visit About Feeds to learn more and get started. It's free. + Visit 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-12T00:00:00+00:00 + https://welpo.github.io/tabi/tags/tutorial/atom.xml + + Lost in Translation? Not with tabi's Multilingual Capabilities + 2023-09-12T00:00:00+00:00 + 2023-09-12T00:00:00+00:00 + + welpo + + + https://welpo.github.io/tabi/blog/faq-languages/ + Master the art of serving a global audience through tabi's built-in multilingual features. Learn how to change the default language, add multilingual support, and contribute your own translations. + + + 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..9ad4c8426 --- /dev/null +++ b/tags/tutorial/index.html @@ -0,0 +1 @@ +~/tabi • tutorial

                          tutorial

                          12 September 2023

                          Lost in Translation? Not with tabi's Multilingual Capabilities

                          Master the art of serving a global audience through tabi's built-in multilingual features. Learn how to change the default language, add multilingual support, and contribute your own translations.

                          Read more →
                          09 August 2023

                          Customise tabi with skins and a default theme

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

                          Read more →
                          14 July 2023

                          Add comments to your posts with these 4 comment systems

                          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

                          Optimise loading times with a custom font subset

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

                          Read more →
                          06 January 2023

                          No mandatory JavaScript

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

                          Read more →
                          01 November 2022

                          Table of Contents

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

                          Read more →
                          \ No newline at end of file