From a14aa856ab8dba4ebb0df577e4102032036dfc23 Mon Sep 17 00:00:00 2001 From: Aetherinox Date: Fri, 28 Mar 2025 12:03:53 -0700 Subject: [PATCH] docs(mkdocs): update --- docs/docs/{resources => about}/backers.md | 0 docs/docs/{resources => about}/changelog.md | 2 +- docs/docs/about/contributing.md | 652 ++++++++++++++++++ docs/docs/about/conventions.md | 183 +++++ docs/docs/{resources => about}/license.md | 0 docs/docs/{resources => about}/tags.md | 0 .../docs/{about.md => about/what_is_tvapp.md} | 97 ++- docs/docs/config/env.md | 428 ++++++++++++ docs/docs/javascripts/tablesort.js | 6 + docs/docs/resources/conventions.md | 109 --- docs/docs/stylesheets/extra.css | 514 +++++++++++--- .../overrides/.icons/aetherx/axd/ballot.svg | 1 + .../aetherx/axd/puzzle-piece-simple.svg | 1 + .../.icons/aetherx/axd/puzzle-piece.svg | 1 + .../overrides/.icons/aetherx/axd/puzzle.svg | 1 + .../.icons/aetherx/axd/skull-crossbones.svg | 1 + .../overrides/.icons/aetherx/axd/tv.svg | 1 + .../overrides/.icons/aetherx/axs/clock.svg | 1 + .../overrides/.icons/aetherx/axs/code.svg | 1 + .../.icons/aetherx/axs/puzzle-piece.svg | 1 + .../stylesheets/custom.00c04c01.min.css | 464 ++++++++++++- docs/material/overrides/hooks/shortcodes.py | 373 ++++++---- docs/mkdocs.yml | 546 ++++++++------- 23 files changed, 2771 insertions(+), 612 deletions(-) rename docs/docs/{resources => about}/backers.md (100%) rename docs/docs/{resources => about}/changelog.md (97%) create mode 100644 docs/docs/about/contributing.md create mode 100644 docs/docs/about/conventions.md rename docs/docs/{resources => about}/license.md (100%) rename docs/docs/{resources => about}/tags.md (100%) rename docs/docs/{about.md => about/what_is_tvapp.md} (73%) create mode 100644 docs/docs/config/env.md create mode 100644 docs/docs/javascripts/tablesort.js delete mode 100644 docs/docs/resources/conventions.md create mode 100644 docs/material/overrides/.icons/aetherx/axd/ballot.svg create mode 100644 docs/material/overrides/.icons/aetherx/axd/puzzle-piece-simple.svg create mode 100644 docs/material/overrides/.icons/aetherx/axd/puzzle-piece.svg create mode 100644 docs/material/overrides/.icons/aetherx/axd/puzzle.svg create mode 100644 docs/material/overrides/.icons/aetherx/axd/skull-crossbones.svg create mode 100644 docs/material/overrides/.icons/aetherx/axd/tv.svg create mode 100644 docs/material/overrides/.icons/aetherx/axs/clock.svg create mode 100644 docs/material/overrides/.icons/aetherx/axs/code.svg create mode 100644 docs/material/overrides/.icons/aetherx/axs/puzzle-piece.svg diff --git a/docs/docs/resources/backers.md b/docs/docs/about/backers.md similarity index 100% rename from docs/docs/resources/backers.md rename to docs/docs/about/backers.md diff --git a/docs/docs/resources/changelog.md b/docs/docs/about/changelog.md similarity index 97% rename from docs/docs/resources/changelog.md rename to docs/docs/about/changelog.md index ca810d53..d5a25168 100644 --- a/docs/docs/resources/changelog.md +++ b/docs/docs/about/changelog.md @@ -17,7 +17,7 @@ tags: ### 1.0.0 Feb 24, 2025 { id="1.0.0" } - +- Initial release
diff --git a/docs/docs/about/contributing.md b/docs/docs/about/contributing.md new file mode 100644 index 00000000..34d6f02b --- /dev/null +++ b/docs/docs/about/contributing.md @@ -0,0 +1,652 @@ +--- +title: Contributing to TVApp2 +tags: + - info +--- + +
+

♾️ Contributing ♾️

+ +
+ +

+ + +[![Version][github-version-img]][github-version-uri] +[![Downloads][github-downloads-img]][github-downloads-uri] +[![Size][github-size-img]][github-size-img] +[![Last Commit][github-commit-img]][github-commit-img] +[![Contributors][contribs-all-img]](#contributors) + + +

+ +
+ +
+ +--- + +
+ +## About + +Below are a list of ways that you can help contribute to this project, as well as policies and guides that explain how to get started. + +Please review everything on this page before you submit your contribution. + +
+ +--- + +
+ +- [About](#about) +- [Issues, Bugs, Ideas](#issues-bugs-ideas) +- [Contributing](#contributing) + - [Before Submitting Pull Requests](#before-submitting-pull-requests) + - [Conventional Commit Specification](#conventional-commit-specification) + - [Types](#types) + - [Example 1:](#example-1) + - [Example 2:](#example-2) + - [Committing](#committing) + - [Languages](#languages) + - [Python](#python) + - [Indentation](#indentation) + - [Line Length](#line-length) + - [Blank Lines](#blank-lines) + - [Imports](#imports) + - [Commenting](#commenting) + - [Casing](#casing) + - [NodeJS](#nodejs) + - [Prettier](#prettier) + - [ESLint](#eslint) + - [v9 \& Newer (Config)](#v9--newer-config) + - [v8 \& Older (Config)](#v8--older-config) + - [Packages](#packages) + - [Indentation](#indentation-1) + - [Style](#style) + - [Line Length](#line-length-1) + - [Commenting](#commenting-1) + - [Casing](#casing-1) + +
+ +--- + +
+ +## Issues, Bugs, Ideas + +Stuff happens, and sometimes as best as we try, there may be issues within this project that we are unaware of. That is the great thing about open-source; anyone can use the program and contribute to making it better. + +
+ +If you have found a bug, have an issue, or maybe even a cool idea; you can let us know by [submitting it](https://github.com/thebinaryninja/tvapp2/issues). However, before you submit your new issue, bug report, or feature request; head over to the [Issues Section](https://github.com/thebinaryninja/tvapp2/issues) and ensure nobody else has already submitted it. + +
+ +Once you are sure that your issue has not already being dealt with; you may submit a new issue at [here](https://github.com/thebinaryninja/tvapp2/issues/new/choose). You'll be asked to specify exactly what your new submission targets, such as: +- Bug report +- Feature Suggestion + +
+ +When writing a new submission; ensure you fill out any of the questions asked of you. If you do not provide enough information, we cannot help. Be as detailed as possible, and provide any logs or screenshots you may have to help us better understand what you mean. Failure to fill out the submission properly may result in it being closed without a response. + +
+ +If you are submitting a bug report: + +- Explain the issue +- Describe how you expect for a feature to work, and what you're seeing instead of what you expected. +- List possible options for a resolution or insight +- Provide screenshots, logs, or anything else that can visually help track down the issue. + +
+ +
+ +[![Submit Issue][btn-github-submit-img]][btn-github-submit-uri] + +
+ +
+ +
+ +**[`^ back to top ^`](#about)** + +
+ +
+ +--- + +
+ +## Contributing + +If you are looking to contribute to this project by actually submit your own code; please review this section completely. There is important information and policies provided below that you must follow for your pull request to get accepted. + +The source is here for everyone to collectively share and collaborate on. If you think you have a possible solution to a problem; don't be afraid to get your hands dirty. + +All contributions are made via pull requests. To create a pull request, you need a GitHub account. If you are unclear on this process, see [GitHub's documentation on forking and pull requests](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork). Pull requests should be targeted at the master branch. + +
+ +### Before Submitting Pull Requests + +- Follow the repository's code formatting conventions (see below); +- Include tests that prove that the change works as intended and does not add regressions; +- Document the changes in the code and/or the project's documentation; +- Your PR must pass the CI pipeline; +- When submitting your Pull Request, use one of the following branches: + - For bug fixes: `main` branch + - For features & functionality: `development` branch +- Include a proper git commit message following the [Conventional Commit Specification](https://conventionalcommits.org/en/v1.0.0/#specification). + +
+ +If you have completed the above tasks, the pull request is ready to be reviewed and your pull request's label will be changed to "Ready for Review". At this point, a human will need to step in and manually verify your submission. + +Reviewers will approve the pull request once they are satisfied with the patch it will be merged. + +
+ +### Conventional Commit Specification + +When committing your changes, we require you to follow the [Conventional Commit Specification](https://conventionalcommits.org/en/v1.0.0/#specification). The **Conventional Commits** is a specification for the format and content of a commit message. The concept behind Conventional Commits is to provide a rich commit history that can be read and understood by both humans and automated tools. Conventional Commits have the following format: + +
+ +``` +[(optional )]: + +[optional ] + +[optional ] +``` + +
+ +#### Types + +Our repositories make use of the following commit tags: + +
+ +| Type | Description | +| --- | --- | +| `feat` | Introduce new feature | +| `fix` | Bug fix | +| `chore` | Includes technical or preventative maintenance task that is necessary for managing the app or repo, such as updating grunt tasks, but is not tied to any specific feature. Usually done for maintenance purposes.
E.g: Edit .gitignore, .prettierrc, .prettierignore, .gitignore, eslint.config.js file
| +| `revert` | Revert a previous commit | +| `style` | Update / reformat style of source code. Does not change the way app is implemented. Changes that do not affect the meaning of the code
E.g: white-space, formatting, missing semi-colons, change tabs to spaces, etc)
| +| `docs` | Change website or markdown documents. Does not mean changes to the documentation generator script itself, only the documents created from the generator.
E.g: documentation, readme.md or markdown | +| `build` | Changes to the build / compilation / packaging process or auxiliary tools such as doc generation
E.g: create new build tasks, update release script, etc.
| +| `refactor` | Change to production code that leads to no behavior difference,
E.g: split files, rename variables, rename package, improve code style, etc.
| +| `test` | Add or refactor tests, no production code change. Changes the suite of automated tests for the app. | +| `ci` | Changes related to Continuous Integration (usually `yml` and other configuration files). | +| `perf` | Performance improvement of algorithms or execution time of the app. Does not change an existing feature. | + +
+ +##### Example 1: + +``` +feat(core): bug affecting menu [#22] +^───^────^ ^────────────────^ ^───^ +| | | | +| | | └───⫸ (ISSUE): Reference issue ID +│ │ │ +│ │ └──────────────────────⫸ (DESC): Summary in present tense. Use lower case not title case! +│ │ +│ └──────────────────────────────⫸ (SCOPE): The package(s) that this change affects +│ +└──────────────────────────────────⫸ (TYPE): See list above +``` + +
+ +##### Example 2: + +``` +(): [issue] + | | | | + | | | └─⫸ Reference issue id (optional) + │ │ │ + │ │ └─⫸ Summary in present tense. Not capitalized. No period at the end. + │ │ + │ └─⫸ Commit Scope: animations|bazel|benchpress|common|compiler|compiler-cli|core| + │ elements|forms|http|language-service|localize|platform-browser| + │ platform-browser-dynamic|platform-server|router|service-worker| + │ upgrade|zone.js|packaging|changelog|docs-infra|migrations|ngcc|ve| + │ devtools.... + │ + └─⫸ Commit Type: build|ci|doc|docs|feat|fix|perf|refactor|test + website|chore|style|type|revert|deprecate +``` + +
+ +### Committing + +If you are pushing a commit which addresses a submitted issue, reference your issue at the end of the commit message. You may also optionally add the major issue to the end of your commit body. + +References should be on their own line, following the word `Ref` or `Refs` + +``` +Title: fix(core): fix error message displayed to users. [#22] +Description: The description of your commit + + Ref: #22, #34, #37 +``` + +
+
+ +### Languages + +The formatting of code greatly depends on the language being used for this repository. We provide various different languages below as this guide is utilized across multiple repositories. + +- [Python](#python) +- [Javascript / Typescript / NodeJS](#nodejs) + +
+
+ +#### Python + +The following guidelines apply to any projects written with Python: + +
+ +##### Indentation + +Use `4 spaces` per indentation level. + +
+ +> [!TIP] +> ✅ Correct +> ```python +> def Encrypt( key : int, bytestr : bytes ): +> res = b'' +> i_blk, left_bytes = divmod( len(bytestr), 3 ) +> ``` + +
+ +> [!CAUTION] +> ❌ Wrong +> ```python +> def encrypt( key : int, byteStr : bytes ): +> Res = b'' +> iBlk, leftBytes = divmod( len(byteStr), 3 ) +> ``` + +
+ +##### Line Length + +Keep the maximum character count to `100 characters per line`. If you are revising old code which doesn't follow this guideline; please rewrite it to conform. + +
+ +##### Blank Lines + +Surround top-level functions and class definitions with a blank in-between. + +Method definitions inside a class are surrounded by a single blank line. + +Extra blank lines may be used (sparingly) to separate groups of functions related to one another. Blank lines may be omitted between a bunch of related one-liners (e.g: set of dummy implementations). + +
+ +##### Imports + +Imports should usually be on separate lines: + +
+ +> [!TIP] +> ✅ Correct +> ```python +> import os +> import sys +> ``` + +
+ +> [!CAUTION] +> ❌ Wrong +> ```python +> import sys, os +> ``` + +
+ +The following is acceptable: + +
+ +> [!TIP] +> ✅ Correct +> ```python +> from mypkg import siblingA, siblingB, siblingC +> ``` + +
+ +##### Commenting + +Comment your code. It helps novice readers to better understand the process. It doesn't have to be painfully obvious explanations, but it helps to give an idea of what something does. + +Please append `#` to the beginning of each line. + +```python +# # +# byteString : b'1#Aetherx|232#1#233262#0#0#0#' +# # + +def Encrypt( key : int, byteString : bytes ): + res = bytearray( ) +``` + +
+ +
+ +##### Casing + +- Stick to `camelCase`; unless: + - naming functions, capitalize the first letter + - Capitalize enums +- If you see code not conforming with this, please revise it in your pull request. + +
+ +> [!TIP] +> ✅ Correct +> ```python +> def Encrypt( key : int, byteStr : bytes ): +> res = b'' +> iBlock, leftBytes = divmod( len(byteStr), 3 ) +> ``` + +
+ +> [!CAUTION] +> ❌ Wrong +> ```python +> def encrypt( key : int, bytestr : bytes ): +> res = b'' +> i_blk, left_bytes = divmod( len(bytestr), 3 ) +> ``` + +
+ +
+ +
+ +**[`^ back to top ^`](#about)** + +
+ +
+ +--- + +
+ +#### NodeJS + +The following allows you to configure ESLint and Prettier. + +
+
+ +##### Prettier + +We have opted to make use of [ESLint](#eslint) over Prettier. We provide a detailed ESLint flag config file with very specific linting rules. Please review that section for more information. + +
+
+ +##### ESLint + +Within the root folder of the repo, there are several configuration files which you should be using within the project. These files dictate how prettier and eslint will behave and what is acceptable / not acceptable. + +
+ +Pick the config file below depending on which version of ESLint you are using. The v8 and older `.eslint` may not be there if we have migrated over to an Eslint v9 flat config file: + +
+ +###### v9 & Newer (Config) + +Our NodeJS applications require that you utilize ESLint v9 or newer which makes use of a flat config structure. You may find a copy of our flat config at the link below: + +- [📄 eslint.config.mjs](https://github.com/thebinaryninja/tvapp2/blob/main/tvapp2/eslint.config.mjs) + +
+ +###### v8 & Older (Config) + +- We no longer utilize any version of ESLint older than version 9. + +
+
+ +> [!NOTE] +> When submitting your pull request, these linting and style rules will be verified with all of your files. If you did not follow these rules; the linter tests on your pull request will fail; and you'll be expected to correct these issues before your submission will be transferred over for human review. + +
+
+ +##### Packages + +We use the following packages for linting and prettier. + +
+ +| Package | Repo File | Description | +| --- | --- | --- | +| [@stylistic/eslint-plugin-js](https://npmjs.com/package/@stylistic/eslint-plugin-js) | [package.json](./package.json) | JavaScript stylistic rules for ESLint, migrated from eslint core. | +| [@stylistic/eslint-plugin-ts](https://npmjs.com/package/@stylistic/eslint-plugin-ts) | [package.json](./package.json) | TypeScript stylistic rules for ESLint, migrated from typescript-eslint. | +| [@stylistic/eslint-plugin-plus](https://npmjs.com/package/@stylistic/eslint-plugin-plus) | [package.json](./package.json) | Supplementary rules introduced by ESLint Stylistic. | +| [eslint-plugin-prettier](https://npmjs.com/package/eslint-plugin-prettier) | [package.json](./package.json) | Runs Prettier as an ESLint rule and reports differences as individual ESLint issues. | + +
+ +You can add the following to your `package.json` file: + +https://github.com/TheBinaryNinja/tvapp2/blob/1c75f11e9f0506ad3dd05133fdafc3aeb87686ca/tvapp2/package.json#L81-L92 + + + +
+
+ +##### Indentation + +Use `4 spaces` per indentation level. + +
+
+ +##### Style + +For files that are not controlled by [Prettier](#prettier) or [ESLint](#eslint); use `Allman Style`. Braces should be on their own lines, and any code inside the braces should be indented 4 spaces. + +
+ +```javascript +return { + status: "failure", + user: + { + id: "1aaa35aa-fb3a-62ae-ffec-a14g7fc401ac", + label: "Test String", + } +}; + +while (x == y) +{ + foo(); + bar(); +} +``` + +
+
+ +##### Line Length + +Keep the maximum character count to `100 characters per line`. The configs on this page have prettier automatically set up to detect more than 100 characters per line. + +
+ +##### Commenting + +Comment your code. It helps novice readers to better understand the process. You may use block style commenting, or single lines: + +```javascript +/* + tests to decide if the end-user is running on Darwin or another platform. +*/ + +test(`Return true if platform is Darwin`, () => { + process.platform = 'darwin'; + expect(bIsDarwin()).toBe(true); +}); + +test(`Return false if platform is not Darwin`, () => { + process.platform = 'linux'; + expect(bIsDarwin()).toBe(false); +}); +``` + +
+ +##### Casing + +Stick to `camelCase` as much as possible. + +```javascript +let myVar = 'one'; +let secondVar = 'two'; +``` + +
+ +If you are defining a new environment variable; it must be in ALL CAPS in the `Dockerfile`: + +```dockerfile +ENV DIR_BUILD=/usr/src/app +ENV DIR_RUN=/usr/bin/app +ENV URL_REPO="https://git.binaryninja.net/binaryninja/" +ENV WEB_IP="0.0.0.0" +ENV WEB_PORT=4124 +ENV STREAM_QUALITY="hd" +ENV FILE_PLAYLIST="playlist.m3u8" +ENV FILE_EPG="xmltv.xml" +ENV LOG_LEVEL=4 +ENV TZ="Etc/UTC" +``` + +
+ +Then you may call your new environment variable within the Javascript code; and ensure you define a default value to correct any user misconfigurations: + +```javascript +const envUrlRepo = process.env.URL_REPO || 'https://git.binaryninja.net/binaryninja'; +const envStreamQuality = process.env.STREAM_QUALITY || 'hd'; +const envFileM3U = process.env.FILE_PLAYLIST || 'playlist.m3u8'; +const envFileXML = process.env.FILE_EPG || 'xmltv.xml'; +const envFileTAR = process.env.FILE_TAR || 'xmltv.xml.gz'; +``` + +
+
+ +
+ +**[`^ back to top ^`](#about)** + +
+ +
+
+ +
+
+ + + + + + [general-npmjs-uri]: https://npmjs.com + [general-nodejs-uri]: https://nodejs.org + [general-npmtrends-uri]: http://npmtrends.com/tvapp2 + + + [github-version-img]: https://img.shields.io/github/v/tag/thebinaryninja/tvapp2?logo=GitHub&label=Version&color=ba5225 + [github-version-uri]: https://github.com/thebinaryninja/tvapp2/releases + + + [license-mit-img]: https://img.shields.io/badge/MIT-FFF?logo=creativecommons&logoColor=FFFFFF&label=License&color=9d29a0 + [license-mit-uri]: https://github.com/thebinaryninja/tvapp2/blob/main/LICENSE + + + [github-downloads-img]: https://img.shields.io/github/downloads/thebinaryninja/tvapp2/total?logo=github&logoColor=FFFFFF&label=Downloads&color=376892 + [github-downloads-uri]: https://github.com/thebinaryninja/tvapp2/releases + + + [github-size-img]: https://img.shields.io/github/repo-size/thebinaryninja/tvapp2?logo=github&label=Size&color=59702a + [github-size-uri]: https://github.com/thebinaryninja/tvapp2/releases + + + [contribs-all-img]: https://img.shields.io/github/all-contributors/thebinaryninja/tvapp2?logo=contributorcovenant&color=de1f6f&label=contributors + [contribs-all-uri]: https://github.com/all-contributors/all-contributors + + + [github-build-img]: https://img.shields.io/github/actions/workflow/status/thebinaryninja/tvapp2/npm-release.yml?logo=github&logoColor=FFFFFF&label=Build&color=%23278b30 + [github-build-uri]: https://github.com/thebinaryninja/tvapp2/actions/workflows/npm-release.yml + + + [github-build-pypi-img]: https://img.shields.io/github/actions/workflow/status/thebinaryninja/tvapp2/release-pypi.yml?logo=github&logoColor=FFFFFF&label=Build&color=%23278b30 + [github-build-pypi-uri]: https://github.com/thebinaryninja/tvapp2/actions/workflows/pypi-release.yml + + + [github-tests-img]: https://img.shields.io/github/actions/workflow/status/thebinaryninja/tvapp2/npm-tests.yml?logo=github&label=Tests&color=2c6488 + [github-tests-uri]: https://github.com/thebinaryninja/tvapp2/actions/workflows/npm-tests.yml + + + [github-commit-img]: https://img.shields.io/github/last-commit/thebinaryninja/tvapp2?logo=conventionalcommits&logoColor=FFFFFF&label=Last%20Commit&color=313131 + [github-commit-uri]: https://github.com/thebinaryninja/tvapp2/commits/main/ + + + [github-docker-version-img]: https://badges-ghcr.onrender.com/thebinaryninja/tvapp2/latest_tag?color=%233d9e18&ignore=development-amd64%2Cdevelopment%2Cdevelopment-arm64%2Clatest&label=version&trim= + [github-docker-version-uri]: https://github.com/thebinaryninja/tvapp2/pkgs/container/tvapp2 + + + [dockerhub-docker-version-img]: https://img.shields.io/docker/v/thebinaryninja/tvapp2?sort=semver&arch=arm64 + [dockerhub-docker-version-uri]: https://hub.docker.com/repository/docker/thebinaryninja/tvapp2/general + + + [gitea-docker-version-img]: https://badges-ghcr.onrender.com/thebinaryninja/tvapp2/latest_tag?color=%233d9e18&ignore=latest&label=version&trim= + [gitea-docker-version-uri]: https://git.binaryninja.net/BinaryNinja/tvapp2 + + + [gitea2-docker-version-img]: https://img.shields.io/gitea/v/release/binaryninja/tvapp2?gitea_url=https%3A%2F%2Fgit.binaryninja.net + [gitea2-docker-version-uri]: https://git.binaryninja.net/BinaryNinja/-/packages/container/tvapp2/latest + + + [btn-github-submit-img]: https://img.shields.io/badge/submit%20new%20issue-de1f5c?style=for-the-badge&logo=github&logoColor=FFFFFF + [btn-github-submit-uri]: https://github.com/thebinaryninja/tvapp2/issues + + + diff --git a/docs/docs/about/conventions.md b/docs/docs/about/conventions.md new file mode 100644 index 00000000..bed597cf --- /dev/null +++ b/docs/docs/about/conventions.md @@ -0,0 +1,183 @@ +# Conventions +This documentation use some symbols for illustration purposes. Before you read +on, please make sure you've made yourself familiar with the following list of +conventions: + +
+ +### Release Type { data-toc-label="Version" } + +The tag symbol in conjunction with a version number denotes when a specific feature or behavior was added. Make sure you're at least on this version if you want to use it. + +: default +: stable +: development + +
+ +### Controls { #default data-toc-label="Control" } + +These icons define what type of control a specified setting uses. + +: toggle +: toggle on +: toggle off +: textbox +: dropdown +: button +: slider +: color wheel + +
+ +### – Default Value { #default data-toc-label="Default value" } + +This defines what the default value for a setting is. + +: Specified setting has a default value +: Specified setting has no default value and is empty +: Specified setting is automatically computed by the app + +
+ +### – Command { #command data-toc-label="Command" } + +This defines a command + +: Specified setting has a default value + +
+ +### – Flags { #flags data-toc-label="Flags" } + +: Default +: Experimental +: Required +: Customization +: Metadata +: Dangerous +: Multiple +: Setting + +Anything listed with this icon are features or functionality that are still in development and may change in future versions. + +
+ +### – 3rd Party { data-toc-label="3rd Party" } + +This symbol denotes that the item described is classified as something that changes the overall functionality of the plugin. + +
+ +### – Configurable Settings { #setting data-toc-label="Configurable Setting" } + +The following denotes a configurable setting. These can also be broken up into individual settings as shown below: + +#### + + + +This is an example setting + +#### + + + +This is another example setting + +
+ +### – Multiple instances { #multiple-instances data-toc-label="Multiple instances" } + +This symbol denotes that the plugin supports multiple instances, i.e, that it +can be used multiple times in the `plugins` setting in `mkdocs.yml`. + +
+ +### – Optional feature { #feature data-toc-label="Optional feature" } + +Some features may be hidden behind feature flags, which means they must +be explicitly enabled first before they can be configured. This allows +for the existence of potentially orthogonal features. + +
+ +### – Markdown extension { data-toc-label="Markdown extension" #extension } + +This symbol denotes that the thing described is a Markdown element. + +
+ +### – Dangerous { #danger data-toc-label="Dangerous Property" } + +This symbol denotes that the item described is a metadata property, which can +be used in Markdown documents as part of the front matter definition. + + +
+ +### – Backers only { data-toc-label="Backers only" } + +The pumping heart symbol denotes that a specific feature or behavior is only +available to backers. Normal users will not have access to this particular item. + +
+ +--- + +
+ +## Other Tags + +
+ +### Example Download { #example data-toc-label="Dangerous Property" } + + +The following denotes a downloadable file. + +
+ +### Commands + + +The above denotes a command which can be executed in a terminal / command prompt. + +
+ +## Options + +Options are another form of setting which lists what the option does, and then examples of how it works. + + + +: This option specifies whether + the plugin is enabled when building your project. If you want to speed up + local builds, you can use an [environment variable][mkdocs.env]: + + ``` yaml + plugins: + - rss: + enabled: !ENV [CI, false] + ``` + + + +: This option specifies which + pages should be included in the feed. For example, to only include blog + posts in the feed, use the following regular expression: + + ``` yaml + plugins: + - rss: + match_path: blog/posts/.* + ``` + +
+ +--- + +
+ +
+
diff --git a/docs/docs/resources/license.md b/docs/docs/about/license.md similarity index 100% rename from docs/docs/resources/license.md rename to docs/docs/about/license.md diff --git a/docs/docs/resources/tags.md b/docs/docs/about/tags.md similarity index 100% rename from docs/docs/resources/tags.md rename to docs/docs/about/tags.md diff --git a/docs/docs/about.md b/docs/docs/about/what_is_tvapp.md similarity index 73% rename from docs/docs/about.md rename to docs/docs/about/what_is_tvapp.md index 132587d1..1df0c35c 100644 --- a/docs/docs/about.md +++ b/docs/docs/about/what_is_tvapp.md @@ -7,8 +7,8 @@ tags: # About
- ![Image settings](https://raw.githubusercontent.com/TheBinaryNinja/tvapp2/main/docs/img/screenshots/01.png){ width="100%" } -
TVApp2 Main Interest
+ ![Image settings](https://raw.githubusercontent.com/TheBinaryNinja/tvapp2/main/docs/img/screenshots/01.png){ width="60%" } +
TVApp2 Main Interface

@@ -22,7 +22,7 @@ tags: [![Downloads][github-downloads-img]][github-downloads-uri] [![Size][github-size-img]][github-size-img] [![Last Commit][github-commit-img]][github-commit-img] -[![Contributors][contribs-all-img]](#contributors-) +[![Contributors][contribs-all-img]](#contributors)

@@ -46,36 +46,6 @@ All channels contain multiple sources so that you have a reliable streaming expe Check out the following websites for additional resources for the TVApp2 docker image below. -```embed -url: https://github.com/TheBinaryNinja/tvapp2 -image: https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQjFUDe-vdiprKpCsiLoRmfCdUq0WS5tqUR9fyEzJjQ0g&s -name: Github: TVApp2 -desc: Official github repository for the TVApp2 docker container. -favicon: https://github.com/Aetherinox/mkdocs-link-embeds/assets/118329232/6433449b-2988-4da3-9d43-ff4c992a9fcf -favicon_size: 25 -``` - -
- -```embed -url: https://hub.docker.com/repository/docker/thebinaryninja/tvapp2/general -image: https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRPt5TDzKi3PTTqLCyeXvnJ3Mj2y5speGcrvw&s -name: Dockerhub: TVApp2 -desc: TVApp2 docker images hosted through Dockerhub. -favicon: https://github.com/Aetherinox/mkdocs-link-embeds/assets/118329232/6433449b-2988-4da3-9d43-ff4c992a9fcf -favicon_size: 25 -``` - -
- -```embed -url: https://git.binaryninja.net/BinaryNinja/ -image: https://avatars.githubusercontent.com/u/200161462?s=400&u=1ce7cfadace57652a2a2f76ef2fd5751fccbbe77&v=4 -name: Gitea: TVApp2 -desc: Official TVApp2 docker image hosted on Gitea. -favicon: https://github.com/Aetherinox/mkdocs-link-embeds/assets/118329232/6433449b-2988-4da3-9d43-ff4c992a9fcf -favicon_size: 25 -```
@@ -119,6 +89,67 @@ The following is a small list of the features available with the TVApp2 containe
+## ✨ Contributors + +We are always looking for contributors. If you feel that you can provide something useful to Gistr, then we'd love to review your suggestion. Before submitting your contribution, please review the following resources: + +- [Pull Request Procedure](https://github.com/TheBinaryNinja/tvapp2/blob/main/.github/PULL_REQUEST_TEMPLATE.md) +- [Contributor Policy](https://github.com/TheBinaryNinja/tvapp2/blob/main/CONTRIBUTING.md) + +
+ +Want to help but can't write code? +- Review [active questions by our community](https://github.com/TheBinaryNinja/tvapp2/labels/help%20wanted) and answer the ones you know. + +
+ +
+ +![Alt](https://repobeats.axiom.co/api/embed/fb7e11f0bc61b125f923a0ee3eb0bd8aba79b8d5.svg "Repobeats analytics image") + +
+ +
+ +The following people have helped get this project going: + +
+ +
+ + +[![Contributors][contribs-all-img]](#contributors) + + + + + + + + + + + + + +
+ Aetherinox
Aetherinox

💻 +
+ iFlip721
iFlip721

💻 +
+ Nvmdfth
Optx

💻 +
+
+ + + + +
+ +--- + +
+ diff --git a/docs/docs/config/env.md b/docs/docs/config/env.md new file mode 100644 index 00000000..8b486671 --- /dev/null +++ b/docs/docs/config/env.md @@ -0,0 +1,428 @@ +--- +title: Environment Variables +tags: + - config +--- + +# Environment Variables + +Environment variables allow you to modify how TVApp2 functions within a docker container. Ensure that +you understand the setting you are changing before you apply the change, otherwise, TVApp2 may fail to +start due to misconfigurations. + +
+ +## TZ + + + + +The `TZ` environment variable specifies the timezone that your docker container will +utilize. This is useful for syncing your local time with console outputs such as +our logging system. + +=== "Example" + + ``` { .yaml .copy .select title="docker-compose.yml" linenums="1" hl_lines="13" } + services: + tvapp2: + container_name: tvapp2 + image: ghcr.io/thebinaryninja/tvapp2:latest + restart: unless-stopped + volumes: + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock + - ./config:/config + - ./app:/usr/bin/app + environment: + - TZ=Etc/UTC # (1) + ``` + + 1. :information: Changing this env variable will change the time for anything + related to the TVApp2 docker container. + +=== "Timezones" + + ``` yaml + Etc/UTC + Africa/Cairo + Africa/Johannesburg + Africa/Lagos + America/Argentina/Buenos_Aires + America/Bogota + America/Caracas + America/Chicago + America/El_Salvador + America/Juneau + America/Lima + America/Los_Angeles + America/Mexico_City + America/New_York + America/Phoenix + America/Santiago + America/Sao_Paulo + America/Toronto + America/Vancouver + Asia/Almaty + Asia/Ashkhabad + Asia/Bahrain + Asia/Bangkok + Asia/Chongqing + Asia/Dubai + Asia/Ho_Chi_Minh + Asia/Hong_Kong + Asia/Jakarta + Asia/Jerusalem + Asia/Kathmandu + Asia/Kolkata + Asia/Kuwait + Asia/Muscat + Asia/Qatar + Asia/Riyadh + Asia/Seoul + Asia/Shanghai + Asia/Singapore + Asia/Taipei + Asia/Tehran + Asia/Tokyo + Atlantic/Reykjavik + Australia/ACT + Australia/Adelaide + Australia/Brisbane + Australia/Sydney + Europe/Athens + Europe/Belgrade + Europe/Berlin + Europe/Copenhagen + Europe/Helsinki + Europe/Istanbul + Europe/London + Europe/Luxembourg + Europe/Madrid + Europe/Moscow + Europe/Paris + Europe/Riga + Europe/Rome + Europe/Stockholm + Europe/Tallinn + Europe/Vilnius + Europe/Warsaw + Europe/Zurich + Pacific/Auckland + Pacific/Chatham + Pacific/Fakaofo + Pacific/Honolulu + Pacific/Norfolk + US/Mountain + ``` + +
+ +## WEB_IP + + + + +The `WEB_IP` environment variable allows you to define what IP address will be +bound to the TVApp2 docker image. + +``` { .yaml .copy .select title="docker-compose.yml" linenums="1" hl_lines="13" } +services: + tvapp2: + container_name: tvapp2 + image: ghcr.io/thebinaryninja/tvapp2:latest + restart: unless-stopped + volumes: + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock + - ./config:/config + - ./app:/usr/bin/app + environment: + - WEB_IP=0.0.0.0 # (1) +``` + +1. :information: Specify `0.0.0.0` to bind to all local IP addresses. + +
+ +## WEB_PORT + + + + +The `WEB_PORT` environment variable allows you to define what port the TVApp2 +docker container will listen to. + +``` { .yaml .copy .select title="docker-compose.yml" linenums="1" hl_lines="13" } +services: + tvapp2: + container_name: tvapp2 + image: ghcr.io/thebinaryninja/tvapp2:latest + restart: unless-stopped + volumes: + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock + - ./config:/config + - ./app:/usr/bin/app + environment: + - WEB_IP=4124 # (1) +``` + +1. :information: The default port is `4124` + +
+ +## URL_REPO + + + + +The `URL_REPO` environment variable allows you to specify what Github repo is used to communicate +with in order to fetch IPTV data. This is used as an internal environment variable by the developers +and should not be changed by the end-user; otherwise you will be unable to fetch IPTV data. + +``` { .yaml .copy .select title="docker-compose.yml" linenums="1" hl_lines="13" } +services: + tvapp2: + container_name: tvapp2 + image: ghcr.io/thebinaryninja/tvapp2:latest + restart: unless-stopped + volumes: + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock + - ./config:/config + - ./app:/usr/bin/app + environment: + - URL_REPO=https://git.binaryninja.net/binaryninja # (1) +``` + +1. :warning: It is highly recommended that you do not change this value + otherwise you will not be able to download the latest M3U playlists and EPG + guide data. + +
+ +## DIR_BUILD + + + + +The `DIR_BUILD` environment variable specifies what local folder will be utilized +by the TVApp2 docker container when the container builds the app. + +``` { .yaml .copy .select title="docker-compose.yml" linenums="1" hl_lines="13" } +services: + tvapp2: + container_name: tvapp2 + image: ghcr.io/thebinaryninja/tvapp2:latest + restart: unless-stopped + volumes: + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock + - ./config:/config + - ./app:/usr/bin/app + environment: + - DIR_BUILD=/usr/src/app # (1) +``` + +1. :warning: You should not change this unless you are an advanced user. + +
+ +## DIR_RUN + + + + +The `DIR_RUN` environment variable specifies what local folder will be utilized +by the TVApp2 docker container when the container has built the app and placed it +into a production folder. + +``` { .yaml .copy .select title="docker-compose.yml" linenums="1" hl_lines="13" } +services: + tvapp2: + container_name: tvapp2 + image: ghcr.io/thebinaryninja/tvapp2:latest + restart: unless-stopped + volumes: + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock + - ./config:/config + - ./app:/usr/bin/app + environment: + - DIR_RUN=/usr/bin/app # (1) +``` + +1. :warning: You should not change this unless you are an advanced user. + +
+ +## STREAM_QUALITY + + + + +The `STREAM_QUALITY` environment variable specifies the default stream quality that will +be used when you initiate a new channel to view. + +Available Options: + + * `hd` High Definition + * `sd` Standard Definition + +``` { .yaml .copy .select title="docker-compose.yml" linenums="1" hl_lines="13" } +services: + tvapp2: + container_name: tvapp2 + image: ghcr.io/thebinaryninja/tvapp2:latest + restart: unless-stopped + volumes: + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock + - ./config:/config + - ./app:/usr/bin/app + environment: + - STREAM_QUALITY=hd # (1) +``` + +1. :information: This environment variable has the following options: + - hd + - sd + +
+ +## FILE_PLAYLIST + + + + +The `FILE_PLAYLIST` environment variable specifies the filename that will be utilized when +your .m3u playlist file is generated. + +``` { .yaml .copy .select title="docker-compose.yml" linenums="1" hl_lines="13" } +services: + tvapp2: + container_name: tvapp2 + image: ghcr.io/thebinaryninja/tvapp2:latest + restart: unless-stopped + volumes: + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock + - ./config:/config + - ./app:/usr/bin/app + environment: + - FILE_PLAYLIST=playlist.m3u8 # (1) +``` + +1. :information: Changing this file only changes the filename locally; it does + not affect the server-side fetching mechanism. + +
+ +## FILE_EPG + + + + +The `FILE_EPG` environment variable specifies the filename that will be utilized when +your .xml EPG playlist file is generated. + +``` { .yaml .copy .select title="docker-compose.yml" linenums="1" hl_lines="13" } +services: + tvapp2: + container_name: tvapp2 + image: ghcr.io/thebinaryninja/tvapp2:latest + restart: unless-stopped + volumes: + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock + - ./config:/config + - ./app:/usr/bin/app + environment: + - FILE_EPG=xmltv.xml # (1) +``` + +1. :information: Changing this file only changes the filename locally; it does + not affect the server-side fetching mechanism. + +
+ +## FILE_GZIP + + + + +The `FILE_GZIP` environment variable specifies the filename that will be utilized when +a compressed `.gzip` is generated and when you download the file. + +``` { .yaml .copy .select title="docker-compose.yml" linenums="1" hl_lines="13" } +services: + tvapp2: + container_name: tvapp2 + image: ghcr.io/thebinaryninja/tvapp2:latest + restart: unless-stopped + volumes: + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock + - ./config:/config + - ./app:/usr/bin/app + environment: + - FILE_GZIP=xmltv.xml.gz # (1) +``` + +1. :information: Changing this file only changes the filename locally for + generation and downloading. It does not affect the server-side fetching + mechanism. + +
+ +## LOG_LEVEL + + + + +The `LOG_LEVEL` environment variable allows you specify how deep logs should go +when being output to your console. + +=== "Example" + + ``` { .yaml .copy .select title="docker-compose.yml" linenums="1" hl_lines="13" } + services: + tvapp2: + container_name: tvapp2 + image: ghcr.io/thebinaryninja/tvapp2:latest + restart: unless-stopped + volumes: + - /etc/timezone:/etc/timezone:ro + - /etc/localtime:/etc/localtime:ro + - /var/run/docker.sock:/var/run/docker.sock + - ./config:/config + - ./app:/usr/bin/app + environment: + - LOG_LEVEL=4 # (1) + ``` + + 1. :information: Changing this file only changes the filename locally for + generation and downloading. It does not affect the server-side fetching + mechanism. + +=== "Logging Options" + + | Log Level | Name | Description | + | --------------- | ----------- | ------------------------------------------------------------------------------- | + | `6` | Trace | Displays all possible logs in console, along with anything below this line. | + | `5` | Debug | Displays debug / developer logs, along with anything below this line. | + | `4` | Info | Displays informative logs, along with anything below this line. | + | `3` | Notice | Displays important notices, along with anything below this line. | + | `2` | Warm | Displays warnings, along with anything below this line. | + | `1` | Error | Displays only errors, none of the log levels above this line will be shown | diff --git a/docs/docs/javascripts/tablesort.js b/docs/docs/javascripts/tablesort.js new file mode 100644 index 00000000..69c0ff3e --- /dev/null +++ b/docs/docs/javascripts/tablesort.js @@ -0,0 +1,6 @@ +document$.subscribe(function() { + var tables = document.querySelectorAll("article table:not([class])") + tables.forEach(function(table) { + new Tablesort(table) + }) +}) \ No newline at end of file diff --git a/docs/docs/resources/conventions.md b/docs/docs/resources/conventions.md deleted file mode 100644 index bc4cbd08..00000000 --- a/docs/docs/resources/conventions.md +++ /dev/null @@ -1,109 +0,0 @@ -# Conventions -This documentation use some symbols for illustration purposes. Before you read -on, please make sure you've made yourself familiar with the following list of -conventions: - -
- -### Release Type { data-toc-label="Version" } - -The tag symbol in conjunction with a version number denotes when a specific feature or behavior was added. Make sure you're at least on this version if you want to use it. - -: stable -: beta - -
- -### Controls { #default data-toc-label="Control" } - -These icons define what type of control a specified setting uses. - -: toggle -: textbox -: dropdown -: button -: slider -: color wheel - -
- -### – Default Value { #default data-toc-label="Default value" } - -This defines what the default value for a setting is. - -: Specified setting has a default value -: Specified setting has no default value and is empty -: Specified setting is automatically computed by the app - -
- -### – Command { #command data-toc-label="Command" } - -This defines a command - -: Specified setting has a default value - -
- -### – Experimental { data-toc-label="Experimental" } - -Anything listed with this icon are features or functionality that are still in development and may change in future versions. - -
- -### – Required value { #required data-toc-label="Required value" } - -Items listed with this symbol indicate that they are required to be set. - -
- -### – Customization { #customization data-toc-label="Customization" } - -This symbol denotes that the item described is a customization which affects the overall look of the app. - -
- -### – 3rd Party { data-toc-label="3rd Party" } - -This symbol denotes that the item described is classified as something that changes the overall functionality of the plugin. - -
- -### – Metadata property { #metadata data-toc-label="Metadata property" } - -This symbol denotes that the item described is a metadata property, which can -be used in Markdown documents as part of the front matter definition. - -
- -### – Configurable Setting { #setting data-toc-label="Configurable Setting" } - -This symbol denotes that an item is configurable by the user - -
- -### – Multiple instances { #multiple-instances data-toc-label="Multiple instances" } - -This symbol denotes that the plugin supports multiple instances, i.e, that it -can be used multiple times in the `plugins` setting in `mkdocs.yml`. - -
- -### – Optional feature { #feature data-toc-label="Optional feature" } - -Most of the features are hidden behind feature flags, which means they must -be explicitly enabled via `mkdocs.yml`. This allows for the existence of -potentially orthogonal features. - -
- -### – Backers only { data-toc-label="Backers only" } - -The pumping heart symbol denotes that a specific feature or behavior is only -available to backers. Normal users will not have access to this particular item. - -
- ---- - -
\ No newline at end of file diff --git a/docs/docs/stylesheets/extra.css b/docs/docs/stylesheets/extra.css index edac838f..57e70497 100644 --- a/docs/docs/stylesheets/extra.css +++ b/docs/docs/stylesheets/extra.css @@ -5,6 +5,16 @@ [ data-md-color-scheme="default" ] { + --md-accent-fg-color--transparent: #1b1b1b2f; + --md-typeset-a-color: #568afa; + --md-badge-icon-color: #2b2b2b; + --md-badge-icon-hover-color: #568afa; + --md-badge-bg-color--transparent: #1b1b1b2f; + --md-badge-bg-hover-color: #1b1b1b2f; + --md-table-head-bg-color: #597dd2; + --md-table-body-bg-color: rgb(221, 221, 221); + --md-table-body-text-color: rgb(20, 20, 20); + /* Tag > Background Color */ @@ -24,15 +34,6 @@ line-height: 1.3; } - /* - Badge > Left Box (Icon - */ - - .md-typeset .mdx-badge__icon - { - background-color: var(--md-accent-fg-color); - } - /* Badges > Right Box */ @@ -52,15 +53,6 @@ color: #FFF; } - /* - Badge > Icon Color - */ - - .md-typeset .mdx-badge svg - { - color: #FFFFFF; - } - /* Make text opaque. used for changelog to show date */ @@ -84,16 +76,10 @@ margin-inline-end: 5px; } - h3 .mdx-badge svg - { - padding-left: 2px; - padding-top: 1px; - } - .color-box { float: left; - height: 24px; - width: 24px; + height: 21px; + width: 21px; border: 1px solid rgba( 255, 255, 255, 0.2 ); clear: both; } @@ -111,11 +97,6 @@ padding-left: 4px; } - .md-typeset table:not([class]) tbody tr - { - background-color: rgb(255, 255, 255); - } - /* Table > Outter Border / Background */ @@ -125,6 +106,17 @@ } + .md-typeset table:not([class]) td + { + border-top: 2px solid var(--md-typeset-table-color); + padding: .9375em 1.25em; + padding-top: 0.9375em; + padding-bottom: 0.9375em; + padding-left: 1.25em; + vertical-align: top; + line-height: 20px; + } + /* Table > Outter Border / Background */ @@ -156,15 +148,6 @@ { white-space: nowrap; /*background-color: var(--md-code-bg-color);*/ - min-width: 25%; - border-right: 1px solid rgba( 255, 255, 255, 0.14); - background-color: rgba(194, 194, 194, 0.28); - } - - .md-typeset__table thead - { - background-color: var(--md-accent-fg-color); - color: #FFF; } /* @@ -233,29 +216,42 @@ --md-code-hl-generic-color: var(--md-default-fg-color--light); --md-code-hl-variable-color: var(--md-default-fg-color--light); --md-typeset-color: var(--md-default-fg-color); - --md-typeset-a-color: #568afa; + --md-typeset-a-color: #f91d5b; + --md-badge-icon-color: #d0d0d0; + --md-badge-icon-hover-color: #568afa; + --md-badge-bg-color--transparent: #ffffff1c; + --md-badge-bg-hover-color: #FFFFFF2E; --md-typeset-kbd-color: hsla(var(--md-hue),15%,90%,0.12); --md-typeset-kbd-accent-color: hsla(var(--md-hue),15%,90%,0.2); --md-typeset-kbd-border-color: hsla(var(--md-hue),15%,14%,1); --md-typeset-mark-color: #4287ff4d; - --md-typeset-table-color: hsla(var(--md-hue),15%,95%,0.12); + --md-typeset-table-color: hsla(0%, 0%, 40%, 0.12); --md-typeset-table-color--light: hsla(var(--md-hue),15%,95%,0.035); --md-admonition-fg-color: var(--md-default-fg-color); --md-admonition-bg-color: var(--md-default-bg-color); - --md-footer-bg-color: rgba( 21, 21, 21, 1 ); - --md-footer-bg-color--dark: rgba( 15, 15, 15, 1 ); + --md-footer-bg-color: rgba( 17, 17, 17, 1 ); + --md-footer-bg-color--dark: rgba( 13, 13, 13, 1 ); --md-shadow-z1: 0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a; --md-shadow-z2: 0 0.2rem 0.5rem #00000040,0 0 0.05rem #00000040; --md-shadow-z3: 0 0.2rem 0.5rem #0006,0 0 0.05rem #00000059; + --md-table-head-bg-color: #860038; + --md-table-body-text-color: rgb(231, 231, 231); + --md-accent-fg-color--transparent: #FFFFFF2E; --md-admonition-icon--pied-piper: url('data:image/svg+xml;charset=utf-8,'); /* - Tag > Background Color + Navigation > Tabs */ - .md-typeset .md-tag + .md-tabs { - background-color: var(--md-primary-fg-color); + background-color: #860038; + color: var(--md-primary-bg-color); + display: block; + line-height: 1.3; + overflow: auto; + width: 100%; + z-index: 3; } /* @@ -264,8 +260,8 @@ .md-nav { - font-size: .6rem; - line-height: 1.3; + font-size: .7rem; + line-height: 1.4; } .mdx-container @@ -276,18 +272,18 @@ .md-main { - background-color: hsla(140, 0%, 5%, 1) !important; + background-color: #161618 !important; } - .md-nav--primary .md-nav__title + .md-main__inner { - background: none; - box-shadow: none; + display: flex; + height: 100%; } .md-typeset table:not([ class ] ) tbody tr { - background-color: rgb( 17, 15, 15 ); + background-color: rgb( 15, 15, 15 ); } /* @@ -321,14 +317,6 @@ { white-space: nowrap; /*background-color: var(--md-code-bg-color);*/ - min-width: 25%; - border-right: 1px solid rgba( 255, 255, 255, 0.14); - background-color: rgba(70, 65, 77, 0.36); - } - - .md-typeset__table thead - { - background-color: #b10f52; } /* @@ -423,16 +411,7 @@ .md-typeset .tabbed-labels { - background-color: #090909; - } - - /* - Badge > Left Box (Icon - */ - - .md-typeset .mdx-badge__icon - { - background-color: #3f4faa; + background-color: #0d0d0d; } /* @@ -459,8 +438,7 @@ h3 .mdx-badge svg { - padding-left: 2px; - padding-top: 1px; + padding-left: 0px; } /* @@ -482,15 +460,6 @@ color: #FFF; } - /* - Badge > Icon Color - */ - - .md-typeset .mdx-badge svg - { - color: #FFFFFF; - } - } /* @@ -515,6 +484,14 @@ h4:has(.twemoji) .twemoji margin-left: -7px; } +.md-typeset .emojione, .md-typeset .gemoji, .md-typeset .twemoji +{ + --md-icon-size: 1.125em; + display: inline-flex; + height: var(--md-icon-size); + vertical-align: middle; +} + /* Badge > Header Padding if a badge is used in a header, add padding between the badge and text @@ -529,12 +506,18 @@ h4:has(.twemoji) .twemoji */ +.md-nav--primary .md-nav__title +{ + background: none; + box-shadow: none; +} + /* Navigation > Spacer Add a gap between the last "File" item in nav menu, and the folders under. */ -.md-sidebar--primary li:has(a[href*="about_tvapp2"]), .md-sidebar--primary li:has(a[href*="about"]) +.md-sidebar--primary li:has(a[href*="about_tvapp2"]) { margin-bottom: 28px !important; } @@ -569,6 +552,34 @@ h4:has(.twemoji) .twemoji transition: none !important; } +.md-typeset .mdx-badge--dangerous +{ + --md-badge-icon-color: #fff; + --md-badge-icon-hover-color: #ff1058; + --md-badge-bg-color--transparent: #7B1532 !important; + color: #f9f9f9; + --md-typeset-bg-color: #111; +} + +.md-typeset .mdx-badge--heart { + --md-badge-icon-color: #e92063; + --md-badge-icon-hover-color: #FFFFFF; + --md-accent-fg-color: #ff4281; + --md-accent-fg-color--transparent: #e920631a; +} + +.md-typeset .mdx-badge--heart .twemoji { + animation: heart 1s infinite; +} + +.md-typeset .mdx-badge--command +{ + --md-typeset-a-color: #ff2d72; + --md-accent-fg-color: #fff; + --md-accent-fg-color--transparent: #ffffff1a; + color: #e91e63; +} + /* Badge > Header Positioning This is mainly for the conventions page @@ -590,7 +601,6 @@ h2:has(.mdx-badge) > .mdx-badge svg :is(h1, h2, h3, h4, h5, h6) .mdx-badge__icon svg { - padding-top: 3px !important; padding-right: 1px; } @@ -604,6 +614,22 @@ h2:has(.mdx-badge) > .mdx-badge svg } +/* + Table > Header +*/ + +.md-typeset__table table thead, .md-typeset__table > table +{ + background-color: var(--md-table-head-bg-color); + color: #FFF; +} + +.md-typeset table:not([class]) tbody tr +{ + background-color: var(--md-table-body-bg-color); + color: var(--md-table-body-text-color); +} + .mdx-badge__text a { padding-top: 2px; @@ -620,20 +646,40 @@ small font-size: 60%; } +/* + Navigation > Category Gap + + if you have multiple sub-folders for a group of pages, add a gap between categories on left-side navigation +*/ + +.md-nav__item--section +{ + display: block; + margin: 2.00em 0; + margin-bottom: 2em; +} + /* Menu Navigation > FontAwesome Folder Icons (for folders) */ +label.md-nav__link +{ + color: #ffffff59 !important; +} + label.md-nav__link::before { - content: "."; + opacity: 0.6; + content: ""; background-color: currentColor; padding-right: 0.6rem; margin-right: 0.1rem; mask-repeat: no-repeat; - mask-size: contain; + mask-size: 20px; + padding-inline: 4px; + mask-position: center; mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 576 512' fill='currentColor' width='16px' height='16px'%3E%3C!-- --%3E%3Cdefs%3E%3Cstyle%3E.fa-secondary%7Bopacity:.4%7D%3C/style%3E%3C/defs%3E%3Cpath class='fa-primary' d='M160 384H512c35.3 0 64-28.7 64-64V160c0-35.3-28.7-64-64-64H394.5c-17 0-33.3-6.7-45.3-18.7L322.7 50.7c-12-12-28.3-18.7-45.3-18.7H160c-35.3 0-64 28.7-64 64V320c0 35.3 28.7 64 64 64z'%3E%3C/path%3E%3Cpath class='fa-secondary' d='M24 96c13.3 0 24 10.7 24 24V344c0 48.6 39.4 88 88 88H456c13.3 0 24 10.7 24 24s-10.7 24-24 24H136C60.9 480 0 419.1 0 344V120c0-13.3 10.7-24 24-24z'%3E%3C/path%3E%3C/svg%3E"); - opacity: 0.6; } li.md-nav__item--nested > a > span::before @@ -658,10 +704,56 @@ nav.md-nav > ul.md-nav__list > li.md-nav__item > a.md-nav__link > span::before padding-right: 0.6rem; margin-right: 0.1rem; mask-repeat: no-repeat; - mask-size: contain; + mask-size: 9px; + padding-inline: 4px; + mask-position: center; mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 512' fill='currentColor' width='16px' height='16px'%3E%3C!-- --%3E%3Cdefs%3E%3Cstyle%3E.fa-secondary%7Bopacity:.4%7D%3C/style%3E%3C/defs%3E%3Cpath class='fa-primary' d=''%3E%3C/path%3E%3Cpath class='fa-secondary' d='M0 256a160 160 0 1 1 320 0A160 160 0 1 1 0 256z'%3E%3C/path%3E%3C/svg%3E"); } +/* + Menu Navigation > Secondary > Text Size +*/ + +nav.md-nav--secondary li +{ + font-size: 0.6rem !important; +} + +/* + Badge > Override Icon Color +*/ + +.mdx-badge a +{ + color: var(--md-badge-icon-color); + word-break: break-word; +} + +.mdx-badge a:hover +{ + color: var(--md-badge-icon-hover-color); + word-break: break-word; +} + +.mdx-badge .mdx-badge__icon +{ + background-color: var(--md-badge-bg-color--transparent); +} + +.mdx-badge .mdx-badge__icon:hover +{ + background-color: var(--md-badge-bg-hover-color); +} + +/* + Tag > Background Color +*/ + +.md-typeset .md-tag +{ + background-color: var(--md-primary-fg-color); +} + /* Lightbox border */ @@ -733,6 +825,12 @@ figure img transition: border .25s,box-shadow .25s; border: 2px solid rgba( 255, 255, 255, 0.1 ); background-color: var(--md-default-fg-color--lightest); + margin-top: 10px; + margin-bottom: 10px; + margin: 0 auto; + margin-bottom: 0px; + margin-top: 5px; + width: clamp(200px, 100%, 75%); } .mkde-embed-container:hover @@ -821,7 +919,23 @@ figure img .mkde-right { - padding: 8px 10px; + padding: 0px 10px; +} + +@media ( min-width: 360px ) +{ + .mkde-right + { + padding: 0px 15px; + } +} + +@media ( min-width: 600px ) +{ + .mkde-right + { + padding: 0px 12px; + } } /* @@ -990,8 +1104,6 @@ figure img padding: 0; background: none transparent; text-align: left; - padding-left: 2px; - border-radius: 10px; } .mkde-sub .item-footer-format:last-child @@ -1049,24 +1161,24 @@ figure img ._fs-x, ._fs-m { - font-size: 12px; + font-size: clamp(7px, 2.0vw, 12px); } ._f1p { - font-size: 13px; + font-size: clamp(10px, 2.5vw, 13px); } @media ( min-width: 360px ) { ._fs-x { - font-size: 13px; + font-size: clamp(10px, 2.5vw, 13px); } ._f1p { - font-size: 14px; + font-size: clamp(10px, 2.5vw, 14px); } } @@ -1074,17 +1186,17 @@ figure img { ._fs-m { - font-size: 13px; + font-size: clamp(10px, 2.5vw, 13px); } ._fs-x { - font-size: 14px; + font-size: clamp(10px, 2.5vw, 14px); } ._f1p { - font-size: 15px; + font-size: clamp(10px, 2.5vw, 15px); } } @@ -1092,17 +1204,17 @@ figure img { ._fs-m { - font-size: 14px; + font-size: clamp(10px, 2.5vw, 13px); } ._fs-x { - font-size: 15px; + font-size: clamp(10px, 2.5vw, 14px); } ._f1p { - font-size: 17px; + font-size: clamp(10px, 2.5vw, 15px); } } @@ -1141,7 +1253,7 @@ figure img .mkde-left-s2 { - border: 1px solid rgba( 255, 255, 255, 0.35 ); + border: 1px solid rgba( 255, 255, 255, 0.35 ) } } @@ -1150,8 +1262,7 @@ figure img position: absolute; width: 100%; height: 100%; - border: 1px solid rgba( 255, 255, 255, 0.10 ); - background-color: #272728; + border: 1px solid rgba( 255, 255, 255, 0.10 ) } .mkde-link-favicon @@ -1217,13 +1328,12 @@ figure img .item-link { color: var( --md-typeset-a-color ); - font-size: 12px; + font-size: clamp(8px, 2.5vw, 12px); padding-bottom: 6px; } .item-footer { - padding-block-start: 12px; padding-left: 5px; } @@ -1256,14 +1366,14 @@ figure img { display: inline-block; padding-left: 5px; - margin-block-end: -5px; + margin-block-end: -7px; } .color-box { float: left; - height: 20px; - width: 20px; + height: 21px; + width: 21px; border: 1px solid rgba( 255, 255, 255, 0.2 ); clear: both; } @@ -1277,3 +1387,187 @@ figure img clear: both; margin-right: 10px; } + +/* + Tools > Icon Search +*/ + +.md-typeset .mdx-iconsearch { + background-color:var(--md-default-bg-color); + border-radius:.1rem; + box-shadow:var(--md-shadow-z1); + position:relative; + transition:box-shadow 125ms +} +.md-typeset .mdx-iconsearch:focus-within, +.md-typeset .mdx-iconsearch:hover { + box-shadow:var(--md-shadow-z2) +} +.md-typeset .mdx-iconsearch .md-input { + background:var(--md-default-bg-color); + box-shadow:none +} +[data-md-color-scheme=slate] .md-typeset .mdx-iconsearch .md-input { + background:var(--md-code-bg-color) +} +.md-typeset .mdx-iconsearch-result { + -webkit-backface-visibility:hidden; + backface-visibility:hidden; + max-height:50vh; + overflow-y:auto; + scrollbar-color:var(--md-default-fg-color--lighter) #0000; + scrollbar-width:thin; + touch-action:pan-y +} +.md-tooltip .md-typeset .mdx-iconsearch-result { + max-height:10.25rem +} +.md-typeset .mdx-iconsearch-result::-webkit-scrollbar { + height:.2rem; + width:.2rem +} +.md-typeset .mdx-iconsearch-result::-webkit-scrollbar-thumb { + background-color:var(--md-default-fg-color--lighter) +} +.md-typeset .mdx-iconsearch-result::-webkit-scrollbar-thumb:hover { + background-color:var(--md-accent-fg-color) +} +.md-typeset .mdx-iconsearch-result__meta { + color:var(--md-default-fg-color--lighter); + font-size:.64rem; + position:absolute; + right:.6rem; + top:.4rem +} +@media screen and (max-width:29.984375em) { + .md-typeset .mdx-iconsearch-result__meta { + display:none + } +} +.md-typeset .mdx-iconsearch-result__select { + background-color:var(--md-default-fg-color--lightest); + border:none; + border-radius:.1rem; + color:var(--md-default-fg-color--light); + font-size:.64rem; + padding-bottom:.15em; + padding-top:.15em; + position:absolute; + right:.6rem; + top:.4rem; + transition:color 125ms,background-color 125ms +} +.md-typeset .mdx-iconsearch-result__select:focus, +.md-typeset .mdx-iconsearch-result__select:hover { + background-color:var(--md-accent-fg-color); + color:var(--md-accent-bg-color); + outline:none +} +.md-typeset .mdx-iconsearch-result__select+.mdx-iconsearch-result__meta { + right:4.1rem +} +[dir=ltr] .md-typeset .mdx-iconsearch-result__list { + margin-left:0 +} +[dir=rtl] .md-typeset .mdx-iconsearch-result__list { + margin-right:0 +} +.md-typeset .mdx-iconsearch-result__list { + list-style:none; + margin:0; + padding:0 +} +[dir=ltr] .md-typeset .mdx-iconsearch-result__item { + margin-left:0 +} +[dir=rtl] .md-typeset .mdx-iconsearch-result__item { + margin-right:0 +} +.md-typeset .mdx-iconsearch-result__item { + border-bottom:.05rem solid var(--md-default-fg-color--lightest); + margin:0; + padding:.2rem .6rem +} +.md-typeset .mdx-iconsearch-result__item:last-child { + border-bottom:none +} +.md-typeset .mdx-iconsearch-result__item>* { + margin-right:.6rem +} +.md-typeset .mdx-iconsearch-result__item img { + height:.9rem; + width:.9rem +} +[data-md-color-scheme=slate] .md-typeset .mdx-iconsearch-result__item img[src*=squidfunk] { + filter:invert(1) +} +.md-typeset .mdx-premium p { + margin:2em 0; + text-align:center +} +.md-typeset .mdx-premium img { + height:3.25rem +} +.md-typeset .mdx-premium p:last-child { + display:flex; + flex-wrap:wrap; + justify-content:center +} +.md-typeset .mdx-premium p:last-child>a { + display:block; + flex-shrink:0 +} +.md-typeset .mdx-sponsorship__list { + margin:2em 0 +} +.md-typeset .mdx-sponsorship__list:after { + clear:both; + content:""; + display:block +} +[dir=ltr] .md-typeset .mdx-sponsorship__item { + float:left +} +[dir=rtl] .md-typeset .mdx-sponsorship__item { + float:right +} +.md-typeset .mdx-sponsorship__item { + border-radius:100%; + display:block; + height:1.6rem; + margin:.2rem; + overflow:hidden; + transform:scale(1); + transition:color 125ms,transform 125ms; + width:1.6rem +} +.md-typeset .mdx-sponsorship__item:focus, +.md-typeset .mdx-sponsorship__item:hover { + transform:scale(1.1) +} +.md-typeset .mdx-sponsorship__item:focus img, +.md-typeset .mdx-sponsorship__item:hover img { + filter:grayscale(0) +} +.md-typeset .mdx-sponsorship__item--private { + background:var(--md-default-fg-color--lightest); + color:var(--md-default-fg-color--lighter); + font-size:.6rem; + font-weight:700; + line-height:1.6rem; + text-align:center +} +.md-typeset .mdx-sponsorship__item img { + display:block; + filter:grayscale(100%) opacity(75%); + height:auto; + transition:filter 125ms; + width:100% +} +.md-typeset .mdx-sponsorship-button { + font-weight:400 +} +.md-typeset .mdx-sponsorship-count, +.md-typeset .mdx-sponsorship-total { + font-weight:700 +} diff --git a/docs/material/overrides/.icons/aetherx/axd/ballot.svg b/docs/material/overrides/.icons/aetherx/axd/ballot.svg new file mode 100644 index 00000000..99fabce5 --- /dev/null +++ b/docs/material/overrides/.icons/aetherx/axd/ballot.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/material/overrides/.icons/aetherx/axd/puzzle-piece-simple.svg b/docs/material/overrides/.icons/aetherx/axd/puzzle-piece-simple.svg new file mode 100644 index 00000000..9b08974b --- /dev/null +++ b/docs/material/overrides/.icons/aetherx/axd/puzzle-piece-simple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/material/overrides/.icons/aetherx/axd/puzzle-piece.svg b/docs/material/overrides/.icons/aetherx/axd/puzzle-piece.svg new file mode 100644 index 00000000..9690785c --- /dev/null +++ b/docs/material/overrides/.icons/aetherx/axd/puzzle-piece.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/material/overrides/.icons/aetherx/axd/puzzle.svg b/docs/material/overrides/.icons/aetherx/axd/puzzle.svg new file mode 100644 index 00000000..9213afc8 --- /dev/null +++ b/docs/material/overrides/.icons/aetherx/axd/puzzle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/material/overrides/.icons/aetherx/axd/skull-crossbones.svg b/docs/material/overrides/.icons/aetherx/axd/skull-crossbones.svg new file mode 100644 index 00000000..62425b30 --- /dev/null +++ b/docs/material/overrides/.icons/aetherx/axd/skull-crossbones.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/material/overrides/.icons/aetherx/axd/tv.svg b/docs/material/overrides/.icons/aetherx/axd/tv.svg new file mode 100644 index 00000000..e32c4574 --- /dev/null +++ b/docs/material/overrides/.icons/aetherx/axd/tv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/material/overrides/.icons/aetherx/axs/clock.svg b/docs/material/overrides/.icons/aetherx/axs/clock.svg new file mode 100644 index 00000000..8b2e63c3 --- /dev/null +++ b/docs/material/overrides/.icons/aetherx/axs/clock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/material/overrides/.icons/aetherx/axs/code.svg b/docs/material/overrides/.icons/aetherx/axs/code.svg new file mode 100644 index 00000000..c09a984b --- /dev/null +++ b/docs/material/overrides/.icons/aetherx/axs/code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/material/overrides/.icons/aetherx/axs/puzzle-piece.svg b/docs/material/overrides/.icons/aetherx/axs/puzzle-piece.svg new file mode 100644 index 00000000..9690785c --- /dev/null +++ b/docs/material/overrides/.icons/aetherx/axs/puzzle-piece.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/material/overrides/assets/stylesheets/custom.00c04c01.min.css b/docs/material/overrides/assets/stylesheets/custom.00c04c01.min.css index 9fb02e08..ae534c04 100644 --- a/docs/material/overrides/assets/stylesheets/custom.00c04c01.min.css +++ b/docs/material/overrides/assets/stylesheets/custom.00c04c01.min.css @@ -1 +1,463 @@ -@keyframes heart{0%,40%,80%,to{transform:scale(1)}20%,60%{transform:scale(1.15)}}.md-typeset .twitter{color:#00acee}.md-typeset .mastodon{color:#897ff8}.md-typeset .mdx-video{width:auto}.md-typeset .mdx-video__inner{height:0;padding-bottom:56.138%;position:relative;width:100%}.md-typeset .mdx-video iframe{border:none;height:100%;left:0;overflow:hidden;position:absolute;top:0;width:100%}.md-typeset .mdx-heart{animation:heart 1s infinite}.md-typeset .mdx-insiders{color:#e91e63}.md-typeset .mdx-badge{font-size:.85em}.md-typeset .mdx-badge--heart{--md-typeset-a-color:#e92063;--md-accent-fg-color:#ff4281;--md-accent-fg-color--transparent:#e920631a}.md-typeset .mdx-badge--heart .twemoji{animation:heart 1s infinite}.md-typeset .mdx-badge--right{float:right;margin-left:.35em}[dir=ltr] .md-typeset .mdx-badge__icon{border-top-left-radius:.1rem}[dir=rtl] .md-typeset .mdx-badge__icon{border-top-right-radius:.1rem}[dir=ltr] .md-typeset .mdx-badge__icon{border-bottom-left-radius:.1rem}[dir=rtl] .md-typeset .mdx-badge__icon{border-bottom-right-radius:.1rem}.md-typeset .mdx-badge__icon{background:var(--md-accent-fg-color--transparent);padding:.2rem}.md-typeset .mdx-badge__icon:last-child{border-radius:.1rem}[dir=ltr] .md-typeset .mdx-badge__text{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .mdx-badge__text{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .mdx-badge__text{border-bottom-right-radius:.1rem}[dir=rtl] .md-typeset .mdx-badge__text{border-bottom-left-radius:.1rem}.md-typeset .mdx-badge__text{box-shadow:0 0 0 1px inset var(--md-accent-fg-color--transparent);padding:.2rem .3rem}.md-typeset .mdx-switch button{cursor:pointer;transition:opacity .25s}.md-typeset .mdx-switch button:focus,.md-typeset .mdx-switch button:hover{opacity:.75}.md-typeset .mdx-switch button>code{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block}.md-typeset .mdx-columns ol,.md-typeset .mdx-columns ul{-moz-columns:2;column-count:2}@media screen and (max-width:29.984375em){.md-typeset .mdx-columns ol,.md-typeset .mdx-columns ul{-moz-columns:initial;columns:initial}}.md-typeset .mdx-columns li{-moz-column-break-inside:avoid;break-inside:avoid}.md-typeset .mdx-flags{margin:2em auto}.md-typeset .mdx-flags ol{list-style:none}.md-typeset .mdx-flags ol li{margin-bottom:1em}.md-typeset .mdx-flags__item{display:flex;gap:.6rem}.md-typeset .mdx-flags__content{display:flex;flex:1;flex-direction:column}.md-typeset .mdx-flags__content span{align-items:baseline;display:inline-flex;justify-content:space-between}.md-typeset .mdx-flags__content>span:nth-child(2){font-size:80%}.md-typeset .mdx-flags__content code{float:right}.md-typeset .mdx-social{height:min(27rem,80vw);position:relative}.md-typeset .mdx-social:hover .mdx-social__image{background-color:#e4e4e40d}.md-typeset .mdx-social__layer{margin-top:4rem;position:absolute;transform-style:preserve-3d;transition:.25s cubic-bezier(.7,0,.3,1)}.md-typeset .mdx-social__layer:hover .mdx-social__label{opacity:1}.md-typeset .mdx-social__layer:hover .mdx-social__image{background-color:#7f7f7ffc}.md-typeset .mdx-social__layer:hover~.mdx-social__layer{opacity:0}.md-typeset .mdx-social__image{box-shadow:-.25rem .25rem .5rem #0000000d;transform:rotate(-40deg) skew(15deg,15deg) scale(.7);transition:all .25s}.md-typeset .mdx-social__image img{display:block}.md-typeset .mdx-social__label{background-color:var(--md-default-fg-color--light);color:var(--md-default-bg-color);display:block;opacity:0;padding:.2rem .4rem;position:absolute;transition:all .25s}.md-typeset .mdx-social:hover .mdx-social__layer:nth-child(6){transform:translateY(-30px)}.md-typeset .mdx-social:hover .mdx-social__layer:nth-child(5){transform:translateY(-20px)}.md-typeset .mdx-social:hover .mdx-social__layer:nth-child(4){transform:translateY(-10px)}.md-typeset .mdx-social:hover .mdx-social__layer:nth-child(3){transform:translateY(0)}.md-typeset .mdx-social:hover .mdx-social__layer:nth-child(2){transform:translateY(10px)}.md-typeset .mdx-social:hover .mdx-social__layer:first-child{transform:translateY(20px)}.md-typeset .mdx-social:hover .mdx-social__layer:nth-child(0){transform:translateY(30px)}.md-banner{color:var(--md-footer-fg-color--lighter)}.md-banner strong{white-space:nowrap}.md-banner a,.md-banner strong{color:var(--md-footer-fg-color)}.md-banner a:focus,.md-banner a:hover{color:currentcolor}.md-banner a:focus .twemoji,.md-banner a:hover .twemoji{background-color:var(--md-footer-fg-color);box-shadow:none}.md-banner .twemoji{border-radius:100%;box-shadow:inset 0 0 0 .05rem currentcolor;display:inline-block;height:1.2rem;padding:.25rem;transition:all .25s;vertical-align:bottom;width:1.2rem}.md-banner .twemoji svg{display:block;max-height:none}.mdx-container{background:url("data:image/svg+xml;utf8,") no-repeat bottom,linear-gradient(to bottom,var(--md-primary-fg-color),#a63fd9 99%,var(--md-default-bg-color) 99%);padding-top:1rem}[data-md-color-scheme=slate] .mdx-container{background:url("data:image/svg+xml;utf8,") no-repeat bottom,linear-gradient(to bottom,var(--md-primary-fg-color),#363949 99%,var(--md-default-bg-color) 99%)}.mdx-hero{color:var(--md-primary-bg-color);margin:0 .8rem}.mdx-hero h1{color:currentcolor;font-weight:700;margin-bottom:1rem}@media screen and (max-width:29.984375em){.mdx-hero h1{font-size:1.4rem}}.mdx-hero__content{padding-bottom:6rem}@media screen and (min-width:60em){.mdx-hero{align-items:stretch;display:flex}.mdx-hero__content{margin-top:3.5rem;max-width:19rem;padding-bottom:14vw}.mdx-hero__image{order:1;transform:translateX(4rem);width:38rem}}@media screen and (min-width:76.25em){.mdx-hero__image{transform:translateX(8rem)}}.mdx-hero .md-button{color:var(--md-primary-bg-color);margin-right:.5rem;margin-top:.5rem}.mdx-hero .md-button:focus,.mdx-hero .md-button:hover{background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.mdx-hero .md-button--primary{background-color:var(--md-primary-bg-color);border-color:var(--md-primary-bg-color);color:#894da8}.md-typeset .mdx-iconsearch{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z1);position:relative;transition:box-shadow 125ms}.md-typeset .mdx-iconsearch:focus-within,.md-typeset .mdx-iconsearch:hover{box-shadow:var(--md-shadow-z2)}.md-typeset .mdx-iconsearch .md-input{background:var(--md-default-bg-color);box-shadow:none}[data-md-color-scheme=slate] .md-typeset .mdx-iconsearch .md-input{background:var(--md-code-bg-color)}.md-typeset .mdx-iconsearch-result{-webkit-backface-visibility:hidden;backface-visibility:hidden;max-height:50vh;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin;touch-action:pan-y}.md-tooltip .md-typeset .mdx-iconsearch-result{max-height:10.25rem}.md-typeset .mdx-iconsearch-result::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset .mdx-iconsearch-result::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset .mdx-iconsearch-result::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset .mdx-iconsearch-result__meta{color:var(--md-default-fg-color--lighter);font-size:.64rem;position:absolute;right:.6rem;top:.4rem}[dir=ltr] .md-typeset .mdx-iconsearch-result__list{margin-left:0}[dir=rtl] .md-typeset .mdx-iconsearch-result__list{margin-right:0}.md-typeset .mdx-iconsearch-result__list{list-style:none;margin:0;padding:0}[dir=ltr] .md-typeset .mdx-iconsearch-result__item{margin-left:0}[dir=rtl] .md-typeset .mdx-iconsearch-result__item{margin-right:0}.md-typeset .mdx-iconsearch-result__item{border-bottom:.05rem solid var(--md-default-fg-color--lightest);margin:0;padding:.2rem .6rem}.md-typeset .mdx-iconsearch-result__item:last-child{border-bottom:none}.md-typeset .mdx-iconsearch-result__item>*{margin-right:.6rem}.md-typeset .mdx-iconsearch-result__item img{height:.9rem;width:.9rem}[data-md-color-scheme=slate] .md-typeset .mdx-iconsearch-result__item img[src*=squidfunk]{filter:invert(1)}.md-typeset .mdx-premium p{margin:2em 0;text-align:center}.md-typeset .mdx-premium img{height:3.25rem}.md-typeset .mdx-premium p:last-child{display:flex;flex-wrap:wrap;justify-content:center}.md-typeset .mdx-premium p:last-child>a{display:block;flex-shrink:0}.md-typeset .mdx-sponsorship__list{margin:2em 0}.md-typeset .mdx-sponsorship__list:after{clear:both;content:"";display:block}[dir=ltr] .md-typeset .mdx-sponsorship__item{float:left}[dir=rtl] .md-typeset .mdx-sponsorship__item{float:right}.md-typeset .mdx-sponsorship__item{border-radius:100%;display:block;height:1.6rem;margin:.2rem;overflow:hidden;transform:scale(1);transition:color 125ms,transform 125ms;width:1.6rem}.md-typeset .mdx-sponsorship__item:focus,.md-typeset .mdx-sponsorship__item:hover{transform:scale(1.1)}.md-typeset .mdx-sponsorship__item:focus img,.md-typeset .mdx-sponsorship__item:hover img{filter:grayscale(0)}.md-typeset .mdx-sponsorship__item--private{background:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--lighter);font-size:.6rem;font-weight:700;line-height:1.6rem;text-align:center}.md-typeset .mdx-sponsorship__item img{display:block;filter:grayscale(100%) opacity(75%);height:auto;transition:filter 125ms;width:100%}.md-typeset .mdx-sponsorship-button{font-weight:400}.md-typeset .mdx-sponsorship-count,.md-typeset .mdx-sponsorship-total{font-weight:700} \ No newline at end of file +@keyframes heart { + 0%, + 40%, + 80%, + to { + transform: scale(1); + } + 20%, + 60% { + transform: scale(1.15); + } +} +.md-typeset .twitter { + color: #00acee; +} +.md-typeset .mastodon { + color: #897ff8; +} +.md-typeset .mdx-video { + width: auto; +} +.md-typeset .mdx-video__inner { + height: 0; + padding-bottom: 56.138%; + position: relative; + width: 100%; +} +.md-typeset .mdx-video iframe { + border: none; + height: 100%; + left: 0; + overflow: hidden; + position: absolute; + top: 0; + width: 100%; +} +.md-typeset .mdx-heart { + animation: heart 1s infinite; +} +.md-typeset .mdx-insiders { + color: #e91e63; +} +.md-typeset .mdx-badge { + font-size: 0.85em; +} +.md-typeset .mdx-badge--right { + float: right; + margin-left: 0.35em; +} +[dir="ltr"] .md-typeset .mdx-badge__icon { + border-top-left-radius: 0.1rem; +} +[dir="rtl"] .md-typeset .mdx-badge__icon { + border-top-right-radius: 0.1rem; +} +[dir="ltr"] .md-typeset .mdx-badge__icon { + border-bottom-left-radius: 0.1rem; +} +[dir="rtl"] .md-typeset .mdx-badge__icon { + border-bottom-right-radius: 0.1rem; +} +.md-typeset .mdx-badge__icon { + padding: 0.2rem; +} +.md-typeset .mdx-badge__icon:last-child { + border-radius: 0.1rem; +} +[dir="ltr"] .md-typeset .mdx-badge__text { + border-top-right-radius: 0.1rem; +} +[dir="rtl"] .md-typeset .mdx-badge__text { + border-top-left-radius: 0.1rem; +} +[dir="ltr"] .md-typeset .mdx-badge__text { + border-bottom-right-radius: 0.1rem; +} +[dir="rtl"] .md-typeset .mdx-badge__text { + border-bottom-left-radius: 0.1rem; +} +.md-typeset .mdx-badge__text { + padding: 0.2rem 0.3rem; +} +.md-typeset .mdx-switch button { + cursor: pointer; + transition: opacity 0.25s; +} +.md-typeset .mdx-switch button:focus, +.md-typeset .mdx-switch button:hover { + opacity: 0.75; +} +.md-typeset .mdx-switch button > code { + background-color: var(--md-primary-fg-color); + color: var(--md-primary-bg-color); + display: block; +} +.md-typeset .mdx-columns ol, +.md-typeset .mdx-columns ul { + -moz-columns: 2; + column-count: 2; +} +@media screen and (max-width: 29.984375em) { + .md-typeset .mdx-columns ol, + .md-typeset .mdx-columns ul { + -moz-columns: initial; + columns: initial; + } +} +.md-typeset .mdx-columns li { + -moz-column-break-inside: avoid; + break-inside: avoid; +} +.md-typeset .mdx-flags { + margin: 2em auto; +} +.md-typeset .mdx-flags ol { + list-style: none; +} +.md-typeset .mdx-flags ol li { + margin-bottom: 1em; +} +.md-typeset .mdx-flags__item { + display: flex; + gap: 0.6rem; +} +.md-typeset .mdx-flags__content { + display: flex; + flex: 1; + flex-direction: column; +} +.md-typeset .mdx-flags__content span { + align-items: baseline; + display: inline-flex; + justify-content: space-between; +} +.md-typeset .mdx-flags__content > span:nth-child(2) { + font-size: 80%; +} +.md-typeset .mdx-flags__content code { + float: right; +} +.md-typeset .mdx-social { + height: min(27rem, 80vw); + position: relative; +} +.md-typeset .mdx-social:hover .mdx-social__image { + background-color: #e4e4e40d; +} +.md-typeset .mdx-social__layer { + margin-top: 4rem; + position: absolute; + transform-style: preserve-3d; + transition: 0.25s cubic-bezier(0.7, 0, 0.3, 1); +} +.md-typeset .mdx-social__layer:hover .mdx-social__label { + opacity: 1; +} +.md-typeset .mdx-social__layer:hover .mdx-social__image { + background-color: #7f7f7ffc; +} +.md-typeset .mdx-social__layer:hover ~ .mdx-social__layer { + opacity: 0; +} +.md-typeset .mdx-social__image { + box-shadow: -0.25rem 0.25rem 0.5rem #0000000d; + transform: rotate(-40deg) skew(15deg, 15deg) scale(0.7); + transition: all 0.25s; +} +.md-typeset .mdx-social__image img { + display: block; +} +.md-typeset .mdx-social__label { + background-color: var(--md-default-fg-color--light); + color: var(--md-default-bg-color); + display: block; + opacity: 0; + padding: 0.2rem 0.4rem; + position: absolute; + transition: all 0.25s; +} +.md-typeset .mdx-social:hover .mdx-social__layer:nth-child(6) { + transform: translateY(-30px); +} +.md-typeset .mdx-social:hover .mdx-social__layer:nth-child(5) { + transform: translateY(-20px); +} +.md-typeset .mdx-social:hover .mdx-social__layer:nth-child(4) { + transform: translateY(-10px); +} +.md-typeset .mdx-social:hover .mdx-social__layer:nth-child(3) { + transform: translateY(0); +} +.md-typeset .mdx-social:hover .mdx-social__layer:nth-child(2) { + transform: translateY(10px); +} +.md-typeset .mdx-social:hover .mdx-social__layer:first-child { + transform: translateY(20px); +} +.md-typeset .mdx-social:hover .mdx-social__layer:nth-child(0) { + transform: translateY(30px); +} +.md-banner { + color: var(--md-footer-fg-color--lighter); +} +.md-banner strong { + white-space: nowrap; +} +.md-banner a, +.md-banner strong { + color: var(--md-footer-fg-color); +} +.md-banner a:focus, +.md-banner a:hover { + color: currentcolor; +} +.md-banner a:focus .twemoji, +.md-banner a:hover .twemoji { + background-color: var(--md-footer-fg-color); + box-shadow: none; +} +.md-banner .twemoji { + border-radius: 100%; + box-shadow: inset 0 0 0 0.05rem currentcolor; + display: inline-block; + height: 1.2rem; + padding: 0.25rem; + transition: all 0.25s; + vertical-align: bottom; + width: 1.2rem; +} +.md-banner .twemoji svg { + display: block; + max-height: none; +} +.mdx-container { + background: url("data:image/svg+xml;utf8,") + no-repeat bottom, + linear-gradient( + to bottom, + var(--md-primary-fg-color), + #a63fd9 99%, + var(--md-default-bg-color) 99% + ); + padding-top: 1rem; +} +[data-md-color-scheme="slate"] .mdx-container { + background: url("data:image/svg+xml;utf8,") + no-repeat bottom, + linear-gradient( + to bottom, + var(--md-primary-fg-color), + #363949 99%, + var(--md-default-bg-color) 99% + ); +} +.mdx-hero { + color: var(--md-primary-bg-color); + margin: 0 0.8rem; +} +.mdx-hero h1 { + color: currentcolor; + font-weight: 700; + margin-bottom: 1rem; +} +@media screen and (max-width: 29.984375em) { + .mdx-hero h1 { + font-size: 1.4rem; + } +} +.mdx-hero__content { + padding-bottom: 6rem; +} +@media screen and (min-width: 60em) { + .mdx-hero { + align-items: stretch; + display: flex; + } + .mdx-hero__content { + margin-top: 3.5rem; + max-width: 19rem; + padding-bottom: 14vw; + } + .mdx-hero__image { + order: 1; + transform: translateX(4rem); + width: 38rem; + } +} +@media screen and (min-width: 76.25em) { + .mdx-hero__image { + transform: translateX(8rem); + } +} +.mdx-hero .md-button { + color: var(--md-primary-bg-color); + margin-right: 0.5rem; + margin-top: 0.5rem; +} +.mdx-hero .md-button:focus, +.mdx-hero .md-button:hover { + background-color: var(--md-accent-fg-color); + border-color: var(--md-accent-fg-color); + color: var(--md-accent-bg-color); +} +.mdx-hero .md-button--primary { + background-color: var(--md-primary-bg-color); + border-color: var(--md-primary-bg-color); + color: #894da8; +} +.md-typeset .mdx-iconsearch { + background-color: var(--md-default-bg-color); + border-radius: 0.1rem; + box-shadow: var(--md-shadow-z1); + position: relative; + transition: box-shadow 125ms; +} +.md-typeset .mdx-iconsearch:focus-within, +.md-typeset .mdx-iconsearch:hover { + box-shadow: var(--md-shadow-z2); +} +.md-typeset .mdx-iconsearch .md-input { + background: var(--md-default-bg-color); + box-shadow: none; +} +[data-md-color-scheme="slate"] .md-typeset .mdx-iconsearch .md-input { + background: var(--md-code-bg-color); +} +.md-typeset .mdx-iconsearch-result { + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + max-height: 50vh; + overflow-y: auto; + scrollbar-color: var(--md-default-fg-color--lighter) #0000; + scrollbar-width: thin; + touch-action: pan-y; +} +.md-tooltip .md-typeset .mdx-iconsearch-result { + max-height: 10.25rem; +} +.md-typeset .mdx-iconsearch-result::-webkit-scrollbar { + height: 0.2rem; + width: 0.2rem; +} +.md-typeset .mdx-iconsearch-result::-webkit-scrollbar-thumb { + background-color: var(--md-default-fg-color--lighter); +} +.md-typeset .mdx-iconsearch-result::-webkit-scrollbar-thumb:hover { + background-color: var(--md-accent-fg-color); +} +.md-typeset .mdx-iconsearch-result__meta { + color: var(--md-default-fg-color--lighter); + font-size: 0.64rem; + position: absolute; + right: 0.6rem; + top: 0.4rem; +} +[dir="ltr"] .md-typeset .mdx-iconsearch-result__list { + margin-left: 0; +} +[dir="rtl"] .md-typeset .mdx-iconsearch-result__list { + margin-right: 0; +} +.md-typeset .mdx-iconsearch-result__list { + list-style: none; + margin: 0; + padding: 0; +} +[dir="ltr"] .md-typeset .mdx-iconsearch-result__item { + margin-left: 0; +} +[dir="rtl"] .md-typeset .mdx-iconsearch-result__item { + margin-right: 0; +} +.md-typeset .mdx-iconsearch-result__item { + border-bottom: 0.05rem solid var(--md-default-fg-color--lightest); + margin: 0; + padding: 0.2rem 0.6rem; +} +.md-typeset .mdx-iconsearch-result__item:last-child { + border-bottom: none; +} +.md-typeset .mdx-iconsearch-result__item > * { + margin-right: 0.6rem; +} +.md-typeset .mdx-iconsearch-result__item img { + height: 0.9rem; + width: 0.9rem; +} +[data-md-color-scheme="slate"] + .md-typeset + .mdx-iconsearch-result__item + img[src*="squidfunk"] { + filter: invert(1); +} +.md-typeset .mdx-premium p { + margin: 2em 0; + text-align: center; +} +.md-typeset .mdx-premium img { + height: 3.25rem; +} +.md-typeset .mdx-premium p:last-child { + display: flex; + flex-wrap: wrap; + justify-content: center; +} +.md-typeset .mdx-premium p:last-child > a { + display: block; + flex-shrink: 0; +} +.md-typeset .mdx-sponsorship__list { + margin: 2em 0; +} +.md-typeset .mdx-sponsorship__list:after { + clear: both; + content: ""; + display: block; +} +[dir="ltr"] .md-typeset .mdx-sponsorship__item { + float: left; +} +[dir="rtl"] .md-typeset .mdx-sponsorship__item { + float: right; +} +.md-typeset .mdx-sponsorship__item { + border-radius: 100%; + display: block; + height: 1.6rem; + margin: 0.2rem; + overflow: hidden; + transform: scale(1); + transition: color 125ms, transform 125ms; + width: 1.6rem; +} +.md-typeset .mdx-sponsorship__item:focus, +.md-typeset .mdx-sponsorship__item:hover { + transform: scale(1.1); +} +.md-typeset .mdx-sponsorship__item:focus img, +.md-typeset .mdx-sponsorship__item:hover img { + filter: grayscale(0); +} +.md-typeset .mdx-sponsorship__item--private { + background: var(--md-default-fg-color--lightest); + color: var(--md-default-fg-color--lighter); + font-size: 0.6rem; + font-weight: 700; + line-height: 1.6rem; + text-align: center; +} +.md-typeset .mdx-sponsorship__item img { + display: block; + filter: grayscale(100%) opacity(75%); + height: auto; + transition: filter 125ms; + width: 100%; +} +.md-typeset .mdx-sponsorship-button { + font-weight: 400; +} +.md-typeset .mdx-sponsorship-count, +.md-typeset .mdx-sponsorship-total { + font-weight: 700; +} diff --git a/docs/material/overrides/hooks/shortcodes.py b/docs/material/overrides/hooks/shortcodes.py index 1e8839f2..29c2e2a0 100644 --- a/docs/material/overrides/hooks/shortcodes.py +++ b/docs/material/overrides/hooks/shortcodes.py @@ -71,9 +71,9 @@ class clr(): MAGENTA = '\033[35m' CYAN = '\033[36m' WHITE = '\033[37m' + GREY = '\033[90m' UNDERLINE = '\033[4m' RESET = '\033[0m' - GREY = '\033[90m' # # # Pages @@ -81,12 +81,14 @@ class clr(): # these must be configured to a valid page path; otherwise the script will error # # -PAGE_CHANGELOG ="resources/changelog.md" -PAGE_BACKERS = "resources/backers.md" -PAGE_CONVENTIONS = "resources/conventions.md" +PAGE_CHANGELOG ="about/changelog.md" +PAGE_BACKERS = "about/backers.md" +PAGE_CONVENTIONS = "about/conventions.md" # # # Hooks > on_page_markdown +# +# do not change this function name # # def on_page_markdown(markdown: str, *, page: Page, config: MkDocsConfig, files: Files): @@ -99,28 +101,28 @@ def on_page_markdown(markdown: str, *, page: Page, config: MkDocsConfig, files: args = args.strip() if type == "version": - if args.startswith( "beta-" ): - return Version_Beta(args, page, files) + if args.startswith( "development-" ): + return Version_Development(args, page, files) elif args.startswith( "stable-" ): return Version_Stable( args, page, files ) else: return Version( args, page, files ) - elif type == "backers": return Badge_Backers(page, files) - elif type == "control": return Create_Control(args, page, files) - elif type == "flag": return Create_Flag(args, page, files) - elif type == "option": return Create_Option(args) - elif type == "setting": return Create_Setting(args) - elif type == "command": return Badge_Command(args, page, files) - elif type == "feature": return Badge_Feature(args, page, files) - elif type == "plugin": return Badge_Plugin(args, page, files) - elif type == "extension": return Badge_Extension(args, page, files) - elif type == "3rdparty": return Badge_3rdparty(args, page, files) - elif type == "example": return Badge_Example(args, page, files) + elif type == "control": return badgeControl(args, page, files) + elif type == "flag": return badgeFlag(args, page, files) + elif type == "option": return badgeOption(args) + elif type == "setting": return badgeSetting(args) + elif type == "backers": return badgeBackers(page, files) + elif type == "command": return badgeCommand(args, page, files) + elif type == "feature": return badgeFeature(args, page, files) + elif type == "plugin": return badgePlugin(args, page, files) + elif type == "markdown": return badgeMarkdown(args, page, files) + elif type == "3rdparty": return badge3rdParty(args, page, files) + elif type == "example": return badgeExample(args, page, files) elif type == "default": - if args == "none": return Badge_DefaultValue_None(page, files) - elif args == "computed": return Badge_DefaultValue_Computed(page, files) - else: return Badge_DefaultValue_Custom(args, page, files) + if args == "none": return badgeDefaultNone(page, files) + elif args == "computed": return badgeDefaultVal(page, files) + else: return badgeDefaultCustom(args, page, files) # Otherwise, raise an error raise RuntimeError( f"Error in shortcodes.yp - Specified an unknown shortcode: {type}" ) @@ -135,31 +137,35 @@ def on_page_markdown(markdown: str, *, page: Page, config: MkDocsConfig, files: # Create > Flag # # -def Create_Flag(args: str, page: Page, files: Files): +def badgeFlag(args: str, page: Page, files: Files): type, *_ = args.split(" ", 1) - if type == "experimental": return Badge_Flag_Experimental(page, files) - elif type == "required": return Badge_Flag_Required(page, files) - elif type == "customization": return Badge_Flag_Customization(page, files) - elif type == "metadata": return Badge_Flag_Metadata(page, files) - elif type == "multiple": return Badge_Flag_Multiple_Instances(page, files) - elif type == "setting": return Badge_Flag_Setting(page, files) + if type == "experimental": return badgeFlagExperimental(page, files) + elif type == "required": return badgeFlagRequired(page, files) + elif type == "customization": return badgeFlagCustomization(page, files) + elif type == "metadata": return badgeFlagMetadata(page, files) + elif type == "dangerous": return badgeFlagDangerous(page, files) + elif type == "multiple": return badgeFlagMultiInstances(page, files) + elif type == "setting": return badgeFlagSetting(page, files) + else: return badgeFlagDefault( page, files ) + raise RuntimeError(f"Unknown type: {type}") # # # Create > Controls # # -def Create_Control( args: str, page: Page, files: Files ): +def badgeControl( args: str, page: Page, files: Files ): type, *_ = args.split( " ", 2 ) - if type == "toggle": return icon_control_toggle( page, files ) - elif type == "toggle_on": return icon_control_toggle_on( page, files ) - elif type == "toggle_off": return icon_control_toggle_off( page, files ) - elif type == "textbox": return icon_control_textbox( page, files ) - elif type == "dropdown": return icon_control_dropdown( page, files ) - elif type == "button": return icon_control_button( page, files ) - elif type == "slider": return icon_control_slider( page, files ) - elif type == "color": return icon_control_color( args, page, files ) - else: return icon_control_default( page, files ) + if type == "toggle": return newControlToggle( page, files ) + elif type == "toggle_on": return newControlToggleOn( page, files ) + elif type == "toggle_off": return newControlToggleOff( page, files ) + elif type == "textbox": return newControlTextbox( page, files ) + elif type == "dropdown": return newControlDropdown( page, files ) + elif type == "button": return newControlButton( page, files ) + elif type == "slider": return newControlSlider( page, files ) + elif type == "env": return newControlEnvVar( page, files ) + elif type == "color": return newControlColor( args, page, files ) + else: return newControlDefault( page, files ) raise RuntimeError(f"Unknown type: {type}") @@ -167,15 +173,19 @@ def Create_Control( args: str, page: Page, files: Files ): # Create > Option # # -def Create_Option(type: str): +def badgeOption(type: str): _, *_, name = re.split(r"[.:]", type) return f"[`{name}`](#+{type}){{ #+{type} }}\n\n" # # # Create > Setting +# +# #### +# +# # # -def Create_Setting(type: str): +def badgeSetting(type: str): _, *_, name = re.split(r"[.*]", type) return f"`{name}` {{ #{type} }}\n\n[{type}]: #{type}\n\n" @@ -202,7 +212,7 @@ def _resolve(file: File, page: Page): # Create > Badge # # -def Create_Badge(icon: str, text: str = "", type: str = ""): +def badgeCreate(icon: str, text: str = "", type: str = ""): classes = f"mdx-badge mdx-badge--{type}" if type else "mdx-badge" return "".join([ f"", @@ -215,7 +225,7 @@ def Create_Badge(icon: str, text: str = "", type: str = ""): # Badge > Color Palette # # -def Badge_ColorPalette(icon: str, text: str = "", type: str = ""): +def badgeColorPalette(icon: str, text: str = "", type: str = ""): args = type.split( " " ) bg1_clr = "#000000" @@ -252,10 +262,10 @@ def Badge_ColorPalette(icon: str, text: str = "", type: str = ""): # # # -def Badge_Backers(page: Page, files: Files): +def badgeBackers(page: Page, files: Files): icon = "material-heart" href = _resolve_path(PAGE_BACKERS, page, files) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Backers only')", type = "heart" ) @@ -280,8 +290,8 @@ def Version( text: str, page: Page, files: Files ): print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( - icon = f"[:{icon}:]({href} 'Mkdocs Release')", + return badgeCreate( + icon = f"[:{icon}:]({href} 'TVApp2 Release')", text = f"[{text}]({_resolve_path(path, page, files)})" if spec else "" ) @@ -294,8 +304,8 @@ def Version_Stable( text: str, page: Page, files: Files ): path = f"{PAGE_CHANGELOG}#{spec}" # Return badge - icon = "aetherx-axs-tag" - href = _resolve_path( f"{PAGE_CONVENTIONS}#version-beta", page, files ) + icon = "aetherx-axs-tag" + href = _resolve_path( f"{PAGE_CONVENTIONS}#version-stable", page, files ) output = "" print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) @@ -306,22 +316,22 @@ def Version_Stable( text: str, page: Page, files: Files ): else: output = f"Stable Release" - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} '{output}' )", text = f"[{spec}]({_resolve_path(path, page, files)})" if spec else "" ) # # -# Badge > Version > Beta +# Badge > Version > Development # # -def Version_Beta( text: str, page: Page, files: Files ): - spec = text.replace( "beta-", "" ) +def Version_Development( text: str, page: Page, files: Files ): + spec = text.replace( "development-", "" ) path = f"{PAGE_CHANGELOG}#{spec}" # Return badge - icon = "aetherx-axs-b" - href = _resolve_path( f"{PAGE_CONVENTIONS}#version-beta", page, files ) + icon = "aetherx-axs-code" + href = _resolve_path( f"{PAGE_CONVENTIONS}#version-development", page, files ) output = "" print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) @@ -330,9 +340,9 @@ def Version_Beta( text: str, page: Page, files: Files ): if spec: output = f"Requires version {spec}" else: - output = f"Beta Release" + output = f"Development Release" - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} '{output}' )", text = f"[{text}]({_resolve_path(path, page, files)})" if spec else "" ) @@ -344,13 +354,13 @@ def Version_Beta( text: str, page: Page, files: Files ): # # # -def Badge_Feature(text: str, page: Page, files: Files): +def badgeFeature(text: str, page: Page, files: Files): icon = "material-toggle-switch" href = _resolve_path( f"{PAGE_CONVENTIONS}#feature", page, files) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Optional feature')", text = text ) @@ -364,32 +374,32 @@ def Badge_Feature(text: str, page: Page, files: Files): # # # -def Badge_Plugin(text: str, page: Page, files: Files): +def badgePlugin(text: str, page: Page, files: Files): icon = "material-floppy" href = _resolve_path( f"{PAGE_CONVENTIONS}#plugin", page, files) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Plugin')", text = text ) # # -# Create badge for extension +# Create badge for Markdown # # use the following tag in your md file: -# +# # # -def Badge_Extension(text: str, page: Page, files: Files): +def badgeMarkdown(text: str, page: Page, files: Files): icon = "material-language-markdown" - href = _resolve_path( f"{PAGE_CONVENTIONS}#extension", page, files) + href = _resolve_path( f"{PAGE_CONVENTIONS}#markdown", page, files) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( - icon = f"[:{icon}:]({href} 'Markdown extension')", + return badgeCreate( + icon = f"[:{icon}:]({href} 'Markdown functionality')", text = text ) @@ -403,13 +413,13 @@ def Badge_Extension(text: str, page: Page, files: Files): # # # -def Badge_3rdparty(text: str, page: Page, files: Files): +def badge3rdParty(text: str, page: Page, files: Files): icon = "material-package-variant" href = _resolve_path( f"{PAGE_CONVENTIONS}#3rdparty", page, files) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Third-party utility')", text = text ) @@ -433,30 +443,30 @@ def Badge_3rdparty(text: str, page: Page, files: Files): # # # -def Badge_Example(text: str, page: Page, files: Files): +def badgeExample(text: str, page: Page, files: Files): return "\n".join([ - Badge_Example_Download_Zip(text, page, files), - Badge_Example_View(text, page, files) + badgeExampleDownloadZip(text, page, files), + badgeExampleView(text, page, files) ]) -def Badge_Example_View(text: str, page: Page, files: Files): +def badgeExampleView(text: str, page: Page, files: Files): icon = "material-folder-eye" href = f"https://github.com/TheBinaryNinja/tvapp2/{text}/" print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'View example')", type = "right" ) -def Badge_Example_Download_Zip(text: str, page: Page, files: Files): +def badgeExampleDownloadZip(text: str, page: Page, files: Files): icon = "material-folder-download" href = f"https://github.com/TheBinaryNinja/tvapp2/{text}.zip" print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Download example')", text = f"[`.zip`]({href})", type = "right" @@ -471,15 +481,16 @@ def Badge_Example_Download_Zip(text: str, page: Page, files: Files): # # # -def Badge_Command(text: str, page: Page, files: Files): +def badgeCommand(text: str, page: Page, files: Files): icon = "material-console-line" href = _resolve_path( f"{PAGE_CONVENTIONS}#command", page, files) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Terminal / Console Command')", - text = text + text = text, + type = "command" ) # # @@ -494,13 +505,13 @@ def Badge_Command(text: str, page: Page, files: Files): # # # -def Badge_DefaultValue_Custom(text: str, page: Page, files: Files): +def badgeDefaultCustom(text: str, page: Page, files: Files): icon = "material-water" href = _resolve_path( f"{PAGE_CONVENTIONS}#default", page, files) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Default value')", text = text ) @@ -517,13 +528,13 @@ def Badge_DefaultValue_Custom(text: str, page: Page, files: Files): # # # -def Badge_DefaultValue_None(page: Page, files: Files): +def badgeDefaultNone(page: Page, files: Files): icon = "material-water-outline" href = _resolve_path( f"{PAGE_CONVENTIONS}#default", page, files) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Default value is empty')" ) @@ -539,53 +550,127 @@ def Badge_DefaultValue_None(page: Page, files: Files): # # # -def Badge_DefaultValue_Computed(page: Page, files: Files): +def badgeDefaultVal(page: Page, files: Files): icon = "material-water-check" href = _resolve_path( f"{PAGE_CONVENTIONS}#default", page, files) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Default value is computed')" ) +# # +# Badge > Flag > Default +# +# This symbol denotes that the specified item is a customizable setting +# +# MUST add an entry in conventions.md +# +# use the following tag in your md file: +# : Default +# : Experimental +# : Required +# : Customization +# : Metadata +# : Dangerous +# : Multiple +# : Setting +# # + +def badgeFlagDefault(page: Page, files: Files): + icon = "material-flag" + href = _resolve_path( f"{PAGE_CONVENTIONS}#setting", page, files) + + print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) + + return badgeCreate( + icon = f"[:{icon}:]({href} 'Configurable Setting')" + ) + # # # Badge > Flag > Metadata Property # # This symbol denotes that the item described is a metadata property, which can # be used in Markdown documents as part of the front matter definition. # +# MUST add an entry in conventions.md +# # use the following tag in your md file: -# +# : Default +# : Experimental +# : Required +# : Customization +# : Metadata +# : Dangerous +# : Multiple +# : Setting # # -def Badge_Flag_Metadata(page: Page, files: Files): +def badgeFlagMetadata(page: Page, files: Files): icon = "material-list-box-outline" href = _resolve_path( f"{PAGE_CONVENTIONS}#metadata", page, files) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Metadata property')" ) +# # +# Badge > Flag > Dangerous +# +# This symbol denotes that the item or setting specified may be dangerous to change. +# +# MUST add an entry in conventions.md +# +# use the following tag in your md file: +# : Default +# : Experimental +# : Required +# : Customization +# : Metadata +# : Dangerous +# : Multiple +# : Setting +# # + +def badgeFlagDangerous(page: Page, files: Files): + icon = "aetherx-axd-skull-crossbones" + href = _resolve_path( f"{PAGE_CONVENTIONS}#dangerous", page, files) + + print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) + + return badgeCreate( + icon = f"[:{icon}:]({href} 'This setting is dangerous to change')", + type = "dangerous" + ) + # # # Badge > Flag > Required # # Specifies that a value is required. # +# MUST add an entry in conventions.md +# # use the following tag in your md file: -# -# This option enables the content tabs +# : Default +# : Experimental +# : Required +# : Customization +# : Metadata +# : Dangerous +# : Multiple +# : Setting # # -def Badge_Flag_Required(page: Page, files: Files): +def badgeFlagRequired(page: Page, files: Files): icon = "material-alert" href = _resolve_path( f"{PAGE_CONVENTIONS}#required", page, files) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Required value')" ) @@ -594,17 +679,26 @@ def Badge_Flag_Required(page: Page, files: Files): # # This symbol denotes that the item described is a customization which affects the overall look of the app. # +# MUST add an entry in conventions.md +# # use the following tag in your md file: -# +# : Default +# : Experimental +# : Required +# : Customization +# : Metadata +# : Dangerous +# : Multiple +# : Setting # # -def Badge_Flag_Customization(page: Page, files: Files): +def badgeFlagCustomization(page: Page, files: Files): icon = "material-brush-variant" href = _resolve_path( f"{PAGE_CONVENTIONS}#customization", page, files) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Customization')" ) @@ -616,16 +710,23 @@ def Badge_Flag_Customization(page: Page, files: Files): # MUST add an entry in conventions.md # # use the following tag in your md file: -# +# : Default +# : Experimental +# : Required +# : Customization +# : Metadata +# : Dangerous +# : Multiple +# : Setting # # -def Badge_Flag_Experimental(page: Page, files: Files): +def badgeFlagExperimental(page: Page, files: Files): icon = "material-flask-outline" href = _resolve_path( f"{PAGE_CONVENTIONS}#experimental", page, files) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Experimental')" ) @@ -638,16 +739,23 @@ def Badge_Flag_Experimental(page: Page, files: Files): # MUST add an entry in conventions.md # # use the following tag in your md file: -# +# : Default +# : Experimental +# : Required +# : Customization +# : Metadata +# : Dangerous +# : Multiple +# : Setting # # -def Badge_Flag_Multiple_Instances(page: Page, files: Files): +def badgeFlagMultiInstances(page: Page, files: Files): icon = "material-inbox-multiple" href = _resolve_path( f"{PAGE_CONVENTIONS}#multiple-instances", page, files) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Multiple instances')" ) @@ -659,16 +767,23 @@ def Badge_Flag_Multiple_Instances(page: Page, files: Files): # MUST add an entry in conventions.md # # use the following tag in your md file: -# +# : Default +# : Experimental +# : Required +# : Customization +# : Metadata +# : Dangerous +# : Multiple +# : Setting # # -def Badge_Flag_Setting(page: Page, files: Files): +def badgeFlagSetting(page: Page, files: Files): icon = "material-cog" href = _resolve_path( f"{PAGE_CONVENTIONS}#setting", page, files) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Configurable Setting')" ) @@ -681,13 +796,13 @@ def Badge_Flag_Setting(page: Page, files: Files): # # # -def icon_control_default( page: Page, files: Files ): +def newControlDefault( page: Page, files: Files ): icon = "aetherx-axs-hand-pointer" href = _resolve_path( f"{PAGE_CONVENTIONS}#control", page, files ) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Type: Textbox')" ) @@ -698,13 +813,13 @@ def icon_control_default( page: Page, files: Files ): # # # -def icon_control_textbox( page: Page, files: Files ): +def newControlTextbox( page: Page, files: Files ): icon = "aetherx-axs-input-text" href = _resolve_path( f"{PAGE_CONVENTIONS}#control", page, files ) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Type: Textbox')" ) @@ -717,33 +832,33 @@ def icon_control_textbox( page: Page, files: Files ): # `Disabled` # # -def icon_control_toggle( page: Page, files: Files ): +def newControlToggle( page: Page, files: Files ): icon = "aetherx-axs-toggle-large-on" href = _resolve_path( f"{PAGE_CONVENTIONS}#control", page, files) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Type: Toggle Switch')" ) -def icon_control_toggle_on( page: Page, files: Files ): +def newControlToggleOn( page: Page, files: Files ): icon = "aetherx-axd-toggle-on" href = _resolve_path( f"{PAGE_CONVENTIONS}#control", page, files) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Toggle: Enabled')" ) -def icon_control_toggle_off( page: Page, files: Files ): +def newControlToggleOff( page: Page, files: Files ): icon = "aetherx-axd-toggle-off" href = _resolve_path( f"{PAGE_CONVENTIONS}#control", page, files) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Toggle: Disabled')" ) @@ -754,13 +869,13 @@ def icon_control_toggle_off( page: Page, files: Files ): # # # -def icon_control_dropdown( page: Page, files: Files ): +def newControlDropdown( page: Page, files: Files ): icon = "aetherx-axs-square-caret-down" href = _resolve_path( f"{PAGE_CONVENTIONS}#control", page, files) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Type: Dropdown')" ) @@ -771,13 +886,13 @@ def icon_control_dropdown( page: Page, files: Files ): # # # -def icon_control_button( page: Page, files: Files ): +def newControlButton( page: Page, files: Files ): icon = "material-button-pointer" href = _resolve_path( f"{PAGE_CONVENTIONS}#control", page, files ) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Type: Button')" ) @@ -788,13 +903,13 @@ def icon_control_button( page: Page, files: Files ): # # # -def icon_control_slider( page: Page, files: Files ): +def newControlSlider( page: Page, files: Files ): icon = "aetherx-axd-sliders-simple" href = _resolve_path( f"{PAGE_CONVENTIONS}#control", page, files ) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Create_Badge( + return badgeCreate( icon = f"[:{icon}:]({href} 'Type: Slider')" ) @@ -805,13 +920,31 @@ def icon_control_slider( page: Page, files: Files ): # # # -def icon_control_color( text: str, page: Page, files: Files ): +def newControlColor( text: str, page: Page, files: Files ): icon = "aetherx-axs-palette" href = _resolve_path( f"{PAGE_CONVENTIONS}#control", page, files ) print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) - return Badge_ColorPalette( + return badgeColorPalette( icon = f"[:{icon}:]({href} 'Type: Color Wheel')", type = text ) + +# # +# Icon : Control : Env Variable +# +# use the following tag in your md file: +# +# # + +def newControlEnvVar( page: Page, files: Files ): + icon = "aetherx-axd-puzzle-piece" + href = _resolve_path( f"{PAGE_CONVENTIONS}#control", page, files ) + + print(clr.MAGENTA + 'VERBOSE - ' + clr.WHITE + ' Running ' + clr.YELLOW + inspect.stack()[0][3] + clr.WHITE + ' for page ' + clr.GREY + str(href) + clr.WHITE ) + + return badgeCreate( + icon = f"[:{icon}:]({href} 'Type: Environment Variable')", + type = "env" + ) diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 1d96eaf3..aab513ff 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -1,3 +1,22 @@ +# # +# Mkdocs Config +# +# @notes this documentation requires the following plugins to be installed: +# pip install mkdocs +# pip install mkdocs-material +# pip install mike +# pip install mkdocs-git-committers-plugin-2 +# pip install mkdocs-encryptcontent-plugin +# pip install mkdocs-embed-external-markdown +# pip install mkdocs-redirects mkdocs-glightbox pymdown-extensions mkdocs-git-revision-date-localized-plugin mkdocs-git-authors-plugin mkdocs-link-embeds-plugin +# cd docs +# mkdocs build +# +# @update use the following commands to update mkdocs and the mkdocs-material theme: +# pip install --upgrade mkdocs +# pip install --upgrade --force-reinstall mkdocs-material +# # + site_name: !!python/object/apply:os.getenv ["DOCS_NAME", "TVApp2"] repo_url: https://github.com/TheBinaryNinja/tvapp2 repo_name: TheBinaryNinja/tvapp2 @@ -5,257 +24,308 @@ edit_uri: edit/main/docs/docs/ site_author: TheBinaryNinja site_url: 'https://thebinaryninja.github.io/tvapp2/' +# # +# Section › Markdown Extensions +# # + markdown_extensions: - - markdown.extensions.extra - - toc: - permalink: true - - abbr - - admonition - - attr_list - - pymdownx.magiclink: - normalize_issue_symbols: true - repo_url_shorthand: true - user: TheBinaryNinja - repo: tvapp2 - - pymdownx.emoji: - emoji_index: !!python/name:material.extensions.emoji.twemoji - emoji_generator: !!python/name:material.extensions.emoji.to_svg - options: - custom_icons: - - material/overrides/.icons - - md_in_html - - def_list - - footnotes - - tables - - pymdownx.inlinehilite - - pymdownx.betterem: - smart_enable: all - - pymdownx.tasklist: - custom_checkbox: true - - pymdownx.highlight: - use_pygments: true - anchor_linenums: true - line_spans: __span - pygments_lang_class: true - - pymdownx.superfences: - custom_fences: - - name: mermaid - class: mermaid - format: !!python/name:pymdownx.superfences.fence_code_format - - pymdownx.tabbed: - alternate_style: true - combine_header_slug: true - slugify: !!python/object/apply:pymdownx.slugs.slugify - kwds: - case: lower - - pymdownx.tabbed - - pymdownx.caret - - pymdownx.mark - - pymdownx.smartsymbols - - pymdownx.tilde - - pymdownx.blocks.html - - pymdownx.details - - pymdownx.magiclink: - normalize_issue_symbols: true - repo_url_shorthand: true - user: TheBinaryNinja - repo: tvapp2 - - pymdownx.keys - - pymdownx.snippets: - auto_append: - - includes/abbreviations.md - url_download: true - - pymdownx.arithmatex: - generic: true + - markdown.extensions.extra + - toc: + permalink: true + - abbr + - admonition + - attr_list + - pymdownx.magiclink: + normalize_issue_symbols: true + repo_url_shorthand: true + user: TheBinaryNinja + repo: tvapp2 + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + options: + custom_icons: + - material/overrides/.icons + - md_in_html + - def_list + - footnotes + - tables + - pymdownx.inlinehilite + - pymdownx.betterem: + smart_enable: all + - pymdownx.tasklist: + custom_checkbox: true + - pymdownx.highlight: + use_pygments: true + anchor_linenums: true + line_spans: __span + pygments_lang_class: true + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format + - pymdownx.tabbed: + alternate_style: true + combine_header_slug: true + slugify: !!python/object/apply:pymdownx.slugs.slugify + kwds: + case: lower + - pymdownx.tabbed + - pymdownx.caret + - pymdownx.mark + - pymdownx.smartsymbols + - pymdownx.tilde + - pymdownx.blocks.html + - pymdownx.details + - pymdownx.magiclink: + normalize_issue_symbols: true + repo_url_shorthand: true + user: TheBinaryNinja + repo: tvapp2 + - pymdownx.keys + - pymdownx.snippets: + auto_append: + - docs/includes/abbreviations.md + url_download: true + - pymdownx.arithmatex: + generic: true + +# # +# Section › Theme +# # theme: - highlightjs: true - hljs_languages: - - yaml - - yml - - rust - - markdown - icon: - note: fontawesome/solid/note-sticky - abstract: fontawesome/solid/book - info: fontawesome/solid/circle-info - tip: fontawesome/solid/bullhorn - success: fontawesome/solid/check - question: fontawesome/solid/circle-question - warning: fontawesome/solid/triangle-exclamation - failure: fontawesome/solid/bomb - danger: fontawesome/solid/skull - bug: fontawesome/solid/robot - example: fontawesome/solid/flask - quote: fontawesome/solid/quote-left - annotation: material/arrow-right-circle - tag: - html: fontawesome/brands/html5 - js: fontawesome/brands/js - css: fontawesome/brands/css3 - repo: fontawesome/brands/git-alt - name: material - custom_dir: material/overrides - palette: - # Palette toggle for light mode - - scheme: default - primary: custom - accent: indigo - toggle: - icon: material/brightness-7 - name: Switch to dark mode + highlightjs: true + hljs_languages: + - yaml + - yml + - rust + - markdown + - json + - batch + - typescript + - javascript + - lua + - python + icon: + note: fontawesome/solid/note-sticky + abstract: fontawesome/solid/book + info: fontawesome/solid/circle-info + tip: fontawesome/solid/bullhorn + success: fontawesome/solid/check + question: fontawesome/solid/circle-question + warning: fontawesome/solid/triangle-exclamation + failure: fontawesome/solid/bomb + danger: fontawesome/solid/skull + bug: fontawesome/solid/robot + example: fontawesome/solid/flask + quote: fontawesome/solid/quote-left + annotation: material/arrow-right-circle + hi: aetherx/axs/clock + tag: + html: fontawesome/brands/html5 + js: fontawesome/brands/js + css: fontawesome/brands/css3 + repo: fontawesome/brands/git-alt + name: material + custom_dir: material/overrides + palette: + # Palette toggle for light mode + - scheme: default + primary: custom + accent: indigo + toggle: + icon: material/brightness-7 + name: Switch to dark mode - # Palette toggle for dark mode - - scheme: main - primary: custom - accent: custom - toggle: - icon: material/brightness-4 - name: Switch to light mode - font: - text: Roboto - code: Roboto Mono - favicon: assets/favicon.png - icon: - logo: logo - features: - - announce.dismiss - - toc.follow - - content.action.edit - - content.action.view - - content.tooltips - - search.highlight - - search.share - - search.suggest - - content.code.annotate - - content.code.select - - content.code.copy - - navigation.footer - - navigation.indexes - - navigation.instant - - navigation.instant.progress - - navigation.instant.prefetch - - navigation.instant.preview - - navigation.tracking - - navigation.path - - navigation.top + # Palette toggle for dark mode + - scheme: main + primary: custom + accent: custom + toggle: + icon: material/brightness-4 + name: Switch to light mode + font: + text: Roboto + code: Roboto Mono + favicon: assets/favicon.png + icon: + logo: /aetherx/axd/tv + features: + - navigation.tabs + - navigation.sections + - announce.dismiss + - toc.follow + - content.action.edit + - content.action.view + - content.tooltips + - search.highlight + - search.share + - search.suggest + - content.code.annotate + - content.code.select + - content.code.copy + - navigation.footer + - navigation.indexes + - navigation.instant + - navigation.instant.progress + - navigation.instant.prefetch + - navigation.instant.preview + - navigation.tracking + - navigation.path + - navigation.top +# # +# Section › Hooks +# # -# Hooks hooks: - - material/overrides/hooks/shortcodes.py - - material/overrides/hooks/translations.py + - material/overrides/hooks/shortcodes.py + - material/overrides/hooks/translations.py + +# # +# Section › Extra › CSS +# # extra_css: - - stylesheets/extra.css?v1.000 + - stylesheets/extra.css?v1.000 + +# # +# Section › Extra › Javascript +# # extra_javascript: - - https://unpkg.com/tablesort@5.3.0/dist/tablesort.min.js - - javascripts/tablesort.js -nav: - - Home: 'home.md' - - About: 'about.md' - - Resources: - - License: 'resources/license.md' - - Conventions: 'resources/conventions.md' - - Tags: 'resources/tags.md' - - Changelog: 'resources/changelog.md' + - https://unpkg.com/tablesort@5.3.0/dist/tablesort.min.js + - javascripts/tablesort.js -plugins: - - search: - separator: '[\s\u200b\-_,:!=\[\]()"`/]+|\.(?!\d)|&[lg]t;|(?!\b)(?=[A-Z][a-z])' - - group: - plugins: - - optimize - - minify - - git-committers: - repository: TheBinaryNinja/tvapp2 - docs_path: docs/docs/ - branch: main - token: !!python/object/apply:os.getenv [GH_TOKEN, "NULL"] - - blog: - authors: true - authors_file: .authors.yml - - encryptcontent: - title_prefix: '[🔒]' - summary: 'Access Restricted' - placeholder: 'Authentication Code' - placeholder_user: User - password_button: True - password_button_text: '' - # input_class: 'w3-input' # CSS class used for input username and password - # button_class: 'w3-button w3-theme-l1 w3-hover-theme' # CSS class for password_button - decryption_failure_message: 'Authentication code not correct.' - encryption_info_message: "This information is restricted to certain users with access." - password_inventory: - classified: - - !!python/object/apply:os.getenv [DOCS_SECRET_L1, "NULL"] - confidential: - - !!python/object/apply:os.getenv [DOCS_SECRET_L2, "NULL"] - - git-revision-date-localized: - type: timeago - enabled: true - - git-authors: - show_contribution: true - sort_authors_by: name - exclude: - - index.md - enabled: true - - glightbox: - touchNavigation: true - loop: false - effect: zoom - slide_effect: slide - width: 100% - height: auto - zoomable: true - draggable: false - skip_classes: - - custom-skip-class-name - auto_caption: false - caption_position: bottom - background: black - shadow: false - - mike: - alias_type: symlink - redirect_template: null - deploy_prefix: '' - canonical_version: null - version_selector: true - css_dir: css - javascript_dir: js - - redirects: - redirect_maps: - docs/settings/summary.md: settings/summary.md - - link-embeds: - enabled: true - name_default: "Untitled Link" - desc_default: "No description found" - image_default: "https://github.com/Aetherinox/mkdocs-link-embeds/assets/118329232/c0298d98-0910-4235-a88f-0c3e2f704ba7" - image_disabled: false - favicon_default: "https://github.com/Aetherinox/mkdocs-link-embeds/assets/118329232/b37da9c6-6f17-4c3f-9c94-c346a6f31bfa" - favicon_disabled: true - favicon_size: 25 - target: "blank" - accent: "FFFFFF1A" - verbose: true +# # +# Section › Extras +# # extra: - tags: - HTML5: html - JavaScript: js - CSS: css - generator: false - version: - default: latest - provider: mike - alias: true - consent: - title: Cookie Consent - description: >- - We use cookies to recognize your repeated visits and preferences, as well - as to measure the effectiveness of our documentation and whether users - find what they're searching for. With your consent, you're helping us to - make our documentation better. + social: + - icon: fontawesome/brands/github + link: https://github.com/TheBinaryNinja/tvapp2 + - icon: fontawesome/brands/discord + link: https://discord.gg/gTze6hRe + tags: + HTML5: html + JavaScript: js + CSS: css + generator: false + version: + default: latest + provider: mike + alias: true + consent: + title: Cookie Consent + description: >- + We use cookies to recognize your repeated visits and preferences, as well + as to measure the effectiveness of our documentation and whether users + find what they're searching for. With your consent, you're helping us to + make our documentation better. + +# # +# Section › Navigation +# # + +nav: + - Home: 'home.md' + - About: + - What Is TVApp2: 'about/what_is_tvapp.md' + - Contributing: 'about/contributing.md' + - License: 'about/license.md' + - Wiki: + - Conventions: 'about/conventions.md' + - Tags: 'about/tags.md' + - Config: + - Environment Variables: 'config/env.md' + - Changelog: 'about/changelog.md' + - Discord: 'https://discord.gg/gTze6hRe' + +# # +# Section › Plugins +# # + +plugins: + - search: + separator: '[\s\u200b\-_,:!=\[\]()"`/]+|\.(?!\d)|&[lg]t;|(?!\b)(?=[A-Z][a-z])' + - group: + plugins: + - optimize + - minify + - git-committers: + repository: TheBinaryNinja/tvapp2 + docs_path: docs/docs/ + branch: main + token: !!python/object/apply:os.getenv [GH_TOKEN, "NULL"] + - blog: + authors: true + authors_file: .authors.yml + - encryptcontent: + title_prefix: '[🔒]' + summary: 'Access Restricted' + placeholder: 'Authentication Code' + placeholder_user: User + password_button: True + password_button_text: '' + # input_class: 'w3-input' # CSS class used for input username and password + # button_class: 'w3-button w3-theme-l1 w3-hover-theme' # CSS class for password_button + decryption_failure_message: 'Authentication code not correct.' + encryption_info_message: "This information is restricted to certain users with access." + password_inventory: + classified: + - !!python/object/apply:os.getenv [DOCS_SECRET_L1, "NULL"] + confidential: + - !!python/object/apply:os.getenv [DOCS_SECRET_L2, "NULL"] + - git-revision-date-localized: + type: timeago + enabled: true + - git-authors: + show_contribution: true + sort_authors_by: name + exclude: + - index.md + enabled: true + - glightbox: + touchNavigation: true + loop: false + effect: zoom + slide_effect: slide + width: 100% + height: auto + zoomable: true + draggable: false + skip_classes: + - custom-skip-class-name + auto_caption: false + caption_position: bottom + background: black + shadow: false + - mike: + alias_type: symlink + redirect_template: null + deploy_prefix: '' + canonical_version: null + version_selector: true + css_dir: css + javascript_dir: js + - redirects: + redirect_maps: + docs/settings/summary.md: settings/summary.md + - link-embeds: + enabled: true + name_default: "Untitled Link" + desc_default: "No description found" + image_default: "https://github.com/Aetherinox/mkdocs-link-embeds/assets/118329232/c0298d98-0910-4235-a88f-0c3e2f704ba7" + image_disabled: false + favicon_default: "https://github.com/Aetherinox/mkdocs-link-embeds/assets/118329232/b37da9c6-6f17-4c3f-9c94-c346a6f31bfa" + favicon_disabled: false + favicon_size: 25 + target: "blank" + accent: "FFFFFF1A" + verbose: true + - external-markdown copyright: > Copyright © 2025 - BinaryNinja