diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index ca6f45c1b..5d9c7d43c 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -3,61 +3,36 @@ on: push: branches: - master -env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - MKDOCS_GIT_COMMITTERS_APIKEY: ${{ secrets.MKDOCS_GIT_COMMITTERS_APIKEY }} +permissions: + contents: read + pages: write + id-token: write jobs: deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest steps: - - name: Checkout latest push - uses: actions/checkout@v4 - with: - fetch-depth: 0 + - uses: actions/checkout@v5 - - name: Setup Python env - uses: actions/setup-python@v5 - with: - python-version: 3.9.16 + - uses: actions/configure-pages@v5 - - name: Set up build cache - uses: actions/cache/restore@v4 + - uses: actions/setup-python@v5 with: - key: docs-${{ hashfiles('.cache/**') }} - path: .cache - restore-keys: | - docs- - - - name: Setup Github - run: | - git config --local user.email "action@github.com" - git config --local user.name "GitHub Action" - git pull - git checkout master + python-version: "3.11" - - name: Install Dependencies - run: | - make install-python-packages - sudo apt-get install pngquant + - name: Install Zensical + run: make install - - name: Install MkDocs Insiders - if: github.event.repository.fork == false - env: - GH_TOKEN: ${{ secrets.GH_TOKEN }} - run: pip install --upgrade git+https://${GH_TOKEN}@github.com/squidfunk/mkdocs-material-insiders.git@9.6.14-insiders-4.53.16 + - name: Build site + run: zensical build --clean - - name: Deploy Release Version - run: | - mkdocs gh-deploy --force --config-file mkdocs-insiders.yml - - - name: Deploy to Server - run: | - git checkout gh-pages - git remote set-url --push origin https://actions:$GITHUB_TOKEN@github.com/ExpressLRS/Docs - git push -f origin gh-pages - - - name: Save build cache - uses: actions/cache/save@v4 + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@v4 with: - key: docs-${{ hashfiles('.cache/**') }} - path: .cache + path: site + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.python-version b/.python-version new file mode 100644 index 000000000..2c0733315 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.11 diff --git a/Dockerfile b/Dockerfile index 7bab7e9cb..67109193d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,16 +1,4 @@ -FROM squidfunk/mkdocs-material:9.6.19 -RUN apk add \ - build-base \ - libxml2-dev \ - libxslt \ - libxslt-dev \ - dumb-init +FROM zensical/zensical:0.0.32 -WORKDIR /docs -COPY ./Makefile ./Makefile -RUN make install-python-packages - -EXPOSE 8000 - -ENTRYPOINT ["dumb-init"] -CMD ["mkdocs", "serve", "--livereload", "--dev-addr=0.0.0.0:8000"] +# WORKDIR, EXPOSE 8000, ENTRYPOINT and the default +# `serve --dev-addr=0.0.0.0:8000` CMD are inherited from the base image. diff --git a/Makefile b/Makefile index aa4bc0c2e..d5ce0b201 100644 --- a/Makefile +++ b/Makefile @@ -1,19 +1,21 @@ -.PHONY: install-python-packages -install-python-packages: - pip install \ - "mkdocs-minify-plugin==0.8.0" \ - "mkdocs-redirects==1.2.2" \ - "mkdocs-static-i18n==1.3.0" \ - "mkdocs-git-committers-plugin-2==2.5.0" \ - "mkdocs-git-revision-date-localized-plugin==1.4.5" \ - "cairosvg==2.8.1" \ - "jinja2==3.1.6" +# Host-only convenience wrappers around `docker compose`. +# CI invokes `docker compose` directly and never calls `make`. +.PHONY: install build run serve site shell + +install: + pip install "zensical==0.0.32" -.PHONY: build build: docker compose build -.PHONY: run -run: +run: serve + +serve: docker compose up + +site: + docker compose run --rm docs build --clean + +shell: + docker compose run --rm --entrypoint sh docs diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..5ff1ae0bc --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,8 @@ +services: + docs: + build: . + image: expresslrs-docs + ports: + - "8000:8000" + volumes: + - .:/docs diff --git a/docs/index.md b/docs/index.md index 0d027f29a..eaf044fd3 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,21 @@ --- -template: home.html title: High Performance Open Source Radio Control Link --- + +# ExpressLRS + +ExpressLRS is a fully open radio control link built for maximum range, +speed, and data throughput. Wide hardware support across both 900 MHz and +2.4 GHz frequencies. + + + +- [Getting Started](quick-start/getting-started.md) +- [Hardware Selection](hardware/hardware-selection.md) +- [FAQ](faq.md) +- [Blog](blog/index.md) diff --git a/mkdocs-insiders.yml b/mkdocs-insiders.yml deleted file mode 100644 index 633584c05..000000000 --- a/mkdocs-insiders.yml +++ /dev/null @@ -1,55 +0,0 @@ -INHERIT: mkdocs.yml - -theme: - features: - - announce.dismiss - - navigation.sections - - navigation.tabs - - navigation.footer - - navigation.tracking - - navigation.path - - search.highlight - - search.suggest - - toc.follow - - content.action.edit - - content.action.view - -plugins: - # - privacy: - # enabled: !ENV [ CI, false ] - # links_attr_map: - # target: _blank - - blog: - enabled: true - blog_toc: true - post_date_format: long - post_url_date_format: yyyy/MM/dd - - social: - cards_color: - fill: "#5f8bf3" - text: "#FFFFFF" - - search: - lang: en - - tags: { } - - minify: - minify_html: true - # - i18n: - # docs_structure: folder - # fallback_to_default: true - # reconfigure_material: true - # reconfigure_search: true - # languages: - # - locale: en - # name: English - # build: true - # default: true - # exclude: - # - blog/** - - git-revision-date-localized: - enabled: !ENV [ CI, false ] - type: timeago - enable_creation_date: true - - git-committers: - enabled: !ENV [ CI, false ] - repository: ExpressLRS/Docs - branch: master diff --git a/mkdocs.yml b/mkdocs.yml deleted file mode 100644 index de75531b7..000000000 --- a/mkdocs.yml +++ /dev/null @@ -1,354 +0,0 @@ -site_name: ExpressLRS -site_url: https://www.expresslrs.org/ -site_author: ExpressLRS -site_description: >- - ExpressLRS is a fully open radio control link built for maximum - range, speed, and data throughput. Wide hardware support across both - 900 MHz and 2.4 GHz frequencies. - -# Repository -repo_name: ExpressLRS/ExpressLRS -repo_url: https://github.com/ExpressLRS/ExpressLRS/releases/ -edit_uri: "https://github.com/ExpressLRS/Docs/tree/master/docs/" - -# Copyright -copyright: Copyright © 2018–2025 ExpressLRS LLC - -# Configuration -theme: - name: material - custom_dir: overrides - - # Static files - static_templates: - - 404.html - - include_search_page: false - search_index_only: true - - language: en - features: - - announce.dismiss - - navigation.sections - - navigation.tabs - - navigation.footer - - navigation.tracking - - navigation.indexes - - search.highlight - - search.suggest - - toc.follow - - content.action.edit - - content.action.view - - palette: - - media: "(prefers-color-scheme: dark)" - scheme: slate - toggle: - icon: material/weather-night - name: Switch to light mode - default: expresslrs-dark - primary: expresslrs-dark - accent: expresslrs-dark - - media: "(prefers-color-scheme: light)" - scheme: default - toggle: - icon: material/weather-sunny - name: Switch to dark mode - primary: expresslrs - accent: expresslrs - font: - text: Roboto - code: Roboto Mono - favicon: assets/favicon.png - logo: assets/images/logotype.svg - -# Plugins -hooks: - - overrides/hooks/blog_posts.py - -plugins: - - blog: - enabled: true - blog_toc: true - post_date_format: long - post_url_date_format: yyyy/MM/dd - - search: - lang: en - - tags: { } - - minify: - minify_html: true - # - i18n: - # docs_structure: folder - # fallback_to_default: true - # reconfigure_material: true - # reconfigure_search: true - # languages: - # - locale: en - # name: English - # build: true - # default: true - # exclude: - # - blog/** - - git-revision-date-localized: - enabled: !ENV [ CI, false ] - type: timeago - enable_creation_date: true - - git-committers: - enabled: !ENV [ CI, false ] - repository: ExpressLRS/Docs - branch: master - -extra_css: - - assets/stylesheets/main.css - - assets/stylesheets/colors.css - - assets/stylesheets/home.css - -# Analytics -extra: - analytics: - provider: google - property: G-VMF2B5BYJZ - feedback: - title: Was this page helpful? - ratings: - - icon: material/emoticon-happy-outline - name: This page was helpful - data: 1 - note: >- - Thanks for your feedback! - - icon: material/emoticon-sad-outline - name: This page could be improved - data: 0 - note: >- - Thanks for your feedback! Help us improve this page by - using our discord server! - 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. - analytics: - name: Google Analytics - actions: - - accept - - manage - - reject - social: - - icon: fontawesome/brands/github - link: https://github.com/ExpressLRS/ - name: See the Github Repo - - icon: fontawesome/brands/discord - link: https://discord.gg/dS6ReFY - name: Check out the Discord - - icon: fontawesome/brands/facebook - link: https://www.facebook.com/groups/636441730280366 - name: Join the Facebook Group - - icon: fontawesome/brands/twitter - link: https://twitter.com/expresslrs - name: We're on Twitter too! - - icon: fontawesome/brands/instagram - link: https://instagram.com/expresslrs - name: Follow us on Instagram - - icon: fontawesome/solid/circle-dollar-to-slot - link: https://opencollective.com/expresslrs - name: Send a Donation! - generator: true - -# Markdown Extensions -markdown_extensions: - - admonition - - abbr - - attr_list - - def_list - - footnotes - - meta - - md_in_html - - tables - - toc: - permalink: true - - pymdownx.arithmatex: - generic: true - - pymdownx.betterem: - smart_enable: all - - pymdownx.caret - - pymdownx.critic - - pymdownx.details - - pymdownx.emoji: - emoji_index: !!python/name:material.extensions.emoji.twemoji - emoji_generator: !!python/name:material.extensions.emoji.to_svg - - pymdownx.highlight - - pymdownx.inlinehilite - - pymdownx.keys - - pymdownx.magiclink: - repo_url_shorthand: true - user: ExpressLRS - repo: ExpressLRS - - pymdownx.mark - - pymdownx.smartsymbols - - pymdownx.superfences: - custom_fences: - - name: mermaid - class: mermaid - format: !!python/name:pymdownx.superfences.fence_code_format - - pymdownx.tabbed: - alternate_style: true - slugify: !!python/object/apply:pymdownx.slugs.slugify - kwds: - case: lower - - pymdownx.tasklist: - custom_checkbox: true - - pymdownx.tilde - -# Navigation -nav: - - Home: index.md - - Quick Start: - - Getting Started: quick-start/getting-started.md - - Installing the Configurator: quick-start/installing-configurator.md - - Firmware Options: quick-start/firmware-options.md - - The Web UI: quick-start/webui.md - - Transmitters: - - Radio Preparation: quick-start/transmitters/tx-prep.md - - Checking FW Version: quick-start/transmitters/firmware-version.md - - Typical Updating Steps: quick-start/transmitters/updating.md - - Updating Transmitters: - - Axisflying Thor: quick-start/transmitters/axisflying-thor.md - - BetaFPV 2.4GHz: quick-start/transmitters/betafpv2400.md - - BetaFPV 900MHz: quick-start/transmitters/betafpv900.md - - BetaFPV LR3 Pro: quick-start/transmitters/betafpvlr3pro.md - - EMAX 2.4GHz: quick-start/transmitters/emax2400.md - - EMAX 900MHz: quick-start/transmitters/emax900.md - - Frsky R9 Modules: quick-start/transmitters/frsky-r9modules.md - - Happymodel ES24TX: quick-start/transmitters/es24tx.md - - Happymodel ES900TX: quick-start/transmitters/es900tx.md - - HGLRC Hermes: quick-start/transmitters/hglrc-hermes.md - - iFlight Commando: quick-start/transmitters/iflight-commando.md - - IMRC Ghost: quick-start/transmitters/ghost2400.md - - Internal RadioMaster: quick-start/transmitters/rm-internal.md - - Internal Jumper T-Pro: quick-start/transmitters/aion-internal.md - - Internal Jumper TLite V2: quick-start/transmitters/jumper-internal.md - - Internal Jumper T14/T15: quick-start/transmitters/jumper-t14-t15-internal.md - - Internal Jumper T20: quick-start/transmitters/jumper-t20-internal.md - - Jumper Aion Nano: quick-start/transmitters/jumper-aion.md - - NamimnoRC Flash: quick-start/transmitters/flash2400.md - - NamimnoRC Voyager: quick-start/transmitters/voyager900.md - - Radiomaster Bandit: quick-start/transmitters/rm-bandit.md - - Radiomaster Ranger: quick-start/transmitters/rm-ranger.md - - Siyi FM30: quick-start/transmitters/siyifm30.md - - Vantac Lite: quick-start/transmitters/vantac-lite.md - - DIY 900TX: quick-start/transmitters/diy900.md - - DIY 2400TX: quick-start/transmitters/diy2400.md - - The ExpressLRS Lua Script: quick-start/transmitters/lua-howto.md - - Receivers: - - Receiver Wiring: quick-start/receivers/wiring-up.md - - Configuring FC: quick-start/receivers/configuring-fc.md - - Checking FW Version: quick-start/receivers/firmware-version.md - - Typical Updating Steps: quick-start/receivers/updating.md - - Updating Receivers: - - Axisflying Thor: quick-start/receivers/axisflying-thor.md - - BetaFPV Lite/Nano/AIO 2.4GHz: quick-start/receivers/betafpv2400.md - - BetaFPV Nano 900MHz: quick-start/receivers/betafpv900.md - - BetaFPV SuperD 2.4GHz: quick-start/receivers/betafpv-superd.md - - BetaFPV SuperD 900MHz: quick-start/receivers/betafpv-superd900.md - - Foxeer LNA & Lite 2.4GHz: quick-start/receivers/foxeer2400.md - - Frsky R9: quick-start/receivers/r9.md - - GEPRC Nano & Dual 2.4GHz: quick-start/receivers/geprc2400.md - - GEPRC Nano & Dual 900MHz: quick-start/receivers/geprc900.md - - Happymodel EP: quick-start/receivers/hmep2400.md - - Happymodel PP: quick-start/receivers/hmpp2400.md - - Happymodel ES900RX: quick-start/receivers/hmes900.md - - HGLRC Hermes 2.4GHz: quick-start/receivers/hglrc-hermes2400.md - - HGLRC Hermes 900MHz: quick-start/receivers/hglrc-hermes900.md - - iFlight 2.4GHz: quick-start/receivers/iflight2400.md - - iFlight 900MHz: quick-start/receivers/iflight900.md - - IMRC Ghost: quick-start/receivers/ghost2400.md - - Jumper Aion Nano: quick-start/receivers/jumper-aion.md - - Jumper R9 Mini: quick-start/receivers/jumper900.md - - Matek R24: quick-start/receivers/matek2400.md - - NamimnoRC Flash: quick-start/receivers/flash2400.md - - NamimnoRC Voyager: quick-start/receivers/voyager900.md - - RadioMaster RP: quick-start/receivers/radiomaster-rp-2400.md - - Siyi FR Mini: quick-start/receivers/siyiFRmini.md - - Vantac: quick-start/receivers/vantac2400.md - - DIY 900RX: quick-start/receivers/diy900.md - - DIY 2400RX: quick-start/receivers/diy2400.md - - Post-Flash: - - LED Status: quick-start/led-status.md - - Binding ExpressLRS: quick-start/binding.md - - Before First Flight: quick-start/pre-1stflight.md - - Ardupilot Setup: quick-start/ardupilot-setup.md - - Troubleshooting: quick-start/troubleshooting.md - - Unbricking: quick-start/unbricking.md - - Software: - - Obsolete Defines: software/obsolete-defines.md - - OpenOCD for STLink: software/open-ocd.md - - PIO STLink Fix: software/stlink-fix.md - - Switch Configs: software/switch-config.md - - Toolchain Setup: software/toolchain-install.md - - User Defines: software/user-defines.md - - Updating: - - Betaflight Passthrough: software/updating/betaflight-passthrough.md - - Wifi Updating: software/updating/wifi-updating.md - - Features: - - AirPort: software/airport.md - - Dynamic Transmit Power: software/dynamic-transmit-power.md - - Gemini: software/gemini.md - - Loan Model: software/loan-model.md - - MAVLink: software/mavlink.md - - MFD Crossbow Tracker Integration: software/mfd-crossbow.md - - Model Matching: software/model-config-match.md - - Receiver Serial Protocols: software/serial-protocols.md - - Sentinel Tracker Integration: software/backpack-telemetry.md - - Serial VTX: software/serialvtx.md - - Team Racing: software/teamracing.md - - Trainer (Head Tracking) Input: software/trainer-input.md - - Testing: - - CRC Testing: software/testing/crc-testing.md - - RX Testing: software/testing/rx-scoreboard.md - - Unit Testing: software/testing/unit-testing.md - - Hardware: - - Hardware Selection: hardware/hardware-selection.md - - R9M Inverter Mod: hardware/inverter-mod.md - - R9M Fan Mod: hardware/fan-mod.md - - Troubleshooting the X9D(+): hardware/x9d-troubleshooting.md - - Crystal Oscillator (XO) Frequency Error: hardware/crystal-frequency-error.md - - SMD Antenna: hardware/smd-antenna.md - - PWM Receivers: hardware/pwm-receivers.md - - SPI Receivers: hardware/spi-receivers.md - - ESP Backpacks: - - Backpack Info: hardware/backpack/esp-backpack.md - - Tx Backpack Setup: hardware/backpack/backpack-tx-setup.md - - VRx Backpack Setup: hardware/backpack/backpack-vrx-setup.md - - HDZero Goggle VRx Backpack: hardware/backpack/hdzero-goggles.md - - Special Targets: - - DIY Receiver: hardware/special-targets/diy-rx.md - - DIY Transmitter: hardware/special-targets/diy-tx.md - - Nuclear Targets: hardware/special-targets/nuclear-hardware.md - - Info: - - Glossary: info/glossary.md - - Signal Health: info/signal-health.md - - Telemetry Bandwidth: info/telem-bandwidth.md - - Init Rate: info/init-rate.md - - Long Range Competition: info/long-range.md - - Advance Technical Info: info/advance-technical-info.md - - Privacy Policy: info/privacy-policy.md - - Licenses: info/licenses.md - - Terms & Conditions: info/terms-and-conditions.md - - FAQ: faq.md - - Blog: - - blog/index.md - - Partners Program: partners-program.md - - Contact Us: contact-us.md - -extra_javascript: - - assets/javascripts/binding-phrase.js - - https://cdnjs.cloudflare.com/ajax/libs/tablesort/5.2.1/tablesort.min.js - - https://cdnjs.cloudflare.com/ajax/libs/tablesort/5.2.1/sorts/tablesort.number.min.js - - assets/javascripts/tablesort.js - - assets/javascripts/mathjax.js - #- https://polyfill.io/v3/polyfill.min.js?features=es6 --db, removed - - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js - -INHERIT: redirects.yml diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 000000000..0fd9ed52a --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,9 @@ +[project] +name = "expresslrs-docs" +version = "0.1.0" +description = "ExpressLRS documentation site" +readme = "README.md" +requires-python = ">=3.11" +dependencies = [ + "zensical==0.0.32", +] diff --git a/uv.lock b/uv.lock new file mode 100644 index 000000000..8eb345b38 --- /dev/null +++ b/uv.lock @@ -0,0 +1,162 @@ +version = 1 +revision = 3 +requires-python = ">=3.11" + +[[package]] +name = "click" +version = "8.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/75/31212c6bf2503fdf920d87fee5d7a86a2e3bcf444984126f13d8e4016804/click-8.3.2.tar.gz", hash = "sha256:14162b8b3b3550a7d479eafa77dfd3c38d9dc8951f6f69c78913a8f9a7540fd5", size = 302856, upload-time = "2026-04-03T19:14:45.118Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/20/71885d8b97d4f3dde17b1fdb92dbd4908b00541c5a3379787137285f602e/click-8.3.2-py3-none-any.whl", hash = "sha256:1924d2c27c5653561cd2cae4548d1406039cb79b858b747cfea24924bbc1616d", size = 108379, upload-time = "2026-04-03T19:14:43.505Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "deepmerge" +version = "2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/3a/b0ba594708f1ad0bc735884b3ad854d3ca3bdc1d741e56e40bbda6263499/deepmerge-2.0.tar.gz", hash = "sha256:5c3d86081fbebd04dd5de03626a0607b809a98fb6ccba5770b62466fe940ff20", size = 19890, upload-time = "2024-08-30T05:31:50.308Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/82/e5d2c1c67d19841e9edc74954c827444ae826978499bde3dfc1d007c8c11/deepmerge-2.0-py3-none-any.whl", hash = "sha256:6de9ce507115cff0bed95ff0ce9ecc31088ef50cbdf09bc90a09349a318b3d00", size = 13475, upload-time = "2024-08-30T05:31:48.659Z" }, +] + +[[package]] +name = "docs" +version = "0.1.0" +source = { virtual = "." } + +[package.dev-dependencies] +dev = [ + { name = "zensical" }, +] + +[package.metadata] + +[package.metadata.requires-dev] +dev = [{ name = "zensical", specifier = ">=0.0.32" }] + +[[package]] +name = "markdown" +version = "3.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", size = 368805, upload-time = "2026-02-09T14:57:26.942Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180, upload-time = "2026-02-09T14:57:25.787Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pymdown-extensions" +version = "10.21.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/08/f1c908c581fd11913da4711ea7ba32c0eee40b0190000996bb863b0c9349/pymdown_extensions-10.21.2.tar.gz", hash = "sha256:c3f55a5b8a1d0edf6699e35dcbea71d978d34ff3fa79f3d807b8a5b3fa90fbdc", size = 853922, upload-time = "2026-03-29T15:01:55.233Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/27/a2fc51a4a122dfd1015e921ae9d22fee3d20b0b8080d9a704578bf9deece/pymdown_extensions-10.21.2-py3-none-any.whl", hash = "sha256:5c0fd2a2bea14eb39af8ff284f1066d898ab2187d81b889b75d46d4348c01638", size = 268901, upload-time = "2026-03-29T15:01:53.244Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "zensical" +version = "0.0.32" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "deepmerge" }, + { name = "markdown" }, + { name = "pygments" }, + { name = "pymdown-extensions" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/94/4a49ca9329136445f4111fda60e4bfcbe68d95e18e9aa02e4606fba5df4a/zensical-0.0.32.tar.gz", hash = "sha256:0f857b09a2b10c99202b3712e1ffc4d1d1ffa4c7c2f1aa0fafb1346b2d8df604", size = 3891955, upload-time = "2026-04-07T11:41:29.203Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/e1/dd03762447f1c2a4c8aff08e8f047ec17c73421714a0600ef71c361a5934/zensical-0.0.32-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:7ed181c76c03fec4c2dd5db207810044bf9c3fa87097fbdbabd633661e20fc70", size = 12416474, upload-time = "2026-04-07T11:40:55.888Z" }, + { url = "https://files.pythonhosted.org/packages/f5/a6/2f1babb00842c6efa5ae755b3ab414e4688ae8e47bdd2e785c0c37ef625d/zensical-0.0.32-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:8cde82bf256408f75ae2b07bffcaac7d080b6aad5f7acf210c438cb7413c3081", size = 12292801, upload-time = "2026-04-07T11:40:59.648Z" }, + { url = "https://files.pythonhosted.org/packages/2d/f1/d32706de06fd30fb07ae514222a79dd17d4578cd1634e5b692e0c790a61e/zensical-0.0.32-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60e60e2358249b2a2c5e1c5c04586d8dbba27e577441cc9dd32fe8d879c6951e", size = 12658847, upload-time = "2026-04-07T11:41:02.347Z" }, + { url = "https://files.pythonhosted.org/packages/e7/42/a3daf4047c86382749a59795c4e7acd59952b4f6f37f329cd2d41cc37a0f/zensical-0.0.32-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ec79b4304009138e7a38ebe24e8a8e9dbc15d38922185f8a84470a7757d7b73f", size = 12604777, upload-time = "2026-04-07T11:41:05.227Z" }, + { url = "https://files.pythonhosted.org/packages/59/11/4af61d3fb07713cd3f77981c1b3017a60c2b210b36f1b04353f9116d03ca/zensical-0.0.32-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc92fa7d0860ec6d95426a5f545cfc5493c60f8ab44fcc11611a4251f34f1b70", size = 12956242, upload-time = "2026-04-07T11:41:07.58Z" }, + { url = "https://files.pythonhosted.org/packages/8c/34/e9b5f4376bbf460f8c07a77af59bd169c7c68ed719a074e6667ba41109f8/zensical-0.0.32-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07f69019396060e310c9c3b18747ce8982ad56d67fbab269b61e74a6a5bdcb4a", size = 12701954, upload-time = "2026-04-07T11:41:10.532Z" }, + { url = "https://files.pythonhosted.org/packages/d2/43/a52e5dcb324f38a1d22f7fafd4eec273385d04de52a7ab5ac7b444cf2bdc/zensical-0.0.32-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:d096c9ed20a48e5ff095eca218eef94f67e739cdf0abf7e1f7e232e78f6d980c", size = 12835464, upload-time = "2026-04-07T11:41:13.152Z" }, + { url = "https://files.pythonhosted.org/packages/a7/95/bede89ecb4932bbd29db7b61bf530a962aed09d3a8d5aa71a64af1d4920f/zensical-0.0.32-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:bf5576b7154bde18cebd9a7b065d3ab8b334c6e73d5b2e83abe2b17f9d00a992", size = 12876574, upload-time = "2026-04-07T11:41:16.085Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e8/9b25fda22bf729ca2598cc42cefe9b20e751d12d23e35c70ea0c7939d20a/zensical-0.0.32-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:f33905a1e0b03a2ad548554a157b7f7c398e6f41012d1e755105ae2bc60eab8a", size = 13022702, upload-time = "2026-04-07T11:41:18.947Z" }, + { url = "https://files.pythonhosted.org/packages/f6/35/0c6d0b57187bd470a05e8a391c0edd1d690eb429e12b9755c99cf60a370e/zensical-0.0.32-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:0a73a53b1dd41fd239875a3cb57c4284747989c45b6933f18e9b51f1b5f3d8ef", size = 12975593, upload-time = "2026-04-07T11:41:21.436Z" }, + { url = "https://files.pythonhosted.org/packages/ee/2d/4e88bcefc33b7af22f0637fd002d3cf5384e8354f0a7f8a9dbfcd40cfa24/zensical-0.0.32-cp310-abi3-win32.whl", hash = "sha256:f8cb579bdb9b56f1704b93f4e17b42895c8cb466e8eec933fbe0153b5b1e3459", size = 12012163, upload-time = "2026-04-07T11:41:23.975Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ae/a80a2f15fd10201fe3dfd6b5cdf85351165f820cf5b29e3c3b24092c158c/zensical-0.0.32-cp310-abi3-win_amd64.whl", hash = "sha256:6d662f42b5d0eadfac6d281e9d86574bc7a9f812f1ed496335d15f2d581d4b28", size = 12205948, upload-time = "2026-04-07T11:41:27.056Z" }, +] diff --git a/zensical.toml b/zensical.toml new file mode 100644 index 000000000..db9df7bf1 --- /dev/null +++ b/zensical.toml @@ -0,0 +1,287 @@ +[project] +site_name = "ExpressLRS" +site_url = "https://www.expresslrs.org/" +site_author = "ExpressLRS" +site_description = """ +ExpressLRS is a fully open radio control link built for maximum range, \ +speed, and data throughput. Wide hardware support across both 900 MHz \ +and 2.4 GHz frequencies.\ +""" +copyright = "Copyright © 2018–2026 ExpressLRS LLC" + +# Repository — used by content.action.edit / content.action.view +repo_name = "ExpressLRS/ExpressLRS" +repo_url = "https://github.com/ExpressLRS/ExpressLRS/releases/" +edit_uri = "https://github.com/ExpressLRS/Docs/tree/master/docs/" + +extra_css = [ + "assets/stylesheets/main.css", + "assets/stylesheets/colors.css", + "assets/stylesheets/home.css", +] + +extra_javascript = [ + "assets/javascripts/binding-phrase.js", + "https://cdnjs.cloudflare.com/ajax/libs/tablesort/5.2.1/tablesort.min.js", + "https://cdnjs.cloudflare.com/ajax/libs/tablesort/5.2.1/sorts/tablesort.number.min.js", + "assets/javascripts/tablesort.js", + "assets/javascripts/mathjax.js", + "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js", +] + +# --------------------------------------------------------------------------- +# Navigation — ported 1:1 from mkdocs.yml +# --------------------------------------------------------------------------- +nav = [ + { "Home" = "index.md" }, + { "Quick Start" = [ + { "Getting Started" = "quick-start/getting-started.md" }, + { "Installing the Configurator" = "quick-start/installing-configurator.md" }, + { "Firmware Options" = "quick-start/firmware-options.md" }, + { "The Web UI" = "quick-start/webui.md" }, + { "Transmitters" = [ + { "Radio Preparation" = "quick-start/transmitters/tx-prep.md" }, + { "Checking FW Version" = "quick-start/transmitters/firmware-version.md" }, + { "Typical Updating Steps" = "quick-start/transmitters/updating.md" }, + { "Updating Transmitters" = [ + { "Axisflying Thor" = "quick-start/transmitters/axisflying-thor.md" }, + { "BetaFPV 2.4GHz" = "quick-start/transmitters/betafpv2400.md" }, + { "BetaFPV 900MHz" = "quick-start/transmitters/betafpv900.md" }, + { "BetaFPV LR3 Pro" = "quick-start/transmitters/betafpvlr3pro.md" }, + { "EMAX 2.4GHz" = "quick-start/transmitters/emax2400.md" }, + { "EMAX 900MHz" = "quick-start/transmitters/emax900.md" }, + { "Frsky R9 Modules" = "quick-start/transmitters/frsky-r9modules.md" }, + { "Happymodel ES24TX" = "quick-start/transmitters/es24tx.md" }, + { "Happymodel ES900TX" = "quick-start/transmitters/es900tx.md" }, + { "HGLRC Hermes" = "quick-start/transmitters/hglrc-hermes.md" }, + { "iFlight Commando" = "quick-start/transmitters/iflight-commando.md" }, + { "IMRC Ghost" = "quick-start/transmitters/ghost2400.md" }, + { "Internal RadioMaster" = "quick-start/transmitters/rm-internal.md" }, + { "Internal Jumper T-Pro" = "quick-start/transmitters/aion-internal.md" }, + { "Internal Jumper TLite V2" = "quick-start/transmitters/jumper-internal.md" }, + { "Internal Jumper T14/T15" = "quick-start/transmitters/jumper-t14-t15-internal.md" }, + { "Internal Jumper T20" = "quick-start/transmitters/jumper-t20-internal.md" }, + { "Jumper Aion Nano" = "quick-start/transmitters/jumper-aion.md" }, + { "NamimnoRC Flash" = "quick-start/transmitters/flash2400.md" }, + { "NamimnoRC Voyager" = "quick-start/transmitters/voyager900.md" }, + { "Radiomaster Bandit" = "quick-start/transmitters/rm-bandit.md" }, + { "Radiomaster Ranger" = "quick-start/transmitters/rm-ranger.md" }, + { "Siyi FM30" = "quick-start/transmitters/siyifm30.md" }, + { "Vantac Lite" = "quick-start/transmitters/vantac-lite.md" }, + { "DIY 900TX" = "quick-start/transmitters/diy900.md" }, + { "DIY 2400TX" = "quick-start/transmitters/diy2400.md" }, + ] }, + { "The ExpressLRS Lua Script" = "quick-start/transmitters/lua-howto.md" }, + ] }, + { "Receivers" = [ + { "Receiver Wiring" = "quick-start/receivers/wiring-up.md" }, + { "Configuring FC" = "quick-start/receivers/configuring-fc.md" }, + { "Checking FW Version" = "quick-start/receivers/firmware-version.md" }, + { "Typical Updating Steps" = "quick-start/receivers/updating.md" }, + { "Updating Receivers" = [ + { "Axisflying Thor" = "quick-start/receivers/axisflying-thor.md" }, + { "BetaFPV Lite/Nano/AIO 2.4GHz" = "quick-start/receivers/betafpv2400.md" }, + { "BetaFPV Nano 900MHz" = "quick-start/receivers/betafpv900.md" }, + { "BetaFPV SuperD 2.4GHz" = "quick-start/receivers/betafpv-superd.md" }, + { "BetaFPV SuperD 900MHz" = "quick-start/receivers/betafpv-superd900.md" }, + { "Foxeer LNA & Lite 2.4GHz" = "quick-start/receivers/foxeer2400.md" }, + { "Frsky R9" = "quick-start/receivers/r9.md" }, + { "GEPRC Nano & Dual 2.4GHz" = "quick-start/receivers/geprc2400.md" }, + { "GEPRC Nano & Dual 900MHz" = "quick-start/receivers/geprc900.md" }, + { "Happymodel EP" = "quick-start/receivers/hmep2400.md" }, + { "Happymodel PP" = "quick-start/receivers/hmpp2400.md" }, + { "Happymodel ES900RX" = "quick-start/receivers/hmes900.md" }, + { "HGLRC Hermes 2.4GHz" = "quick-start/receivers/hglrc-hermes2400.md" }, + { "HGLRC Hermes 900MHz" = "quick-start/receivers/hglrc-hermes900.md" }, + { "iFlight 2.4GHz" = "quick-start/receivers/iflight2400.md" }, + { "iFlight 900MHz" = "quick-start/receivers/iflight900.md" }, + { "IMRC Ghost" = "quick-start/receivers/ghost2400.md" }, + { "Jumper Aion Nano" = "quick-start/receivers/jumper-aion.md" }, + { "Jumper R9 Mini" = "quick-start/receivers/jumper900.md" }, + { "Matek R24" = "quick-start/receivers/matek2400.md" }, + { "NamimnoRC Flash" = "quick-start/receivers/flash2400.md" }, + { "NamimnoRC Voyager" = "quick-start/receivers/voyager900.md" }, + { "RadioMaster RP" = "quick-start/receivers/radiomaster-rp-2400.md" }, + { "Siyi FR Mini" = "quick-start/receivers/siyiFRmini.md" }, + { "Vantac" = "quick-start/receivers/vantac2400.md" }, + { "DIY 900RX" = "quick-start/receivers/diy900.md" }, + { "DIY 2400RX" = "quick-start/receivers/diy2400.md" }, + ] }, + ] }, + { "Post-Flash" = [ + { "LED Status" = "quick-start/led-status.md" }, + { "Binding ExpressLRS" = "quick-start/binding.md" }, + { "Before First Flight" = "quick-start/pre-1stflight.md" }, + { "Ardupilot Setup" = "quick-start/ardupilot-setup.md" }, + ] }, + { "Troubleshooting" = "quick-start/troubleshooting.md" }, + { "Unbricking" = "quick-start/unbricking.md" }, + ] }, + { "Software" = [ + { "Obsolete Defines" = "software/obsolete-defines.md" }, + { "OpenOCD for STLink" = "software/open-ocd.md" }, + { "PIO STLink Fix" = "software/stlink-fix.md" }, + { "Switch Configs" = "software/switch-config.md" }, + { "Toolchain Setup" = "software/toolchain-install.md" }, + { "User Defines" = "software/user-defines.md" }, + { "Updating" = [ + { "Betaflight Passthrough" = "software/updating/betaflight-passthrough.md" }, + { "Wifi Updating" = "software/updating/wifi-updating.md" }, + ] }, + { "Features" = [ + { "AirPort" = "software/airport.md" }, + { "Dynamic Transmit Power" = "software/dynamic-transmit-power.md" }, + { "Gemini" = "software/gemini.md" }, + { "Loan Model" = "software/loan-model.md" }, + { "MAVLink" = "software/mavlink.md" }, + { "MFD Crossbow Tracker Integration" = "software/mfd-crossbow.md" }, + { "Model Matching" = "software/model-config-match.md" }, + { "Receiver Serial Protocols" = "software/serial-protocols.md" }, + { "Sentinel Tracker Integration" = "software/backpack-telemetry.md" }, + { "Serial VTX" = "software/serialvtx.md" }, + { "Team Racing" = "software/teamracing.md" }, + { "Trainer (Head Tracking) Input" = "software/trainer-input.md" }, + ] }, + { "Testing" = [ + { "CRC Testing" = "software/testing/crc-testing.md" }, + { "RX Testing" = "software/testing/rx-scoreboard.md" }, + { "Unit Testing" = "software/testing/unit-testing.md" }, + ] }, + ] }, + { "Hardware" = [ + { "Hardware Selection" = "hardware/hardware-selection.md" }, + { "R9M Inverter Mod" = "hardware/inverter-mod.md" }, + { "R9M Fan Mod" = "hardware/fan-mod.md" }, + { "Troubleshooting the X9D(+)" = "hardware/x9d-troubleshooting.md" }, + { "Crystal Oscillator (XO) Frequency Error" = "hardware/crystal-frequency-error.md" }, + { "SMD Antenna" = "hardware/smd-antenna.md" }, + { "PWM Receivers" = "hardware/pwm-receivers.md" }, + { "SPI Receivers" = "hardware/spi-receivers.md" }, + { "ESP Backpacks" = [ + { "Backpack Info" = "hardware/backpack/esp-backpack.md" }, + { "Tx Backpack Setup" = "hardware/backpack/backpack-tx-setup.md" }, + { "VRx Backpack Setup" = "hardware/backpack/backpack-vrx-setup.md" }, + { "HDZero Goggle VRx Backpack" = "hardware/backpack/hdzero-goggles.md" }, + ] }, + { "Special Targets" = [ + { "DIY Receiver" = "hardware/special-targets/diy-rx.md" }, + { "DIY Transmitter" = "hardware/special-targets/diy-tx.md" }, + { "Nuclear Targets" = "hardware/special-targets/nuclear-hardware.md" }, + ] }, + ] }, + { "Info" = [ + { "Glossary" = "info/glossary.md" }, + { "Signal Health" = "info/signal-health.md" }, + { "Telemetry Bandwidth" = "info/telem-bandwidth.md" }, + { "Init Rate" = "info/init-rate.md" }, + { "Long Range Competition" = "info/long-range.md" }, + { "Advance Technical Info" = "info/advance-technical-info.md" }, + { "Privacy Policy" = "info/privacy-policy.md" }, + { "Licenses" = "info/licenses.md" }, + { "Terms & Conditions" = "info/terms-and-conditions.md" }, + ] }, + { "FAQ" = "faq.md" }, + { "Blog" = [ + { "Blog" = "blog/index.md" }, + ] }, + { "Partners Program" = "partners-program.md" }, + { "Contact Us" = "contact-us.md" }, +] + +# --------------------------------------------------------------------------- +# Theme +# --------------------------------------------------------------------------- +[project.theme] +# TODO: re-enable `custom_dir = "overrides"` once the partials in +# overrides/ (header, footer, copyright, home.html, blog.html) are ported +# to Zensical's template context. The mkdocs-material variables they +# reference (e.g. config.extra.social, page.meta) don't exist in Zensical +# yet — enabling custom_dir floods the build with template errors. +language = "en" +favicon = "assets/favicon.png" +logo = "assets/images/logotype.svg" + +features = [ + "announce.dismiss", + "navigation.sections", + "navigation.tabs", + "navigation.footer", + "navigation.tracking", + "navigation.indexes", + "search.highlight", + "search.suggest", + "toc.follow", + "content.action.edit", + "content.action.view", +] + +[project.theme.font] +text = "Roboto" +code = "Roboto Mono" + +# Dark mode (default — matches the historical ExpressLRS palette) +[[project.theme.palette]] +media = "(prefers-color-scheme: dark)" +scheme = "slate" +toggle.icon = "lucide/moon" +toggle.name = "Switch to light mode" + +# Light mode +[[project.theme.palette]] +media = "(prefers-color-scheme: light)" +scheme = "default" +toggle.icon = "lucide/sun" +toggle.name = "Switch to dark mode" + +# --------------------------------------------------------------------------- +# Extra +# --------------------------------------------------------------------------- +[[project.extra.social]] +icon = "fontawesome/brands/github" +link = "https://github.com/ExpressLRS/" +name = "See the Github Repo" + +[[project.extra.social]] +icon = "fontawesome/brands/discord" +link = "https://discord.gg/dS6ReFY" +name = "Check out the Discord" + +[[project.extra.social]] +icon = "fontawesome/brands/facebook" +link = "https://www.facebook.com/groups/636441730280366" +name = "Join the Facebook Group" + +[[project.extra.social]] +icon = "fontawesome/brands/twitter" +link = "https://twitter.com/expresslrs" +name = "We're on Twitter too!" + +[[project.extra.social]] +icon = "fontawesome/brands/instagram" +link = "https://instagram.com/expresslrs" +name = "Follow us on Instagram" + +[[project.extra.social]] +icon = "fontawesome/solid/circle-dollar-to-slot" +link = "https://opencollective.com/expresslrs" +name = "Send a Donation!" + +# --------------------------------------------------------------------------- +# TODO — Zensical equivalents not yet wired up. The user accepted feature +# loss during migration; track these as follow-ups: +# +# * blog plugin (mkdocs-material insiders blog/posts/*) +# * tags plugin +# * minify plugin +# * git-revision-date-localized +# * git-committers +# * redirects.yml (mkdocs-redirects redirect_maps — see redirects.yml) +# * Google Analytics + cookie consent banner (project.extra.analytics / .consent) +# * overrides/hooks/blog_posts.py (injects recent posts into homepage) +# * pymdownx markdown extensions — Zensical's markdown_extensions surface is +# not yet documented; verify before re-enabling. Previous list: +# admonition, abbr, attr_list, def_list, footnotes, meta, md_in_html, +# tables, toc(permalink), pymdownx.{arithmatex, betterem, caret, critic, +# details, emoji, highlight, inlinehilite, keys, magiclink, mark, +# smartsymbols, superfences(mermaid), tabbed, tasklist, tilde} +# ---------------------------------------------------------------------------