diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..2851fe1 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,44 @@ +name: Build and deploy + +on: + push: + branches: [main] + pull_request: + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: pages-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: npm + - run: npm ci + - run: npm run build + - uses: actions/upload-pages-artifact@v3 + if: github.ref == 'refs/heads/main' + with: + path: _site + + deploy: + needs: build + if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore index 9f11b75..a176443 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ .idea/ +node_modules/ +_site/ diff --git a/DEVICE_TEMPLATE.md b/DEVICE_TEMPLATE.md index 7c94e7c..142bb6e 100644 --- a/DEVICE_TEMPLATE.md +++ b/DEVICE_TEMPLATE.md @@ -4,6 +4,15 @@ Copy the block below into `docs/devices/-.md` and remove the sect ## Conventions +- The frontmatter block at the top puts the device on the Supported Devices page; there is no separate list to edit. + - `title`: name shown on the page and in the list (the page has no `# heading` of its own) + - `vendor`: groups the device in the list, e.g. `LilyGO` + - `psram`: `true` when the device has external RAM + - `sdcard`: `true` when the SD card works + - `recommended`: `true` for devices recommended by the developer (⭐) + - `community`: `true` when the developer does not own the board + - `incubating`: `true` while support is still being worked on + - `installer` (optional): the device id in the [Web Installer](https://install.tactilityproject.org/), used for the "Install Tactility" button. Leave it out when the id equals the file name. Use a list of `id` / `label` pairs when there are several firmware builds (see `docs/devices/cl32.md`), or `false` to hide the button. - Status legend (also shown on `supported-devices.md`): - ✅ Supported - ⚠️ Partially supported or buggy (explain in Notes) @@ -13,14 +22,22 @@ Copy the block below into `docs/devices/-.md` and remove the sect - Spelling: `LilyGO`, `M5Stack`, `Elecrow`, `Guition`, `Waveshare`, `Seeed Studio`, `Wi-Fi`, `USB Mass Storage`, `SD card`. - Chip names in code formatting: `SX1262`, `ES8311`. - Headings in sentence case: "Known issues", not "Known Issues". -- Warnings use Docsify alerts (`> [!WARNING]`, `> [!NOTE]`), not loose ⚠️ lines. +- Warnings use GitHub-style alerts (`> [!WARNING]`, `> [!NOTE]`), not loose ⚠️ lines. - Link labels: "Product page", "Official documentation", "Store", "GitHub", "Wiki". Add the variant name when there are multiple, e.g. "Store (Keyboard)". - Known issues: one or two sentences on what is affected and what to do about it, then a link to the source. ## Template ```markdown -# +--- +title: " " +vendor: +psram: true +sdcard: true +recommended: false +community: false +incubating: false +--- diff --git a/README.md b/README.md index e966c67..ad94188 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,31 @@ -This projects contains the content for the website at [tactilityproject.org](https://tactilityproject.org). +This project contains the content for the website at [tactilityproject.org](https://tactilityproject.org). -It is built with [Docsify](https://docsify.js.org), which installs as follows: +The pages are markdown files in `docs/`. [Eleventy](https://www.11ty.dev) turns them into static HTML. + +Install the dependencies (Node.js 20 or newer): + +```sh +npm install +``` + +Develop with a local server that reloads on changes: ```sh -npm i docsify-cli -g +npm start ``` -Develop with: +Build the site into `_site/`: ```sh -docsify serve docs +npm run build ``` + +## Where things are + +- `docs/*.md`: the pages. `docs/index.md` is the home page; its hero, screenshots and supporter logos are listed in the frontmatter. +- `docs/devices/*.md`: one page per device. The Supported Devices list is generated from the frontmatter of these files, see [DEVICE_TEMPLATE.md](DEVICE_TEMPLATE.md). +- `docs/_data/`: site name, community links and navigation. +- `docs/_includes/`: page layouts. +- `docs/assets/site.css`: the stylesheet. + +Pushing to `main` builds and publishes the site with GitHub Actions (`.github/workflows/deploy.yml`). diff --git a/docs/.nojekyll b/docs/.nojekyll deleted file mode 100644 index e69de29..0000000 diff --git a/docs/404.md b/docs/404.md new file mode 100644 index 0000000..5f49082 --- /dev/null +++ b/docs/404.md @@ -0,0 +1,7 @@ +--- +title: Page not found +permalink: /404.html +eleventyExcludeFromCollections: true +--- + +This page doesn't exist. Try the [home page](index.md) or the list of [supported devices](supported-devices.md). diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 950f4e2..0000000 --- a/docs/README.md +++ /dev/null @@ -1,55 +0,0 @@ -## Overview - -Tactility is an operating system that focuses on the ESP32 microcontroller family. - - -
-
- - link to matrix community - -
-
- - link to Stoat.chat community - -
-
- -
-Join us on Matrix or Stoat.chat
(or Discord) -
- -
- -
- screenshot of launcher app -   - screenshot off settings app -
-  -
- screenshot of terminal app -   - screenshot of files app -
- -Use one of the [supported devices](supported-devices.md),
-or set up the drivers for your own hardware combination. - -
- -
-Supported by - -[![CLion logo](images/supporter/CLion.svg)](https://jb.gg/OpenSourceSupport) -[![Elecrow logo](images/supporter/Elecrow.webp)](https://www.elecrow.com/) -[![LILYGO logo](images/supporter/LILYGO.webp)](https://lilygo.cc) -[![M5Stack logo](images/supporter/M5Stack.webp)](https://m5stack.com) -[![unphone logo](images/supporter/unPhone.svg)](https://unphone.net) - -
diff --git a/docs/_data/nav.json b/docs/_data/nav.json new file mode 100644 index 0000000..4aeb063 --- /dev/null +++ b/docs/_data/nav.json @@ -0,0 +1,15 @@ +{ + "main": [ + { "label": "Features", "url": "/features/" }, + { "label": "Install", "url": "/installing/" }, + { "label": "Devices", "url": "/devices/" }, + { "label": "FAQ", "url": "/faq/" }, + { "label": "Support", "url": "/support/" }, + { "label": "Docs", "url": "https://docs.tactilityproject.org", "external": true } + ], + "footer": [ + { "label": "Licenses & Copyrights", "url": "/licenses-and-copyrights/" }, + { "label": "Developer documentation", "url": "https://docs.tactilityproject.org" }, + { "label": "GitHub", "url": "https://github.com/TactilityProject" } + ] +} diff --git a/docs/_data/site.json b/docs/_data/site.json new file mode 100644 index 0000000..c04fd6d --- /dev/null +++ b/docs/_data/site.json @@ -0,0 +1,13 @@ +{ + "name": "Tactility", + "tagline": "An operating system for ESP32 devices", + "description": "Tactility is an operating system for the ESP32 microcontroller family, with a launcher, apps, an App Hub and support for more than 50 devices.", + "url": "https://tactilityproject.org", + "repo": "https://github.com/TactilityProject", + "installer": "https://install.tactilityproject.org/", + "community": [ + { "name": "Matrix", "url": "https://matrix.to/#/#tactility:matrix.org", "logo": "/images/matrix-logo.svg" }, + { "name": "Stoat", "url": "https://stt.gg/xwRTZEpX", "logo": "/images/stoat-logo.svg" }, + { "name": "Discord", "url": "https://discord.gg/pXs2xGS6fs" } + ] +} diff --git a/docs/_includes/badges.njk b/docs/_includes/badges.njk new file mode 100644 index 0000000..3e99138 --- /dev/null +++ b/docs/_includes/badges.njk @@ -0,0 +1,4 @@ +{%- if device.psram %}External RAM{% else %}No external RAM{% endif %} +{%- if device.sdcard %}SD card{% else %}No SD card{% endif %} +{%- if device.community %}Community tested{% endif %} +{%- if device.incubating %}Incubating{% endif %} diff --git a/docs/_includes/base.njk b/docs/_includes/base.njk new file mode 100644 index 0000000..9a79ac2 --- /dev/null +++ b/docs/_includes/base.njk @@ -0,0 +1,79 @@ + + + + + + {%- set pageTitle = (title + " | " + site.name) if (title and title != site.name) else (site.name + ": " + site.tagline) %} + {%- set pageDescription = description or site.description %} + {{ pageTitle }} + + + + + + + + + + + + + + + + + + + + +
+ {{ content | safe }} +
+ + + + + diff --git a/docs/_includes/device.njk b/docs/_includes/device.njk new file mode 100644 index 0000000..71c68b7 --- /dev/null +++ b/docs/_includes/device.njk @@ -0,0 +1,20 @@ +--- +layout: base +--- +
+
+ +

{{ title }}{% if recommended %} ⭐{% endif %}

+

+ {%- set device = { recommended: recommended, psram: psram, sdcard: sdcard, community: community, incubating: incubating } %} + {% include "badges.njk" %} +

+

+ {%- for target in installer | installTargets(page.fileSlug) %} + Install Tactility{% if target.label %} ({{ target.label }}){% endif %} + {%- endfor %} +

+ {{ content | safe }} +

What the status markers and badges mean is explained on the supported devices page.

+
+
diff --git a/docs/_includes/devices.njk b/docs/_includes/devices.njk new file mode 100644 index 0000000..47b1f2f --- /dev/null +++ b/docs/_includes/devices.njk @@ -0,0 +1,71 @@ +--- +layout: base +--- +{%- set parts = content.split("") %} +
+
+

{{ title }}

+ {{ parts[0] | safe }} +
+ + + + + {%- for group in collections.device | deviceGroups %} +
+

{{ group.name }} {{ group.devices.length }}

+ {%- if group.note %}

{{ group.note }}

{% endif %} + +
+ {%- endfor %} + +
+ {{ parts[1] | safe }} +
+
+ diff --git a/docs/_includes/home.njk b/docs/_includes/home.njk new file mode 100644 index 0000000..ca2caaa --- /dev/null +++ b/docs/_includes/home.njk @@ -0,0 +1,92 @@ +--- +layout: base +--- +
+
+
+

{{ tagline }}

+

{{ lead }}

+

+ {%- for action in actions %} + {{ action.label }} + {%- endfor %} +

+
+ {%- set shot = screenshots | first %} + {%- set size = shot.src | pngSize %} +
{{ shot.alt }}
+
+
+ +
+
+ {%- for shot in screenshots %}{% if not loop.first %} +
+ {%- set size = shot.src | pngSize %} + {{ shot.alt }} + {%- if shot.caption %}
{{ shot.caption }}
{% endif %} +
+ {%- endif %}{% endfor %} +
+ +
+ + +
+ {%- for item in highlights %} + +

{{ item.title }}

+

{{ item.text }}

+
+ {%- endfor %} +
+ +
+ {{ content | safe }} +
+ +
+

Join the community

+ +
+ +
+

Supported by

+

+ {%- for item in supporters %} + {{ item.name }} + {%- endfor %} +

+
diff --git a/docs/_includes/page.njk b/docs/_includes/page.njk new file mode 100644 index 0000000..b1d2c56 --- /dev/null +++ b/docs/_includes/page.njk @@ -0,0 +1,19 @@ +--- +layout: base +--- +
+
+

{{ title }}

+ {{ content | safe }} +
+ {%- if toc %} + + {%- endif %} +
diff --git a/docs/_sidebar.md b/docs/_sidebar.md deleted file mode 100644 index 12db606..0000000 --- a/docs/_sidebar.md +++ /dev/null @@ -1,13 +0,0 @@ -![](images/menu-logo.png "Tactility Logo") - -- Main - - [Home](/) - - [Features](features.md) - - [Installing](installing.md) - - [Support](support.md) - - [Supported Devices](supported-devices.md) - - [FAQ](faq.md) -- Development - - [docs.tactilityproject.org](https://docs.tactilityproject.org) -- About - - [Licenses & Copyrights](licenses-and-copyrights.md) diff --git a/docs/assets/site.css b/docs/assets/site.css new file mode 100644 index 0000000..4f5b51d --- /dev/null +++ b/docs/assets/site.css @@ -0,0 +1,314 @@ +@font-face { + font-family: "Inter"; + src: url("/assets/fonts/inter.woff2") format("woff2"); + font-weight: 100 900; + font-display: swap; +} +@font-face { + font-family: "JetBrains Mono"; + src: url("/assets/fonts/jetbrains-mono.woff2") format("woff2"); + font-weight: 100 800; + font-display: swap; +} + +:root { + --bg: #16171d; + --surface: #1e1f28; + --surface-2: #272934; + --border: #33353f; + --text: #cfd3da; + --muted: #9298a5; + --heading: #ffffff; + --blue: #33bbff; + --pink: #ee81c3; + --green: #5fd38d; + --orange: #f0a35e; + --red: #f0707a; + --radius: 10px; + --wrap: 1120px; + --font: "Inter", system-ui, -apple-system, "Segoe UI", sans-serif; + --mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace; + color-scheme: dark; +} + +*, *::before, *::after { box-sizing: border-box; } + +html { + scroll-behavior: smooth; + scroll-padding-top: 5rem; + -webkit-text-size-adjust: 100%; +} + +body { + margin: 0; + min-height: 100vh; + display: flex; + flex-direction: column; + background: var(--bg); + color: var(--text); + font: 400 1rem/1.65 var(--font); + -webkit-font-smoothing: antialiased; +} + +main { flex: 1; } +img { max-width: 100%; height: auto; } +a { color: var(--blue); text-decoration: none; } +a:hover { color: var(--pink); } +:focus-visible { outline: 2px solid var(--blue); outline-offset: 2px; border-radius: 4px; } +[hidden] { display: none !important; } + +h1, h2, h3, h4 { color: var(--heading); line-height: 1.2; letter-spacing: -0.015em; } +h1 { font-size: clamp(2rem, 1.5rem + 2vw, 2.75rem); font-weight: 700; margin: 0 0 1.25rem; } + +.wrap { width: 100%; max-width: var(--wrap); margin-inline: auto; padding-inline: 1.25rem; } + +.skip { position: absolute; left: -999px; top: 0; padding: 0.5rem 1rem; background: var(--blue); color: #000; z-index: 20; } +.skip:focus { left: 0; } + +/* Header */ + +.site-header { + position: sticky; + top: 0; + z-index: 10; + background: color-mix(in srgb, var(--bg) 85%, transparent); + backdrop-filter: blur(12px); + border-bottom: 1px solid var(--border); +} +.site-header .wrap { display: flex; align-items: center; flex-wrap: wrap; gap: 0.25rem 1.5rem; min-height: 3.75rem; } +.brand { display: inline-flex; align-items: center; gap: 0.6rem; margin-right: auto; color: var(--heading); font: 700 1.15rem var(--mono); } +.brand:hover { color: var(--heading); } +.site-header nav { display: flex; align-items: center; flex-wrap: wrap; gap: 0.15rem; } +.site-header nav a { padding: 0.4rem 0.7rem; border-radius: 6px; color: var(--text); font-size: 0.95rem; font-weight: 500; } +.site-header nav a:hover { color: var(--heading); background: var(--surface-2); } +.site-header nav a[aria-current] { color: var(--blue); } +.site-header nav .nav-repo { margin-left: 0.5rem; border: 1px solid var(--border); } +.nav-toggle { display: none; padding: 0.4rem 0.8rem; border: 1px solid var(--border); border-radius: 6px; background: none; color: var(--text); font: inherit; font-size: 0.9rem; cursor: pointer; } + +@media (max-width: 760px) { + .nav-toggle { display: block; } + .site-header nav.is-collapsible { display: none; } + .site-header nav.is-collapsible.is-open { display: flex; flex-direction: column; align-items: stretch; width: 100%; padding-bottom: 0.75rem; } + .site-header nav .nav-repo { margin-left: 0; } +} + +/* Footer */ + +.site-footer { margin-top: 5rem; border-top: 1px solid var(--border); font-size: 0.9rem; } +.site-footer .wrap { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 0.5rem 2rem; padding-block: 1.75rem; } +.site-footer ul { display: flex; flex-wrap: wrap; gap: 0.25rem 1.5rem; margin: 0; padding: 0; list-style: none; } +.site-footer a { color: var(--muted); } +.site-footer a:hover { color: var(--heading); } + +/* Buttons, badges, cards */ + +.btn { + display: inline-block; + padding: 0.7rem 1.3rem; + border: 1px solid var(--border); + border-radius: 8px; + background: var(--surface); + color: var(--heading); + font-weight: 600; + transition: border-color 0.15s, background 0.15s; +} +.btn:hover { border-color: var(--pink); color: var(--heading); } +.btn-primary { background: var(--blue); border-color: var(--blue); color: #06141c; } +.btn-primary:hover { background: #6acdff; border-color: #6acdff; color: #06141c; } + +.badges { display: flex; flex-wrap: wrap; gap: 0.35rem; margin: 0; } +.badge { + display: inline-block; + padding: 0.1rem 0.5rem; + border: 1px solid var(--border); + border-radius: 999px; + color: var(--muted); + font: 500 0.72rem/1.6 var(--mono); + white-space: nowrap; +} +.badge-yes { color: var(--green); border-color: color-mix(in srgb, var(--green) 35%, transparent); } +.badge-warn { color: var(--orange); border-color: color-mix(in srgb, var(--orange) 35%, transparent); } +.badge-no { color: var(--red); border-color: color-mix(in srgb, var(--red) 35%, transparent); } +.star { + display: inline-block; + margin-left: 0.25rem; + padding: 0.1rem 0.45rem; + border: 1px solid color-mix(in srgb, var(--pink) 60%, transparent); + border-radius: 999px; + font-size: 0.72rem; + line-height: 1.6; + letter-spacing: 0; + vertical-align: middle; + cursor: help; +} +h1 .star { font-size: 0.9rem; padding-inline: 0.6rem; } + +/* Home */ + +.hero { + padding-block: clamp(3rem, 8vw, 6rem); + background: + radial-gradient(40rem 22rem at 85% 30%, color-mix(in srgb, var(--pink) 14%, transparent), transparent 70%), + radial-gradient(40rem 22rem at 60% 80%, color-mix(in srgb, var(--blue) 14%, transparent), transparent 70%); + border-bottom: 1px solid var(--border); +} +.hero .wrap { max-width: 1260px; display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 3rem; } +.hero h1 { font-size: clamp(2.25rem, 1.4rem + 3vw, 3.1rem); letter-spacing: -0.03em; text-wrap: balance; } +.lead { max-width: 34rem; margin: 0 0 2rem; font-size: 1.15rem; color: var(--text); } +.actions { display: flex; flex-wrap: wrap; gap: 0.75rem; margin: 0; } + +/* Small screenshots (class "pixel") are pixel art: only scaled by whole numbers */ +.bezel { + margin: 0; + padding: 10px; + border: 1px solid var(--border); + border-radius: 16px; + background: #0b0c10; + box-shadow: 0 20px 50px -20px #000; +} +.bezel img { display: block; width: 320px; max-width: none; height: auto; border-radius: 6px; } +.bezel img.pixel { image-rendering: pixelated; } +.bezel figcaption { padding-top: 8px; color: var(--muted); font: 500 0.8rem var(--mono); text-align: center; } +@media (min-width: 1280px) { + .hero-shot img { width: 640px; } +} +@media (max-width: 760px) { + .hero .wrap { grid-template-columns: 1fr; justify-items: start; gap: 2.5rem; } + .hero-shot { justify-self: center; } +} +@media (max-width: 380px) { + .bezel { padding: 6px; } + .hero-shot img { width: 100%; max-width: 320px; image-rendering: auto; } +} + +.shots { margin-top: 4rem; } +.shots-track { + display: flex; + justify-content: safe center; + gap: 1.5rem; + padding-bottom: 1rem; + overflow-x: auto; + scroll-snap-type: x proximity; + scrollbar-width: thin; + scrollbar-color: var(--border) transparent; +} +.shots-track .bezel { flex: none; scroll-snap-align: start; box-shadow: none; } +.shots-track .bezel img { width: auto; height: 240px; } +.shots-track figcaption { max-width: 0; min-width: 100%; } +.shots-nav { display: flex; justify-content: center; gap: 0.5rem; margin: 0.75rem 0 0; } +.shots-nav button { width: 2.5rem; height: 2.5rem; border: 1px solid var(--border); border-radius: 999px; background: var(--surface); color: var(--heading); font: inherit; cursor: pointer; } +.shots-nav button:hover:not(:disabled) { border-color: var(--blue); } +.shots-nav button:disabled { opacity: 0.35; cursor: default; } + +.highlights { display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 1rem; margin-top: 4rem; } +.card { + display: block; + padding: 1.4rem; + border: 1px solid var(--border); + border-radius: var(--radius); + background: var(--surface); + color: var(--text); + transition: border-color 0.15s, transform 0.15s; +} +.card:hover { border-color: var(--blue); color: var(--text); transform: translateY(-2px); } +.card h2 { margin: 0 0 0.5rem; font-size: 1.1rem; } +.card p { margin: 0; font-size: 0.95rem; color: var(--muted); } + +.home-body { margin-top: 3.5rem; text-align: center; font-size: 1.1rem; } +.home-body.prose { max-width: var(--wrap); } + +.community, .supporters { margin-top: 4rem; text-align: center; } +.community h2, .supporters h2 { margin: 0 0 1.5rem; color: var(--muted); font: 500 0.8rem var(--mono); letter-spacing: 0.12em; text-transform: uppercase; } +.community-links, .supporters p { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 1.5rem 3rem; margin: 0; } +.community-links a { display: inline-flex; align-items: center; color: var(--heading); font-weight: 600; font-size: 1.2rem; opacity: 0.85; } +.community-links img { height: 36px; width: auto; } +.supporters img { height: 44px; width: auto; } +.community-links a:hover, .supporters a:hover { opacity: 1; } +.supporters a { opacity: 0.8; transition: opacity 0.15s; } + +/* Pages */ + +.page { padding-top: clamp(2rem, 5vw, 3.5rem); } +.page.has-toc { display: grid; grid-template-columns: minmax(0, 46rem) 14rem; justify-content: space-between; gap: 3rem; } +.page-wide .prose { max-width: 46rem; } +.prose { max-width: 46rem; } + +.toc { position: sticky; top: 5.5rem; align-self: start; max-height: calc(100vh - 7rem); overflow: auto; font-size: 0.9rem; } +.toc p { margin: 0 0 0.6rem; color: var(--muted); font: 500 0.75rem var(--mono); letter-spacing: 0.1em; text-transform: uppercase; } +.toc ul { margin: 0; padding: 0; list-style: none; border-left: 1px solid var(--border); } +.toc a { display: block; padding: 0.25rem 0 0.25rem 1rem; color: var(--muted); } +.toc a:hover { color: var(--heading); } +@media (max-width: 1000px) { + .page.has-toc { display: block; } + .toc { display: none; } +} + +.breadcrumb { margin: 0 0 0.75rem; color: var(--muted); font-size: 0.9rem; } +.prose > .badges { margin: -0.5rem 0 1.5rem; } +.device-install { margin: 0 0 2rem; } +.device-install:empty { display: none; } +.device-install .btn { text-decoration: none; } +.page-note { margin-top: 3rem; padding-top: 1rem; border-top: 1px solid var(--border); color: var(--muted); font-size: 0.9rem; } + +.prose h2 { margin: 2.75rem 0 0.9rem; font-size: 1.6rem; } +.prose h3 { margin: 2rem 0 0.6rem; font-size: 1.2rem; } +.prose h4 { margin: 1.5rem 0 0.5rem; font-size: 1rem; } +.prose :is(h2, h3, h4) a { color: inherit; } +.prose :is(h2, h3, h4) a:hover::after { content: " #"; color: var(--muted); } +.prose p, .prose ul, .prose ol { margin: 0 0 1.1rem; } +.prose ul, .prose ol { padding-left: 1.4rem; } +.prose li { margin: 0.3rem 0; } +.prose li::marker { color: var(--muted); } +.prose strong { color: var(--heading); font-weight: 600; } +.prose p a, .prose li a, .prose td a { text-decoration: underline; text-decoration-color: color-mix(in srgb, currentColor 40%, transparent); text-underline-offset: 3px; } +.prose hr { border: 0; border-top: 1px solid var(--border); margin: 2.5rem 0; } +.prose blockquote { margin: 1.5rem 0; padding-left: 1rem; border-left: 3px solid var(--border); color: var(--muted); } + +.prose code { padding: 0.15em 0.4em; border-radius: 5px; background: var(--surface-2); color: var(--heading); font: 0.875em var(--mono); } +.prose pre { margin: 1.25rem 0; padding: 1rem 1.2rem; overflow-x: auto; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); font: 0.875rem/1.6 var(--mono); } +.prose pre code { padding: 0; background: none; color: var(--text); font: inherit; } +.token.comment { color: var(--muted); } +.token.string, .token.attr-value { color: var(--green); } +.token.function, .token.builtin, .token.keyword { color: var(--blue); } +.token.variable, .token.parameter, .token.number, .token.boolean { color: var(--pink); } +.token.operator, .token.punctuation { color: var(--muted); } + +.prose table { display: block; width: max-content; max-width: 100%; margin: 1.25rem 0; overflow-x: auto; border-collapse: collapse; font-size: 0.95rem; } +.prose th, .prose td { padding: 0.5rem 0.9rem; border-bottom: 1px solid var(--border); text-align: left; vertical-align: top; } +.prose th { color: var(--muted); font: 500 0.75rem var(--mono); letter-spacing: 0.08em; text-transform: uppercase; white-space: nowrap; } +.prose tr:last-child td { border-bottom: 0; } + +.markdown-alert { margin: 1.5rem 0; padding: 0.9rem 1.1rem; border: 1px solid color-mix(in srgb, var(--alert) 40%, transparent); border-left-width: 3px; border-left-color: var(--alert); border-radius: var(--radius); background: color-mix(in srgb, var(--alert) 8%, transparent); --alert: var(--blue); } +.markdown-alert > :last-child { margin-bottom: 0; } +.markdown-alert-title { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.35rem !important; color: var(--alert); font-weight: 600; } +.markdown-alert-title svg { fill: currentColor; flex: none; } +.markdown-alert-warning, .markdown-alert-caution { --alert: var(--orange); } +.markdown-alert-tip { --alert: var(--green); } +.markdown-alert-important { --alert: var(--pink); } + +/* Device directory */ + +.device-filter { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; margin: 2rem 0 0; } +.device-filter input[type="search"] { flex: 1 1 16rem; max-width: 24rem; padding: 0.6rem 0.9rem; border: 1px solid var(--border); border-radius: 8px; background: var(--surface); color: var(--heading); font: inherit; } +.device-filter input[type="search"]::placeholder { color: var(--muted); } +.chip { display: inline-flex; align-items: center; padding: 0.5rem 0.9rem; border: 1px solid var(--border); border-radius: 999px; color: var(--text); font-size: 0.9rem; cursor: pointer; user-select: none; } +.chip input { position: absolute; opacity: 0; pointer-events: none; } +.chip:hover { border-color: var(--muted); } +.chip:has(input:checked) { border-color: var(--blue); background: color-mix(in srgb, var(--blue) 15%, transparent); color: var(--heading); } +.chip:has(input:focus-visible) { outline: 2px solid var(--blue); outline-offset: 2px; } +.device-empty { margin: 2rem 0; color: var(--muted); } + +.device-group h2 { display: flex; align-items: baseline; gap: 0.6rem; margin: 2.5rem 0 1rem; font-size: 1.3rem; } +.count { color: var(--muted); font: 500 0.8rem var(--mono); } +.group-note { margin: -0.5rem 0 1rem; color: var(--muted); font-size: 0.95rem; } +.device-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 0.75rem; margin: 0; padding: 0; list-style: none; } +.device-card { position: relative; display: flex; flex-direction: column; gap: 0.7rem; padding: 1rem 1.1rem; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); transition: border-color 0.15s; } +.device-card:hover { border-color: var(--blue); } +.device-card > a { color: var(--heading); font-weight: 600; line-height: 1.3; } +.device-card > a::after { content: ""; position: absolute; inset: 0; border-radius: var(--radius); } +.device-card .badges { margin-top: auto; } + +@media (prefers-reduced-motion: reduce) { + html { scroll-behavior: auto; } + * { transition: none !important; } +} diff --git a/docs/devices/btt-panda-touch.md b/docs/devices/btt-panda-touch.md index f8df405..a68af39 100644 --- a/docs/devices/btt-panda-touch.md +++ b/docs/devices/btt-panda-touch.md @@ -1,4 +1,12 @@ -# BigTreeTech Panda Touch / K Touch +--- +title: "BigTreeTech Panda Touch & K Touch" +vendor: BigTreeTech +psram: true +sdcard: false +recommended: false +community: true +incubating: false +--- ## Feature support diff --git a/docs/devices/cl32.md b/docs/devices/cl32.md index a4a599e..56701c7 100644 --- a/docs/devices/cl32.md +++ b/docs/devices/cl32.md @@ -1,4 +1,17 @@ -# CL-32 +--- +title: "CL-32" +vendor: CL-32 +psram: true +sdcard: true +recommended: true +community: false +incubating: false +installer: + - id: cl32-v02-v03 + label: v0.2 and v0.3 + - id: cl32-v04 + label: v0.4 +--- ## Hardware variants diff --git a/docs/devices/cyd-2432s022c.md b/docs/devices/cyd-2432s022c.md index 6e1792e..cf2e4dc 100644 --- a/docs/devices/cyd-2432s022c.md +++ b/docs/devices/cyd-2432s022c.md @@ -1,4 +1,12 @@ -# CYD 2432S022C +--- +title: "CYD 2432S022C" +vendor: CYD +psram: false +sdcard: true +recommended: false +community: false +incubating: false +--- A CYD ("Cheap Yellow Display") board. diff --git a/docs/devices/cyd-2432s024c.md b/docs/devices/cyd-2432s024c.md index d3071d6..2e4841f 100644 --- a/docs/devices/cyd-2432s024c.md +++ b/docs/devices/cyd-2432s024c.md @@ -1,4 +1,12 @@ -# CYD 2432S024C +--- +title: "CYD 2432S024C" +vendor: CYD +psram: false +sdcard: true +recommended: false +community: false +incubating: false +--- A CYD ("Cheap Yellow Display") board. diff --git a/docs/devices/cyd-2432s024r.md b/docs/devices/cyd-2432s024r.md index 44674dd..827a3ff 100644 --- a/docs/devices/cyd-2432s024r.md +++ b/docs/devices/cyd-2432s024r.md @@ -1,4 +1,12 @@ -# CYD 2432S024R +--- +title: "CYD 2432S024R" +vendor: CYD +psram: false +sdcard: true +recommended: false +community: false +incubating: false +--- A CYD ("Cheap Yellow Display") board. diff --git a/docs/devices/cyd-2432s028r.md b/docs/devices/cyd-2432s028r.md index b9d357c..ee88d8a 100644 --- a/docs/devices/cyd-2432s028r.md +++ b/docs/devices/cyd-2432s028r.md @@ -1,4 +1,12 @@ -# CYD 2432S028R +--- +title: "CYD 2432S028R" +vendor: CYD +psram: false +sdcard: true +recommended: false +community: false +incubating: false +--- A CYD ("Cheap Yellow Display") board. diff --git a/docs/devices/cyd-2432s028rv3.md b/docs/devices/cyd-2432s028rv3.md index e94fc98..fe2d34d 100644 --- a/docs/devices/cyd-2432s028rv3.md +++ b/docs/devices/cyd-2432s028rv3.md @@ -1,4 +1,12 @@ -# CYD 2432S028R v3 +--- +title: "CYD 2432S028R v3" +vendor: CYD +psram: false +sdcard: true +recommended: false +community: false +incubating: false +--- A CYD ("Cheap Yellow Display") board. diff --git a/docs/devices/cyd-2432s032c.md b/docs/devices/cyd-2432s032c.md index dcdf263..51e7691 100644 --- a/docs/devices/cyd-2432s032c.md +++ b/docs/devices/cyd-2432s032c.md @@ -1,4 +1,12 @@ -# CYD 2432S032C +--- +title: "CYD 2432S032C" +vendor: CYD +psram: false +sdcard: true +recommended: true +community: false +incubating: false +--- A CYD ("Cheap Yellow Display") board. diff --git a/docs/devices/cyd-3248s035c.md b/docs/devices/cyd-3248s035c.md index d834ca6..54a05eb 100644 --- a/docs/devices/cyd-3248s035c.md +++ b/docs/devices/cyd-3248s035c.md @@ -1,4 +1,12 @@ -# CYD 3248S035C +--- +title: "CYD 3248S035C" +vendor: CYD +psram: false +sdcard: true +recommended: false +community: true +incubating: false +--- A CYD ("Cheap Yellow Display") board. diff --git a/docs/devices/cyd-4827s043c.md b/docs/devices/cyd-4827s043c.md index 6196ccc..b9c1853 100644 --- a/docs/devices/cyd-4827s043c.md +++ b/docs/devices/cyd-4827s043c.md @@ -1,4 +1,12 @@ -# CYD 4827S043C +--- +title: "CYD 4827S043C" +vendor: CYD +psram: true +sdcard: true +recommended: false +community: true +incubating: false +--- A CYD ("Cheap Yellow Display") board. diff --git a/docs/devices/cyd-4848s040c.md b/docs/devices/cyd-4848s040c.md index fff35ce..608320c 100644 --- a/docs/devices/cyd-4848s040c.md +++ b/docs/devices/cyd-4848s040c.md @@ -1,4 +1,12 @@ -# CYD 4848S040C (Guition) +--- +title: "CYD 4848S040C" +vendor: CYD +psram: true +sdcard: true +recommended: false +community: false +incubating: false +--- ## Feature support diff --git a/docs/devices/cyd-8048s043c.md b/docs/devices/cyd-8048s043c.md index 1b9451d..bfb7fab 100644 --- a/docs/devices/cyd-8048s043c.md +++ b/docs/devices/cyd-8048s043c.md @@ -1,4 +1,12 @@ -# CYD 8048S043C +--- +title: "CYD 8048S043C" +vendor: CYD +psram: true +sdcard: true +recommended: false +community: true +incubating: false +--- A CYD ("Cheap Yellow Display") board. diff --git a/docs/devices/cyd-e32r28t.md b/docs/devices/cyd-e32r28t.md index d4fc780..45af3c6 100644 --- a/docs/devices/cyd-e32r28t.md +++ b/docs/devices/cyd-e32r28t.md @@ -1,4 +1,12 @@ -# CYD E32R28T +--- +title: "CYD E32R28T" +vendor: CYD +psram: false +sdcard: true +recommended: false +community: true +incubating: false +--- A CYD ("Cheap Yellow Display") board. diff --git a/docs/devices/cyd-e32r32p.md b/docs/devices/cyd-e32r32p.md index 6470f2a..95093de 100644 --- a/docs/devices/cyd-e32r32p.md +++ b/docs/devices/cyd-e32r32p.md @@ -1,4 +1,12 @@ -# CYD E32R32P +--- +title: "CYD E32R32P" +vendor: CYD +psram: false +sdcard: true +recommended: false +community: true +incubating: false +--- A CYD ("Cheap Yellow Display") board. diff --git a/docs/devices/cyd-es3c28p.md b/docs/devices/cyd-es3c28p.md index 7c7f7d5..7ecd490 100644 --- a/docs/devices/cyd-es3c28p.md +++ b/docs/devices/cyd-es3c28p.md @@ -1,4 +1,13 @@ -# CYD ES3C28P +--- +title: "CYD ES3C28P" +vendor: CYD +psram: true +sdcard: true +recommended: false +community: true +incubating: false +installer: es3c28p +--- A CYD ("Cheap Yellow Display") board. diff --git a/docs/devices/devices.11tydata.js b/docs/devices/devices.11tydata.js new file mode 100644 index 0000000..5d1977f --- /dev/null +++ b/docs/devices/devices.11tydata.js @@ -0,0 +1,9 @@ +// Applies to every device page in this folder +export default { + layout: "device", + tags: "device", + eleventyComputed: { + description: (data) => + data.description || `Tactility on the ${data.title}: supported features, known issues and links.`, + }, +}; diff --git a/docs/devices/elecrow-crowpanel-advance-28.md b/docs/devices/elecrow-crowpanel-advance-28.md index 6ffa022..cde34ec 100644 --- a/docs/devices/elecrow-crowpanel-advance-28.md +++ b/docs/devices/elecrow-crowpanel-advance-28.md @@ -1,4 +1,12 @@ -# Elecrow CrowPanel Advance 2.8" +--- +title: "Elecrow CrowPanel Advance 2.8\"" +vendor: Elecrow +psram: true +sdcard: true +recommended: true +community: false +incubating: false +--- ## Feature support diff --git a/docs/devices/elecrow-crowpanel-advance-35.md b/docs/devices/elecrow-crowpanel-advance-35.md index f0b0b7c..c5d4895 100644 --- a/docs/devices/elecrow-crowpanel-advance-35.md +++ b/docs/devices/elecrow-crowpanel-advance-35.md @@ -1,4 +1,12 @@ -# Elecrow CrowPanel Advance 3.5" +--- +title: "Elecrow CrowPanel Advance 3.5\"" +vendor: Elecrow +psram: true +sdcard: true +recommended: true +community: false +incubating: false +--- > [!NOTE] > Rendering is slower than on most devices because of hardware and software limitations. A full screen refresh takes a bit less than half a second. Updates to smaller areas of the screen are much faster. diff --git a/docs/devices/elecrow-crowpanel-advance-50.md b/docs/devices/elecrow-crowpanel-advance-50.md index cd2a741..188408a 100644 --- a/docs/devices/elecrow-crowpanel-advance-50.md +++ b/docs/devices/elecrow-crowpanel-advance-50.md @@ -1,4 +1,12 @@ -# Elecrow CrowPanel Advance 5.0" +--- +title: "Elecrow CrowPanel Advance 5.0\"" +vendor: Elecrow +psram: true +sdcard: true +recommended: true +community: false +incubating: false +--- > [!WARNING] > The device does not power on with a USB-C to USB-C cable. Use a USB-C to USB-A cable instead. diff --git a/docs/devices/elecrow-crowpanel-basic-28.md b/docs/devices/elecrow-crowpanel-basic-28.md index c2e24de..44f2cdf 100644 --- a/docs/devices/elecrow-crowpanel-basic-28.md +++ b/docs/devices/elecrow-crowpanel-basic-28.md @@ -1,4 +1,12 @@ -# Elecrow CrowPanel Basic 2.8" +--- +title: "Elecrow CrowPanel Basic 2.8\"" +vendor: Elecrow +psram: false +sdcard: true +recommended: false +community: false +incubating: false +--- ## Feature support diff --git a/docs/devices/elecrow-crowpanel-basic-35.md b/docs/devices/elecrow-crowpanel-basic-35.md index 014cb72..ee477a4 100644 --- a/docs/devices/elecrow-crowpanel-basic-35.md +++ b/docs/devices/elecrow-crowpanel-basic-35.md @@ -1,4 +1,12 @@ -# Elecrow CrowPanel Basic 3.5" +--- +title: "Elecrow CrowPanel Basic 3.5\"" +vendor: Elecrow +psram: false +sdcard: true +recommended: false +community: false +incubating: false +--- > [!WARNING] > Only hardware revision v2.2 is supported. diff --git a/docs/devices/elecrow-crowpanel-basic-50.md b/docs/devices/elecrow-crowpanel-basic-50.md index 2e7d45b..9ca0ee7 100644 --- a/docs/devices/elecrow-crowpanel-basic-50.md +++ b/docs/devices/elecrow-crowpanel-basic-50.md @@ -1,4 +1,12 @@ -# Elecrow CrowPanel Basic 5.0" +--- +title: "Elecrow CrowPanel Basic 5.0\"" +vendor: Elecrow +psram: true +sdcard: true +recommended: true +community: false +incubating: false +--- ## Feature support diff --git a/docs/devices/espressif-esp-mosaico.md b/docs/devices/espressif-esp-mosaico.md index 0182a60..094a222 100644 --- a/docs/devices/espressif-esp-mosaico.md +++ b/docs/devices/espressif-esp-mosaico.md @@ -1,4 +1,12 @@ -# Espressif ESP-Mosaico +--- +title: "Espressif ESP-Mosaico" +vendor: Espressif +psram: true +sdcard: true +recommended: true +community: false +incubating: true +--- A compact ESP32-S31 board with a 2.16" 480x480 AMOLED display and 128 MB of SPI NAND that serves as the user-data volume. diff --git a/docs/devices/guition-jc1060p470ciwy.md b/docs/devices/guition-jc1060p470ciwy.md index 0bd7711..04d4730 100644 --- a/docs/devices/guition-jc1060p470ciwy.md +++ b/docs/devices/guition-jc1060p470ciwy.md @@ -1,4 +1,12 @@ -# Guition JC1060P470C-I-W-Y +--- +title: "Guition JC1060P470C-I-W-Y" +vendor: Guition +psram: true +sdcard: true +recommended: false +community: false +incubating: false +--- ## Feature support diff --git a/docs/devices/guition-jc2432w328c.md b/docs/devices/guition-jc2432w328c.md index 05f4ae7..319740f 100644 --- a/docs/devices/guition-jc2432w328c.md +++ b/docs/devices/guition-jc2432w328c.md @@ -1,4 +1,12 @@ -# Guition JC2432W328C +--- +title: "Guition JC2432W328C" +vendor: Guition +psram: false +sdcard: true +recommended: false +community: true +incubating: false +--- > [!WARNING] > The device does not power on with a USB-C to USB-C cable. Use a USB-C to USB-A cable instead. diff --git a/docs/devices/guition-jc8048w550c.md b/docs/devices/guition-jc8048w550c.md index e512842..9cb13c5 100644 --- a/docs/devices/guition-jc8048w550c.md +++ b/docs/devices/guition-jc8048w550c.md @@ -1,4 +1,12 @@ -# Guition JC8048W550C +--- +title: "Guition JC8048W550C" +vendor: Guition +psram: true +sdcard: true +recommended: false +community: false +incubating: false +--- > [!WARNING] > The device does not power on with a USB-C to USB-C cable. Use a USB-C to USB-A cable instead. diff --git a/docs/devices/heltec-wifi-lora-32-v3.md b/docs/devices/heltec-wifi-lora-32-v3.md index 0b17270..846bbf0 100644 --- a/docs/devices/heltec-wifi-lora-32-v3.md +++ b/docs/devices/heltec-wifi-lora-32-v3.md @@ -1,4 +1,12 @@ -# Heltec WiFi LoRa 32 v3 +--- +title: "Heltec WiFi LoRa 32 v3" +vendor: Heltec +psram: false +sdcard: false +recommended: false +community: false +incubating: true +--- > [!NOTE] > Support for this device is incubating. diff --git a/docs/devices/lilygo-t5-47.md b/docs/devices/lilygo-t5-47.md index 103196d..70fc609 100644 --- a/docs/devices/lilygo-t5-47.md +++ b/docs/devices/lilygo-t5-47.md @@ -1,4 +1,13 @@ -# LilyGO T5 4.7 Inch E-Paper S3 +--- +title: "LilyGO T5 4.7 Inch E-Paper S3" +vendor: LilyGO +psram: true +sdcard: true +recommended: false +community: true +incubating: true +installer: lilygo-t5-epd47-s3 +--- > [!WARNING] > Only the V2 variant of the hardware is supported. diff --git a/docs/devices/lilygo-tdeck-max.md b/docs/devices/lilygo-tdeck-max.md index fe453f7..2e054d8 100644 --- a/docs/devices/lilygo-tdeck-max.md +++ b/docs/devices/lilygo-tdeck-max.md @@ -1,4 +1,12 @@ -# LilyGO T-Deck Max +--- +title: "LilyGO T-Deck Max" +vendor: LilyGO +psram: true +sdcard: true +recommended: false +community: true +incubating: false +--- ## Feature support diff --git a/docs/devices/lilygo-tdeck-plus.md b/docs/devices/lilygo-tdeck-plus.md index 7b2d48f..da88ed6 100644 --- a/docs/devices/lilygo-tdeck-plus.md +++ b/docs/devices/lilygo-tdeck-plus.md @@ -1,4 +1,12 @@ -# LilyGO T-Deck Plus +--- +title: "LilyGO T-Deck Plus" +vendor: LilyGO +psram: true +sdcard: true +recommended: true +community: false +incubating: false +--- ## Feature support diff --git a/docs/devices/lilygo-tdeck-pro.md b/docs/devices/lilygo-tdeck-pro.md index 93e09ad..22f8b0b 100644 --- a/docs/devices/lilygo-tdeck-pro.md +++ b/docs/devices/lilygo-tdeck-pro.md @@ -1,4 +1,12 @@ -# LilyGO T-Deck Pro +--- +title: "LilyGO T-Deck Pro" +vendor: LilyGO +psram: true +sdcard: true +recommended: false +community: false +incubating: false +--- > [!WARNING] > Only hardware revision 1.0 is supported, not 1.1. diff --git a/docs/devices/lilygo-tdeck.md b/docs/devices/lilygo-tdeck.md index 3fd6e76..d90589f 100644 --- a/docs/devices/lilygo-tdeck.md +++ b/docs/devices/lilygo-tdeck.md @@ -1,4 +1,12 @@ -# LilyGO T-Deck +--- +title: "LilyGO T-Deck" +vendor: LilyGO +psram: true +sdcard: true +recommended: false +community: false +incubating: false +--- ## Feature support diff --git a/docs/devices/lilygo-tdisplay-s3.md b/docs/devices/lilygo-tdisplay-s3.md index e3a0121..94ebd7c 100644 --- a/docs/devices/lilygo-tdisplay-s3.md +++ b/docs/devices/lilygo-tdisplay-s3.md @@ -1,4 +1,12 @@ -# LilyGO T-Display S3 +--- +title: "LilyGO T-Display S3" +vendor: LilyGO +psram: true +sdcard: false +recommended: false +community: true +incubating: false +--- ## Feature support diff --git a/docs/devices/lilygo-tdisplay.md b/docs/devices/lilygo-tdisplay.md index 9b2924f..0969928 100644 --- a/docs/devices/lilygo-tdisplay.md +++ b/docs/devices/lilygo-tdisplay.md @@ -1,4 +1,12 @@ -# LilyGO T-Display +--- +title: "LilyGO T-Display" +vendor: LilyGO +psram: false +sdcard: false +recommended: false +community: true +incubating: false +--- A small board with 2 buttons, a screen and lots of free pins. diff --git a/docs/devices/lilygo-tdongle-s3.md b/docs/devices/lilygo-tdongle-s3.md index 73f84b3..e4fa1cc 100644 --- a/docs/devices/lilygo-tdongle-s3.md +++ b/docs/devices/lilygo-tdongle-s3.md @@ -1,4 +1,12 @@ -# LilyGO T-Dongle S3 +--- +title: "LilyGO T-Dongle S3" +vendor: LilyGO +psram: false +sdcard: true +recommended: false +community: false +incubating: false +--- > [!NOTE] > Support for this device is incubating. It runs Tactility and has a single button for navigation, but there's currently no easy way to install apps. diff --git a/docs/devices/lilygo-tembed-cc1101-plus.md b/docs/devices/lilygo-tembed-cc1101-plus.md index c85c247..2bf5d1e 100644 --- a/docs/devices/lilygo-tembed-cc1101-plus.md +++ b/docs/devices/lilygo-tembed-cc1101-plus.md @@ -1,4 +1,12 @@ -# LilyGO T-Embed CC1101 Plus +--- +title: "LilyGO T-Embed CC1101 Plus" +vendor: LilyGO +psram: true +sdcard: true +recommended: true +community: false +incubating: false +--- ## Feature support diff --git a/docs/devices/lilygo-tembed-cc1101.md b/docs/devices/lilygo-tembed-cc1101.md index c55446b..e6c006b 100644 --- a/docs/devices/lilygo-tembed-cc1101.md +++ b/docs/devices/lilygo-tembed-cc1101.md @@ -1,4 +1,12 @@ -# LilyGO T-Embed CC1101 +--- +title: "LilyGO T-Embed CC1101" +vendor: LilyGO +psram: true +sdcard: true +recommended: false +community: false +incubating: false +--- > [!NOTE] > There's no separate firmware for this device yet. Flash the [CC1101 Plus](devices/lilygo-tembed-cc1101-plus.md) firmware instead. diff --git a/docs/devices/lilygo-thmi.md b/docs/devices/lilygo-thmi.md index edd265e..7f393ba 100644 --- a/docs/devices/lilygo-thmi.md +++ b/docs/devices/lilygo-thmi.md @@ -1,4 +1,12 @@ -# LilyGO T-HMI +--- +title: "LilyGO T-HMI" +vendor: LilyGO +psram: true +sdcard: true +recommended: false +community: false +incubating: false +--- ## Feature support diff --git a/docs/devices/lilygo-tlora-pager.md b/docs/devices/lilygo-tlora-pager.md index 2b70c18..b17357a 100644 --- a/docs/devices/lilygo-tlora-pager.md +++ b/docs/devices/lilygo-tlora-pager.md @@ -1,4 +1,12 @@ -# LilyGO T-Lora Pager +--- +title: "LilyGO T-Lora Pager" +vendor: LilyGO +psram: true +sdcard: true +recommended: true +community: false +incubating: false +--- ## Feature support diff --git a/docs/devices/m5stack-cardputer-adv.md b/docs/devices/m5stack-cardputer-adv.md index 4a4258b..95d94fb 100644 --- a/docs/devices/m5stack-cardputer-adv.md +++ b/docs/devices/m5stack-cardputer-adv.md @@ -1,4 +1,12 @@ -# M5Stack Cardputer Adv +--- +title: "M5Stack Cardputer Adv" +vendor: M5Stack +psram: false +sdcard: true +recommended: false +community: false +incubating: false +--- ## Feature support diff --git a/docs/devices/m5stack-cardputer.md b/docs/devices/m5stack-cardputer.md index 1435fd8..5967b7e 100644 --- a/docs/devices/m5stack-cardputer.md +++ b/docs/devices/m5stack-cardputer.md @@ -1,4 +1,12 @@ -# M5Stack Cardputer & Cardputer v1.1 +--- +title: "M5Stack Cardputer" +vendor: M5Stack +psram: false +sdcard: true +recommended: false +community: false +incubating: false +--- ## Hardware variants diff --git a/docs/devices/m5stack-core2.md b/docs/devices/m5stack-core2.md index 3c64c2a..f3a6311 100644 --- a/docs/devices/m5stack-core2.md +++ b/docs/devices/m5stack-core2.md @@ -1,4 +1,12 @@ -# M5Stack Core2 +--- +title: "M5Stack Core2" +vendor: M5Stack +psram: true +sdcard: true +recommended: false +community: false +incubating: false +--- > [!WARNING] > Only the [original](https://docs.m5stack.com/en/core/Core2) version is supported, not [v1.1](https://docs.m5stack.com/en/core/Core2%20v1.1). diff --git a/docs/devices/m5stack-cores3.md b/docs/devices/m5stack-cores3.md index 058da7f..66d33b2 100644 --- a/docs/devices/m5stack-cores3.md +++ b/docs/devices/m5stack-cores3.md @@ -1,4 +1,12 @@ -# M5Stack CoreS3 +--- +title: "M5Stack CoreS3" +vendor: M5Stack +psram: true +sdcard: false +recommended: false +community: false +incubating: false +--- ## Feature support diff --git a/docs/devices/m5stack-papers3.md b/docs/devices/m5stack-papers3.md index 957d5df..89e0df0 100644 --- a/docs/devices/m5stack-papers3.md +++ b/docs/devices/m5stack-papers3.md @@ -1,4 +1,12 @@ -# M5Stack PaperS3 +--- +title: "M5Stack PaperS3" +vendor: M5Stack +psram: true +sdcard: true +recommended: true +community: false +incubating: false +--- ## Feature support diff --git a/docs/devices/m5stack-stackchan.md b/docs/devices/m5stack-stackchan.md index 56c3d11..8b968f3 100644 --- a/docs/devices/m5stack-stackchan.md +++ b/docs/devices/m5stack-stackchan.md @@ -1,4 +1,12 @@ -# M5Stack StackChan +--- +title: "M5Stack StackChan" +vendor: M5Stack +psram: true +sdcard: true +recommended: false +community: true +incubating: false +--- ## Feature support diff --git a/docs/devices/m5stack-stickc-plus2.md b/docs/devices/m5stack-stickc-plus2.md index ad98e5e..3072401 100644 --- a/docs/devices/m5stack-stickc-plus2.md +++ b/docs/devices/m5stack-stickc-plus2.md @@ -1,4 +1,12 @@ -# M5Stack StickC Plus2 +--- +title: "M5Stack StickC Plus2" +vendor: M5Stack +psram: true +sdcard: false +recommended: false +community: false +incubating: false +--- ## Feature support diff --git a/docs/devices/m5stack-sticks3.md b/docs/devices/m5stack-sticks3.md index 7b8ce6a..9aee44d 100644 --- a/docs/devices/m5stack-sticks3.md +++ b/docs/devices/m5stack-sticks3.md @@ -1,4 +1,12 @@ -# M5Stack StickS3 +--- +title: "M5Stack StickS3" +vendor: M5Stack +psram: true +sdcard: false +recommended: false +community: true +incubating: false +--- ## Feature support diff --git a/docs/devices/m5stack-tab5.md b/docs/devices/m5stack-tab5.md index dea6b1f..a328430 100644 --- a/docs/devices/m5stack-tab5.md +++ b/docs/devices/m5stack-tab5.md @@ -1,4 +1,12 @@ -# M5Stack Tab5 +--- +title: "M5Stack Tab5" +vendor: M5Stack +psram: true +sdcard: true +recommended: true +community: false +incubating: false +--- ## Hardware variants diff --git a/docs/devices/seeed-wio-tracker-l2-pro.md b/docs/devices/seeed-wio-tracker-l2-pro.md index 4e30c1b..faa878f 100644 --- a/docs/devices/seeed-wio-tracker-l2-pro.md +++ b/docs/devices/seeed-wio-tracker-l2-pro.md @@ -1,4 +1,12 @@ -# Seeed Studio Wio Tracker L2 Pro +--- +title: "Seeed Studio Wio Tracker L2 Pro" +vendor: Seeed Studio +psram: true +sdcard: true +recommended: false +community: true +incubating: false +--- ## Feature support diff --git a/docs/devices/tulip-creative-computer.md b/docs/devices/tulip-creative-computer.md index 64f4387..b1e1688 100644 --- a/docs/devices/tulip-creative-computer.md +++ b/docs/devices/tulip-creative-computer.md @@ -1,4 +1,13 @@ -# Tulip Creative Computer 4r11 +--- +title: "Tulip Creative Computer 4r11" +vendor: Tulip +psram: true +sdcard: true +recommended: false +community: true +incubating: false +installer: tulip-4r11 +--- > [!WARNING] > Only variant 4r11 is supported. diff --git a/docs/devices/unphone.md b/docs/devices/unphone.md index c86d33f..13dee6f 100644 --- a/docs/devices/unphone.md +++ b/docs/devices/unphone.md @@ -1,4 +1,12 @@ -# unPhone +--- +title: "unPhone" +vendor: unPhone +psram: true +sdcard: true +recommended: false +community: false +incubating: false +--- > [!WARNING] > Only version 9 of the hardware is supported. diff --git a/docs/devices/waveshare-esp32-s3-epaper-397.md b/docs/devices/waveshare-esp32-s3-epaper-397.md index 4e0b6ce..386f802 100644 --- a/docs/devices/waveshare-esp32-s3-epaper-397.md +++ b/docs/devices/waveshare-esp32-s3-epaper-397.md @@ -1,4 +1,12 @@ -# Waveshare ESP32 S3 ePaper 3.97" +--- +title: "Waveshare ESP32 S3 ePaper 3.97\"" +vendor: Waveshare +psram: true +sdcard: true +recommended: false +community: false +incubating: false +--- An ESP32-S3 board with a 3.97" 800x480 e-paper display (8 gray shades), 16 MB flash and 8 MB PSRAM. diff --git a/docs/devices/waveshare-esp32-s3-geek.md b/docs/devices/waveshare-esp32-s3-geek.md index b1bb60f..01c70c6 100644 --- a/docs/devices/waveshare-esp32-s3-geek.md +++ b/docs/devices/waveshare-esp32-s3-geek.md @@ -1,4 +1,12 @@ -# Waveshare ESP32 S3 GEEK +--- +title: "Waveshare ESP32 S3 GEEK" +vendor: Waveshare +psram: true +sdcard: true +recommended: false +community: true +incubating: false +--- ## Feature support diff --git a/docs/devices/waveshare-s3-lcd-13.md b/docs/devices/waveshare-s3-lcd-13.md index c6b1562..3ec364d 100644 --- a/docs/devices/waveshare-s3-lcd-13.md +++ b/docs/devices/waveshare-s3-lcd-13.md @@ -1,4 +1,12 @@ -# Waveshare ESP32 S3 LCD 1.3" +--- +title: "Waveshare ESP32 S3 LCD 1.3\"" +vendor: Waveshare +psram: true +sdcard: true +recommended: false +community: false +incubating: true +--- > [!NOTE] > Support for this device is incubating. diff --git a/docs/devices/waveshare-s3-touch-lcd-128.md b/docs/devices/waveshare-s3-touch-lcd-128.md index b3fcf93..9f0c3c4 100644 --- a/docs/devices/waveshare-s3-touch-lcd-128.md +++ b/docs/devices/waveshare-s3-touch-lcd-128.md @@ -1,4 +1,12 @@ -# Waveshare ESP32 S3 Touch LCD 1.28" +--- +title: "Waveshare ESP32 S3 Touch LCD 1.28\"" +vendor: Waveshare +psram: true +sdcard: true +recommended: false +community: false +incubating: false +--- > [!WARNING] > The round display works, but the default Tactility launcher and apps don't support it yet. diff --git a/docs/devices/waveshare-s3-touch-lcd-147.md b/docs/devices/waveshare-s3-touch-lcd-147.md index 32b9314..fce6eda 100644 --- a/docs/devices/waveshare-s3-touch-lcd-147.md +++ b/docs/devices/waveshare-s3-touch-lcd-147.md @@ -1,4 +1,12 @@ -# Waveshare ESP32 S3 Touch LCD 1.47" +--- +title: "Waveshare ESP32 S3 Touch LCD 1.47\"" +vendor: Waveshare +psram: true +sdcard: true +recommended: false +community: false +incubating: false +--- ## Feature support diff --git a/docs/devices/waveshare-s3-touch-lcd-43.md b/docs/devices/waveshare-s3-touch-lcd-43.md index f28ff2c..b01ac23 100644 --- a/docs/devices/waveshare-s3-touch-lcd-43.md +++ b/docs/devices/waveshare-s3-touch-lcd-43.md @@ -1,4 +1,12 @@ -# Waveshare ESP32 S3 Touch LCD 4.3" +--- +title: "Waveshare ESP32 S3 Touch LCD 4.3\"" +vendor: Waveshare +psram: true +sdcard: true +recommended: false +community: false +incubating: false +--- > [!WARNING] > This page covers the [regular](https://www.waveshare.com/esp32-s3-touch-lcd-4.3.htm) variant, not the [Type B](https://www.waveshare.com/esp32-s3-touch-lcd-4.3b.htm) variant. diff --git a/docs/devices/wireless-tag-wt32-sc01-plus.md b/docs/devices/wireless-tag-wt32-sc01-plus.md index 23a0bb4..e071584 100644 --- a/docs/devices/wireless-tag-wt32-sc01-plus.md +++ b/docs/devices/wireless-tag-wt32-sc01-plus.md @@ -1,4 +1,12 @@ -# Wireless Tag WT32 SC01 Plus +--- +title: "Wireless Tag WT32 SC01 Plus" +vendor: Wireless Tag +psram: true +sdcard: true +recommended: false +community: true +incubating: false +--- ## Feature support diff --git a/docs/faq.md b/docs/faq.md index 6379e08..671985c 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -1,4 +1,8 @@ -# FAQ +--- +title: "FAQ" +description: "Frequently asked questions about Tactility, the operating system for ESP32 devices." +toc: true +--- ## Getting started @@ -7,11 +11,11 @@ Any device marked with ⭐ on the [Supported Devices](supported-devices.md) page is a good choice, because these devices are recommended by the developer. The [M5Stack Tab5](devices/m5stack-tab5.md) currently performs best and has the most features. -Devices with external RAM (🟩 in the Memory column) are recommended. Devices without it can run Tactility, but memory is tight. +Devices with external RAM (marked "External RAM" in the list) are recommended. Devices without it can run Tactility, but memory is tight. ### How do I install Tactility? -Use the [Web Installer](https://install.tactility.one/) in a desktop browser. Installing with the _erase_ option is recommended. +Use the [Web Installer](https://install.tactilityproject.org/) in a desktop browser. Installing with the _erase_ option is recommended. See [Installing](installing.md) for alternative methods. ### My device doesn't power on. What should I do? diff --git a/docs/features.md b/docs/features.md index 0d06f83..9fd15db 100644 --- a/docs/features.md +++ b/docs/features.md @@ -1,4 +1,8 @@ -# Features +--- +title: "Features" +description: "What Tactility offers: apps, App Hub, Wi-Fi, Bluetooth, mesh networking, app development and driver support for ESP32 devices." +toc: true +--- Tactility turns ESP32 hardware into a small computer with a real operating system: a launcher, apps, settings, file management and connectivity, all ready to go. Install it from your browser, then add apps from the App Hub or build your own. @@ -8,7 +12,7 @@ Install it from your browser, then add apps from the App Hub or build your own. More than 50 devices are supported out of the box, from handhelds with keyboards like the LilyGO T-Deck and M5Stack Cardputer to tablets like the M5Stack Tab5 and affordable "Cheap Yellow Display" boards. See [Supported Devices](supported-devices.md) for the full list. -- **Easy to install**: flash Tactility with the [Web Installer](https://install.tactility.one/). No toolchain needed. +- **Easy to install**: flash Tactility with the [Web Installer](https://install.tactilityproject.org/). No toolchain needed. - **Many types of input**: touchscreens, keyboards, trackballs, encoder wheels and plain buttons all work. - **Graphical or headless**: use the full user interface, or run without a display. You can change how the device boots and start the app you need automatically. diff --git a/docs/images/screenshot-AppHub.png b/docs/images/screenshot-AppHub.png new file mode 100644 index 0000000..b1d7d6e Binary files /dev/null and b/docs/images/screenshot-AppHub.png differ diff --git a/docs/images/screenshot-Files.png b/docs/images/screenshot-Files.png index e6a5799..bc8eec9 100644 Binary files a/docs/images/screenshot-Files.png and b/docs/images/screenshot-Files.png differ diff --git a/docs/images/screenshot-Launcher.png b/docs/images/screenshot-Launcher.png index dfdfc18..d49c036 100644 Binary files a/docs/images/screenshot-Launcher.png and b/docs/images/screenshot-Launcher.png differ diff --git a/docs/images/screenshot-Mesh.png b/docs/images/screenshot-Mesh.png new file mode 100644 index 0000000..6952687 Binary files /dev/null and b/docs/images/screenshot-Mesh.png differ diff --git a/docs/images/screenshot-SatelliteTracker.png b/docs/images/screenshot-SatelliteTracker.png new file mode 100644 index 0000000..9249361 Binary files /dev/null and b/docs/images/screenshot-SatelliteTracker.png differ diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 03d0a77..0000000 --- a/docs/index.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - Tactility - - - - - - - - - - -
Loading...
- - - - - - - - - - diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..aa04c25 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,68 @@ +--- +layout: home +title: Tactility +tagline: An operating system for ESP32 devices +lead: >- + Tactility turns ESP32 hardware into a small computer: a launcher, apps, settings, + file management and connectivity, all ready to go. Install it from your browser, + then add apps from the App Hub or build your own. +actions: + - label: Install Tactility + url: https://install.tactilityproject.org/ + primary: true + - label: Supported devices + url: supported-devices.md +screenshots: + - src: /images/screenshot-Launcher.png + alt: Screenshot of the launcher app + - src: /images/screenshot-AppHub.png + alt: Screenshot of the App Hub app + caption: App Hub + - src: /images/screenshot-SatelliteTracker.png + alt: Screenshot of the satellite tracker app showing satellites on a world map + caption: Satellite Tracker + - src: /images/screenshot-Terminal.png + alt: Screenshot of the terminal app + caption: Terminal + - src: /images/screenshot-Settings.png + alt: Screenshot of the settings app + caption: Settings + - src: /images/screenshot-Files.png + alt: Screenshot of the files app + caption: Files + - src: /images/screenshot-Mesh.png + alt: Screenshot of a channel in the mesh chat app + caption: Mesh +highlights: + - title: Runs on 50+ devices + text: Handhelds with keyboards, tablets, e-paper and affordable "Cheap Yellow Display" boards. + url: supported-devices.md + - title: Apps included + text: Files, Terminal, Mesh, Notes, Camera and more. Install extra apps on the device from the App Hub. + url: features.md#apps-included + - title: Connected + text: Wi-Fi, Bluetooth LE, USB, a web dashboard, and Meshtastic and MeshCore mesh networking. + url: features.md#connectivity + - title: Build your own apps + text: Run apps from an SD card or install them over Wi-Fi. Test on your PC with the simulator. + url: features.md#build-your-own-apps +supporters: + - name: CLion + logo: /images/supporter/CLion.svg + url: https://jb.gg/OpenSourceSupport + - name: Elecrow + logo: /images/supporter/Elecrow.webp + url: https://www.elecrow.com/ + - name: LILYGO + logo: /images/supporter/LILYGO.webp + url: https://lilygo.cc + - name: M5Stack + logo: /images/supporter/M5Stack.webp + url: https://m5stack.com + - name: unPhone + logo: /images/supporter/unPhone.svg + url: https://unphone.net +--- + +Use one of the [supported devices](supported-devices.md), +or set up the drivers for your own hardware combination. diff --git a/docs/installing.md b/docs/installing.md index 3fae186..810df13 100644 --- a/docs/installing.md +++ b/docs/installing.md @@ -1,6 +1,9 @@ -# Installing +--- +title: "Installing" +description: "Install Tactility on your ESP32 device with the Web Installer, or flash a release manually." +--- -You can install Tactility with the [Web Installer](https://install.tactility.one/). Installing with the _erase_ option is recommended. +You can install Tactility with the [Web Installer](https://install.tactilityproject.org/). Installing with the _erase_ option is recommended. Note, for **T-Deck**: You might need to manually put the device in boot mode: 1. Press the trackball and then the reset button at the same time @@ -36,7 +39,7 @@ _Troubleshooting Linux / macOS_ Flash by specifying the `COM` port: -```ps +```powershell flash.ps COM3 ``` diff --git a/docs/licenses-and-copyrights.md b/docs/licenses-and-copyrights.md index 76f1b17..2b93e4b 100644 --- a/docs/licenses-and-copyrights.md +++ b/docs/licenses-and-copyrights.md @@ -1,4 +1,7 @@ -# Licenses & Copyrights +--- +title: "Licenses & Copyrights" +description: "Licensing of the Tactility operating system, SDK and apps." +--- ## Tactility diff --git a/docs/sitemap.njk b/docs/sitemap.njk new file mode 100644 index 0000000..8a774b4 --- /dev/null +++ b/docs/sitemap.njk @@ -0,0 +1,11 @@ +--- +permalink: /sitemap.xml +layout: false +eleventyExcludeFromCollections: true +--- + + +{%- for item in collections.all %} + {{ site.url }}{{ item.url }} +{%- endfor %} + diff --git a/docs/support.md b/docs/support.md index 33db6c0..bc20b4c 100644 --- a/docs/support.md +++ b/docs/support.md @@ -1,4 +1,7 @@ -# Support +--- +title: "Support" +description: "Report bugs, suggest features and join the Tactility community." +--- Bugs and suggestions can be report via [GitHub](https://github.com/TactilityProject/Tactility/issues). diff --git a/docs/supported-devices.md b/docs/supported-devices.md index 7bc6e70..446c001 100644 --- a/docs/supported-devices.md +++ b/docs/supported-devices.md @@ -1,85 +1,24 @@ -# Supported Devices +--- +layout: devices +title: Supported Devices +description: ESP32 devices that run Tactility, with their memory, SD card and feature support. +permalink: /devices/ +--- Any ESP32 device should be able to run Tactility, because drivers can be implemented for any hardware. Some hardware combinations are officially supported. -The [Tab5](devices/m5stack-tab5.md) currently performs best and has the most features. + -|Name|Memory|SD card|Badge| -|-|-|-|-| -|[BigTreeTech Panda Touch & K Touch](devices/btt-panda-touch.md)(\*)|🟩|🟥| | -|[CL-32](devices/cl32.md)|🟩|🟩| | -|[CYD 2432S022C](devices/cyd-2432s022c.md)|🟧|🟩| | -|[CYD 2432S024C](devices/cyd-2432s024c.md)|🟧|🟩| | -|[CYD 2432S024R](devices/cyd-2432s024r.md)|🟧|🟩| | -|[CYD 2432S028R](devices/cyd-2432s028r.md)|🟧|🟩| | -|[CYD 2432S028R v3](devices/cyd-2432s028rv3.md)|🟧|🟩| | -|[CYD 2432S032C](devices/cyd-2432s032c.md)|🟧|🟩|⭐| -|[CYD 3248S035C](devices/cyd-3248s035c.md)(\*)|🟧|🟩| | -|[CYD 4827S043C](devices/cyd-4827s043c.md)(\*)|🟩|🟩| | -|[CYD 4848S040C](devices/cyd-4848s040c.md)|🟩|🟩| | -|[CYD 8048S043C](devices/cyd-8048s043c.md)(\*)|🟩|🟩| | -|[CYD E32R28T](devices/cyd-e32r28t.md)(\*)|🟧|🟩| | -|[CYD E32R32P](devices/cyd-e32r32p.md)(\*)|🟧|🟩| | -|[CYD ES3C28P](devices/cyd-es3c28p.md)(\*)|🟩|🟩| | -|[Elecrow CrowPanel Advance 2.8"](devices/elecrow-crowpanel-advance-28.md)|🟩|🟩|⭐| -|[Elecrow CrowPanel Advance 3.5"](devices/elecrow-crowpanel-advance-35.md)|🟩|🟩| | -|[Elecrow CrowPanel Advance 5.0"](devices/elecrow-crowpanel-advance-50.md)|🟩|🟩| | -|[Elecrow CrowPanel Basic 2.8"](devices/elecrow-crowpanel-basic-28.md)|🟧|🟩| | -|[Elecrow CrowPanel Basic 3.5"](devices/elecrow-crowpanel-basic-35.md)|🟧|🟩| | -|[Elecrow CrowPanel Basic 5.0"](devices/elecrow-crowpanel-basic-50.md)|🟩|🟩| | -|[Guition JC1060P470C-I-W-Y](devices/guition-jc1060p470ciwy.md)|🟩|🟩| | -|[Guition JC2432W328C](devices/guition-jc2432w328c.md)(\*)|🟧|🟩| | -|[Guition JC8048W550C](devices/guition-jc8048w550c.md)|🟩|🟩| | -|[LilyGO T-Deck](devices/lilygo-tdeck.md)|🟩|🟩| | -|[LilyGO T-Deck Plus](devices/lilygo-tdeck-plus.md)|🟩|🟩|⭐| -|[LilyGO T-Deck Pro](devices/lilygo-tdeck-pro.md)|🟩|🟩| | -|[LilyGO T-Deck Max](devices/lilygo-tdeck-max.md)(\*)|🟩|🟩| | -|[LilyGO T-Display](devices/lilygo-tdisplay.md)(\*)|🟧|🟥| | -|[LilyGO T-Display S3](devices/lilygo-tdisplay-s3.md)(\*)|🟩|🟥| | -|[LilyGO T-Dongle S3](devices/lilygo-tdongle-s3.md)|🟧|🟩| | -|[LilyGO T-Embed CC1101](devices/lilygo-tembed-cc1101.md)|🟩|🟩| | -|[LilyGO T-Embed CC1101 Plus](devices/lilygo-tembed-cc1101-plus.md)|🟩|🟩| | -|[LilyGO T-Lora Pager](devices/lilygo-tlora-pager.md)|🟩|🟩| | -|[LilyGO T-HMI](devices/lilygo-thmi.md)|🟩|🟩| | -|[M5Stack Cardputer](devices/m5stack-cardputer.md)|🟧|🟩|⭐| -|[M5Stack Cardputer Adv](devices/m5stack-cardputer-adv.md)|🟧|🟩|⭐| -|[M5Stack Core2](devices/m5stack-core2.md)|🟩|🟩| | -|[M5Stack CoreS3](devices/m5stack-cores3.md)|🟩|🟥| | -|[M5Stack PaperS3](devices/m5stack-papers3.md)|🟩|🟩| | -|[M5Stack StackChan](devices/m5stack-stackchan.md)(\*)|🟩|🟩| | -|[M5Stack StickC Plus2](devices/m5stack-stickc-plus2.md)|🟩|🟥| | -|[M5Stack StickS3](devices/m5stack-sticks3.md)(\*)|🟩|🟥| | -|[M5Stack Tab5](devices/m5stack-tab5.md)|🟩|🟩|⭐| -|[Seeed Studio Wio Tracker L2 Pro](devices/seeed-wio-tracker-l2-pro.md)(\*)|🟩|🟩| | -|[Tulip Creative Computer 4r11](devices/tulip-creative-computer.md)(\*)|🟩|🟩| | -|[unPhone](devices/unphone.md)|🟩|🟩| | -|[Waveshare ESP32 S3 ePaper 3.97"](devices/waveshare-esp32-s3-epaper-397.md)|🟩|🟩| | -|[Waveshare ESP32 S3 GEEK](devices/waveshare-esp32-s3-geek.md)(\*)|🟩|🟩| | -|[Waveshare ESP32 S3 Touch LCD 1.28"](devices/waveshare-s3-touch-lcd-128.md)|🟩|🟩| | -|[Waveshare ESP32 S3 Touch LCD 1.47"](devices/waveshare-s3-touch-lcd-147.md)|🟩|🟩| | -|[Waveshare ESP32 S3 Touch LCD 4.3"](devices/waveshare-s3-touch-lcd-43.md)|🟩|🟩| | -|[Wireless Tag WT32 SC01 Plus](devices/wireless-tag-wt32-sc01-plus.md)(\*)|🟩|🟩| | +## Legend -Incubating: +- **⭐** after the name: recommended by the developer. +- **External RAM**: the device has external RAM (PSRAM). Devices without it can run Tactility, but memory is tight. +- **SD card**: the SD card slot works. "No SD card" means it is unavailable, broken or not implemented. +- **Community tested**: these boards are not owned by the developer, so quality control is limited to community efforts. +- **Incubating**: support is still being worked on. -|Name|Memory|SD card|Badge| -|-|-|-|-| -|[Espressif ESP-Mosaico](devices/espressif-esp-mosaico.md)|🟩|🟩| | -|[Heltec WiFi LoRa 32 v3](devices/heltec-wifi-lora-32-v3.md)|🟧|🟥| | -|[LilyGO T5 4.7 Inch E-Paper S3](devices/lilygo-t5-47.md)(\*)|🟩|🟩| | -|[Waveshare ESP32 S3 LCD 1.3"](devices/waveshare-s3-lcd-13.md)|🟩|🟩| | - - -Memory: 🟧 = no external RAM, 🟩 = external RAM present - -SD card: 🟩 = working, 🟥 = unavailable/broken/not implemented - -⭐ = recommended by the developer - - (\*) These boards are not owned by the developer, so quality control is limited to community efforts. - -## Feature status legend +### Feature status Device pages use the following status markers: diff --git a/docs/theme/tactility.css b/docs/theme/tactility.css deleted file mode 100644 index f678b78..0000000 --- a/docs/theme/tactility.css +++ /dev/null @@ -1,843 +0,0 @@ -/*! - * Tactility theme, based on Darcula > Darkly > Dark theme for docsify - */ -@import url('https://fonts.googleapis.com/css?family=Roboto+Mono|Source+Sans+Pro:300,600'); -* { - -webkit-font-smoothing: antialiased; - -webkit-overflow-scrolling: touch; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); - -webkit-text-size-adjust: none; - -webkit-touch-callout: none; - box-sizing: border-box; -} -body:not(.ready) { - overflow: hidden; -} -body:not(.ready) .app-nav, -body:not(.ready) > nav, -body:not(.ready) [data-cloak] { - display: none; -} -div#app { - font-size: 30px; - font-weight: lighter; - margin: 40vh auto; - text-align: center; -} -div#app:empty:before { - content: 'Loading...'; -} -.emoji { - height: 1.2rem; - vertical-align: middle; -} -.progress { - background-color: var(--theme-color, #33bbff); - height: 2px; - left: 0; - position: fixed; - right: 0; - top: 0; - transition: width 0.2s, opacity 0.4s; - width: 0; - z-index: 5; -} -input[type='search'] { - background: #21222a; - border-color: #21222a; - color: rgb(192, 192, 192); -} -.search { - border-bottom: 1px solid #191919; -} -.search .search-keyword, -.search a:hover { - color: var(--theme-color, #33bbff); -} -.search .search-keyword { - color: var(--theme-color, #33bbff); - font-style: normal; - font-weight: 700; -} -.search .results-panel { - color: rgb(192, 192, 192); -} -.search .matching-post { - border-bottom: 1px solid #444444 !important; -} -body, -html { - height: 100%; -} -body { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - /* color: #34495e; */ - color: #bbc0c4; - font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - font-size: 16px; - letter-spacing: 0; - margin: 0; - overflow-x: hidden; - z-index: 10; -} -img { - max-width: 100%; -} -a[disabled] { - cursor: not-allowed; - opacity: 0.6; -} -kbd { - border: 1px solid #a3a3a3; - border-radius: 3px; - display: inline-block; - font-size: 12px !important; - line-height: 12px; - margin-bottom: 3px; - padding: 3px 5px; - vertical-align: middle; -} -.task-list-item { - list-style-type: none; -} -li input[type='checkbox'] { - margin: 0 0.2em 0.25em -1.6em; - vertical-align: middle; -} -.app-nav { - margin: 25px 60px 0 0; - position: absolute; - right: 0; - text-align: right; - z-index: 2; -} -.app-nav.no-badge { - margin-right: 25px; -} -.app-nav p { - margin: 0; -} -.app-nav > a { - margin: 0 1rem; - padding: 5px 0; -} -.app-nav li, -.app-nav ul { - display: inline-block; - list-style: none; - margin: 0; -} -.app-nav a { - color: inherit; - font-size: 16px; - text-decoration: none; - transition: color 0.3s; -} -.app-nav a.active, -.app-nav a:hover { - color: var(--theme-color, #33bbff); -} -.app-nav a.active { - border-bottom: 2px solid var(--theme-color, #33bbff); - color: var(--theme-color, #33bbff); -} -.app-nav li { - display: inline-block; - margin: 0 1rem; - padding: 5px 0; - position: relative; -} -.app-nav li ul { - background-color: #fff; - border: 1px solid #b0b0b0; - border-bottom-color: #a3a3a3; - border-radius: 4px; - box-sizing: border-box; - display: none; - max-height: calc(100vh - 61px); - overflow-y: auto; - padding: 10px 0; - position: absolute; - right: -15px; - text-align: left; - top: 100%; - white-space: nowrap; -} -.app-nav li ul li { - display: block; - font-size: 14px; - line-height: 1rem; - margin: 0; - margin: 8px 14px; - white-space: nowrap; -} -.app-nav li ul a { - display: block; - font-size: inherit; - margin: 0; - padding: 0; -} -.app-nav li ul a.active { - border-bottom: 0; -} -.app-nav li:hover ul { - display: block; -} -.github-corner { - border-bottom: 0; - position: fixed; - right: 0; - text-decoration: none; - top: 0; - z-index: 1; -} -.github-corner:hover .octo-arm { - animation: a 0.56s ease-in-out; -} -.github-corner svg { - color: #21222b; - fill: var(--theme-color, #33bbff); - height: 80px; - width: 80px; -} -main { - display: block; - position: relative; - width: 100vw; - height: 100%; - z-index: 0; -} -main.hidden { - display: none; -} -.anchor { - display: inline-block; - text-decoration: none; - transition: all 0.3s; -} -.anchor span { - color: #33bbff; -} -.anchor:hover { - text-decoration: underline; -} -.sidebar { - border-right: 1px solid rgba(0, 0, 0, 0.4); - overflow-y: auto; - padding: 40px 0 0; - position: absolute; - top: 0; - bottom: 0; - left: 0; - transition: transform 0.25s ease-out; - width: 300px; - z-index: 3; -} -.sidebar > h1 { - margin: 0 auto 1rem; - font-size: 1.5rem; - font-weight: 300; - text-align: center; -} -.sidebar > h1 a { - color: inherit; - text-decoration: none; - font-weight: 600; - color: #ee81c3; -} -.sidebar > h1 .app-nav { - display: block; - position: static; -} -.sidebar .sidebar-nav { - line-height: 2em; - padding-bottom: 40px; -} -.sidebar li.collapse .app-sub-sidebar { - display: none; -} -.sidebar ul { - margin: 0 0 0 15px; - padding: 0; -} -.sidebar li > p { - font-weight: 700; - margin: 0; - color: #ee81c3; -} -.sidebar ul, -.sidebar ul li { - list-style: none; -} -.sidebar ul li a { - border-bottom: none; - display: block; -} -.sidebar ul li ul { - padding-left: 20px; -} -.sidebar::-webkit-scrollbar { - width: 4px; -} -.sidebar::-webkit-scrollbar-thumb { - background: transparent; - border-radius: 4px; -} -.sidebar:hover::-webkit-scrollbar-thumb { - background: hsla(0, 0%, 53%, 0.4); -} -.sidebar:hover::-webkit-scrollbar-track { - background: hsla(0, 0%, 53%, 0.1); -} -.sidebar-toggle { - background-color: transparent; - background-color: #21222b; - border: 0; - outline: none; - padding: 10px; - position: absolute; - bottom: 0; - left: 0; - text-align: center; - transition: opacity 0.3s; - width: 284px; - z-index: 4; -} -.sidebar-toggle .sidebar-toggle-button:hover { - opacity: 0.8; - -} -.sidebar-toggle span { - background-color: var(--theme-color, #33bbff); - display: block; - margin-bottom: 4px; - width: 24px; - height: 4px; - text-shadow: 2px 2px; -} -body.sticky .sidebar, -body.sticky .sidebar-toggle { - position: fixed; -} -.content { - padding-top: 60px; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 300px; - transition: left 0.25s ease; -} -.markdown-section { - margin: 0 auto; - max-width: 800px; - padding: 30px 15px 40px; - position: relative; -} -.markdown-section > * { - box-sizing: border-box; - font-size: inherit; -} -.markdown-section > :first-child { - margin-top: 0 !important; -} -.markdown-section hr { - border: none; - border-bottom: 1px solid #444444; - margin: 2em 0; -} -.markdown-section iframe { - border: 1px solid #444444; -} -.markdown-section table { - border-collapse: collapse; - border-spacing: 0; - display: block; - margin-bottom: 1rem; - overflow: auto; - width: 100%; -} -.markdown-section th { - font-weight: 700; -} -.markdown-section td, -.markdown-section th { - border: 1px solid #b0b0b0; - padding: 6px 13px; -} -.markdown-section tr { - border-top: 1px solid #a3a3a3; -} -.markdown-section p.tip, -.markdown-section tr:nth-child(2n) { - background-color: #1e1e25; -} -.markdown-section p.tip { - border-bottom-right-radius: 2px; - border-left: 4px solid #33bbff; - border-top-right-radius: 2px; - margin: 2em 0; - padding: 12px 24px 12px 30px; - position: relative; -} -.markdown-section p.tip:before { - background-color: #33bbff; - border-radius: 100%; - color: #fff; - content: '!'; - font-family: Dosis, Source Sans Pro, Helvetica Neue, Arial, sans-serif; - font-size: 14px; - font-weight: 700; - left: -12px; - line-height: 20px; - position: absolute; - height: 20px; - width: 20px; - text-align: center; - top: 14px; -} -.markdown-section p.tip code { - background-color: #191919; -} -.markdown-section p.tip em { - color: #34495e; -} -.markdown-section p.warn { - background: rgba(66, 185, 131, 0.2); - border-radius: 2px; - padding: 1rem; -} -body.close .sidebar { - transform: translateX(-300px); -} -body.close .sidebar-toggle { - width: auto; -} -body.close .content { - left: 0; -} -@media print { - .app-nav, - .github-corner, - .sidebar, - .sidebar-toggle { - display: none; - } -} -@media screen and (max-width: 768px) { - .github-corner, - .sidebar, - .sidebar-toggle { - position: fixed; - } - .app-nav { - margin-top: 16px; - } - .app-nav li ul { - top: 30px; - } - main { - height: auto; - overflow-x: hidden; - } - .sidebar { - left: -300px; - transition: transform 0.25s ease-out; - } - .content { - left: 0; - max-width: 100vw; - position: static; - padding-top: 20px; - transition: transform 0.25s ease; - } - .app-nav, - .github-corner { - transition: transform 0.25s ease-out; - } - .sidebar-toggle { - background-color: transparent; - width: auto; - padding: 30px 30px 10px 10px; - } - body.close .sidebar { - transform: translateX(300px); - } - body.close .sidebar-toggle { - background-color: #282a35; - transition: background-color 1s; - width: 284px; - padding: 10px; - } - body.close .content { - transform: translateX(300px); - } - body.close .app-nav, - body.close .github-corner { - display: none; - } - .github-corner:hover .octo-arm { - animation: none; - } - .github-corner .octo-arm { - animation: a 0.56s ease-in-out; - } -} -@keyframes a { - 0%, - to { - transform: rotate(0); - } - 20%, - 60% { - transform: rotate(-25deg); - } - 40%, - 80% { - transform: rotate(10deg); - } -} -section.cover { - -ms-flex-align: center; - align-items: center; - background-position: 50%; - background-repeat: no-repeat; - background-size: cover; - height: 100vh; - display: none; - background: - linear-gradient(180deg, #341D65 0%, rgba(52, 29, 101, 0) 100%), - radial-gradient(94.51% 124.88% at 94.32% 94.43%, rgba(65, 244, 255, 0.78) 0%, rgba(128, 217, 255, 0.78) 46.52%, rgba(65, 198, 255, 0) 100%), - linear-gradient(41deg, #fffce673 4.33%, rgba(255, 252, 230, 0) 73.7%); - background-blend-mode: normal, normal, normal; - /* filter: blur(0.5px); */ - z-index: 0; /* 设置较小的 z-index */ -} - - -section.cover.show { - display: -ms-flexbox; - display: flex; -} -section.cover.has-mask .mask { - background-color: #fff; - opacity: 0.8; - position: absolute; - top: 0; - height: 100%; - width: 100%; -} -section.cover .cover-main { - -ms-flex: 1; - flex: 1; - margin: -20px 16px 0; - text-align: center; - z-index: 10; -} -section.cover a { - color: inherit; -} -section.cover a, -section.cover a:hover { - text-decoration: none; -} -section.cover p { - line-height: 1.5rem; - margin: 1em 0; -} -section.cover h1 { - color: inherit; - font-size: 2.5rem; - font-weight: 300; - margin: 0.625rem 0 2.5rem; - position: relative; - text-align: center; -} -section.cover h1 a { - display: block; -} -section.cover h1 small { - bottom: -0.4375rem; - font-size: 1rem; - position: absolute; -} -section.cover blockquote { - font-size: 1.5rem; - text-align: center; -} -section.cover ul { - line-height: 1.8; - list-style-type: none; - margin: 1em auto; - max-width: 500px; - padding: 0; -} -section.cover .cover-main > p:last-child a { - border: 1px solid var(--theme-color, #33bbff); - border-radius: 2rem; - box-sizing: border-box; - color: var(--theme-color, #33bbff); - display: inline-block; - font-size: 1.05rem; - letter-spacing: 0.1rem; - margin: 0.5rem 1rem; - padding: 0.75em 2rem; - text-decoration: none; - transition: all 0.15s ease; -} -section.cover .cover-main > p:last-child a:last-child { - background-color: var(--theme-color, #33bbff); - color: #e5e5e5; -} -section.cover .cover-main > p:last-child a:last-child:hover { - color: inherit; - opacity: 0.8; - color: #e5e5e5; -} -section.cover .cover-main > p:last-child a:hover { - color: inherit; -} -section.cover blockquote > p > a { - border-bottom: 2px solid var(--theme-color, #33bbff); - transition: color 0.3s; -} -section.cover blockquote > p > a:hover { - color: var(--theme-color, #33bbff); -} -.sidebar, -body { - background-color: #21222b; -} -.sidebar { - color: #bbc0c4; -} -.sidebar li { - margin: 6px 0; -} -.sidebar ul li a { - color: #33bbff; - font-size: 14px; - font-weight: 600; - overflow: hidden; - text-decoration: none; - text-overflow: ellipsis; - white-space: nowrap; -} -.sidebar ul li a:hover { - text-decoration: underline; -} -.sidebar ul li ul { - padding: 0; -} -.sidebar ul li.active > a { - border-right: 2px solid; - color: var(--theme-color, #33bbff); - font-size: 16px; - font-weight: 600; -} -.app-sub-sidebar li:before { - content: '-'; - padding-right: 4px; - float: left; -} -.markdown-section h1, -.markdown-section h2, -.markdown-section h3, -.markdown-section h4, -.markdown-section strong { - color: #fff; - font-weight: 600; -} -.markdown-section a { - color: #ee81c3; - font-weight: 600; -} -.markdown-section h1 { - font-size: 2rem; - margin: 0 0 1rem; -} -.markdown-section h2 { - font-size: 1.75rem; - margin: 45px 0 0.8rem; -} -.markdown-section h3 { - font-size: 1.5rem; - margin: 40px 0 0.6rem; -} -.markdown-section h4 { - font-size: 1.25rem; -} -.markdown-section h5 { - font-size: 1rem; -} -.markdown-section h6 { - color: #777; - font-size: 1rem; -} -.markdown-section figure, -.markdown-section p { - margin: 1.2em 0; -} -.markdown-section ol, -.markdown-section p, -.markdown-section ul { - line-height: 1.6rem; - word-spacing: 0.05rem; -} -.markdown-section ol, -.markdown-section ul { - padding-left: 1.5rem; -} -.markdown-section blockquote { - border-left: 4px solid var(--theme-color, #33bbff); - color: #858585; - margin: 2em 0; - padding-left: 20px; -} -.markdown-section blockquote p { - font-weight: 600; - margin-left: 0; -} -.markdown-section iframe { - margin: 1em 0; -} -.markdown-section em { - color: #7f8c8d; -} -.markdown-section code { - border-radius: 2px; - color: #33bbff; - font-size: 0.9rem; - margin: 0 2px; - padding: 3px 5px; - white-space: pre-wrap; -} -.markdown-section code, -.markdown-section pre { - background-color: #1e1e25; - font-family: Roboto Mono, Monaco, courier, monospace; -} -.markdown-section pre { - -moz-osx-font-smoothing: initial; - -webkit-font-smoothing: initial; - line-height: 1.5rem; - margin: 1.2em 0; - overflow: auto; - padding: 0 1.4rem; - position: relative; - word-wrap: normal; -} -.token.cdata, -.token.comment, -.token.doctype, -.token.prolog { - color: #8e908c; -} -.token.namespace { - opacity: 0.7; -} -.token.boolean, -.token.number { - color: #f3fa9a; -} -.token.punctuation { - color: #0078c8; -} -.token.property { - color: #f3fa9a; -} -.token.tag { - color: #ee81c3; -} -.token.string { - color: var(--theme-color, #33bbff); -} -.token.selector { - color: #6679cc; -} -.token.attr-name { - color: #ee81c3; -} -.language-css .token.string, -.style .token.string, -.token.entity, -.token.url { - color: #22a2c9; -} -.token.attr-value, -.token.control, -.token.directive, -.token.unit { - color: var(--theme-color, #33bbff); -} -.token.keyword { - color: #f3fa9a; -} -.token.atrule, -.token.regex, -.token.statement { - color: #22a2c9; -} -.token.placeholder, -.token.variable { - color: #3d8fd1; -} -.token.deleted { - text-decoration: line-through; -} -.token.inserted { - border-bottom: 1px dotted #202746; - text-decoration: none; -} -.token.italic { - font-style: italic; -} -.token.bold, -.token.important { - font-weight: 700; -} -.token.important { - color: #f3fa9a; -} -.token.entity { - cursor: help; -} -.markdown-section pre > code { - -moz-osx-font-smoothing: initial; - -webkit-font-smoothing: initial; - background-color: #1e1e25; - border-radius: 2px; - color: #c0c0c0; - display: block; - font-family: Roboto Mono, Monaco, courier, monospace; - font-size: 0.9rem; - line-height: inherit; - margin: 0 2px; - max-width: inherit; - overflow: inherit; - padding: 2.2em 5px; - white-space: inherit; -} -.markdown-section code:after, -.markdown-section code:before { - letter-spacing: 0.05rem; -} -code .token { - -moz-osx-font-smoothing: initial; - -webkit-font-smoothing: initial; - min-height: 1.5rem; -} -pre:after { - color: #a3a3a3; - content: attr(data-lang); - font-size: 0.6rem; - font-weight: 600; - height: 15px; - line-height: 15px; - padding: 5px 10px 0; - position: absolute; - right: 0; - text-align: right; - top: 0; -} diff --git a/eleventy.config.js b/eleventy.config.js new file mode 100644 index 0000000..8c3734d --- /dev/null +++ b/eleventy.config.js @@ -0,0 +1,100 @@ +import { InputPathToUrlTransformPlugin } from "@11ty/eleventy"; +import syntaxHighlight from "@11ty/eleventy-plugin-syntaxhighlight"; +import fs from "node:fs"; +import markdownIt from "markdown-it"; +import anchor from "markdown-it-anchor"; +import alerts from "markdown-it-github-alerts"; + +const fonts = "node_modules/@fontsource-variable"; + +export default function (eleventyConfig) { + // Lets markdown link to other pages by file name, e.g. [FAQ](faq.md) + eleventyConfig.addPlugin(InputPathToUrlTransformPlugin); + eleventyConfig.addPlugin(syntaxHighlight); + + eleventyConfig.setLibrary( + "md", + markdownIt({ html: true, linkify: true }) + .use(anchor, { permalink: anchor.permalink.headerLink({ safariReaderFix: true }) }) + .use(alerts), + ); + + eleventyConfig.addGlobalData("layout", "page"); + + eleventyConfig.addPassthroughCopy("docs/images"); + eleventyConfig.addPassthroughCopy("docs/assets"); + eleventyConfig.addPassthroughCopy("docs/CNAME"); + eleventyConfig.addPassthroughCopy({ + [`${fonts}/inter/files/inter-latin-wght-normal.woff2`]: "assets/fonts/inter.woff2", + [`${fonts}/jetbrains-mono/files/jetbrains-mono-latin-wght-normal.woff2`]: "assets/fonts/jetbrains-mono.woff2", + }); + + // Device pages grouped for the directory: one group per vendor with several + // devices, the rest under "Other", incubating devices last. + eleventyConfig.addFilter("deviceGroups", (devices) => { + const byTitle = (a, b) => a.data.title.localeCompare(b.data.title, "en", { numeric: true }); + const vendors = new Map(); + const incubating = []; + for (const device of [...devices].sort(byTitle)) { + if (device.data.incubating) { + incubating.push(device); + continue; + } + const vendor = device.data.vendor; + if (!vendors.has(vendor)) vendors.set(vendor, []); + vendors.get(vendor).push(device); + } + const groups = []; + const other = []; + for (const [name, list] of [...vendors].sort((a, b) => a[0].localeCompare(b[0]))) { + if (list.length > 1) groups.push({ name, devices: list }); + else other.push(...list); + } + if (other.length) groups.push({ name: "Other", devices: other.sort(byTitle) }); + if (incubating.length) { + groups.push({ + name: "Incubating", + note: "Work in progress: expect missing features and rough edges.", + devices: incubating, + }); + } + return groups; + }); + + // Installer targets of a device page. The installer id defaults to the file + // name; `installer` in the frontmatter overrides it with one id or a list of + // ids / { id, label } entries for devices with several firmware builds. + eleventyConfig.addFilter("installTargets", (installer, fileSlug) => { + if (installer === false) return []; + const entries = Array.isArray(installer) ? installer : [installer || fileSlug]; + return entries.map((entry) => (typeof entry === "string" ? { id: entry } : entry)); + }); + + // Pixel size of a PNG in docs/, read from its header, so screenshots of any + // size get correct width/height attributes. Small ones are shown as pixel art. + eleventyConfig.addFilter("pngSize", (src) => { + try { + const fd = fs.openSync(`docs${src}`, "r"); + const header = Buffer.alloc(24); + fs.readSync(fd, header, 0, 24, 0); + fs.closeSync(fd); + if (header.toString("latin1", 12, 16) !== "IHDR") return null; + return { width: header.readUInt32BE(16), height: header.readUInt32BE(20) }; + } catch { + return null; + } + }); + + // Second-level headings of rendered content, for the "On this page" list + eleventyConfig.addFilter("headings", (html) => + [...String(html).matchAll(/

]*>(.*?)<\/h2>/gs)].map((m) => ({ + id: m[1], + text: m[2].replace(/<[^>]+>/g, ""), + })), + ); + + return { + dir: { input: "docs", output: "_site" }, + markdownTemplateEngine: false, + }; +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..c30d2f3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1876 @@ +{ + "name": "tactility-website", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "tactility-website", + "devDependencies": { + "@11ty/eleventy": "^3.1.8", + "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.2", + "@fontsource-variable/inter": "^5.3.0", + "@fontsource-variable/jetbrains-mono": "^5.3.0", + "markdown-it": "^15.0.3", + "markdown-it-anchor": "^10.1.0", + "markdown-it-github-alerts": "^1.0.1" + } + }, + "node_modules/@11ty/chokidar-with-glob-support": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@11ty/chokidar-with-glob-support/-/chokidar-with-glob-support-1.1.1.tgz", + "integrity": "sha512-wyugY5VKwQ9OabCBNwa3BLwei54aV36jy8K3O762m/ZVKiczLvnKJN+JYGFL5Ct2faDoBr3Bp0AjNbZpz0xo3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.3", + "picomatch": "^4.0.7" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/chokidar-with-glob-support/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@11ty/chokidar-with-glob-support/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@11ty/dependency-tree": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree/-/dependency-tree-4.0.2.tgz", + "integrity": "sha512-RTF6VTZHatYf7fSZBUN3RKwiUeJh5dhWV61gDPrHhQF2/gzruAkYz8yXuvGLx3w3ZBKreGrR+MfYpSVkdbdbLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.1" + } + }, + "node_modules/@11ty/dependency-tree-esm": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@11ty/dependency-tree-esm/-/dependency-tree-esm-2.0.4.tgz", + "integrity": "sha512-MYKC0Ac77ILr1HnRJalzKDlb9Z8To3kXQCltx299pUXXUFtJ1RIONtULlknknqW8cLe19DLVgmxVCtjEFm7h0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.7", + "acorn": "^8.15.0", + "dependency-graph": "^1.0.0", + "normalize-path": "^3.0.0" + } + }, + "node_modules/@11ty/eleventy": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-3.1.8.tgz", + "integrity": "sha512-nzwVWco4TBETroX7yARBtHlX8P1TWfqHZtQKc5LQ4vyBSbE8dw8lA5gsMWs9VpWqWoLdfnHCLl/r8hT8qOFvwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@11ty/chokidar-with-glob-support": "^1.1.0", + "@11ty/dependency-tree": "^4.0.2", + "@11ty/dependency-tree-esm": "^2.0.4", + "@11ty/eleventy-dev-server": "^2.1.2", + "@11ty/eleventy-plugin-bundle": "^3.0.7", + "@11ty/eleventy-utils": "^2.0.7", + "@11ty/lodash-custom": "^4.17.21", + "@11ty/posthtml-urls": "^1.0.3", + "@11ty/recursive-copy": "^4.0.6", + "@sindresorhus/slugify": "^2.2.1", + "bcp-47-normalize": "^2.3.0", + "debug": "^4.4.3", + "dependency-graph": "^1.0.0", + "entities": "^6.0.1", + "filesize": "^10.1.6", + "gray-matter": "npm:@11ty/gray-matter@^1.0.0", + "iso-639-1": "^3.1.6", + "js-yaml": "^4.1.1", + "kleur": "^4.1.5", + "liquidjs": "^10.30.0", + "luxon": "^3.7.2", + "markdown-it": "^14.3.3", + "minimist": "^1.2.8", + "moo": "0.5.2", + "node-retrieve-globals": "^6.0.1", + "nunjucks": "^3.2.4", + "picomatch": "^4.0.7", + "please-upgrade-node": "^3.2.0", + "posthtml": "^0.16.7", + "posthtml-match-helper": "^2.0.3", + "semver": "^7.8.5", + "slugify": "^1.6.9", + "tinyglobby": "^0.2.16" + }, + "bin": { + "eleventy": "cmd.cjs" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-dev-server": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-dev-server/-/eleventy-dev-server-2.1.2.tgz", + "integrity": "sha512-cwReJlQtIZsFuwMhm2fXwwjj+uUVvRkuoESgDtR5Mg9tY2qRj8UbNC8xhYRBuYVpACd3E09CxGPkk/Qj15Zo+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@11ty/chokidar-with-glob-support": "^1.1.0", + "@11ty/eleventy-utils": "^2.0.1", + "debug": "^4.4.0", + "finalhandler": "^1.3.1", + "mime": "^3.0.0", + "minimist": "^1.2.8", + "morphdom": "^2.7.4", + "please-upgrade-node": "^3.2.0", + "send": "^1.1.0", + "ssri": "^11.0.0", + "urlpattern-polyfill": "^10.0.0", + "ws": "^8.18.1" + }, + "bin": { + "eleventy-dev-server": "cmd.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-plugin-bundle": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-bundle/-/eleventy-plugin-bundle-3.0.7.tgz", + "integrity": "sha512-QK1tRFBhQdZASnYU8GMzpTdsMMFLVAkuU0gVVILqNyp09xJJZb81kAS3AFrNrwBCsgLxTdWHJ8N64+OTTsoKkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@11ty/eleventy-utils": "^2.0.2", + "debug": "^4.4.0", + "posthtml-match-helper": "^2.0.3" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-plugin-syntaxhighlight": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-syntaxhighlight/-/eleventy-plugin-syntaxhighlight-5.0.2.tgz", + "integrity": "sha512-T6xVVRDJuHlrFMHbUiZkHjj5o1IlLzZW+1IL9eUsyXFU7rY2ztcYhZew/64vmceFFpQwzuSfxQOXxTJYmKkQ+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "prismjs": "^1.30.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy-utils": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-2.0.7.tgz", + "integrity": "sha512-6QE+duqSQ0GY9rENXYb4iPR4AYGdrFpqnmi59tFp9VrleOl0QSh8VlBr2yd6dlhkdtj7904poZW5PvGr9cMiJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/eleventy/node_modules/linkify-it": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", + "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/@11ty/eleventy/node_modules/markdown-it": { + "version": "14.3.3", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.3.tgz", + "integrity": "sha512-L//tDAkjTjJCU6pBUSBTgs3Kg4InVaZuUZog/b6V12UKhcDQ7S78877ibbCanRExwPuYP1CZD7Gd2dxSy1GXRg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.5.0", + "linkify-it": "^5.0.2", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/@11ty/eleventy/node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/@11ty/eleventy/node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@11ty/lodash-custom": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@11ty/lodash-custom/-/lodash-custom-4.17.21.tgz", + "integrity": "sha512-Mqt6im1xpb1Ykn3nbcCovWXK3ggywRJa+IXIdoz4wIIK+cvozADH63lexcuPpGS/gJ6/m2JxyyXDyupkMr5DHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/11ty" + } + }, + "node_modules/@11ty/posthtml-urls": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@11ty/posthtml-urls/-/posthtml-urls-1.0.3.tgz", + "integrity": "sha512-1YvhnkaNlFnnJic1rBMWmTC2adbuy+JQiBfl1Hecr1Wjjik1pQZmGyk/eC9zKX/FQv52s2Nht1Gi/UwhYqrBeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "evaluate-value": "^2.0.0", + "http-equiv-refresh": "^2.0.1", + "list-to-array": "^1.1.0", + "parse-srcset": "^1.0.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@11ty/recursive-copy": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@11ty/recursive-copy/-/recursive-copy-4.0.6.tgz", + "integrity": "sha512-+mdqG79jXufZnY0nD/ZWOsT7i8lxqXRtaO0TotpV4fD3qrHlPonEz2izTsbENAlzpsq5+QpwuHnH4RZoalx44g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.21", + "errno": "^1.0.0", + "junk": "^3.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@fontsource-variable/inter": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource-variable/inter/-/inter-5.3.0.tgz", + "integrity": "sha512-OupL48va4JNofb97w6NYeF9S7W/kHNKM0Er8Dem5nqi4jeOLrVJDoE8tZEpnMJmtkvNbB1EIPPwHcdkF6b1oUA==", + "dev": true, + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@fontsource-variable/jetbrains-mono": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource-variable/jetbrains-mono/-/jetbrains-mono-5.3.0.tgz", + "integrity": "sha512-F32xpS2NsGYoQi2ADSkKTgpJj7ozajsGgDJ8woTnqjmIB+dxDIqImjl4pXZVEExu8UFZ2ndhmX18EBS/hdz3Lw==", + "dev": true, + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@sindresorhus/slugify": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-2.2.1.tgz", + "integrity": "sha512-MkngSCRZ8JdSOCHRaYd+D01XhvU3Hjy6MGl06zhOk614hp9EOAp5gIkBeQg7wtmxpitU6eAL4kdiRMcJa2dlrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/transliterate": "^1.0.0", + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sindresorhus/transliterate": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-1.6.0.tgz", + "integrity": "sha512-doH1gimEu3A46VX6aVxpHTeHrytJAG6HgdxntYnCFiIFHEM/ZGpG8KiZGBChchjQmG0XFIBL552kBTjVcMZXwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.19.0.tgz", + "integrity": "sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bcp-47": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.2.tgz", + "integrity": "sha512-wsv86UuNFuPnVieKLyECTT+CP1WSAHeoIg5P3xu2kA9Z+7fVPoKt7dxzSeEhtJel0AI+NW3fIW3KtTKQKUCngg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-normalize": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bcp-47-normalize/-/bcp-47-normalize-2.3.0.tgz", + "integrity": "sha512-8I/wfzqQvttUFz7HVJgIZ7+dj3vUaIyIxYXaTRP1YWoSDfzt6TUmxaKZeuXR62qBmYr+nvuWINFRl6pZ5DlN4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "bcp-47": "^2.0.0", + "bcp-47-match": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.22.tgz", + "integrity": "sha512-CKLDTuSsN0+r1ThM0WkzzBI7dnPI6xEGfa/JnVYIK9JNBA1N1NyPwXVHor//NKD/y3sDxp764sZdLhFK7pH8XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dependency-graph": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", + "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.1.tgz", + "integrity": "sha512-Ev/hIyePLZtpL98x562lvPtenrUfGr0lfaf44HFZ+hDEwso7ccV9QAZrEVLg0hxNAzygaAFxy2dYaAKKM0G06A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/errno/-/errno-1.0.0.tgz", + "integrity": "sha512-3zV5mFS1E8/1bPxt/B0xxzI1snsg3uSCIh6Zo1qKg6iMw93hzPANk9oBFzSFBFrwuVoQuE3rLoouAUfwOAj1wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esm-import-transformer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/esm-import-transformer/-/esm-import-transformer-3.0.5.tgz", + "integrity": "sha512-1GKLvfuMnnpI75l8c6sHoz0L3Z872xL5akGuBudgqTDPv4Vy6f2Ec7jEMKTxlqWl/3kSvNbHELeimJtnqgYniw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/evaluate-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/evaluate-value/-/evaluate-value-2.0.0.tgz", + "integrity": "sha512-VonfiuDJc0z4sOO7W0Pd130VLsXN6vmBWZlrog1mCb/o7o/Nl5Lr25+Kj/nkCCAhG+zqeeGjxhkK9oHpkgTHhQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/filesize": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", + "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 10.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gray-matter": { + "name": "@11ty/gray-matter", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@11ty/gray-matter/-/gray-matter-1.0.0.tgz", + "integrity": "sha512-7mJJl+wf1AByoT0PknQiQfOPnVNT4fevGrUBVWO4HXsnYn1aQPyRyrELYrNUFleUBM++KzMKN6QaxHPk0t/6/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^4.1.0", + "kind-of": "^6.0.3", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=11" + } + }, + "node_modules/htmlparser2": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", + "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.2", + "domutils": "^2.8.0", + "entities": "^3.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-equiv-refresh": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-equiv-refresh/-/http-equiv-refresh-2.0.1.tgz", + "integrity": "sha512-XJpDL/MLkV3dKwLzHwr2dY05dYNfBNlyPu4STQ8WvKCFdc6vC5tPXuq28of663+gHVg03C+16pHHs/+FmmDjcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-json": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-json/-/is-json-2.0.1.tgz", + "integrity": "sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/iso-639-1": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/iso-639-1/-/iso-639-1-3.1.6.tgz", + "integrity": "sha512-ZFar/L4ngX7wZh2QX+Fiftmuf0igWJsrJtfizrovWifF1gAWkfmRa5Z1m0LQZbm0hKCHRDYhLRSLFrSqNe4EJA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/linkify-it": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-6.1.0.tgz", + "integrity": "sha512-wJ/TwpSDTLepCrQoYWYIExIKg5Zchex2Nn5yk2mFnB+6PtdkHtyLx742md9csRjjOnGkKIS/RrbY7l8D6gT9Vw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", + "dependencies": { + "uc.micro": "^3.0.0" + } + }, + "node_modules/liquidjs": { + "version": "10.30.1", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.30.1.tgz", + "integrity": "sha512-P1Iz14WUHZdfbOYwHOIhtl/iAWIOYk1ks5l9rPZlDM6vZo+6BLeYIuWHAPkIz+U8Mm8HKZKITIrjX7DQJO2fqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "^10.0.0" + }, + "bin": { + "liquid": "bin/liquid.js", + "liquidjs": "bin/liquid.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/liquidjs" + } + }, + "node_modules/list-to-array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/list-to-array/-/list-to-array-1.1.0.tgz", + "integrity": "sha512-+dAZZ2mM+/m+vY9ezfoueVvrgnHIGi5FvgSymbIgJOFwiznWyA59mav95L+Mc6xPtL3s9gm5eNTlNtxJLbNM1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/luxon": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/markdown-it": { + "version": "15.0.3", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-15.0.3.tgz", + "integrity": "sha512-+Az7Ojz3iRGu8KYMvJ6xVhvrxP3eE+vEtJX75Ow88XBpcQNV/0lGX5ZynIIBftREo4DC2jsveAMDaeltmm8QvQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^3.0.3", + "entities": "^8.1.0", + "linkify-it": "^6.1.0", + "mdurl": "^2.1.0", + "punycode.js": "^2.3.1", + "uc.micro": "^3.0.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it-anchor": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-10.1.0.tgz", + "integrity": "sha512-htMTOUnoGqoWguddWO+NBrOEdh3dt9k1RIhTlr2CQTJOPiLZglDDGADu+Ch+47roTO6nxl2aJfSYykmOhdJCew==", + "dev": true, + "license": "Unlicense", + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + }, + "peerDependenciesMeta": { + "@types/markdown-it": { + "optional": true + } + } + }, + "node_modules/markdown-it-github-alerts": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/markdown-it-github-alerts/-/markdown-it-github-alerts-1.0.1.tgz", + "integrity": "sha512-NNATF4QdoGI07hyCitoB2YqJ1YcNVCKT89ut2VtfFY9rkeFCXe/V2lOonKQLpJiq5DjiZZepf97BJx5xOjFIAw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "markdown-it": ">= 13.0.0" + } + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-3.0.4.tgz", + "integrity": "sha512-fwWK3Zq22l4XJJjx5mcBHGikIk+hJqO+32dPm0Jur7+rtG5x1scOjSfdT9ZKeWHPpsya/l0HHK4tDImBkTrtvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "PSF-2.0" + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.1.0.tgz", + "integrity": "sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/mdurl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.1.0.tgz", + "integrity": "sha512-1+HBaOx0zi/dQWht8rNv9MYf9qqpqL/kxI0hXImU6Y547zM6Sni8BQibt7ifgMcYtQg41ao3Ivd6cnSM86inpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/morphdom": { + "version": "2.7.8", + "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.7.8.tgz", + "integrity": "sha512-D/fR4xgGUyVRbdMGU6Nejea1RFzYxYtyurG4Fbv2Fi/daKlWKuXGLOdXtl+3eIwL110cI2hz1ZojGICjjFLgTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-retrieve-globals": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/node-retrieve-globals/-/node-retrieve-globals-6.0.1.tgz", + "integrity": "sha512-j0DeFuZ/Wg3VlklfbxUgZF/mdHMTEiEipBb3q0SpMMbHaV3AVfoUQF8UGxh1s/yjqO0TgRZd4Pi/x2yRqoQ4Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.1", + "acorn-walk": "^8.3.4", + "esm-import-transformer": "^3.0.3" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nunjucks": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.2.4.tgz", + "integrity": "sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/nunjucks/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/on-finished": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.2.tgz", + "integrity": "sha512-ATWUv387i+nLD49EiDoOft5scf32Vsdz3ktrQJG9bi7jRFmaXTssvyvj1EmeKVVgvesbqUtvQQvaS2TpTukAZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/parse-srcset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver-compare": "^1.0.0" + } + }, + "node_modules/posthtml": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.16.7.tgz", + "integrity": "sha512-7Hc+IvlQ7hlaIfQFZnxlRl0jnpWq2qwibORBhQYIb0QbNtuicc5ZxvKkVT71HJ4Py1wSZ/3VR1r8LfkCtoCzhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "posthtml-parser": "^0.11.0", + "posthtml-render": "^3.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/posthtml-match-helper": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/posthtml-match-helper/-/posthtml-match-helper-2.0.3.tgz", + "integrity": "sha512-p9oJgTdMF2dyd7WE54QI1LvpBIkNkbSiiECKezNnDVYhGhD1AaOnAkw0Uh0y5TW+OHO8iBdSqnd8Wkpb6iUqmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "posthtml": "^0.16.6" + } + }, + "node_modules/posthtml-parser": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.11.0.tgz", + "integrity": "sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "htmlparser2": "^7.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/posthtml-render": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-3.0.0.tgz", + "integrity": "sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-json": "^2.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/range-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", + "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/semver": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.6.tgz", + "integrity": "sha512-9lpSSU4Mly3mrtruwLs1eLK6+gzbzqeBFwRNjIjE+9LuDpWdYctrQlQ3ej1Ilgi7gknpsTRnPoLP8DpCHqHIJw==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "dev": true, + "license": "MIT" + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slugify": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz", + "integrity": "sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/ssri": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-11.0.0.tgz", + "integrity": "sha512-aZpUoMN/Jj2MqA4vMCeiKGnc/8SuSyHbGSBdgFbZxP8OJGF/lFkIuElzPxsN0q8TQQ+prw3P4EDfB3TBHHgfXw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/uc.micro": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-3.0.0.tgz", + "integrity": "sha512-U3PppEkleoTnIfi8BozMx3yju3qc/L6SwqWo2Sw+54PX+PX0q9I+r1Um5HCmqD7n9VDX5/v3vQH/AjA6deDdtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/urlpattern-polyfill": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.1.0.tgz", + "integrity": "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ws": { + "version": "8.22.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.22.2.tgz", + "integrity": "sha512-/rEZ2ejown2N5gxVTHUu9bVVC7ttu0/Tgzf5hbTOixR3Fs7mbbXgn2DbdbcKgJOmpQMtrIUWivtYuVMnp/W/yA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..81f42d6 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "tactility-website", + "private": true, + "type": "module", + "scripts": { + "start": "eleventy --serve", + "build": "eleventy" + }, + "devDependencies": { + "@11ty/eleventy": "^3.1.8", + "@11ty/eleventy-plugin-syntaxhighlight": "^5.0.2", + "@fontsource-variable/inter": "^5.3.0", + "@fontsource-variable/jetbrains-mono": "^5.3.0", + "markdown-it": "^15.0.3", + "markdown-it-anchor": "^10.1.0", + "markdown-it-github-alerts": "^1.0.1" + } +}