diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..afa33097 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,54 @@ +name: Docs + +on: + push: + branches: [main] + paths: + - 'user-docs/**' + - 'website/**' + - 'scripts/build_site.py' + - '.github/workflows/docs.yml' + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +# Allow one concurrent deployment; don't cancel an in-progress publish. +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-node@v6 + with: + node-version: '20' + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + - name: Assemble VitePress source + run: python3 scripts/build_site.py + - name: Install & build + working-directory: website + run: | + npm install + npm run build + - uses: actions/configure-pages@v5 + - uses: actions/upload-pages-artifact@v3 + with: + path: website/dist + + deploy: + needs: build + runs-on: ubuntu-latest + 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 9a428ccb..31b2e919 100644 --- a/.gitignore +++ b/.gitignore @@ -13,5 +13,12 @@ internal/ui/embedded/export/export.js node_modules/ tmp/ +__pycache__/ .requirements/ + +# VitePress docs site: generated srcDir, build output, cache, and locale config. +website/src/ +website/dist/ +website/.vitepress/cache/ +website/.vitepress/locales.generated.json diff --git a/Makefile b/Makefile index 87e9eba5..32a37f14 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: build setup frontend-setup go-setup root-setup frontend-build frontend-test frontend-knip frontend-lint frontend-format-check extension-test memory-test go-test install-test vet test check clean dev release-patch release-minor release-major release-beta e2e e2e-setup +.PHONY: build setup frontend-setup go-setup root-setup frontend-build frontend-test frontend-knip frontend-lint frontend-format-check extension-test memory-test go-test install-test vet test check clean dev docs docs-dev release-patch release-minor release-major release-beta e2e e2e-setup BINARY ?= pi-web WEB_DIR := web @@ -88,6 +88,16 @@ clean: rm -f $(BINARY) rm -rf $(WEB_DIR)/dist +# Docs site (VitePress). Assemble the generated srcDir from user-docs + authored +# pages, then build/preview. Not part of `make check` — never gates the app. +docs: + python3 scripts/build_site.py + cd website && npm install && npm run build + +docs-dev: + python3 scripts/build_site.py + cd website && npm install && npm run dev + # Release helpers — bump package.json, commit, tag, and push. # Uses npm version which auto-creates a vX.Y.Z git tag. release-patch: diff --git a/scripts/build_site.py b/scripts/build_site.py new file mode 100644 index 00000000..bdf99462 --- /dev/null +++ b/scripts/build_site.py @@ -0,0 +1,195 @@ +#!/usr/bin/env python3 +"""Assemble the VitePress source tree (website/src) for the docs site. + +Source of truth stays in user-docs/ — prose in user-docs//*.md and the +hero in user-docs//hero.json (translated by build_userdocs.py). This +script produces the generated, gitignored srcDir VitePress builds from, so docs +are never duplicated by hand. + +For every language it: + 1. Renders a localized hero home page (index.md) from user-docs//hero.json + (falling back to the English user-docs/en/hero.json if a locale lacks one). + 2. Transforms each user-docs//*.md into a localized VitePress page + (README -> guide), copies shared images into public/. + 3. Emits .vitepress/locales.generated.json (labels + per-locale sidebars) + consumed by config.js to wire up the language switcher. + +The language list is imported from build_userdocs so a new language is added in +one place (its LANGS list), exactly like the rest of the docs pipeline. +""" + +import json +import re +import shutil +from pathlib import Path + +from build_userdocs import LANGS + +ROOT = Path(__file__).resolve().parent.parent +SITE = ROOT / "website" +SRC = SITE / "src" +USER_DOCS = ROOT / "user-docs" +ASSETS = USER_DOCS / "assets" +LOCALES_JSON = SITE / ".vitepress" / "locales.generated.json" + +PACKAGE_URL = "https://pi.dev/packages/@ygncode/pi-web?name=pi-web" + +# Browser/SEO for the home page (titleTemplate:false keeps it verbatim). +HOME_TITLE = "pi-web - Web UI for Pi (Access pi via Remote, Mobile)" + +# Reading order for the sidebar. README becomes the "guide" page per locale. +DOC_ORDER = [ + "README", + "why", + "install", + "personal-assistant", + "keyboard-shortcuts", + "llm-debug", + "roadmap", +] + +# BCP-47 tags for the <html lang> attribute, keyed by user-docs dir name. +LANG_TAGS = { + "en": "en-US", + "es": "es", + "fr": "fr", + "de": "de", + "zh": "zh-Hans", + "ja": "ja", + "id": "id", + "ms": "ms", + "vi": "vi", + "th": "th", + "fil": "fil", + "my": "my", + "km": "km", + "lo": "lo", +} + +# Sidebar title for docs with no Markdown heading to derive one from. +FALLBACK_TITLES = {"llm-debug": "LLM Debugging"} + +# The language-switcher nav block authored for GitHub rendering: the only +# <div align="center"> in a README, recognizable by its README.md) links. +NAV_BLOCK_RE = re.compile( + r'<div align="center">\s*\n.*?README\.md\).*?</div>\n*', + re.DOTALL, +) + + +def slug(code: str, doc: str) -> str: + name = "guide" if doc == "README" else doc + return f"/{name}" if code == "en" else f"/{code}/{name}" + + +def transform(text: str, doc: str, code: str) -> str: + if doc == "README": + text = NAV_BLOCK_RE.sub("", text, count=1) + # Shared images: ../assets/x -> /assets/x (served from public/, base-prefixed). + text = text.replace("](../assets/", "](/assets/") + # The lone cross-doc link to the README (in roadmap). English slugs match the + # English headings; translated headings slugify differently, so drop the + # fragment for locales to avoid a dead anchor. + if code == "en": + text = re.sub(r"\]\(README\.md#([^)]*)\)", r"](/guide#\1)", text) + else: + text = re.sub(r"\]\(README\.md#[^)]*\)", f"](/{code}/guide)", text) + return re.sub(r"\n{3,}", "\n\n", text).lstrip("\n") + + +def page_title(text: str, doc: str) -> str: + match = re.search(r"^#\s+(.+)$", text, re.MULTILINE) + if match: + return match.group(1).strip() + return FALLBACK_TITLES.get(doc, doc.replace("-", " ").title()) + + +def yaml_scalar(value: str) -> str: + # JSON strings are valid double-quoted YAML scalars (escaping + emoji safe). + return json.dumps(value, ensure_ascii=False) + + +def render_hero(code: str) -> str: + path = USER_DOCS / code / "hero.json" + if not path.exists(): + path = USER_DOCS / "en" / "hero.json" + hero = json.loads(path.read_text()) + + lines = [ + "---", + "layout: home", + f"title: {yaml_scalar(HOME_TITLE)}", + "titleTemplate: false", + "", + "hero:", + ' name: "pi-web"', + f" text: {yaml_scalar(hero['text'])}", + f" tagline: {yaml_scalar(hero['tagline'])}", + " actions:", + ] + for action in hero["actions"]: + link = action.get("link") or ( + f"/{action['to']}" if code == "en" else f"/{code}/{action['to']}" + ) + lines += [ + f" - theme: {action.get('theme', 'brand')}", + f" text: {yaml_scalar(action['text'])}", + f" link: {yaml_scalar(link)}", + ] + # The hero image (demo GIF + caption) is rendered for every locale by the + # home-hero-image theme slot (HeroImage.vue), not via per-locale frontmatter. + lines += ["", "features:"] + for feature in hero["features"]: + lines += [ + f" - icon: {yaml_scalar(feature['icon'])}", + f" title: {yaml_scalar(feature['title'])}", + f" details: {yaml_scalar(feature['details'])}", + ] + lines += ["---", ""] + return "\n".join(lines) + + +def main() -> None: + if SRC.exists(): + shutil.rmtree(SRC) + SRC.mkdir(parents=True) + + dest_assets = SRC / "public" / "assets" + dest_assets.mkdir(parents=True, exist_ok=True) + for path in ASSETS.glob("*"): + if path.is_file(): + shutil.copy2(path, dest_assets / path.name) + + locales = {} + for code, label in LANGS: + out_dir = SRC if code == "en" else SRC / code + out_dir.mkdir(parents=True, exist_ok=True) + + (out_dir / "index.md").write_text(render_hero(code)) + + sidebar = [] + for doc in DOC_ORDER: + text = transform((USER_DOCS / code / f"{doc}.md").read_text(), doc, code) + name = "guide" if doc == "README" else doc + (out_dir / f"{name}.md").write_text(text) + sidebar.append({"text": page_title(text, doc), "link": slug(code, doc)}) + + theme = { + "nav": [ + {"text": "Guide", "link": slug(code, "README")}, + {"text": "pi.dev", "link": PACKAGE_URL}, + ], + "sidebar": sidebar, + } + key = "root" if code == "en" else code + entry = {"label": label, "lang": LANG_TAGS[code], "themeConfig": theme} + if code != "en": + entry["link"] = f"/{code}/" + locales[key] = entry + + LOCALES_JSON.write_text(json.dumps(locales, ensure_ascii=False, indent=2) + "\n") + print(f"Assembled VitePress src at {SRC.relative_to(ROOT)} ({len(LANGS)} locales)") + + +if __name__ == "__main__": + main() diff --git a/scripts/build_userdocs.py b/scripts/build_userdocs.py index 1485c2de..d665abc8 100644 --- a/scripts/build_userdocs.py +++ b/scripts/build_userdocs.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import json import re import subprocess import sys @@ -116,6 +117,66 @@ def build_doc(doc: str, code: str) -> str: return translate(src, code) + "\n" +# hero.json drives the docs-site home page (see scripts/build_site.py). Only its +# string values are translated; keys, links, icons, and structure are preserved. +HERO_PROMPT = """Translate the string VALUES of this JSON object into {target}. + +Rules: +- Output ONLY valid JSON with the exact same keys. No preamble, no commentary, no code fence. +- Translate every value into {target}. +- Keep these terms in English / as-is: pi, pi-web, PWA, SSE, Tailscale, GitHub, Gist, macOS, Linux, Windows, npm, Claude, Cowork, Termius. +- Preserve emoji, punctuation, and the em dash (—). + +{payload} +""" + + +def hero_strings(hero: dict) -> list[tuple]: + paths = [("text",), ("tagline",)] + paths += [("actions", i, "text") for i in range(len(hero["actions"]))] + for i in range(len(hero["features"])): + paths += [("features", i, "title"), ("features", i, "details")] + return paths + + +def build_hero(code: str) -> str: + hero = json.loads((EN_DIR / "hero.json").read_text()) + if code == "en": + return json.dumps(hero, ensure_ascii=False, indent=2) + "\n" + paths = hero_strings(hero) + payload = json.dumps( + {str(i): _at(hero, p) for i, p in enumerate(paths)}, ensure_ascii=False, indent=2 + ) + prompt = HERO_PROMPT.format(target=TRANSLATE_TARGET[code], payload=payload) + result = subprocess.run( + ["pi", "-p", "--model", "opencode-go/deepseek-v4-pro", "--no-session", prompt], + capture_output=True, + text=True, + timeout=600, + ) + if result.returncode != 0: + raise RuntimeError(f"pi failed for {code} hero: {result.stderr}") + out = re.sub(r"\n```$", "", re.sub(r"^```[a-zA-Z]*\n", "", result.stdout.strip())) + data = json.loads(out) + if len(data) != len(paths): + raise RuntimeError(f"{code} hero: expected {len(paths)} strings, got {len(data)}") + for i, path in enumerate(paths): + _set(hero, path, data[str(i)]) + return json.dumps(hero, ensure_ascii=False, indent=2) + "\n" + + +def _at(obj, path): + for key in path: + obj = obj[key] + return obj + + +def _set(obj, path, value): + for key in path[:-1]: + obj = obj[key] + obj[path[-1]] = value + + def main(): only = sys.argv[1:] # optional list of lang codes for code, name in LANGS: @@ -132,7 +193,9 @@ def main(): else: content = build_doc(doc, code) (out_dir / f"{doc}.md").write_text(content) - print(f"[{code}] done ({len(DOCS)} docs)", flush=True) + print(f"[{code}] hero…", flush=True) + (out_dir / "hero.json").write_text(build_hero(code)) + print(f"[{code}] done ({len(DOCS)} docs + hero)", flush=True) if __name__ == "__main__": diff --git a/user-docs/assets/icon.svg b/user-docs/assets/icon.svg new file mode 100644 index 00000000..c28d6242 --- /dev/null +++ b/user-docs/assets/icon.svg @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 800"> + <rect width="800" height="800" rx="120" fill="#09090b"/> + <path fill="#fff" fill-rule="evenodd" d=" + M165.29 165.29 + H517.36 + V400 + H400 + V517.36 + H282.65 + V634.72 + H165.29 + Z + M282.65 282.65 + V400 + H400 + V282.65 + Z + "/> + <path fill="#fff" d="M517.36 400 H634.72 V634.72 H517.36 Z"/> +</svg> diff --git a/user-docs/assets/og-image.png b/user-docs/assets/og-image.png new file mode 100644 index 00000000..47827c25 Binary files /dev/null and b/user-docs/assets/og-image.png differ diff --git a/user-docs/assets/pi-web-demo.gif b/user-docs/assets/pi-web-demo.gif new file mode 100644 index 00000000..95761a9b Binary files /dev/null and b/user-docs/assets/pi-web-demo.gif differ diff --git a/user-docs/de/hero.json b/user-docs/de/hero.json new file mode 100644 index 00000000..88e88d2d --- /dev/null +++ b/user-docs/de/hero.json @@ -0,0 +1,53 @@ +{ + "text": "Steuere deinen pi Coding Agent aus der Ferne", + "tagline": "Eine schöne Web-UI und PWA für pi — durchsuche, lies und setze deine KI-Coding-Sessions von jedem Browser und jedem Gerät aus fort.", + "actions": [ + { + "theme": "brand", + "text": "Loslegen", + "to": "guide" + }, + { + "theme": "alt", + "text": "Installieren", + "to": "install" + }, + { + "theme": "alt", + "text": "Auf GitHub ansehen", + "link": "https://github.com/ygncode/pi-web" + } + ], + "features": [ + { + "icon": "📱", + "title": "Von überall fortsetzen", + "details": "Setze eine Session von deinem Handy, Tablet oder einem anderen Rechner aus fort. Kein SSH, kein Termius — öffne einfach deinen Browser." + }, + { + "icon": "🗂️", + "title": "Multi-Session-Dashboard", + "details": "Starte die Arbeit in einer Session, während du einer anderen zuschaust. Suche projektübergreifend, filtere nach Branch, finde schnell, was du brauchst." + }, + { + "icon": "🔓", + "title": "Open-Source & modellunabhängig", + "details": "pi ist vollständig quelloffen und anbieterunabhängig. Wähle ein beliebiges Modell, wechsle wann immer du willst — du bist an keinen Anbieter gebunden." + }, + { + "icon": "🔒", + "title": "Sicherer Fernzugriff", + "details": "Integrierte Token-Authentifizierung, damit du es sorgenfrei in deinem LAN oder über Tailscale bereitstellen kannst." + }, + { + "icon": "📤", + "title": "Teile deine Arbeit", + "details": "Exportiere Sessions mit einem Klick als statische Snapshots oder geheime GitHub Gists." + }, + { + "icon": "🏠", + "title": "Dein persönlicher KI-Arbeitsbereich", + "details": "Installiere es wie eine native PWA und verwandle es in einen persönlichen Assistenten, der auf deinem Rechner lebt." + } + ] +} diff --git a/user-docs/en/hero.json b/user-docs/en/hero.json new file mode 100644 index 00000000..61d3a8d9 --- /dev/null +++ b/user-docs/en/hero.json @@ -0,0 +1,41 @@ +{ + "text": "Remote-control your pi coding agent", + "tagline": "A beautiful web UI and PWA for pi — browse, read, and continue your AI coding sessions from any browser, on any device.", + "actions": [ + { "theme": "brand", "text": "Get Started", "to": "guide" }, + { "theme": "alt", "text": "Install", "to": "install" }, + { "theme": "alt", "text": "View on GitHub", "link": "https://github.com/ygncode/pi-web" } + ], + "features": [ + { + "icon": "📱", + "title": "Resume from anywhere", + "details": "Continue a session from your phone, tablet, or another computer. No SSH, no Termius — just open your browser." + }, + { + "icon": "🗂️", + "title": "Multi-session dashboard", + "details": "Kick off work in one session while watching another stream. Search across projects, filter by branch, find what you need fast." + }, + { + "icon": "🔓", + "title": "Open-source & model-agnostic", + "details": "pi is fully open source and provider-agnostic. Pick any model, switch whenever you like — you're not locked to a vendor." + }, + { + "icon": "🔒", + "title": "Safe remote access", + "details": "Built-in token auth so you can expose it on your LAN or over Tailscale without worry." + }, + { + "icon": "📤", + "title": "Share your work", + "details": "Export sessions as static snapshots or secret GitHub Gists in one click." + }, + { + "icon": "🏠", + "title": "Your personal AI workspace", + "details": "Install it like a native PWA and turn it into a personal assistant that lives on your machine." + } + ] +} diff --git a/user-docs/es/hero.json b/user-docs/es/hero.json new file mode 100644 index 00000000..09cf6f79 --- /dev/null +++ b/user-docs/es/hero.json @@ -0,0 +1,53 @@ +{ + "text": "Controla remotamente tu agente de codificación pi", + "tagline": "Una hermosa interfaz web y PWA para pi — explora, lee y continúa tus sesiones de codificación con IA desde cualquier navegador, en cualquier dispositivo.", + "actions": [ + { + "theme": "brand", + "text": "Comenzar", + "to": "guide" + }, + { + "theme": "alt", + "text": "Instalar", + "to": "install" + }, + { + "theme": "alt", + "text": "Ver en GitHub", + "link": "https://github.com/ygncode/pi-web" + } + ], + "features": [ + { + "icon": "📱", + "title": "Retoma desde cualquier lugar", + "details": "Continúa una sesión desde tu teléfono, tableta u otra computadora. Sin SSH, sin Termius — solo abre tu navegador." + }, + { + "icon": "🗂️", + "title": "Panel de múltiples sesiones", + "details": "Inicia trabajo en una sesión mientras observas otra transmitiendo. Busca entre proyectos, filtra por rama, encuentra lo que necesitas rápido." + }, + { + "icon": "🔓", + "title": "Código abierto y compatible con cualquier modelo", + "details": "pi es completamente de código abierto e independiente del proveedor. Elige cualquier modelo, cambia cuando quieras — no estás atado a un proveedor." + }, + { + "icon": "🔒", + "title": "Acceso remoto seguro", + "details": "Autenticación por token integrada para que puedas exponerlo en tu LAN o a través de Tailscale sin preocupaciones." + }, + { + "icon": "📤", + "title": "Comparte tu trabajo", + "details": "Exporta sesiones como instantáneas estáticas o Gists secretos de GitHub en un solo clic." + }, + { + "icon": "🏠", + "title": "Tu espacio de trabajo personal de IA", + "details": "Instálalo como una PWA nativa y conviértelo en un asistente personal que vive en tu máquina." + } + ] +} diff --git a/user-docs/fil/hero.json b/user-docs/fil/hero.json new file mode 100644 index 00000000..08c7a783 --- /dev/null +++ b/user-docs/fil/hero.json @@ -0,0 +1,53 @@ +{ + "text": "I-remote-control ang iyong pi coding agent", + "tagline": "Isang magandang web UI at PWA para sa pi — mag-browse, magbasa, at magpatuloy ng iyong AI coding sessions mula sa kahit anong browser, sa kahit anong device.", + "actions": [ + { + "theme": "brand", + "text": "Magsimula", + "to": "guide" + }, + { + "theme": "alt", + "text": "I-install", + "to": "install" + }, + { + "theme": "alt", + "text": "Tingnan sa GitHub", + "link": "https://github.com/ygncode/pi-web" + } + ], + "features": [ + { + "icon": "📱", + "title": "Magpatuloy mula sa kahit saan", + "details": "Ipagpatuloy ang isang session mula sa iyong telepono, tablet, o ibang computer. Walang SSH, walang Termius — buksan lang ang iyong browser." + }, + { + "icon": "🗂️", + "title": "Multi-session dashboard", + "details": "Magsimula ng trabaho sa isang session habang pinapanood ang isa pang stream. Maghanap sa iba't ibang proyekto, i-filter ayon sa branch, hanapin ang kailangan mo nang mabilis." + }, + { + "icon": "🔓", + "title": "Open-source at model-agnostic", + "details": "Ang pi ay ganap na open source at provider-agnostic. Pumili ng kahit anong modelo, magpalit kahit kailan mo gusto — hindi ka nakatali sa isang vendor." + }, + { + "icon": "🔒", + "title": "Ligtas na remote access", + "details": "May built-in na token auth upang mailantad mo ito sa iyong LAN o sa pamamagitan ng Tailscale nang walang pag-aalala." + }, + { + "icon": "📤", + "title": "Ibahagi ang iyong gawa", + "details": "I-export ang mga session bilang static snapshots o secret GitHub Gists sa isang click." + }, + { + "icon": "🏠", + "title": "Ang iyong personal na AI workspace", + "details": "I-install ito tulad ng isang native PWA at gawin itong personal assistant na nakatira sa iyong machine." + } + ] +} diff --git a/user-docs/fr/hero.json b/user-docs/fr/hero.json new file mode 100644 index 00000000..201a22fc --- /dev/null +++ b/user-docs/fr/hero.json @@ -0,0 +1,53 @@ +{ + "text": "Pilotez votre agent de codage pi à distance", + "tagline": "Une interface web et PWA magnifique pour pi — parcourez, lisez et poursuivez vos sessions de codage IA depuis n'importe quel navigateur, sur n'importe quel appareil.", + "actions": [ + { + "theme": "brand", + "text": "Démarrer", + "to": "guide" + }, + { + "theme": "alt", + "text": "Installer", + "to": "install" + }, + { + "theme": "alt", + "text": "Voir sur GitHub", + "link": "https://github.com/ygncode/pi-web" + } + ], + "features": [ + { + "icon": "📱", + "title": "Reprenez où que vous soyez", + "details": "Continuez une session depuis votre téléphone, tablette ou un autre ordinateur. Pas de SSH, pas de Termius — ouvrez simplement votre navigateur." + }, + { + "icon": "🗂️", + "title": "Tableau de bord multi-sessions", + "details": "Lancez du travail dans une session tout en surveillant le flux d'une autre. Recherchez à travers les projets, filtrez par branche, trouvez rapidement ce dont vous avez besoin." + }, + { + "icon": "🔓", + "title": "Open source et indépendant des modèles", + "details": "pi est entièrement open source et indépendant des fournisseurs. Choisissez n'importe quel modèle, changez quand vous le souhaitez — vous n'êtes pas enfermé chez un fournisseur." + }, + { + "icon": "🔒", + "title": "Accès distant sécurisé", + "details": "Authentification par jeton intégrée pour pouvoir l'exposer sur votre réseau local ou via Tailscale sans inquiétude." + }, + { + "icon": "📤", + "title": "Partagez votre travail", + "details": "Exportez vos sessions sous forme d'instantanés statiques ou de Gists GitHub secrets en un clic." + }, + { + "icon": "🏠", + "title": "Votre espace de travail IA personnel", + "details": "Installez-le comme une PWA native et transformez-le en assistant personnel qui vit sur votre machine." + } + ] +} diff --git a/user-docs/id/hero.json b/user-docs/id/hero.json new file mode 100644 index 00000000..bce3e8f3 --- /dev/null +++ b/user-docs/id/hero.json @@ -0,0 +1,53 @@ +{ + "text": "Kendalikan dari jarak jauh agen coding pi Anda", + "tagline": "UI web dan PWA yang indah untuk pi — jelajahi, baca, dan lanjutkan sesi coding AI Anda dari browser apa pun, di perangkat apa pun.", + "actions": [ + { + "theme": "brand", + "text": "Mulai", + "to": "guide" + }, + { + "theme": "alt", + "text": "Pasang", + "to": "install" + }, + { + "theme": "alt", + "text": "Lihat di GitHub", + "link": "https://github.com/ygncode/pi-web" + } + ], + "features": [ + { + "icon": "📱", + "title": "Lanjutkan dari mana saja", + "details": "Lanjutkan sesi dari ponsel, tablet, atau komputer lain. Tanpa SSH, tanpa Termius — cukup buka browser Anda." + }, + { + "icon": "🗂️", + "title": "Dasbor multi-sesi", + "details": "Mulai pekerjaan di satu sesi sambil memantau sesi lain. Cari di seluruh proyek, filter berdasarkan cabang, temukan yang Anda butuhkan dengan cepat." + }, + { + "icon": "🔓", + "title": "Sumber terbuka & agnostik model", + "details": "pi sepenuhnya sumber terbuka dan agnostik penyedia. Pilih model apa pun, ganti kapan pun Anda suka — Anda tidak terkunci pada satu vendor." + }, + { + "icon": "🔒", + "title": "Akses jarak jauh yang aman", + "details": "Auth token bawaan sehingga Anda bisa mengeksposnya di LAN atau melalui Tailscale tanpa khawatir." + }, + { + "icon": "📤", + "title": "Bagikan hasil kerja Anda", + "details": "Ekspor sesi sebagai snapshot statis atau GitHub Gist rahasia dalam satu klik." + }, + { + "icon": "🏠", + "title": "Ruang kerja AI pribadi Anda", + "details": "Pasang seperti PWA native dan ubah menjadi asisten pribadi yang tinggal di mesin Anda." + } + ] +} diff --git a/user-docs/ja/hero.json b/user-docs/ja/hero.json new file mode 100644 index 00000000..35e06f32 --- /dev/null +++ b/user-docs/ja/hero.json @@ -0,0 +1,53 @@ +{ + "text": "あなたのpiコーディングエージェントをリモート操作", + "tagline": "pi用の美しいWeb UIとPWA — あらゆるブラウザ、あらゆるデバイスからAIコーディングセッションを閲覧、読み取り、続行できます。", + "actions": [ + { + "theme": "brand", + "text": "はじめる", + "to": "guide" + }, + { + "theme": "alt", + "text": "インストール", + "to": "install" + }, + { + "theme": "alt", + "text": "GitHubで見る", + "link": "https://github.com/ygncode/pi-web" + } + ], + "features": [ + { + "icon": "📱", + "title": "どこからでも再開", + "details": "スマートフォン、タブレット、別のコンピューターからセッションを続行できます。SSH不要、Termius不要 — ブラウザを開くだけです。" + }, + { + "icon": "🗂️", + "title": "マルチセッションダッシュボード", + "details": "一つのセッションで作業を進めながら、別のストリームを監視できます。プロジェクトを横断検索し、ブランチで絞り込み、必要な情報を素早く見つけられます。" + }, + { + "icon": "🔓", + "title": "オープンソース & モデル非依存", + "details": "piは完全にオープンソースで、プロバイダーに依存しません。好きなモデルを選び、いつでも切り替え可能です — ベンダーロックインはありません。" + }, + { + "icon": "🔒", + "title": "安全なリモートアクセス", + "details": "ビルトインのトークン認証により、LAN上やTailscale経由で安心して公開できます。" + }, + { + "icon": "📤", + "title": "作業を共有", + "details": "セッションを静的スナップショットまたはシークレットGitHub Gistとしてワンクリックでエクスポート。" + }, + { + "icon": "🏠", + "title": "あなた専用のAIワークスペース", + "details": "ネイティブPWAとしてインストールし、あなたのマシン上で動作するパーソナルアシスタントに。" + } + ] +} diff --git a/user-docs/km/hero.json b/user-docs/km/hero.json new file mode 100644 index 00000000..79506682 --- /dev/null +++ b/user-docs/km/hero.json @@ -0,0 +1,53 @@ +{ + "text": "បញ្ជាពីចម្ងាយភ្នាក់ងារសរសេរកូដ pi របស់អ្នក", + "tagline": "UI បណ្ដាញដ៏ស្រស់ស្អាត និង PWA សម្រាប់ pi — រកមើល អាន និងបន្តវគ្គសរសេរកូដ AI របស់អ្នកពីកម្មវិធីរុករកណាមួយ លើឧបករណ៍ណាមួយ។", + "actions": [ + { + "theme": "brand", + "text": "ចាប់ផ្ដើម", + "to": "guide" + }, + { + "theme": "alt", + "text": "ដំឡើង", + "to": "install" + }, + { + "theme": "alt", + "text": "មើលលើ GitHub", + "link": "https://github.com/ygncode/pi-web" + } + ], + "features": [ + { + "icon": "📱", + "title": "បន្តពីគ្រប់ទីកន្លែង", + "details": "បន្តវគ្គពីទូរសព្ទ ថេប្លេត ឬកុំព្យូទ័រផ្សេងទៀតរបស់អ្នក។ គ្មាន SSH គ្មាន Termius — គ្រាន់តែបើកកម្មវិធីរុករករបស់អ្នក។" + }, + { + "icon": "🗂️", + "title": "ផ្ទាំងគ្រប់គ្រងច្រើនវគ្គ", + "details": "ចាប់ផ្ដើមការងារក្នុងវគ្គមួយ ខណៈពេលមើលស្ទ្រីមផ្សេងទៀត។ ស្វែងរកឆ្លងកាត់គម្រោង ត្រងតាមសាខា រកអ្វីដែលអ្នកត្រូវការបានរហ័ស។" + }, + { + "icon": "🔓", + "title": "កូដបើកចំហ & មិនជាប់នឹងម៉ូដែលណាមួយ", + "details": "pi គឺជាកូដបើកចំហពេញលេញ និងមិនជាប់នឹងអ្នកផ្ដល់សេវាណាមួយ។ ជ្រើសរើសម៉ូដែលណាក៏បាន ប្ដូរពេលណាក៏បានតាមចិត្ត — អ្នកមិនជាប់សោរជាមួយអ្នកលក់ណាមួយឡើយ។" + }, + { + "icon": "🔒", + "title": "ការចូលប្រើពីចម្ងាយដោយសុវត្ថិភាព", + "details": "មានការផ្ទៀងផ្ទាត់ដោយតូកខេនភ្ជាប់មកជាមួយ ដូច្នេះអ្នកអាចបើកវានៅលើបណ្ដាញ LAN ឬតាម Tailscale ដោយគ្មានកង្វល់។" + }, + { + "icon": "📤", + "title": "ចែករំលែកការងាររបស់អ្នក", + "details": "នាំចេញវគ្គជារូបថតឋិតិវន្ត ឬ GitHub Gists សម្ងាត់ដោយគ្រាន់តែចុចមួយដង។" + }, + { + "icon": "🏠", + "title": "កន្លែងធ្វើការ AI ផ្ទាល់ខ្លួនរបស់អ្នក", + "details": "ដំឡើងវាដូចជា PWA ដើម ហើយប្រែក្លាយវាទៅជាជំនួយការផ្ទាល់ខ្លួនដែលរស់នៅលើម៉ាស៊ីនរបស់អ្នក។" + } + ] +} diff --git a/user-docs/lo/hero.json b/user-docs/lo/hero.json new file mode 100644 index 00000000..6c60ccb3 --- /dev/null +++ b/user-docs/lo/hero.json @@ -0,0 +1,53 @@ +{ + "text": "ຄວບຄຸມ pi coding agent ຂອງທ່ານຈາກທຸກທີ່", + "tagline": "Web UI ແລະ PWA ທີ່ສວຍງາມສຳລັບ pi — ເບິ່ງ, ອ່ານ, ແລະ ສືບຕໍ່ເຊສຊັ່ນ AI coding ຂອງທ່ານຈາກບຣາວເຊີໃດກໍໄດ້, ໃນທຸກອຸປະກອນ.", + "actions": [ + { + "theme": "brand", + "text": "ເລີ່ມຕົ້ນ", + "to": "guide" + }, + { + "theme": "alt", + "text": "ຕິດຕັ້ງ", + "to": "install" + }, + { + "theme": "alt", + "text": "ເບິ່ງໃນ GitHub", + "link": "https://github.com/ygncode/pi-web" + } + ], + "features": [ + { + "icon": "📱", + "title": "ສືບຕໍ່ຈາກທຸກທີ່", + "details": "ສືບຕໍ່ເຊສຊັ່ນຈາກໂທລະສັບ, ແທັບເລັດ, ຫຼື ຄອມພິວເຕີເຄື່ອງອື່ນ. ບໍ່ຕ້ອງ SSH, ບໍ່ຕ້ອງ Termius — ພຽງແຕ່ເປີດບຣາວເຊີຂອງທ່ານ." + }, + { + "icon": "🗂️", + "title": "ແດສບອດຫຼາຍເຊສຊັ່ນ", + "details": "ເລີ່ມວຽກໃນເຊສຊັ່ນໜຶ່ງ ພ້ອມກັບເບິ່ງສະຕຣີມຂອງອີກເຊສຊັ່ນ. ຄົ້ນຫາຂ້າມໂປຣເຈັກ, ກັ່ນຕອງຕາມສາຂາ, ຊອກຫາສິ່ງທີ່ຕ້ອງການໄດ້ໄວ." + }, + { + "icon": "🔓", + "title": "Open-source ແລະ ບໍ່ຂຶ້ນກັບໂມເດວໃດໜຶ່ງ", + "details": "pi ແມ່ນ open source ແທ້ ແລະ ບໍ່ຂຶ້ນກັບ provider ໃດ. ເລືອກໂມເດວໃດກໍໄດ້, ປ່ຽນຕອນໃດກໍໄດ້ — ທ່ານບໍ່ໄດ້ຖືກລັອກໃສ່ຜູ້ຂາຍໃດ." + }, + { + "icon": "🔒", + "title": "ການເຂົ້າເຖິງທາງໄກທີ່ປອດໄພ", + "details": "ມີ token auth ໃນຕົວ ທ່ານຈຶ່ງສາມາດເປີດເຜີຍມັນໃນ LAN ຫຼື ຜ່ານ Tailscale ໄດ້ຢ່າງບໍ່ຕ້ອງກັງວົນ." + }, + { + "icon": "📤", + "title": "ແບ່ງປັນວຽກຂອງທ່ານ", + "details": "ສົ່ງອອກເຊສຊັ່ນເປັນສະແນັບຊັອດແບບ static ຫຼື GitHub Gist ແບບລັບດ້ວຍຄລິກດຽວ." + }, + { + "icon": "🏠", + "title": "ພື້ນທີ່ເຮັດວຽກ AI ສ່ວນຕົວຂອງທ່ານ", + "details": "ຕິດຕັ້ງມັນຄືກັບ PWA ແບບ native ແລະ ປ່ຽນມັນໃຫ້ກາຍເປັນຜູ້ຊ່ວຍສ່ວນຕົວທີ່ຢູ່ໃນເຄື່ອງຂອງທ່ານ." + } + ] +} diff --git a/user-docs/ms/hero.json b/user-docs/ms/hero.json new file mode 100644 index 00000000..905e42e7 --- /dev/null +++ b/user-docs/ms/hero.json @@ -0,0 +1,53 @@ +{ + "text": "Kawal ejen pengekodan pi anda dari jauh", + "tagline": "UI web dan PWA yang cantik untuk pi — semak imbas, baca, dan sambung sesi pengekodan AI anda dari mana-mana pelayar, pada mana-mana peranti.", + "actions": [ + { + "theme": "brand", + "text": "Mula Sekarang", + "to": "guide" + }, + { + "theme": "alt", + "text": "Pasang", + "to": "install" + }, + { + "theme": "alt", + "text": "Lihat di GitHub", + "link": "https://github.com/ygncode/pi-web" + } + ], + "features": [ + { + "icon": "📱", + "title": "Sambung dari mana-mana", + "details": "Sambung sesi dari telefon, tablet, atau komputer lain anda. Tiada SSH, tiada Termius — hanya buka pelayar anda." + }, + { + "icon": "🗂️", + "title": "Papan pemuka pelbagai sesi", + "details": "Mulakan kerja dalam satu sesi sambil menonton strim sesi lain. Cari merentas projek, tapis mengikut cawangan, cari apa yang anda perlukan dengan pantas." + }, + { + "icon": "🔓", + "title": "Sumber terbuka & agnostik model", + "details": "pi adalah sumber terbuka sepenuhnya dan agnostik pembekal. Pilih mana-mana model, tukar bila-bila masa — anda tidak terikat kepada satu vendor." + }, + { + "icon": "🔒", + "title": "Akses jauh yang selamat", + "details": "Pengesahan token terbina dalam supaya anda boleh mendedahkannya pada LAN anda atau melalui Tailscale tanpa risau." + }, + { + "icon": "📤", + "title": "Kongsi kerja anda", + "details": "Eksport sesi sebagai syot kilat statik atau GitHub Gists rahsia dalam satu klik." + }, + { + "icon": "🏠", + "title": "Ruang kerja AI peribadi anda", + "details": "Pasangnya seperti PWA asli dan jadikannya pembantu peribadi yang tinggal di mesin anda." + } + ] +} diff --git a/user-docs/my/hero.json b/user-docs/my/hero.json new file mode 100644 index 00000000..a4ca9e56 --- /dev/null +++ b/user-docs/my/hero.json @@ -0,0 +1,53 @@ +{ + "text": "သင့် pi coding agent ကို အဝေးမှ ထိန်းချုပ်ပါ", + "tagline": "pi အတွက် လှပသော web UI နှင့် PWA — သင့် AI coding sessions များကို မည်သည့် browser၊ မည်သည့် စက်ပစ္စည်းမှမဆို ကြည့်ရှုရန်၊ ဖတ်ရှုရန်နှင့် ဆက်လက်လုပ်ဆောင်ရန်။", + "actions": [ + { + "theme": "brand", + "text": "စတင်ရန်", + "to": "guide" + }, + { + "theme": "alt", + "text": "ထည့်သွင်းရန်", + "to": "install" + }, + { + "theme": "alt", + "text": "GitHub တွင် ကြည့်ရှုရန်", + "link": "https://github.com/ygncode/pi-web" + } + ], + "features": [ + { + "icon": "📱", + "title": "မည်သည့်နေရာမှမဆို ပြန်လည်စတင်ရန်", + "details": "သင့်ဖုန်း၊ တက်ဘလက် သို့မဟုတ် အခြားကွန်ပျူတာမှ session တစ်ခုကို ဆက်လက်လုပ်ဆောင်ပါ။ SSH မလို၊ Termius မလို — browser ဖွင့်လိုက်ရုံပါပဲ။" + }, + { + "icon": "🗂️", + "title": "Session များစွာ ဒက်ရှ်ဘုတ်", + "details": " session တစ်ခုတွင် အလုပ်စလုပ်ရင်း အခြား session တစ်ခုကို စောင့်ကြည့်ပါ။ ပရောဂျက်များကြား ရှာဖွေပါ၊ branch အလိုက် စစ်ထုတ်ပါ၊ လိုအပ်သည်များကို လျင်မြန်စွာ ရှာပါ။" + }, + { + "icon": "🔓", + "title": "Open-source နှင့် မော်ဒယ်-ကန့်သတ်မှုမရှိ", + "details": "pi သည် အပြည့်အဝ open source ဖြစ်ပြီး provider-agnostic ဖြစ်သည်။ မည်သည့် မော်ဒယ်ကိုမဆို ရွေးချယ်ပါ၊ ကြိုက်သည့်အချိန် ပြောင်းပါ — vendor တစ်ခုတည်းတွင် ချုပ်နှောင်ထားခြင်း မရှိပါ။" + }, + { + "icon": "🔒", + "title": "လုံခြုံသော အဝေးထိန်း အသုံးပြုခွင့်", + "details": "Built-in token auth ပါဝင်သောကြောင့် သင့် LAN သို့မဟုတ် Tailscale မှတစ်ဆင့် စိတ်ချစွာ ဖွင့်ထားနိုင်ပါသည်။" + }, + { + "icon": "📤", + "title": "သင့်အလုပ်ကို မျှဝေပါ", + "details": "Session များကို static snapshots အဖြစ် သို့မဟုတ် လျှို့ဝှက် GitHub Gists အဖြစ် တစ်ချက်နှိပ်ရုံဖြင့် ထုတ်ယူပါ။" + }, + { + "icon": "🏠", + "title": "သင့်ကိုယ်ပိုင် AI အလုပ်ခွင်", + "details": "Native PWA အဖြစ် ထည့်သွင်းပြီး သင့်စက်ပေါ်တွင် အမြဲရှိနေသော ကိုယ်ပိုင်လက်ထောက်အဖြစ် ပြောင်းလဲလိုက်ပါ။" + } + ] +} diff --git a/user-docs/th/hero.json b/user-docs/th/hero.json new file mode 100644 index 00000000..85b872ec --- /dev/null +++ b/user-docs/th/hero.json @@ -0,0 +1,53 @@ +{ + "text": "ควบคุม pi coding agent ของคุณจากระยะไกล", + "tagline": "Web UI และ PWA สำหรับ pi ที่สวยงาม — เบิร์วซ์ อ่าน และทำต่อเซสชัน AI coding ของคุณจากบราวเซอร์ใดๆ บนอุปกรณ์ใดๆ", + "actions": [ + { + "theme": "brand", + "text": "เริ่มต้นใช้งาน", + "to": "guide" + }, + { + "theme": "alt", + "text": "ติดตั้ง", + "to": "install" + }, + { + "theme": "alt", + "text": "ดูบน GitHub", + "link": "https://github.com/ygncode/pi-web" + } + ], + "features": [ + { + "icon": "📱", + "title": "กลับมาทำต่อได้จากทุกที่", + "details": "ทำต่อเซสชันจากโทรศัพท์ แท็บเล็ต หรือคอมพิวเตอร์เครื่องอื่น ไม่ต้องใช้ SSH ไม่ต้องใช้ Termius — แค่เปิดบราวเซอร์ของคุณ" + }, + { + "icon": "🗂️", + "title": "แดชบอร์ดหลายเซสชัน", + "details": "เริ่มทำงานในเซสชันหนึ่งพร้อมดูสตรีมอีกเซสชันไปด้วย ค้นหาข้ามโปรเจกต์ กรองตามแบรนช์ ค้นหาสิ่งที่ต้องการได้อย่างรวดเร็ว" + }, + { + "icon": "🔓", + "title": "โอเพนซอร์ส & ไม่ขึ้นกับโมเดล", + "details": "pi เป็นโอเพนซอร์สเต็มรูปแบบและไม่ขึ้นกับผู้ให้บริการ เลือกโมเดลใดๆ เปลี่ยนได้ตามต้องการ — คุณไม่ถูกล็อกไว้กับผู้ขายรายใด" + }, + { + "icon": "🔒", + "title": "การเข้าถึงระยะไกลที่ปลอดภัย", + "details": "มี token auth ในตัวเอง คุณจึงเปิดใช้บน LAN หรือผ่าน Tailscale ได้โดยไม่ต้องกังวล" + }, + { + "icon": "📤", + "title": "แชร์งานของคุณ", + "details": "ส่งออกเซสชันเป็นสแน็ปช็อตแบบสแตติกหรือ GitHub Gists แบบลับด้วยคลิกเดียว" + }, + { + "icon": "🏠", + "title": "พื้นที่ทำงาน AI ส่วนตัวของคุณ", + "details": "ติดตั้งเหมือน PWA แบบเนทีฟและทำให้กลายเป็นผู้ช่วยส่วนตัวที่อยู่บนเครื่องของคุณ" + } + ] +} diff --git a/user-docs/vi/hero.json b/user-docs/vi/hero.json new file mode 100644 index 00000000..b6045892 --- /dev/null +++ b/user-docs/vi/hero.json @@ -0,0 +1,53 @@ +{ + "text": "Điều khiển từ xa pi coding agent của bạn", + "tagline": "Giao diện web và PWA tuyệt đẹp cho pi — duyệt, đọc và tiếp tục các phiên lập trình AI của bạn từ bất kỳ trình duyệt nào, trên mọi thiết bị.", + "actions": [ + { + "theme": "brand", + "text": "Bắt Đầu", + "to": "guide" + }, + { + "theme": "alt", + "text": "Cài Đặt", + "to": "install" + }, + { + "theme": "alt", + "text": "Xem trên GitHub", + "link": "https://github.com/ygncode/pi-web" + } + ], + "features": [ + { + "icon": "📱", + "title": "Tiếp tục từ mọi nơi", + "details": "Tiếp tục phiên làm việc từ điện thoại, máy tính bảng hoặc máy tính khác. Không cần SSH, không cần Termius — chỉ cần mở trình duyệt." + }, + { + "icon": "🗂️", + "title": "Bảng điều khiển đa phiên", + "details": "Khởi động công việc trong một phiên và theo dõi luồng phiên khác. Tìm kiếm xuyên suốt các dự án, lọc theo nhánh, tìm thứ bạn cần thật nhanh." + }, + { + "icon": "🔓", + "title": "Mã nguồn mở & không phụ thuộc model", + "details": "pi hoàn toàn là mã nguồn mở và không phụ thuộc nhà cung cấp. Chọn bất kỳ model nào, chuyển đổi bất cứ lúc nào — bạn không bị khóa vào một nhà cung cấp." + }, + { + "icon": "🔒", + "title": "Truy cập từ xa an toàn", + "details": "Tích hợp xác thực token để bạn có thể mở nó trên mạng LAN hoặc qua Tailscale mà không lo lắng." + }, + { + "icon": "📤", + "title": "Chia sẻ công việc của bạn", + "details": "Xuất các phiên dưới dạng ảnh chụp tĩnh hoặc GitHub Gist bí mật chỉ với một cú nhấp." + }, + { + "icon": "🏠", + "title": "Không gian làm việc AI cá nhân của bạn", + "details": "Cài đặt như một PWA gốc và biến nó thành trợ lý cá nhân sống ngay trên máy của bạn." + } + ] +} diff --git a/user-docs/zh/hero.json b/user-docs/zh/hero.json new file mode 100644 index 00000000..82c92f3d --- /dev/null +++ b/user-docs/zh/hero.json @@ -0,0 +1,53 @@ +{ + "text": "远程控制你的 pi 编程助手", + "tagline": "一个漂亮的 Web 界面和 PWA,专为 pi 打造——在任何设备、任何浏览器上浏览、阅读并继续你的 AI 编程会话。", + "actions": [ + { + "theme": "brand", + "text": "快速开始", + "to": "guide" + }, + { + "theme": "alt", + "text": "安装", + "to": "install" + }, + { + "theme": "alt", + "text": "在 GitHub 上查看", + "link": "https://github.com/ygncode/pi-web" + } + ], + "features": [ + { + "icon": "📱", + "title": "随时随地从上次中断处继续", + "details": "在手机、平板或另一台电脑上继续你的会话。无需 SSH,无需 Termius——打开浏览器即可。" + }, + { + "icon": "🗂️", + "title": "多会话仪表盘", + "details": "在一个会话中启动工作任务,同时观察另一个会话的实时输出。跨项目搜索,按分支筛选,快速找到所需内容。" + }, + { + "icon": "🔓", + "title": "开源且不绑定模型", + "details": "pi 完全开源,不绑定任何模型服务商。随心选择模型,随时切换——你不受任何厂商限制。" + }, + { + "icon": "🔒", + "title": "安全的远程访问", + "details": "内置 token 认证,你可以安心地将其开放到局域网或通过 Tailscale 访问。" + }, + { + "icon": "📤", + "title": "分享你的成果", + "details": "一键将会话导出为静态快照或私密 GitHub Gist。" + }, + { + "icon": "🏠", + "title": "你的专属 AI 工作空间", + "details": "像原生 PWA 一样安装,把它变成常驻在你电脑上的个人助手。" + } + ] +} diff --git a/website/.vitepress/config.js b/website/.vitepress/config.js new file mode 100644 index 00000000..fe2f02a9 --- /dev/null +++ b/website/.vitepress/config.js @@ -0,0 +1,87 @@ +import { defineConfig } from 'vitepress' +import locales from './locales.generated.json' + +const SITE_ORIGIN = 'https://ygncode.github.io' +const BASE = '/pi-web/' +const OG_IMAGE = `${SITE_ORIGIN}${BASE}assets/og-image.png` + +// OpenGraph locale tags, keyed by the locale dir (root pages default to en_US). +const OG_LOCALES = { + es: 'es_ES', + fr: 'fr_FR', + de: 'de_DE', + zh: 'zh_CN', + ja: 'ja_JP', + id: 'id_ID', + ms: 'ms_MY', + vi: 'vi_VN', + th: 'th_TH', + fil: 'fil_PH', + my: 'my_MM', + km: 'km_KH', + lo: 'lo_LA', +} + +// Project Pages site: served under https://ygncode.github.io/pi-web/ +// so every asset/link must resolve under the `/pi-web/` base path. +// `locales` (labels + per-locale nav/sidebar) is generated by scripts/build_site.py. +export default defineConfig({ + base: BASE, + srcDir: 'src', + outDir: 'dist', + cleanUrls: true, + title: 'pi-web', + description: + 'A beautiful web UI and PWA for pi — browse, read, and continue your AI coding sessions from any browser, on any device.', + // The nav ThemeSwitcher owns theming (4 named themes), so disable VitePress's + // own light/dark toggle. Set the saved theme (default dracula) before first + // paint to avoid a flash. + appearance: false, + head: [ + ['link', { rel: 'icon', type: 'image/svg+xml', href: '/pi-web/assets/icon.svg' }], + ['meta', { name: 'theme-color', content: '#282a36' }], + ['meta', { name: 'twitter:card', content: 'summary_large_image' }], + ['meta', { property: 'og:type', content: 'website' }], + ['meta', { property: 'og:site_name', content: 'pi-web' }], + ['meta', { property: 'og:image', content: OG_IMAGE }], + ['meta', { property: 'og:image:width', content: '1200' }], + ['meta', { property: 'og:image:height', content: '630' }], + ['meta', { name: 'twitter:image', content: OG_IMAGE }], + [ + 'script', + {}, + "(function(){try{var t=localStorage.getItem('pi-web-docs-theme')||'dracula';var d=document.documentElement;d.dataset.theme=t;d.classList.toggle('dark',t!=='light');}catch(e){}})()", + ], + ], + sitemap: { hostname: `${SITE_ORIGIN}${BASE}` }, + // Per-page OpenGraph/Twitter/canonical tags (title, description, URL, locale). + transformHead({ pageData, siteData }) { + const title = pageData.frontmatter.title || pageData.title || siteData.title + const description = + pageData.frontmatter.description || pageData.description || siteData.description + const path = pageData.relativePath.replace(/(^|\/)index\.md$/, '$1').replace(/\.md$/, '') + const url = `${SITE_ORIGIN}${BASE}${path}` + const ogLocale = OG_LOCALES[pageData.relativePath.split('/')[0]] || 'en_US' + return [ + ['link', { rel: 'canonical', href: url }], + ['meta', { property: 'og:title', content: title }], + ['meta', { property: 'og:description', content: description }], + ['meta', { property: 'og:url', content: url }], + ['meta', { property: 'og:locale', content: ogLocale }], + ['meta', { name: 'twitter:title', content: title }], + ['meta', { name: 'twitter:description', content: description }], + ] + }, + locales, + themeConfig: { + logo: '/assets/icon.svg', + // GitHub lives in the nav as a "Star" call-to-action (GitHubStar.vue), so no + // duplicate social icon here. + search: { provider: 'local' }, + footer: { + message: + 'pi-web is a community pi package — not official, and not affiliated with pi itself. Released under the MIT License.', + copyright: 'pi-web — remote-control your pi coding agent.', + }, + }, +}) diff --git a/website/.vitepress/theme/GitHubStar.vue b/website/.vitepress/theme/GitHubStar.vue new file mode 100644 index 00000000..9ffb7d68 --- /dev/null +++ b/website/.vitepress/theme/GitHubStar.vue @@ -0,0 +1,94 @@ +<script setup> +import { ref, onMounted } from 'vue' + +const REPO = 'ygncode/pi-web' +const CACHE_KEY = 'pi-web-docs-stars' +const TTL = 6 * 60 * 60 * 1000 // 6h + +const stars = ref(null) + +function format(n) { + return n >= 1000 ? (n / 1000).toFixed(1).replace(/\.0$/, '') + 'k' : String(n) +} + +onMounted(async () => { + try { + const cached = JSON.parse(localStorage.getItem(CACHE_KEY) || 'null') + if (cached && Date.now() - cached.t < TTL) { + stars.value = cached.n + return + } + } catch (e) {} + try { + const res = await fetch(`https://api.github.com/repos/${REPO}`) + if (!res.ok) return + const data = await res.json() + stars.value = data.stargazers_count + try { + localStorage.setItem(CACHE_KEY, JSON.stringify({ n: stars.value, t: Date.now() })) + } catch (e) {} + } catch (e) {} +}) +</script> + +<template> + <a + class="gh-star" + :href="`https://github.com/${REPO}`" + target="_blank" + rel="noopener noreferrer" + title="Star pi-web on GitHub" + > + <svg class="gh-mark" viewBox="0 0 16 16" width="16" height="16" aria-hidden="true"> + <path + fill="currentColor" + d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0016 8c0-4.42-3.58-8-8-8z" + /> + </svg> + <span class="gh-label">Star</span> + <span v-if="stars != null" class="gh-count">{{ format(stars) }}</span> + </a> +</template> + +<style scoped> +.gh-star { + display: inline-flex; + align-items: center; + gap: 6px; + height: 32px; + padding: 0 11px; + margin-left: 8px; + border: 1px solid var(--vp-c-divider); + border-radius: 8px; + font-size: 12px; + font-weight: 600; + line-height: 1; + color: var(--vp-c-text-2); + background: transparent; + transition: + border-color 0.25s, + color 0.25s; +} +.gh-star:hover { + color: var(--vp-c-text-1); + border-color: var(--vp-c-brand-1); +} +.gh-mark { + flex: none; +} +.gh-count { + padding-left: 6px; + margin-left: 2px; + border-left: 1px solid var(--vp-c-divider); + color: var(--vp-c-text-1); + font-variant-numeric: tabular-nums; +} +@media (max-width: 640px) { + .gh-label { + display: none; + } + .gh-star { + padding: 0 9px; + } +} +</style> diff --git a/website/.vitepress/theme/HeroImage.vue b/website/.vitepress/theme/HeroImage.vue new file mode 100644 index 00000000..a25009df --- /dev/null +++ b/website/.vitepress/theme/HeroImage.vue @@ -0,0 +1,50 @@ +<script setup> +import { withBase } from 'vitepress' +</script> + +<template> + <figure class="hero-demo"> + <img + class="hero-demo-img" + :src="withBase('/assets/pi-web-demo.gif')" + alt="pi-web demo on desktop and iOS" + /> + <figcaption class="hero-demo-cap">Live demo · desktop + iOS, sped up</figcaption> + </figure> +</template> + +<style scoped> +.hero-demo { + margin: 0; + display: flex; + flex-direction: column; + align-items: center; + gap: 12px; + /* Sit above VitePress's .image-bg glow, which is absolutely positioned and + would otherwise paint over this in-flow figure and wash out the demo. */ + position: relative; + z-index: 1; +} +.hero-demo-img { + width: 580px; + max-width: 100%; + border-radius: 14px; + border: 1px solid var(--vp-c-divider); + box-shadow: 0 22px 60px -18px rgba(0, 0, 0, 0.55); +} +.hero-demo-cap { + font-size: 13px; + color: var(--vp-c-text-3); + text-align: center; +} +@media (min-width: 960px) { + .hero-demo-img { + width: 620px; + } +} +@media (max-width: 640px) { + .hero-demo-img { + width: 100%; + } +} +</style> diff --git a/website/.vitepress/theme/ThemeSwitcher.vue b/website/.vitepress/theme/ThemeSwitcher.vue new file mode 100644 index 00000000..56fc80e3 --- /dev/null +++ b/website/.vitepress/theme/ThemeSwitcher.vue @@ -0,0 +1,102 @@ +<script setup> +import { ref, computed, onMounted } from 'vue' + +const THEMES = [ + { id: 'dark', label: 'Dark' }, + { id: 'light', label: 'Light' }, + { id: 'nord', label: 'Nord' }, + { id: 'dracula', label: 'Dracula' }, +] + +const current = ref('dracula') +const label = computed(() => THEMES.find((t) => t.id === current.value)?.label ?? 'Dracula') + +function apply(id) { + const el = document.documentElement + el.dataset.theme = id + el.classList.toggle('dark', id !== 'light') + try { + localStorage.setItem('pi-web-docs-theme', id) + } catch (e) {} + current.value = id +} + +function cycle() { + const i = THEMES.findIndex((t) => t.id === current.value) + apply(THEMES[(i + 1) % THEMES.length].id) +} + +onMounted(() => { + try { + current.value = localStorage.getItem('pi-web-docs-theme') || 'dracula' + } catch (e) { + current.value = 'dracula' + } +}) +</script> + +<template> + <button + class="theme-switcher" + type="button" + :title="`Theme: ${label} — click to cycle Dark / Light / Nord / Dracula`" + @click="cycle" + > + <span class="theme-swatch" :data-theme-id="current"></span> + <span class="theme-label">{{ label }}</span> + </button> +</template> + +<style scoped> +.theme-switcher { + display: inline-flex; + align-items: center; + gap: 7px; + height: 32px; + padding: 0 11px; + margin-left: 8px; + border: 1px solid var(--vp-c-divider); + border-radius: 8px; + font-size: 12px; + font-weight: 500; + line-height: 1; + color: var(--vp-c-text-2); + background: transparent; + cursor: pointer; + transition: + border-color 0.25s, + color 0.25s; +} +.theme-switcher:hover { + color: var(--vp-c-text-1); + border-color: var(--vp-c-brand-1); +} +.theme-swatch { + width: 12px; + height: 12px; + border-radius: 50%; + border: 1px solid var(--vp-c-divider); + box-shadow: 0 0 0 2px var(--vp-c-bg); +} +.theme-swatch[data-theme-id='dark'] { + background: #9cc7c0; +} +.theme-swatch[data-theme-id='light'] { + background: #496f69; +} +.theme-swatch[data-theme-id='nord'] { + background: #88c0d0; +} +.theme-swatch[data-theme-id='dracula'] { + background: #ff79c6; +} +/* Hide the text label on narrow screens; the swatch alone identifies the theme. */ +@media (max-width: 640px) { + .theme-label { + display: none; + } + .theme-switcher { + padding: 0 9px; + } +} +</style> diff --git a/website/.vitepress/theme/custom.css b/website/.vitepress/theme/custom.css new file mode 100644 index 00000000..e3fc864f --- /dev/null +++ b/website/.vitepress/theme/custom.css @@ -0,0 +1,142 @@ +/* pi-web docs theme — maps the app's four palettes (internal/ui/embedded/styles/ + theme.css) onto VitePress variables. Selected via html[data-theme="…"] by the + nav ThemeSwitcher; dark-family themes also carry the .dark class so VitePress's + own dark component styles apply. Default (dracula) is set pre-paint in config.js. */ + +/* ── Dark (Obsidian / Carbon) ── */ +html[data-theme='dark'] { + --vp-c-bg: #111116; + --vp-c-bg-alt: #0f0f14; + --vp-c-bg-soft: #191920; + --vp-c-bg-elv: #15151b; + --vp-c-text-1: #e6e7eb; + --vp-c-text-2: #b7bbc4; + --vp-c-text-3: #858a96; + --vp-c-divider: #292a33; + --vp-c-border: #292a33; + --vp-c-gutter: #20212a; + --accent: #9cc7c0; + --accent-2: #8abeb7; + --brand-text: #111116; + --vp-code-block-bg: #0d0d12; +} + +/* ── Light (Warm Linen) ── */ +html[data-theme='light'] { + --vp-c-bg: #f6f5f2; + --vp-c-bg-alt: #eceae4; + --vp-c-bg-soft: #f1f0ec; + --vp-c-bg-elv: #ffffff; + --vp-c-text-1: #1f2328; + --vp-c-text-2: #3f4650; + --vp-c-text-3: #747b85; + --vp-c-divider: #d8d5cc; + --vp-c-border: #d8d5cc; + --vp-c-gutter: #e8e5dc; + --accent: #496f69; + --accent-2: #5a8080; + --brand-text: #ffffff; + --vp-code-block-bg: #f1f0ec; +} + +/* ── Nord (Arctic Frost) ── */ +html[data-theme='nord'] { + --vp-c-bg: #2e3440; + --vp-c-bg-alt: #292f3a; + --vp-c-bg-soft: #434c5e; + --vp-c-bg-elv: #3b4252; + --vp-c-text-1: #d8dee9; + --vp-c-text-2: #e5e9f0; + --vp-c-text-3: #88c0d0; + --vp-c-divider: #4c566a; + --vp-c-border: #4c566a; + --vp-c-gutter: #3b4252; + --accent: #88c0d0; + --accent-2: #81a1c1; + --brand-text: #2e3440; + --vp-code-block-bg: #2b313c; +} + +/* ── Dracula (Cyberpunk) ── */ +html[data-theme='dracula'], +:root { + --vp-c-bg: #282a36; + --vp-c-bg-alt: #21222d; + --vp-c-bg-soft: #343746; + --vp-c-bg-elv: #1e1f29; + --vp-c-text-1: #f8f8f2; + --vp-c-text-2: #eaeaea; + --vp-c-text-3: #6272a4; + --vp-c-divider: #44475a; + --vp-c-border: #44475a; + --vp-c-gutter: #1d1f27; + --accent: #ff79c6; + --accent-2: #bd93f9; + --brand-text: #282a36; + --vp-code-block-bg: #1e1f29; +} + +/* ── Shared brand + hero wiring (driven by per-theme --accent / --accent-2) ── */ +html[data-theme] { + --vp-c-brand-1: var(--accent); + --vp-c-brand-2: var(--accent); + --vp-c-brand-3: var(--accent); + --vp-c-brand-soft: color-mix(in srgb, var(--accent) 16%, transparent); + --vp-c-brand-softer: color-mix(in srgb, var(--accent) 8%, transparent); + + --vp-button-brand-bg: var(--accent); + --vp-button-brand-border: var(--accent); + --vp-button-brand-text: var(--brand-text); + --vp-button-brand-hover-bg: color-mix(in srgb, var(--accent) 88%, #fff); + --vp-button-brand-hover-border: var(--vp-button-brand-hover-bg); + --vp-button-brand-hover-text: var(--brand-text); + --vp-button-brand-active-bg: color-mix(in srgb, var(--accent) 88%, #000); + + /* Gradient hero title + a soft accent glow behind the demo (dimmed so it + reads as a halo rather than washing out the GIF in front of it). */ + --vp-home-hero-name-color: transparent; + --vp-home-hero-name-background: linear-gradient(120deg, var(--accent) 20%, var(--accent-2)); + --vp-home-hero-image-background-image: linear-gradient( + -45deg, + color-mix(in srgb, var(--accent) 55%, transparent) 30%, + color-mix(in srgb, var(--accent-2) 55%, transparent) 70% + ); + --vp-home-hero-image-filter: blur(76px); +} + +/* Native widgets (scrollbars, form controls) follow each theme. */ +html[data-theme='dark'], +html[data-theme='nord'], +html[data-theme='dracula'] { + color-scheme: dark; +} +html[data-theme='light'] { + color-scheme: light; +} + +/* ── Southeast-Asian scripts (Burmese/Khmer/Lao/Thai) stack diacritics + vertically and need looser leading than Latin, or glyphs collide. The big + hero text is the worst offender because VitePress sets a very tight px + line-height there. Scoped by :lang() so Latin locales are unaffected. ── */ +:is(:lang(my), :lang(km), :lang(lo), :lang(th)) { + line-height: 1.7; +} +:is(:lang(my), :lang(km), :lang(lo), :lang(th)) .VPHero .name, +:is(:lang(my), :lang(km), :lang(lo), :lang(th)) .VPHero .text { + line-height: 1.5; + padding-bottom: 0.12em; +} +:is(:lang(my), :lang(km), :lang(lo), :lang(th)) .VPHero .tagline { + line-height: 1.7; +} +:is(:lang(my), :lang(km), :lang(lo), :lang(th)) .VPFeature .title { + line-height: 1.5; +} +:is(:lang(my), :lang(km), :lang(lo), :lang(th)) .vp-doc :is(p, li, h1, h2, h3, h4) { + line-height: 1.9; +} + +/* Feature cards pick up a subtle accent border on hover. */ +.VPFeature:hover { + border-color: color-mix(in srgb, var(--accent) 45%, var(--vp-c-border)); +} diff --git a/website/.vitepress/theme/index.js b/website/.vitepress/theme/index.js new file mode 100644 index 00000000..0472c6a0 --- /dev/null +++ b/website/.vitepress/theme/index.js @@ -0,0 +1,21 @@ +import DefaultTheme from 'vitepress/theme' +import { h } from 'vue' +import GitHubStar from './GitHubStar.vue' +import ThemeSwitcher from './ThemeSwitcher.vue' +import HeroImage from './HeroImage.vue' +import './custom.css' + +// Match the pi-web app's four named themes (dark/light/nord/dracula) via a +// data-theme attribute, driven by a custom switcher in the nav, plus a GitHub +// "Star" call-to-action. The hero image slot renders the demo GIF with a +// caption. The default theme + flash-free first paint are set by the inline +// head script in config.js. +export default { + extends: DefaultTheme, + Layout() { + return h(DefaultTheme.Layout, null, { + 'nav-bar-content-after': () => [h(GitHubStar), h(ThemeSwitcher)], + 'home-hero-image': () => h(HeroImage), + }) + }, +} diff --git a/website/package-lock.json b/website/package-lock.json new file mode 100644 index 00000000..003a785f --- /dev/null +++ b/website/package-lock.json @@ -0,0 +1,2511 @@ +{ + "name": "pi-web-docs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "pi-web-docs", + "devDependencies": { + "vitepress": "^1.6.3" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.21.1.tgz", + "integrity": "sha512-Wia5/mNTfiU0PIUN25UMfAGGdASkkwuCS9nBAdmhqrNPY/ff7U/6MgBVdwFDPsa3sA1msutPtO50gvOzx6MOXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", + "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", + "@algolia/autocomplete-shared": "1.17.7" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", + "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", + "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", + "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.55.1.tgz", + "integrity": "sha512-miW8RzAtBgNiEJ9fGEhsOPgWUpekAe64YcVufqXrlykj0Jjmo5nj0a5f/HAzRVX5ZuU1GAVd7BkzFDx7q50P3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.55.1.tgz", + "integrity": "sha512-eR3J3kB9JX6DdCvDRi3I4KPfwO6fR9HWYRXhVke2TXIoOQafMKCRAneg33JRmIrb+DnnJ/eWApJLF1O1CLPERg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.55.1.tgz", + "integrity": "sha512-P5ak7EurwYqgAiDyb95mgA3WRR/Zu8CPMv36lWTISvL2AmlPyqQPy2nX/KEJRTcwaeTWwrk6wJV4/M93GfjOWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.55.1.tgz", + "integrity": "sha512-OVtj9uA//+pjvKQI5INnzbyLrf3ClNv3XRbWswwJ2kHIStQNHtBfHo+LofNB/WhM9xjuXlW5ANn2aMj65UGx7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.55.1.tgz", + "integrity": "sha512-oKlVFlp+qbIEe4p7E54zSiP2gEV/vDu972Ykv8VDMFwEvreS7m0YKA3a8hGGHwc7yiBUGGiR3LlwzMLfnJmy6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.55.1.tgz", + "integrity": "sha512-BOVrld6vdtsFmotVDMTVQfYXwrVplJ+DUvy60JFi+tkWV698q2J9NNPKEO3dr5qxtSLKQP4vHF8n+3U5PDWhOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.55.1.tgz", + "integrity": "sha512-GAqHl9zERhC3bbBfubwUu07G3UXO06gORvOcsiTBZB3et0s3auNUbHlYdYNp4VKa3sUZqH5AcD3OKzU/KDGXjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.55.1.tgz", + "integrity": "sha512-BXZw+C+gsWL7pZvbnhJUnCXASiDLGcQxVV7h55Pyh2DmSzwdZIVccE5xc9RVD2trtrhIqk5smuODTxtaZqd0IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.55.1", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.55.1.tgz", + "integrity": "sha512-9g/ceZrZTqA62FA3588Xj0onRPjDNfu0pVQqefK0rrHp9H6Wblph/YmzGjZ2g8uqbTh0ZGIvAGCzErU8f7MHpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.55.1.tgz", + "integrity": "sha512-cZTIrGyAP+W4A6jDVwvWM/JOaoJKQkD/2a5eLUEeNdKAD45jN7BCpsMDONyhZlosLa4UwL8uiINQzj4iFy9nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.55.1.tgz", + "integrity": "sha512-N6I3leW0UO8Y9Zv90yo2UHgYGuxZO0mjbvzNxDIJDjO0qECEF7Z9XMvSNeUWXQh/iNDA9lr8MfEy3rmZGIcclw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.55.1.tgz", + "integrity": "sha512-ukU5zeeFs44rQkzv+TRdYard+d+3lmPGs8lPZhHtWE8rfz+LlBSF6s9kP3VQ7LeOYL8Dz0u6tZfnyTrqrumbHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.55.1.tgz", + "integrity": "sha512-lCwXyijwPm3vbYHpBXPRomMcD6mgiptmps27gnMCf4HK+u/AOeFPBnIFh4V3l4A5SnP9VRiKBZqwGBpUH0vaTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", + "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docsearch/js": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", + "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/react": "3.8.2", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", + "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.2", + "algoliasearch": "^5.14.2" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.87", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.87.tgz", + "integrity": "sha512-8YciStObhSji3OZFmWAWK6kBujyqO5bLCxeDwLxf3CR3F4PVelq7keC2LBvgTqviWzSTysj5/g4PCFLiAMVGsw==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", + "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", + "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^3.1.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", + "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", + "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", + "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", + "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/types": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", + "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.2.tgz", + "integrity": "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.39.tgz", + "integrity": "sha512-16KBTEXAJCpDr0mwlw+AZyhu8iyC7R3S2vBwsI7QnWJU6X3WKc9VKeNEZpiMdZ569qWhz9574L3vV55qRL0Vtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/shared": "3.5.39", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.39.tgz", + "integrity": "sha512-oQPigALqYbNxTNPvNgSOe+czwVExfbVF02lz8jP0S3AXJiu3jxYDygNUiqSep4ezzW8XgnubqH63My2A7JR/vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.39", + "@vue/shared": "3.5.39" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.39.tgz", + "integrity": "sha512-d0ki86iOyN8LoZPBmk5SJWNwHP19CnDDCfuo//+2WJa2g5Ke0Jay983PIBIcSSzldC68I8DrD5GrHV3OSDfodg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/compiler-core": "3.5.39", + "@vue/compiler-dom": "3.5.39", + "@vue/compiler-ssr": "3.5.39", + "@vue/shared": "3.5.39", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.15", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.39.tgz", + "integrity": "sha512-Ce7/wvwMHai74bdszfXExdazFigYnlF9zgCmEQUcM1j0fOymlouZ7XilTYNo8oUjhlnjYOZbGrcYKuqjz89Ucw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.39", + "@vue/shared": "3.5.39" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.10", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.10.tgz", + "integrity": "sha512-KxtEpUOOpFz/qOGRrAwA36QF7DqIA+FXgCYit9mk9wjbaZt0sXOFz81ElOZtKA4HbWHUdwNjZHBFsFFyp5BZiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.10" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.10", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.10.tgz", + "integrity": "sha512-3WNi2Kq4tbpVbmhml7RiphmAt0279oh3fKNeWMQIrltfX8Q91b4i5PL8DtyNKdwmcsGrV4fg+erwWOmD05CLIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.10", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.10", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.10.tgz", + "integrity": "sha512-wOPslzB8vTvpxwdaOcR2qAbwmuSP0L+rhpoC6Cf56V3Jip+HWb7PQQXOUPgBNQARpXsbQX/+mvi8kKucmBGRwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.39.tgz", + "integrity": "sha512-TpsuBJ9gGlZa5d23XcM2y8EXanz9dZeVDQBXRwzy46ItgvM+rWpzs+UVM0wcRLxGvcav0HE5jz2gNL53xlRAog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.39" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.39.tgz", + "integrity": "sha512-9GLtNyRvPAUMbX+7ono0RC2j0guo2LXVi8LvcmAooImACUKm0oFf0jjwbX8/H0AE/t1nxhAkn8RSl9PMCzzxZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.39", + "@vue/shared": "3.5.39" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.39.tgz", + "integrity": "sha512-7Y6aAGboKcXAZ3ECuUy7RrS5yy2r47dhTp2SKaJmYxjopImaVFaNa5Ne66NwGovsrxVAl5S5rwc7m22UG7Lmww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.39", + "@vue/runtime-core": "3.5.39", + "@vue/shared": "3.5.39", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.39.tgz", + "integrity": "sha512-yZSakiAGw85rZfG7UM8akMnIF+FmeiNk47uvHf2nVBBSe+dIKUhZuZq9+XgJhbV3nS5Z4ALH23/MpXofW+mbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.39", + "@vue/shared": "3.5.39" + }, + "peerDependencies": { + "vue": "3.5.39" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.39.tgz", + "integrity": "sha512-l1rrBtBfTnmxvtsvdQDXltUUy8S1Y+ZaqdfUzmAnJkTd8Z8rv5v/ytW+TKiqEOWyHPoqtPlNFSs0lhRmYVSHVA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/integrations": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", + "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vueuse/core": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/algoliasearch": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.55.1.tgz", + "integrity": "sha512-FyaFnnsbVPtevQwqSj/SdxE3jAsSsY0BEH8IVLf9rXxEBdAhAmT6VKCVSMWoaPIHVN1Eufh/1w8q6k8URpIkWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.21.1", + "@algolia/client-abtesting": "5.55.1", + "@algolia/client-analytics": "5.55.1", + "@algolia/client-common": "5.55.1", + "@algolia/client-insights": "5.55.1", + "@algolia/client-personalization": "5.55.1", + "@algolia/client-query-suggestions": "5.55.1", + "@algolia/client-search": "5.55.1", + "@algolia/ingestion": "1.55.1", + "@algolia/monitoring": "1.55.1", + "@algolia/recommend": "5.55.1", + "@algolia/requester-browser-xhr": "5.55.1", + "@algolia/requester-fetch": "5.55.1", + "@algolia/requester-node-http": "5.55.1" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/focus-trap": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz", + "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tabbable": "^6.4.0" + } + }, + "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" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/minisearch": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", + "dev": true, + "license": "MIT" + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.15", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/oniguruma-to-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", + "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.29.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.3.tgz", + "integrity": "sha512-D9NL1GAnJZhc3RndVs4gDdxEeU9TcHgywMrhhOsnpdlvFjdbx0gAsLUnH6JEhlJH5giL7Tx5biWPUSEXE/HPzw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/property-information": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/shiki": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", + "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/langs": "2.5.0", + "@shikijs/themes": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tabbable": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz", + "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.4.tgz", + "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/css": "3.8.2", + "@docsearch/js": "3.8.2", + "@iconify-json/simple-icons": "^1.2.21", + "@shikijs/core": "^2.1.0", + "@shikijs/transformers": "^2.1.0", + "@shikijs/types": "^2.1.0", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.2.1", + "@vue/devtools-api": "^7.7.0", + "@vue/shared": "^3.5.13", + "@vueuse/core": "^12.4.0", + "@vueuse/integrations": "^12.4.0", + "focus-trap": "^7.6.4", + "mark.js": "8.11.1", + "minisearch": "^7.1.1", + "shiki": "^2.1.0", + "vite": "^5.4.14", + "vue": "^3.5.13" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.39", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.39.tgz", + "integrity": "sha512-xmZCYabFGcirU8r0fTuvl/LICc1OU620rnqepaJDL/a141ZigkG7AyaxQLdqJ02ZRYzWe6YPaDHeQx7MfknQfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.39", + "@vue/compiler-sfc": "3.5.39", + "@vue/runtime-dom": "3.5.39", + "@vue/server-renderer": "3.5.39", + "@vue/shared": "3.5.39" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/website/package.json b/website/package.json new file mode 100644 index 00000000..b4a57ee9 --- /dev/null +++ b/website/package.json @@ -0,0 +1,14 @@ +{ + "name": "pi-web-docs", + "description": "VitePress documentation site for pi-web", + "private": true, + "type": "module", + "scripts": { + "dev": "vitepress dev", + "build": "vitepress build", + "preview": "vitepress preview" + }, + "devDependencies": { + "vitepress": "^1.6.3" + } +}