From e081de24fe60a2899d9be8f89629adeb2ca32d59 Mon Sep 17 00:00:00 2001 From: Owais Date: Thu, 7 May 2026 13:46:07 -0500 Subject: [PATCH] feat: migrate static site to astro (#29) * build: scaffold migration to astro for www * feat: basic structure of astro site * feat: update favicon * build: copy non-ui static routes * feat: content collection * build: swap www & website dirs * chore: remove boilerplate readme --- .prettierrc | 6 +- DEVELOPMENT.md | 28 + www/.gitignore | 24 + www/.markdownlint.json | 1 + www/.prettierrc | 7 + www/astro.config.mjs | 5 + www/csae-policy.html | 127 - www/index.html | 233 -- www/oauth/callback/index.html | 56 - www/package.json | 21 + www/pnpm-lock.yaml | 3053 +++++++++++++++++ www/pnpm-workspace.yaml | 3 + www/privacy.html | 125 - .../.well-known/apple-app-site-association | 0 www/{ => public}/.well-known/assetlinks.json | 0 www/{ => public}/_headers | 0 www/{ => public}/client-metadata.json | 0 www/public/favicon.ico | Bin 0 -> 1671 bytes www/{static => public}/favicon.svg | 0 www/{ => public}/static/desktop-deck.png | Bin www/{ => public}/static/desktop.svg | 0 www/{ => public}/static/feed.svg | 0 www/{ => public}/static/folder.svg | 0 www/{ => public}/static/graph.svg | 0 www/{ => public}/static/lock.svg | 0 www/{ => public}/static/logo.svg | 0 www/{ => public}/static/message.svg | 0 www/{ => public}/static/offline.svg | 0 www/{ => public}/static/palette.svg | 0 www/{ => public}/static/search.svg | 0 www/{ => public}/static/smartphone.svg | 0 www/src/components/BrandMark.astro | 15 + www/src/components/FeatureCard.astro | 19 + www/src/components/HomePage.astro | 185 + www/src/components/IconBadge.astro | 14 + www/src/components/LegalDocument.astro | 51 + www/src/components/PlatformCard.astro | 57 + www/src/components/ScreenshotFrame.astro | 16 + www/src/components/SiteFooter.astro | 24 + www/src/components/StatusBadge.astro | 12 + www/src/components/TechStack.astro | 31 + www/src/content.config.ts | 20 + www/src/content/legal/csae-policy.md | 58 + www/src/content/legal/privacy.md | 60 + www/src/content/legal/terms.md | 69 + www/src/layouts/BaseLayout.astro | 34 + www/src/pages/[slug].astro | 23 + www/src/pages/index.astro | 11 + www/src/pages/oauth/callback/index.astro | 49 + www/src/styles/shared.css | 716 ++++ www/static/shared.css | 719 ---- www/terms.html | 147 - www/tsconfig.json | 5 + 53 files changed, 4612 insertions(+), 1412 deletions(-) create mode 100644 www/.gitignore create mode 100644 www/.markdownlint.json create mode 100644 www/.prettierrc create mode 100644 www/astro.config.mjs delete mode 100644 www/csae-policy.html delete mode 100644 www/index.html delete mode 100644 www/oauth/callback/index.html create mode 100644 www/package.json create mode 100644 www/pnpm-lock.yaml create mode 100644 www/pnpm-workspace.yaml delete mode 100644 www/privacy.html rename www/{ => public}/.well-known/apple-app-site-association (100%) rename www/{ => public}/.well-known/assetlinks.json (100%) rename www/{ => public}/_headers (100%) rename www/{ => public}/client-metadata.json (100%) create mode 100644 www/public/favicon.ico rename www/{static => public}/favicon.svg (100%) rename www/{ => public}/static/desktop-deck.png (100%) rename www/{ => public}/static/desktop.svg (100%) rename www/{ => public}/static/feed.svg (100%) rename www/{ => public}/static/folder.svg (100%) rename www/{ => public}/static/graph.svg (100%) rename www/{ => public}/static/lock.svg (100%) rename www/{ => public}/static/logo.svg (100%) rename www/{ => public}/static/message.svg (100%) rename www/{ => public}/static/offline.svg (100%) rename www/{ => public}/static/palette.svg (100%) rename www/{ => public}/static/search.svg (100%) rename www/{ => public}/static/smartphone.svg (100%) create mode 100644 www/src/components/BrandMark.astro create mode 100644 www/src/components/FeatureCard.astro create mode 100644 www/src/components/HomePage.astro create mode 100644 www/src/components/IconBadge.astro create mode 100644 www/src/components/LegalDocument.astro create mode 100644 www/src/components/PlatformCard.astro create mode 100644 www/src/components/ScreenshotFrame.astro create mode 100644 www/src/components/SiteFooter.astro create mode 100644 www/src/components/StatusBadge.astro create mode 100644 www/src/components/TechStack.astro create mode 100644 www/src/content.config.ts create mode 100644 www/src/content/legal/csae-policy.md create mode 100644 www/src/content/legal/privacy.md create mode 100644 www/src/content/legal/terms.md create mode 100644 www/src/layouts/BaseLayout.astro create mode 100644 www/src/pages/[slug].astro create mode 100644 www/src/pages/index.astro create mode 100644 www/src/pages/oauth/callback/index.astro create mode 100644 www/src/styles/shared.css delete mode 100644 www/static/shared.css delete mode 100644 www/terms.html create mode 100644 www/tsconfig.json diff --git a/.prettierrc b/.prettierrc index 59cc311..066ed73 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,5 +1 @@ -{ - "bracketSameLine": true, - "printWidth": 120, - "objectWrap": "collapse" -} +{ "bracketSameLine": true, "printWidth": 120, "objectWrap": "collapse" } diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 5f79a0a..5ec2f5d 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -23,6 +23,34 @@ Use `just` for common workflows: | `just gen` | Run `build_runner` for code generation | | `just check` | Format, lint, and test in sequence | +## Website + +The public website lives in `www` as an Astro project. + +```sh +cd www +pnpm install +pnpm dev +pnpm build +``` + +Astro source files live under `www/src`: + +- `/pages` defines routes. +- `/components` holds reusable page sections and layout components. +- `/content/legal` contains the legal pages as Markdown. +- `/styles/shared.css` is the shared stylesheet for the Astro site. + +Static files that must keep exact public routes live in `www/public`, including: + +- `.well-known/apple-app-site-association` +- `.well-known/assetlinks.json` +- `_headers` +- `client-metadata.json` +- favicon and image assets + +The legal routes are `/privacy`, `/terms`, and `/csae-policy`. + ## Architecture ### Stack diff --git a/www/.gitignore b/www/.gitignore new file mode 100644 index 0000000..16d54bb --- /dev/null +++ b/www/.gitignore @@ -0,0 +1,24 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store + +# jetbrains setting folder +.idea/ diff --git a/www/.markdownlint.json b/www/.markdownlint.json new file mode 100644 index 0000000..13a2fd8 --- /dev/null +++ b/www/.markdownlint.json @@ -0,0 +1 @@ +{ "MD033": false, "MD013": false } diff --git a/www/.prettierrc b/www/.prettierrc new file mode 100644 index 0000000..8c6d244 --- /dev/null +++ b/www/.prettierrc @@ -0,0 +1,7 @@ +{ + "bracketSameLine": true, + "printWidth": 120, + "objectWrap": "collapse", + "plugins": ["prettier-plugin-astro"], + "overrides": [{ "files": "*.astro", "options": { "parser": "astro" } }] +} diff --git a/www/astro.config.mjs b/www/astro.config.mjs new file mode 100644 index 0000000..e762ba5 --- /dev/null +++ b/www/astro.config.mjs @@ -0,0 +1,5 @@ +// @ts-check +import { defineConfig } from 'astro/config'; + +// https://astro.build/config +export default defineConfig({}); diff --git a/www/csae-policy.html b/www/csae-policy.html deleted file mode 100644 index 4df72c3..0000000 --- a/www/csae-policy.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - - Lazurite CSAE Policy - - - - - - - -
- - -
-

Child Safety Standards (CSAE)

-

Effective May 3, 2026

-

- This page describes the child safety standards for Lazurite by Stormlight Labs, including - our policies against child sexual abuse and exploitation (CSAE), child sexual abuse - material (CSAM), and related harmful behavior. -

-

- Zero tolerance: content or behavior involving child sexual abuse, exploitation, or - endangerment is prohibited. -

- -
-

1) Prohibited content and conduct

-

Lazurite standards prohibit, at minimum:

-
    -
  • Creation, sharing, solicitation, or promotion of CSAM.
  • -
  • Grooming behavior targeting minors.
  • -
  • Sextortion involving minors.
  • -
  • Trafficking, solicitation, or sexual exploitation of children.
  • -
  • Any use of Lazurite to endanger children.
  • -
-
- -
-

2) In-app reporting and user feedback

-

- Lazurite provides in-app pathways for users to report content, accounts, and behavior - that may violate safety standards, including CSAE concerns. -

-

- Reports are reviewed as a priority category and escalated when they indicate possible - child endangerment or CSAM. -

-
- -
-

3) Response to potential CSAM

-

- Upon obtaining actual knowledge of potential CSAM, we take appropriate action under our - policies and applicable law. Actions may include: -

-
    -
  • Removing or restricting access to violative content.
  • -
  • Restricting or suspending access to violating accounts and features.
  • -
  • Preserving records necessary for legal reporting and safety investigations.
  • -
-
- -
-

4) Legal compliance and external reporting

-

- We maintain procedures to comply with applicable child safety laws and regulations, - including reporting confirmed CSAM to the National Center for Missing and Exploited - Children (NCMEC) or the relevant regional authority as required by law. -

-

- If you believe a child is in immediate danger, contact local law enforcement - immediately. -

-
- -
-

5) Child safety point of contact

-

- Child safety contact for Lazurite / Stormlight Labs: - info@stormlightlabs.org -

-

- This contact is designated to receive and coordinate potential notifications related to - CSAE and CSAM concerns. -

-
- -
-

6) Policy updates

-

- We may update these standards as laws, platform requirements, and enforcement practices - evolve. Material updates will be reflected by an updated effective date. -

-
- - -
-
- - - diff --git a/www/index.html b/www/index.html deleted file mode 100644 index a34a569..0000000 --- a/www/index.html +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - - - Lazurite for BlueSky - - - - - - - - -
-
- -

The ATmosphere client that rocks.

-
- -
-
-
- - In Active Development -
- -

Roam the ATmosphere

-

- Lazurite is a client for Bluesky & BlackSky built for people who want more from their social experience. - A full-featured mobile app for iOS and Android, paired with a powerful desktop companion - for macOS, Windows, and Linux. -

-
- -
- -
- - Lazurite desktop workspace screenshot -
-
- - Lazurite mobile profile screenshot -
-
- -
-
-
-
- - Mobile icon -
-

Mobile

- Beta -
-

- Material You design with offline support, smart folders, and full AT Protocol coverage. - Built with Flutter for a native feel on both platforms. -

-
- iOS - Android -
-
    -
  • Offline-first with local caching and offline compose
  • -
  • Full DM support with conversation requests
  • -
  • Drafts, scheduled posts, and bookmarks
  • -
  • Content moderation with custom labelers
  • -
  • Multi-account switching with data isolation
  • -
  • Themeable: Oxocarbon, Catppuccin, Nord, Rosé Pine
  • -
-
- - Mobile feed and compose -
Your home feed and a composer button
-
-
- -
-
-
- Desktop icon -
-

Desktop

- Alpha -
-

- A native desktop experience built with Tauri and Solid.js. Semantic search - across your saved posts, multi-column layouts, and deep AT Protocol tooling. -

-
- macOS - Windows - Linux -
-
    -
  • Full-text and vector search over saved and liked posts
  • -
  • Multi-column workspace layouts
  • -
  • PDS browser for exploring repository data
  • -
  • Composer window for distraction-free posting
  • -
  • Deep-link handling for at:// URIs
  • -
  • Global shortcuts (post from anywhere)
  • -
-
- - Desktop multi-column layout -
Multi-column workspace with search
-
-
-
- -

Across both platforms

-
-
-
- Feed icon -
-

Feeds & Timelines

-

Home timeline, custom algorithmic feeds, pinned feeds with drag-to-reorder. Full thread and reply chain rendering.

-
- -
-
- Search icon -
-

Search & Discovery

-

Search your saved & liked posts, discover starterpacks with the power of local semantic search with embeddings.

-
- -
-
- Moderation icon -
-

Moderation

-

Subscribe to labelers, configure per-label preferences, mute and block lists. Adult content controls with granular filtering.

-
- -
-
- Lists icon -
-

Lists & Starter Packs

-

Create and manage curation and moderation lists. Browse, search, and build starter packs to share with others.

-
- -
-
- Offline icon -
-

Offline & Fast

-

Smart caching with local databases on both platforms. Browse cached content and queue actions while offline.

-
- -
-
- Graph icon -
-

Social Graph

-

Explore connections with a force-directed graph visualization. See mutual follows, followers, and blocking context at a glance.

-
-
- -
-

Built with

-
-
Mobile
-
- Flutter - Dart - Material 3 - Drift - BLoC -
-
-
-
Desktop
-
- Tauri 2 - Rust - Solid.js - SQLite + FTS - fastembed -
-
-
-
Protocol
-
- AT Protocol - OAuth 2.0 + DPoP - Constellation -
-
-
- -
- Follow development updates on Bluesky: - @desertthunder.dev -
-
-
- - - - diff --git a/www/oauth/callback/index.html b/www/oauth/callback/index.html deleted file mode 100644 index 3974a52..0000000 --- a/www/oauth/callback/index.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - Lazurite Authentication Complete - - - - - - -
-
-

Authentication Complete

-

Lazurite is finishing sign-in. If the app does not reopen automatically, tap below.

- Open Lazurite -

If this still fails, use your browser menu and choose “Open in app”.

-
-
- - - diff --git a/www/package.json b/www/package.json new file mode 100644 index 0000000..724b21c --- /dev/null +++ b/www/package.json @@ -0,0 +1,21 @@ +{ + "name": "www", + "type": "module", + "version": "0.0.1", + "engines": { + "node": ">=22.12.0" + }, + "scripts": { + "dev": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "astro": "^6.3.0" + }, + "devDependencies": { + "prettier": "^3.8.3", + "prettier-plugin-astro": "^0.14.1" + } +} diff --git a/www/pnpm-lock.yaml b/www/pnpm-lock.yaml new file mode 100644 index 0000000..4d366cd --- /dev/null +++ b/www/pnpm-lock.yaml @@ -0,0 +1,3053 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + astro: + specifier: ^6.3.0 + version: 6.3.0(rollup@4.60.3) + devDependencies: + prettier: + specifier: ^3.8.3 + version: 3.8.3 + prettier-plugin-astro: + specifier: ^0.14.1 + version: 0.14.1 + +packages: + + '@astrojs/compiler@2.13.1': + resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==} + + '@astrojs/compiler@4.0.0': + resolution: {integrity: sha512-eouss7G8ygdZqHuke033VMcVw5HTZUu+PXd/h06DGDUg/jt5btPYPqh66ENWw/mU78rBrf/oeC4oqoBwMtDMNA==} + + '@astrojs/internal-helpers@0.9.0': + resolution: {integrity: sha512-GdYkzR26re8izmyYlBqf4z2s7zNngmWLFuxw0UKiPNqHraZGS6GKWIwSHgS22RDlu2ePFJ8bzmpBcUszut/SDg==} + + '@astrojs/markdown-remark@7.1.1': + resolution: {integrity: sha512-C6e9BnLGlbdv6bV8MYGeHpHxsUHrCrB4OuRLqi5LI7oiBVcBcqfUN06zpwFQdHgV48QCCrMmLpyqBr7VqC+swA==} + + '@astrojs/prism@4.0.1': + resolution: {integrity: sha512-nksZQVjlferuWzhPsBpQ1JE5XuKAf1id1/9Hj4a9KG4+ofrlzxUUwX4YGQF/SuDiuiGKEnzopGOt38F3AnVWsQ==} + engines: {node: '>=22.12.0'} + + '@astrojs/telemetry@3.3.2': + resolution: {integrity: sha512-j8DNruA8ors99Al39RYZPJK4DC1bKkoNm93mAMuBhY9TCNC4R8n1q7ovFnJ5qhGh5Lsh7pa1gpQVpYpsJPeTHQ==} + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.3': + resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@capsizecss/unpack@4.0.0': + resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==} + engines: {node: '>=18'} + + '@clack/core@1.3.0': + resolution: {integrity: sha512-xJPHpAmEQUBrXSLx0gF+q5K/IyihXpsHZcha+jB+tyahsKRK3Dxo4D0coZDewHo12NhiuzC3dTtMPbm53GEAAA==} + engines: {node: '>= 20.12.0'} + + '@clack/prompts@1.3.0': + resolution: {integrity: sha512-GgcWwRCs/xPtaqlMy8qRhPnZf9vlWcWZNHAitnVQ3yk7JmSralSiq5q07yaffYE8SogtDm7zFeKccx1QNVARpw==} + engines: {node: '>= 20.12.0'} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@esbuild/aix-ppc64@0.27.7': + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.7': + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.7': + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.7': + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.7': + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.7': + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.7': + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.7': + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.7': + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.7': + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.7': + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.7': + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.7': + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.7': + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.7': + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.7': + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.7': + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.7': + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.7': + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.7': + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.7': + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.7': + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.7': + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.7': + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.7': + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.7': + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@oslojs/encoding@1.1.0': + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.60.3': + resolution: {integrity: sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.60.3': + resolution: {integrity: sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.60.3': + resolution: {integrity: sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.60.3': + resolution: {integrity: sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.60.3': + resolution: {integrity: sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.60.3': + resolution: {integrity: sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.60.3': + resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.60.3': + resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.60.3': + resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.60.3': + resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.60.3': + resolution: {integrity: sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.60.3': + resolution: {integrity: sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.60.3': + resolution: {integrity: sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.60.3': + resolution: {integrity: sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.60.3': + resolution: {integrity: sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.60.3': + resolution: {integrity: sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.60.3': + resolution: {integrity: sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.60.3': + resolution: {integrity: sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.60.3': + resolution: {integrity: sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.60.3': + resolution: {integrity: sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.60.3': + resolution: {integrity: sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.60.3': + resolution: {integrity: sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.60.3': + resolution: {integrity: sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.60.3': + resolution: {integrity: sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.60.3': + resolution: {integrity: sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==} + cpu: [x64] + os: [win32] + + '@shikijs/core@4.0.2': + resolution: {integrity: sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==} + engines: {node: '>=20'} + + '@shikijs/engine-javascript@4.0.2': + resolution: {integrity: sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag==} + engines: {node: '>=20'} + + '@shikijs/engine-oniguruma@4.0.2': + resolution: {integrity: sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==} + engines: {node: '>=20'} + + '@shikijs/langs@4.0.2': + resolution: {integrity: sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==} + engines: {node: '>=20'} + + '@shikijs/primitive@4.0.2': + resolution: {integrity: sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==} + engines: {node: '>=20'} + + '@shikijs/themes@4.0.2': + resolution: {integrity: sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==} + engines: {node: '>=20'} + + '@shikijs/types@4.0.2': + resolution: {integrity: sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==} + engines: {node: '>=20'} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/nlcst@2.0.3': + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@ungap/structured-clone@1.3.1': + resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + + astro@6.3.0: + resolution: {integrity: sha512-yhDelVblNzQE4mjS0s27T9BZuAlfRCy+qHk6IlMgSr+ADG5QNpyPkroJAVCFRH08Nf2VhDM5dz6n4GWiTB9TlQ==} + engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'} + hasBin: true + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + common-ancestor-path@2.0.0: + resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==} + engines: {node: '>= 18'} + + cookie-es@1.2.3: + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} + + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + + crossws@0.3.5: + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} + + css-select@5.2.2: + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} + + css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.2.2: + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} + engines: {node: '>= 6'} + + csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + devalue@5.8.0: + resolution: {integrity: sha512-2zA9pFEsnp7vWBZbXF5JAgAq0fsUIt/1XPbRiAmRV3lp/2C3upzH+sADiyy66aFCihoLEsrQHxNM5w1gIDfsBg==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} + engines: {node: '>=0.3.1'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} + engines: {node: '>=4'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + + esbuild@0.27.7: + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} + engines: {node: '>=18'} + hasBin: true + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-wrap-ansi@0.2.0: + resolution: {integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + + fontace@0.4.1: + resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} + + fontkitten@1.0.3: + resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} + engines: {node: '>=20'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-tsconfig@5.0.0-beta.4: + resolution: {integrity: sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==} + engines: {node: '>=20.20.0'} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + h3@1.15.11: + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} + + hast-util-from-html@2.0.3: + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} + + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + + hast-util-to-text@4.0.2: + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + + iron-webcrypto@1.2.1: + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-docker@4.0.0: + resolution: {integrity: sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==} + engines: {node: '>=20'} + hasBin: true + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + hasBin: true + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lru-cache@11.3.6: + resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==} + engines: {node: 20 || >=22} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magicast@0.5.2: + resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} + engines: {node: '>=10'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + neotraverse@0.6.18: + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} + engines: {node: '>= 10'} + + nlcst-to-string@4.0.0: + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + node-mock-http@1.0.4: + resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + + ofetch@1.5.1: + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + + p-limit@7.3.0: + resolution: {integrity: sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==} + engines: {node: '>=20'} + + p-queue@9.2.0: + resolution: {integrity: sha512-dWgLE8AH0HjQ9fe74pUkKkvzzYT18Inp4zra3lKHnnwqGvcfcUBrvF2EAVX+envufDNBOzpPq/IBUONDbI7+3g==} + engines: {node: '>=20'} + + p-timeout@7.0.1: + resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==} + engines: {node: '>=20'} + + package-manager-detector@1.6.0: + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} + + parse-latin@7.0.0: + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + + piccolore@0.1.3: + resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} + engines: {node: ^10 || ^12 || >=14} + + prettier-plugin-astro@0.14.1: + resolution: {integrity: sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==} + engines: {node: ^14.15.0 || >=16.0.0} + + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} + engines: {node: '>=14'} + hasBin: true + + prismjs@1.30.0: + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} + engines: {node: '>=6'} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + radix3@1.1.2: + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} + + readdirp@5.0.0: + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} + engines: {node: '>= 20.19.0'} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + rehype-parse@9.0.1: + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-stringify@10.0.1: + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} + + rehype@13.0.2: + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-smartypants@3.0.2: + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} + engines: {node: '>=16.0.0'} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + retext-latin@4.0.0: + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} + + retext-smartypants@6.2.0: + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} + + retext-stringify@4.0.0: + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} + + retext@9.0.0: + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} + + rollup@4.60.3: + resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + s.color@0.0.15: + resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} + + sass-formatter@0.7.9: + resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==} + + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shiki@4.0.2: + resolution: {integrity: sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==} + engines: {node: '>=20'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + smol-toml@1.6.1: + resolution: {integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==} + engines: {node: '>= 18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + suf-log@2.5.3: + resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} + + svgo@4.0.1: + resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} + engines: {node: '>=16'} + hasBin: true + + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + + tinyclip@0.1.12: + resolution: {integrity: sha512-Ae3OVUqifDw0wBriIBS7yVaW44Dp6eSHQcyq4Igc7eN2TJH/2YsicswaW+J/OuMvhpDPOKEgpAZCjkb4hpoyeA==} + engines: {node: ^16.14.0 || >= 17.3.0} + + tinyexec@1.1.2: + resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} + engines: {node: '>=18'} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + ultrahtml@1.6.0: + resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} + + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unifont@0.7.4: + resolution: {integrity: sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==} + + unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-modify-children@4.0.0: + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + unstorage@1.17.5: + resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} + peerDependencies: + '@azure/app-configuration': ^1.8.0 + '@azure/cosmos': ^4.2.0 + '@azure/data-tables': ^13.3.0 + '@azure/identity': ^4.6.0 + '@azure/keyvault-secrets': ^4.9.0 + '@azure/storage-blob': ^12.26.0 + '@capacitor/preferences': ^6 || ^7 || ^8 + '@deno/kv': '>=0.9.0' + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 + '@planetscale/database': ^1.19.0 + '@upstash/redis': ^1.34.3 + '@vercel/blob': '>=0.27.1' + '@vercel/functions': ^2.2.12 || ^3.0.0 + '@vercel/kv': ^1 || ^2 || ^3 + aws4fetch: ^1.0.20 + db0: '>=0.2.1' + idb-keyval: ^6.2.1 + ioredis: ^5.4.2 + uploadthing: ^7.4.4 + peerDependenciesMeta: + '@azure/app-configuration': + optional: true + '@azure/cosmos': + optional: true + '@azure/data-tables': + optional: true + '@azure/identity': + optional: true + '@azure/keyvault-secrets': + optional: true + '@azure/storage-blob': + optional: true + '@capacitor/preferences': + optional: true + '@deno/kv': + optional: true + '@netlify/blobs': + optional: true + '@planetscale/database': + optional: true + '@upstash/redis': + optional: true + '@vercel/blob': + optional: true + '@vercel/functions': + optional: true + '@vercel/kv': + optional: true + aws4fetch: + optional: true + db0: + optional: true + idb-keyval: + optional: true + ioredis: + optional: true + uploadthing: + optional: true + + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@7.3.3: + resolution: {integrity: sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitefu@1.1.3: + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + vite: + optional: true + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} + + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + + zod@4.4.3: + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@astrojs/compiler@2.13.1': {} + + '@astrojs/compiler@4.0.0': {} + + '@astrojs/internal-helpers@0.9.0': + dependencies: + picomatch: 4.0.4 + + '@astrojs/markdown-remark@7.1.1': + dependencies: + '@astrojs/internal-helpers': 0.9.0 + '@astrojs/prism': 4.0.1 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.3 + hast-util-to-text: 4.0.2 + js-yaml: 4.1.1 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.1 + remark-gfm: 4.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + remark-smartypants: 3.0.2 + retext-smartypants: 6.2.0 + shiki: 4.0.2 + smol-toml: 1.6.1 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.1.0 + unist-util-visit-parents: 6.0.2 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@astrojs/prism@4.0.1': + dependencies: + prismjs: 1.30.0 + + '@astrojs/telemetry@3.3.2': + dependencies: + ci-info: 4.4.0 + dset: 3.1.4 + is-docker: 4.0.0 + is-wsl: 3.1.1 + which-pm-runs: 1.1.0 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.29.3': + dependencies: + '@babel/types': 7.29.0 + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@capsizecss/unpack@4.0.0': + dependencies: + fontkitten: 1.0.3 + + '@clack/core@1.3.0': + dependencies: + fast-wrap-ansi: 0.2.0 + sisteransi: 1.0.5 + + '@clack/prompts@1.3.0': + dependencies: + '@clack/core': 1.3.0 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.0 + sisteransi: 1.0.5 + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.27.7': + optional: true + + '@esbuild/android-arm64@0.27.7': + optional: true + + '@esbuild/android-arm@0.27.7': + optional: true + + '@esbuild/android-x64@0.27.7': + optional: true + + '@esbuild/darwin-arm64@0.27.7': + optional: true + + '@esbuild/darwin-x64@0.27.7': + optional: true + + '@esbuild/freebsd-arm64@0.27.7': + optional: true + + '@esbuild/freebsd-x64@0.27.7': + optional: true + + '@esbuild/linux-arm64@0.27.7': + optional: true + + '@esbuild/linux-arm@0.27.7': + optional: true + + '@esbuild/linux-ia32@0.27.7': + optional: true + + '@esbuild/linux-loong64@0.27.7': + optional: true + + '@esbuild/linux-mips64el@0.27.7': + optional: true + + '@esbuild/linux-ppc64@0.27.7': + optional: true + + '@esbuild/linux-riscv64@0.27.7': + optional: true + + '@esbuild/linux-s390x@0.27.7': + optional: true + + '@esbuild/linux-x64@0.27.7': + optional: true + + '@esbuild/netbsd-arm64@0.27.7': + optional: true + + '@esbuild/netbsd-x64@0.27.7': + optional: true + + '@esbuild/openbsd-arm64@0.27.7': + optional: true + + '@esbuild/openbsd-x64@0.27.7': + optional: true + + '@esbuild/openharmony-arm64@0.27.7': + optional: true + + '@esbuild/sunos-x64@0.27.7': + optional: true + + '@esbuild/win32-arm64@0.27.7': + optional: true + + '@esbuild/win32-ia32@0.27.7': + optional: true + + '@esbuild/win32-x64@0.27.7': + optional: true + + '@img/colour@1.1.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.10.0 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@oslojs/encoding@1.1.0': {} + + '@rollup/pluginutils@5.3.0(rollup@4.60.3)': + dependencies: + '@types/estree': 1.0.9 + estree-walker: 2.0.2 + picomatch: 4.0.4 + optionalDependencies: + rollup: 4.60.3 + + '@rollup/rollup-android-arm-eabi@4.60.3': + optional: true + + '@rollup/rollup-android-arm64@4.60.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.60.3': + optional: true + + '@rollup/rollup-darwin-x64@4.60.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.60.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.60.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.60.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.60.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.60.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.60.3': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.60.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.60.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.60.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.60.3': + optional: true + + '@rollup/rollup-openbsd-x64@4.60.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.60.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.60.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.60.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.60.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.60.3': + optional: true + + '@shikijs/core@4.0.2': + dependencies: + '@shikijs/primitive': 4.0.2 + '@shikijs/types': 4.0.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@4.0.2': + dependencies: + '@shikijs/types': 4.0.2 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@4.0.2': + dependencies: + '@shikijs/types': 4.0.2 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@4.0.2': + dependencies: + '@shikijs/types': 4.0.2 + + '@shikijs/primitive@4.0.2': + dependencies: + '@shikijs/types': 4.0.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/themes@4.0.2': + dependencies: + '@shikijs/types': 4.0.2 + + '@shikijs/types@4.0.2': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + '@shikijs/vscode-textmate@10.0.2': {} + + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree@1.0.8': {} + + '@types/estree@1.0.9': {} + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@2.1.0': {} + + '@types/nlcst@2.0.3': + dependencies: + '@types/unist': 3.0.3 + + '@types/unist@3.0.3': {} + + '@ungap/structured-clone@1.3.1': {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + array-iterate@2.0.1: {} + + astro@6.3.0(rollup@4.60.3): + dependencies: + '@astrojs/compiler': 4.0.0 + '@astrojs/internal-helpers': 0.9.0 + '@astrojs/markdown-remark': 7.1.1 + '@astrojs/telemetry': 3.3.2 + '@capsizecss/unpack': 4.0.0 + '@clack/prompts': 1.3.0 + '@oslojs/encoding': 1.1.0 + '@rollup/pluginutils': 5.3.0(rollup@4.60.3) + aria-query: 5.3.2 + axobject-query: 4.1.0 + ci-info: 4.4.0 + clsx: 2.1.1 + common-ancestor-path: 2.0.0 + cookie: 1.1.1 + devalue: 5.8.0 + diff: 8.0.4 + dset: 3.1.4 + es-module-lexer: 2.1.0 + esbuild: 0.27.7 + flattie: 1.1.1 + fontace: 0.4.1 + get-tsconfig: 5.0.0-beta.4 + github-slugger: 2.0.0 + html-escaper: 3.0.3 + http-cache-semantics: 4.2.0 + js-yaml: 4.1.1 + jsonc-parser: 3.3.1 + magic-string: 0.30.21 + magicast: 0.5.2 + mrmime: 2.0.1 + neotraverse: 0.6.18 + obug: 2.1.1 + p-limit: 7.3.0 + p-queue: 9.2.0 + package-manager-detector: 1.6.0 + piccolore: 0.1.3 + picomatch: 4.0.4 + rehype: 13.0.2 + semver: 7.7.4 + shiki: 4.0.2 + smol-toml: 1.6.1 + svgo: 4.0.1 + tinyclip: 0.1.12 + tinyexec: 1.1.2 + tinyglobby: 0.2.16 + ultrahtml: 1.6.0 + unifont: 0.7.4 + unist-util-visit: 5.1.0 + unstorage: 1.17.5 + vfile: 6.0.3 + vite: 7.3.3 + vitefu: 1.1.3(vite@7.3.3) + xxhash-wasm: 1.1.0 + yargs-parser: 22.0.0 + zod: 4.4.3 + optionalDependencies: + sharp: 0.34.5 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@types/node' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - db0 + - idb-keyval + - ioredis + - jiti + - less + - lightningcss + - rollup + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - uploadthing + - yaml + + axobject-query@4.1.0: {} + + bail@2.0.2: {} + + boolbase@1.0.0: {} + + ccount@2.0.1: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + chokidar@5.0.0: + dependencies: + readdirp: 5.0.0 + + ci-info@4.4.0: {} + + clsx@2.1.1: {} + + comma-separated-tokens@2.0.3: {} + + commander@11.1.0: {} + + common-ancestor-path@2.0.0: {} + + cookie-es@1.2.3: {} + + cookie@1.1.1: {} + + crossws@0.3.5: + dependencies: + uncrypto: 0.1.3 + + css-select@5.2.2: + dependencies: + boolbase: 1.0.0 + css-what: 6.2.2 + domhandler: 5.0.3 + domutils: 3.2.2 + nth-check: 2.1.1 + + css-tree@2.2.1: + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.1 + + css-tree@3.2.1: + dependencies: + mdn-data: 2.27.1 + source-map-js: 1.2.1 + + css-what@6.2.2: {} + + csso@5.0.5: + dependencies: + css-tree: 2.2.1 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + + defu@6.1.7: {} + + dequal@2.0.3: {} + + destr@2.0.5: {} + + detect-libc@2.1.2: + optional: true + + devalue@5.8.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff@8.0.4: {} + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.2.2: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + dset@3.1.4: {} + + entities@4.5.0: {} + + entities@6.0.1: {} + + es-module-lexer@2.1.0: {} + + esbuild@0.27.7: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.7 + '@esbuild/android-arm': 0.27.7 + '@esbuild/android-arm64': 0.27.7 + '@esbuild/android-x64': 0.27.7 + '@esbuild/darwin-arm64': 0.27.7 + '@esbuild/darwin-x64': 0.27.7 + '@esbuild/freebsd-arm64': 0.27.7 + '@esbuild/freebsd-x64': 0.27.7 + '@esbuild/linux-arm': 0.27.7 + '@esbuild/linux-arm64': 0.27.7 + '@esbuild/linux-ia32': 0.27.7 + '@esbuild/linux-loong64': 0.27.7 + '@esbuild/linux-mips64el': 0.27.7 + '@esbuild/linux-ppc64': 0.27.7 + '@esbuild/linux-riscv64': 0.27.7 + '@esbuild/linux-s390x': 0.27.7 + '@esbuild/linux-x64': 0.27.7 + '@esbuild/netbsd-arm64': 0.27.7 + '@esbuild/netbsd-x64': 0.27.7 + '@esbuild/openbsd-arm64': 0.27.7 + '@esbuild/openbsd-x64': 0.27.7 + '@esbuild/openharmony-arm64': 0.27.7 + '@esbuild/sunos-x64': 0.27.7 + '@esbuild/win32-arm64': 0.27.7 + '@esbuild/win32-ia32': 0.27.7 + '@esbuild/win32-x64': 0.27.7 + + escape-string-regexp@5.0.0: {} + + estree-walker@2.0.2: {} + + eventemitter3@5.0.4: {} + + extend@3.0.2: {} + + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + + fast-wrap-ansi@0.2.0: + dependencies: + fast-string-width: 3.0.2 + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + flattie@1.1.1: {} + + fontace@0.4.1: + dependencies: + fontkitten: 1.0.3 + + fontkitten@1.0.3: + dependencies: + tiny-inflate: 1.0.3 + + fsevents@2.3.3: + optional: true + + get-tsconfig@5.0.0-beta.4: + dependencies: + resolve-pkg-maps: 1.0.0 + + github-slugger@2.0.0: {} + + h3@1.15.11: + dependencies: + cookie-es: 1.2.3 + crossws: 0.3.5 + defu: 6.1.7 + destr: 2.0.5 + iron-webcrypto: 1.2.1 + node-mock-http: 1.0.4 + radix3: 1.1.2 + ufo: 1.6.4 + uncrypto: 0.1.3 + + hast-util-from-html@2.0.3: + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.3 + parse5: 7.3.0 + vfile: 6.0.3 + vfile-message: 4.0.3 + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.1.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.4 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.1 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-text@4.0.2: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.4 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.1.0 + space-separated-tokens: 2.0.2 + + html-escaper@3.0.3: {} + + html-void-elements@3.0.0: {} + + http-cache-semantics@4.2.0: {} + + iron-webcrypto@1.2.1: {} + + is-docker@3.0.0: {} + + is-docker@4.0.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-plain-obj@4.1.0: {} + + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 + + jsonc-parser@3.3.1: {} + + longest-streak@3.1.0: {} + + lru-cache@11.3.6: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.5.2: + dependencies: + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 + source-map-js: 1.2.1 + + markdown-table@3.0.4: {} + + mdast-util-definitions@6.0.0: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.3: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.1.0: + dependencies: + mdast-util-from-markdown: 2.0.3 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.1 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.1.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdn-data@2.0.28: {} + + mdn-data@2.27.1: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-whitespace@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 + + micromark-util-encode@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-symbol@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color + + mrmime@2.0.1: {} + + ms@2.1.3: {} + + nanoid@3.3.12: {} + + neotraverse@0.6.18: {} + + nlcst-to-string@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + + node-fetch-native@1.6.7: {} + + node-mock-http@1.0.4: {} + + normalize-path@3.0.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + obug@2.1.1: {} + + ofetch@1.5.1: + dependencies: + destr: 2.0.5 + node-fetch-native: 1.6.7 + ufo: 1.6.4 + + ohash@2.0.11: {} + + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + + p-limit@7.3.0: + dependencies: + yocto-queue: 1.2.2 + + p-queue@9.2.0: + dependencies: + eventemitter3: 5.0.4 + p-timeout: 7.0.1 + + p-timeout@7.0.1: {} + + package-manager-detector@1.6.0: {} + + parse-latin@7.0.0: + dependencies: + '@types/nlcst': 2.0.3 + '@types/unist': 3.0.3 + nlcst-to-string: 4.0.0 + unist-util-modify-children: 4.0.0 + unist-util-visit-children: 3.0.0 + vfile: 6.0.3 + + parse5@7.3.0: + dependencies: + entities: 6.0.1 + + piccolore@0.1.3: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.4: {} + + postcss@8.5.14: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier-plugin-astro@0.14.1: + dependencies: + '@astrojs/compiler': 2.13.1 + prettier: 3.8.3 + sass-formatter: 0.7.9 + + prettier@3.8.3: {} + + prismjs@1.30.0: {} + + property-information@7.1.0: {} + + radix3@1.1.2: {} + + readdirp@5.0.0: {} + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + rehype-parse@9.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.3 + unified: 11.0.5 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.4 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-stringify@10.0.1: + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.5 + unified: 11.0.5 + + rehype@13.0.2: + dependencies: + '@types/hast': 3.0.4 + rehype-parse: 9.0.1 + rehype-stringify: 10.0.1 + unified: 11.0.5 + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 + + remark-smartypants@3.0.2: + dependencies: + retext: 9.0.0 + retext-smartypants: 6.2.0 + unified: 11.0.5 + unist-util-visit: 5.1.0 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + resolve-pkg-maps@1.0.0: {} + + retext-latin@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + parse-latin: 7.0.0 + unified: 11.0.5 + + retext-smartypants@6.2.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unist-util-visit: 5.1.0 + + retext-stringify@4.0.0: + dependencies: + '@types/nlcst': 2.0.3 + nlcst-to-string: 4.0.0 + unified: 11.0.5 + + retext@9.0.0: + dependencies: + '@types/nlcst': 2.0.3 + retext-latin: 4.0.0 + retext-stringify: 4.0.0 + unified: 11.0.5 + + rollup@4.60.3: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.60.3 + '@rollup/rollup-android-arm64': 4.60.3 + '@rollup/rollup-darwin-arm64': 4.60.3 + '@rollup/rollup-darwin-x64': 4.60.3 + '@rollup/rollup-freebsd-arm64': 4.60.3 + '@rollup/rollup-freebsd-x64': 4.60.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.3 + '@rollup/rollup-linux-arm-musleabihf': 4.60.3 + '@rollup/rollup-linux-arm64-gnu': 4.60.3 + '@rollup/rollup-linux-arm64-musl': 4.60.3 + '@rollup/rollup-linux-loong64-gnu': 4.60.3 + '@rollup/rollup-linux-loong64-musl': 4.60.3 + '@rollup/rollup-linux-ppc64-gnu': 4.60.3 + '@rollup/rollup-linux-ppc64-musl': 4.60.3 + '@rollup/rollup-linux-riscv64-gnu': 4.60.3 + '@rollup/rollup-linux-riscv64-musl': 4.60.3 + '@rollup/rollup-linux-s390x-gnu': 4.60.3 + '@rollup/rollup-linux-x64-gnu': 4.60.3 + '@rollup/rollup-linux-x64-musl': 4.60.3 + '@rollup/rollup-openbsd-x64': 4.60.3 + '@rollup/rollup-openharmony-arm64': 4.60.3 + '@rollup/rollup-win32-arm64-msvc': 4.60.3 + '@rollup/rollup-win32-ia32-msvc': 4.60.3 + '@rollup/rollup-win32-x64-gnu': 4.60.3 + '@rollup/rollup-win32-x64-msvc': 4.60.3 + fsevents: 2.3.3 + + s.color@0.0.15: {} + + sass-formatter@0.7.9: + dependencies: + suf-log: 2.5.3 + + sax@1.6.0: {} + + semver@7.7.4: {} + + sharp@0.34.5: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.7.4 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + optional: true + + shiki@4.0.2: + dependencies: + '@shikijs/core': 4.0.2 + '@shikijs/engine-javascript': 4.0.2 + '@shikijs/engine-oniguruma': 4.0.2 + '@shikijs/langs': 4.0.2 + '@shikijs/themes': 4.0.2 + '@shikijs/types': 4.0.2 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.4 + + sisteransi@1.0.5: {} + + smol-toml@1.6.1: {} + + source-map-js@1.2.1: {} + + space-separated-tokens@2.0.2: {} + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + suf-log@2.5.3: + dependencies: + s.color: 0.0.15 + + svgo@4.0.1: + dependencies: + commander: 11.1.0 + css-select: 5.2.2 + css-tree: 3.2.1 + css-what: 6.2.2 + csso: 5.0.5 + picocolors: 1.1.1 + sax: 1.6.0 + + tiny-inflate@1.0.3: {} + + tinyclip@0.1.12: {} + + tinyexec@1.1.2: {} + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + tslib@2.8.1: + optional: true + + ufo@1.6.4: {} + + ultrahtml@1.6.0: {} + + uncrypto@0.1.3: {} + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unifont@0.7.4: + dependencies: + css-tree: 3.2.1 + ofetch: 1.5.1 + ohash: 2.0.11 + + unist-util-find-after@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-modify-children@4.0.0: + dependencies: + '@types/unist': 3.0.3 + array-iterate: 2.0.1 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + unstorage@1.17.5: + dependencies: + anymatch: 3.1.3 + chokidar: 5.0.0 + destr: 2.0.5 + h3: 1.15.11 + lru-cache: 11.3.6 + node-fetch-native: 1.6.7 + ofetch: 1.5.1 + ufo: 1.6.4 + + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@7.3.3: + dependencies: + esbuild: 0.27.7 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + postcss: 8.5.14 + rollup: 4.60.3 + tinyglobby: 0.2.16 + optionalDependencies: + fsevents: 2.3.3 + + vitefu@1.1.3(vite@7.3.3): + optionalDependencies: + vite: 7.3.3 + + web-namespaces@2.0.1: {} + + which-pm-runs@1.1.0: {} + + xxhash-wasm@1.1.0: {} + + yargs-parser@22.0.0: {} + + yocto-queue@1.2.2: {} + + zod@4.4.3: {} + + zwitch@2.0.4: {} diff --git a/www/pnpm-workspace.yaml b/www/pnpm-workspace.yaml new file mode 100644 index 0000000..dbb26c8 --- /dev/null +++ b/www/pnpm-workspace.yaml @@ -0,0 +1,3 @@ +allowBuilds: + esbuild: true + sharp: true diff --git a/www/privacy.html b/www/privacy.html deleted file mode 100644 index 06e054b..0000000 --- a/www/privacy.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - Lazurite Privacy Policy - - - - - - - -
- - -
-

Privacy Policy

-

Effective April 15, 2026

-

- Lazurite is a client for Bluesky. Core app behavior runs from your device, and we do not - operate a developer backend for normal use. -

- -
-

What the app stores on your device

-

- Lazurite stores account session data, settings, cached content, and other app data - locally so the app can work quickly and reliably. -

-

- This local data can include profile metadata, viewed posts, follows, lists, likes, - drafts, and media caches. -

-
- -
-

How your data is used

-

- Local data is used to keep you signed in, remember your preferences, improve loading - performance, and support offline-friendly behavior. -

-

Lazurite does not sell your personal information.

-
- -
-

Network requests and third parties

-

- When you use Lazurite, requests are sent directly from your device to Bluesky and - related infrastructure. -

-

- Your use of Bluesky remains subject to Bluesky policies, terms, and moderation systems. -

-
- -
-

Permissions

-

- If you choose to save media, Lazurite requests photo or storage permissions required by - your platform. -

-

Permissions are used only for the feature you invoke.

-
- -
-

Diagnostics and logs

-

- Lazurite keeps local app logs to help troubleshoot issues. These logs stay on your - device unless you choose to share them. -

-

Lazurite does not include ad tracking SDKs.

-
- -
-

Data retention and control

-

- Data remains on your device until you remove it by signing out, clearing app storage, - or uninstalling the app. -

-

- Because Lazurite does not run a central app backend for normal use, most data-control - actions happen on your device or through Bluesky account settings. -

-
- -
-

Children

-

- Lazurite is not directed to children under 13, or under the minimum age required in - your jurisdiction. -

-
- -
-

Policy updates

-

- We may revise this policy from time to time. Material updates will be reflected by a - new effective date and app release notes when appropriate. -

-
- - -
-
- - - diff --git a/www/.well-known/apple-app-site-association b/www/public/.well-known/apple-app-site-association similarity index 100% rename from www/.well-known/apple-app-site-association rename to www/public/.well-known/apple-app-site-association diff --git a/www/.well-known/assetlinks.json b/www/public/.well-known/assetlinks.json similarity index 100% rename from www/.well-known/assetlinks.json rename to www/public/.well-known/assetlinks.json diff --git a/www/_headers b/www/public/_headers similarity index 100% rename from www/_headers rename to www/public/_headers diff --git a/www/client-metadata.json b/www/public/client-metadata.json similarity index 100% rename from www/client-metadata.json rename to www/public/client-metadata.json diff --git a/www/public/favicon.ico b/www/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e689e5828d888028a6f1208b5640ef922bd852ef GIT binary patch literal 1671 zcmZQzU}Rus5D);-3Jm6q3=C!r3=9ei5WYAQ14Aw&1A~D9gwM>(z|g|Xz|a}s=g!L| z#l^tD!0YMZ62!p3AOOM~Yzzzx@}K`FGB7Z37I;J!Gcfq=1!2bGtPBwb28NfOE{-7; zbCw2sb1@n6)P65ef5ht|VB4gScV|cWJHwL|yp9)?cYJVoRK9#iL4}j`;=dYwJ_;Aq z&Su~9=5Cp`QS|7lCvnScoGl$PBzFhA`*?Xu%ZI)x!s=#CpR$TX8Ty_rFlsLftB5<& zS9oxa@8wy0e=iPIs4rszXeT^Qn3FI}11-DlYft{sMM+hYjvWyK9Vsv&wf*o|(IQ6E6#wubTa>nv*;iPt0E6 zD0uAmIp$*?1wm{K9T%5yTy8CvnxS&A^{g(dgU%6Q*BSiB+-ImBJRBdF$&jRY?*+%{ ztT%>Y9v>#1)D(4Cv)yCE%x>=uZcX1~{@61#NZc1mwin&(+vK1A=EAWID}J#*0ZqEE zpKX@@vMOVu@zVzDE(7PL?5Dq(Uq=-#meCClc+Vs;cXmsiqDe!+N9kQhT)u^`NbX|k z_d2vz_z z+QfxjA?8na(i(B?dxpp6g~z>Z(!O@v;hkFE{EgnslF987?OoS{3QbMV@vLm@UCr`9 z>p#;slf+#QcWIqimApc&$JXf0+i!1VI2=VLBtDXK(OdacJ(1&(amTB9foopg*~|S$ z;9Q_g<@AYmDPM9WnqEY@ty%Z@Ld)grg%V0z`)Z#}4$l-9njc!HI{D5*-L8#+XO~V{ zy=PjnJiqX<+MNtBZ!fM3$#Vlb*k-b;j7xgRIO;yr*#orO}mD^>5Tfly&noovD=k7l1-TjkW(B*@; z%Z0i|kxz`SpI1zqRFP6PJLl4wb9ZK*QR}lcV3~GiZuPTs_bkiPI{jpeV!SVXljyNC zd>5SaWQT7LbCwLxghPsk^ISKt+~Ce^DX za}~E4!#Xa`+_;^E$x2FoMepY%>DVCW2))@&GZBw2d|y0Ds*Au zi;LNJR=nNat9|50+SZE}InC40&Pj96ymWPcp@xj*+<+ghTx&b+);^lK`~F2Gjx8=K zC0TclJzeCx%yahVp5uvrQ?oD2#kDe~R>b{@=T}iK{Jdl5-0&M;HvFAi6f<9K;^S)- z<~{C*d>tyS)=y7r>)rMAS~Ra=|7VSqb`Gw5rHKZ@ z9EEX-(~n%Z<@T_aMQAh2p|pR>dk;r`I>dKQ@bTw4D$6)q&ilBH|$%xykHX1yyKlAKYfWbSV$J?*xt*STuS;Vv|JxFuX zV?UYa+Cu&7TeG%h=ISLf6_Ykh znX+loz3@=4u3wGfoXLUu)?u70mn=E1#eCjFqAzsGhrp@a);Fv|-Mi=fdZ_n*{qfga z@t5{K2*`{#EPcM?$?YgP#@e&1K4_iI4r_Hj^}%G(S@-TeFWv>WRllsuny~!eM)tqa SKe*q%VY=U~b9XCp761Sn5Y)K< literal 0 HcmV?d00001 diff --git a/www/static/favicon.svg b/www/public/favicon.svg similarity index 100% rename from www/static/favicon.svg rename to www/public/favicon.svg diff --git a/www/static/desktop-deck.png b/www/public/static/desktop-deck.png similarity index 100% rename from www/static/desktop-deck.png rename to www/public/static/desktop-deck.png diff --git a/www/static/desktop.svg b/www/public/static/desktop.svg similarity index 100% rename from www/static/desktop.svg rename to www/public/static/desktop.svg diff --git a/www/static/feed.svg b/www/public/static/feed.svg similarity index 100% rename from www/static/feed.svg rename to www/public/static/feed.svg diff --git a/www/static/folder.svg b/www/public/static/folder.svg similarity index 100% rename from www/static/folder.svg rename to www/public/static/folder.svg diff --git a/www/static/graph.svg b/www/public/static/graph.svg similarity index 100% rename from www/static/graph.svg rename to www/public/static/graph.svg diff --git a/www/static/lock.svg b/www/public/static/lock.svg similarity index 100% rename from www/static/lock.svg rename to www/public/static/lock.svg diff --git a/www/static/logo.svg b/www/public/static/logo.svg similarity index 100% rename from www/static/logo.svg rename to www/public/static/logo.svg diff --git a/www/static/message.svg b/www/public/static/message.svg similarity index 100% rename from www/static/message.svg rename to www/public/static/message.svg diff --git a/www/static/offline.svg b/www/public/static/offline.svg similarity index 100% rename from www/static/offline.svg rename to www/public/static/offline.svg diff --git a/www/static/palette.svg b/www/public/static/palette.svg similarity index 100% rename from www/static/palette.svg rename to www/public/static/palette.svg diff --git a/www/static/search.svg b/www/public/static/search.svg similarity index 100% rename from www/static/search.svg rename to www/public/static/search.svg diff --git a/www/static/smartphone.svg b/www/public/static/smartphone.svg similarity index 100% rename from www/static/smartphone.svg rename to www/public/static/smartphone.svg diff --git a/www/src/components/BrandMark.astro b/www/src/components/BrandMark.astro new file mode 100644 index 0000000..923a3c8 --- /dev/null +++ b/www/src/components/BrandMark.astro @@ -0,0 +1,15 @@ +--- +interface Props { + href?: string; + label?: string; + class?: string; +} + +const { href, label = "Lazurite", class: className = "" } = Astro.props; +const Element = href ? "a" : "div"; +--- + + + + {label} + diff --git a/www/src/components/FeatureCard.astro b/www/src/components/FeatureCard.astro new file mode 100644 index 0000000..81e3e81 --- /dev/null +++ b/www/src/components/FeatureCard.astro @@ -0,0 +1,19 @@ +--- +import IconBadge from "./IconBadge.astro"; + +interface Props { + title: string; + description: string; + icon: string; + iconAlt: string; + iconTone?: "blue" | "violet"; +} + +const { title, description, icon, iconAlt, iconTone = "blue" } = Astro.props; +--- + +
+ +

{title}

+

{description}

+
diff --git a/www/src/components/HomePage.astro b/www/src/components/HomePage.astro new file mode 100644 index 0000000..dd0a560 --- /dev/null +++ b/www/src/components/HomePage.astro @@ -0,0 +1,185 @@ +--- +import BrandMark from "./BrandMark.astro"; +import FeatureCard from "./FeatureCard.astro"; +import PlatformCard from "./PlatformCard.astro"; +import ScreenshotFrame from "./ScreenshotFrame.astro"; +import SiteFooter from "./SiteFooter.astro"; +import StatusBadge from "./StatusBadge.astro"; +import TechStack from "./TechStack.astro"; + +const screenshots = [ + { + src: "/static/desktop-deck.png", + alt: "Lazurite desktop workspace screenshot", + variant: "desktop" as const, + loading: "eager" as const, + }, + { + src: "https://placehold.co/720x1280/191919/33b1ff?text=Mobile%0AProfile&font=inter", + alt: "Lazurite mobile profile screenshot", + variant: "phone" as const, + loading: "lazy" as const, + }, +]; + +const platforms = [ + { + title: "Mobile", + description: + "Material You design with offline support, smart folders, and full AT Protocol coverage. Built with Flutter for a native feel on both platforms.", + badge: "Beta", + badgeTone: "beta" as const, + icon: "/static/smartphone.svg", + iconAlt: "Mobile icon", + iconTone: "blue" as const, + targets: ["iOS", "Android"], + features: [ + "Offline-first with local caching and offline compose", + "Full DM support with conversation requests", + "Drafts, scheduled posts, and bookmarks", + "Content moderation with custom labelers", + "Multi-account switching with data isolation", + "Themeable: Oxocarbon, Catppuccin, Nord, Rose Pine", + ], + screenshot: { + src: "https://placehold.co/720x1280/000000/7dafff?text=Feed+%2B+Compose&font=inter", + alt: "Mobile feed and compose", + caption: "Your home feed and a composer button", + }, + }, + { + title: "Desktop", + description: + "A native desktop experience built with Tauri and Solid.js. Semantic search across your saved posts, multi-column layouts, and deep AT Protocol tooling.", + badge: "Alpha", + badgeTone: "alpha" as const, + icon: "/static/desktop.svg", + iconAlt: "Desktop icon", + iconTone: "violet" as const, + targets: ["macOS", "Windows", "Linux"], + features: [ + "Full-text and vector search over saved and liked posts", + "Multi-column workspace layouts", + "PDS browser for exploring repository data", + "Composer window for distraction-free posting", + "Deep-link handling for at:// URIs", + "Global shortcuts (post from anywhere)", + ], + screenshot: { + src: "/static/desktop-deck.png", + alt: "Desktop multi-column layout", + caption: "Multi-column workspace with search", + }, + }, +]; + +const features = [ + { + title: "Feeds & Timelines", + description: + "Home timeline, custom algorithmic feeds, pinned feeds with drag-to-reorder. Full thread and reply chain rendering.", + icon: "/static/feed.svg", + iconAlt: "Feed icon", + }, + { + title: "Search & Discovery", + description: + "Search your saved & liked posts, discover starterpacks with the power of local semantic search with embeddings.", + icon: "/static/search.svg", + iconAlt: "Search icon", + iconTone: "violet" as const, + }, + { + title: "Moderation", + description: + "Subscribe to labelers, configure per-label preferences, mute and block lists. Adult content controls with granular filtering.", + icon: "/static/lock.svg", + iconAlt: "Moderation icon", + }, + { + title: "Lists & Starter Packs", + description: + "Create and manage curation and moderation lists. Browse, search, and build starter packs to share with others.", + icon: "/static/folder.svg", + iconAlt: "Lists icon", + iconTone: "violet" as const, + }, + { + title: "Offline & Fast", + description: + "Smart caching with local databases on both platforms. Browse cached content and queue actions while offline.", + icon: "/static/offline.svg", + iconAlt: "Offline icon", + }, + { + title: "Social Graph", + description: + "Explore connections with a force-directed graph visualization. See mutual follows, followers, and blocking context at a glance.", + icon: "/static/graph.svg", + iconAlt: "Graph icon", + iconTone: "violet" as const, + }, +]; + +const techGroups = [ + { label: "Mobile", items: ["Flutter", "Dart", "Material 3", "Drift", "BLoC"] }, + { label: "Desktop", items: ["Tauri 2", "Rust", "Solid.js", "SQLite + FTS", "fastembed"] }, + { label: "Protocol", items: ["AT Protocol", "OAuth 2.0 + DPoP", "Constellation"] }, +]; +--- + +
+
+
+ +

The ATmosphere client that rocks.

+
+ +
+
+ +

Roam the ATmosphere

+

+ Lazurite is a client for Bluesky & BlackSky built for people who want more from their + social experience. A full-featured mobile app for iOS and Android, paired with a powerful + desktop companion for macOS, Windows, and Linux. +

+
+ +
+ { + screenshots.map((screenshot) => ( + + )) + } +
+ +
+ {platforms.map((platform) => )} +
+ +
+

Across both platforms

+
+ {features.map((feature) => )} +
+
+ + + + +
+
+ + +
diff --git a/www/src/components/IconBadge.astro b/www/src/components/IconBadge.astro new file mode 100644 index 0000000..6b480ba --- /dev/null +++ b/www/src/components/IconBadge.astro @@ -0,0 +1,14 @@ +--- +interface Props { + src: string; + alt: string; + tone?: "blue" | "violet"; + class?: string; +} + +const { src, alt, tone = "blue", class: className = "" } = Astro.props; +--- + + + {alt} + diff --git a/www/src/components/LegalDocument.astro b/www/src/components/LegalDocument.astro new file mode 100644 index 0000000..2714677 --- /dev/null +++ b/www/src/components/LegalDocument.astro @@ -0,0 +1,51 @@ +--- +import type { CollectionEntry } from "astro:content"; +import BrandMark from "./BrandMark.astro"; + +interface Props { + page: CollectionEntry<"legalPages">["data"]; +} + +const { page } = Astro.props; +--- + + diff --git a/www/src/components/PlatformCard.astro b/www/src/components/PlatformCard.astro new file mode 100644 index 0000000..690f448 --- /dev/null +++ b/www/src/components/PlatformCard.astro @@ -0,0 +1,57 @@ +--- +import IconBadge from "./IconBadge.astro"; +import ScreenshotFrame from "./ScreenshotFrame.astro"; + +interface PlatformScreenshot { + src: string; + alt: string; + caption: string; +} + +interface Props { + title: string; + description: string; + badge: string; + badgeTone: "alpha" | "beta"; + icon: string; + iconAlt: string; + iconTone: "blue" | "violet"; + targets: string[]; + features: string[]; + screenshot: PlatformScreenshot; +} + +const { + title, + description, + badge, + badgeTone, + icon, + iconAlt, + iconTone, + targets, + features, + screenshot, +} = Astro.props; +--- + +
+
+ +

{title}

+ {badge} +
+

{description}

+
+ {targets.map((target) => {target})} +
+
    + {features.map((feature) =>
  • {feature}
  • )} +
+ +
diff --git a/www/src/components/ScreenshotFrame.astro b/www/src/components/ScreenshotFrame.astro new file mode 100644 index 0000000..84346f5 --- /dev/null +++ b/www/src/components/ScreenshotFrame.astro @@ -0,0 +1,16 @@ +--- +interface Props { + src: string; + alt: string; + variant?: "desktop" | "phone" | "card"; + caption?: string; + loading?: "eager" | "lazy"; +} + +const { src, alt, variant = "card", caption, loading = "lazy" } = Astro.props; +--- + +
+ {alt} + {caption &&
{caption}
} +
diff --git a/www/src/components/SiteFooter.astro b/www/src/components/SiteFooter.astro new file mode 100644 index 0000000..6872431 --- /dev/null +++ b/www/src/components/SiteFooter.astro @@ -0,0 +1,24 @@ +--- +const footerLinks = [ + { href: "https://desertthunder.dev", label: "Owais", external: true }, + { href: "https://stormlightlabs.org", label: "Stormlight Labs", external: true }, + { href: "https://atproto.com", label: "AT Protocol", external: true }, + { href: "/csae-policy", label: "Child Safety Standards" }, + { href: "/privacy", label: "Privacy Policy" }, + { href: "/terms", label: "Terms of Service" }, +]; +--- + + diff --git a/www/src/components/StatusBadge.astro b/www/src/components/StatusBadge.astro new file mode 100644 index 0000000..b7470e2 --- /dev/null +++ b/www/src/components/StatusBadge.astro @@ -0,0 +1,12 @@ +--- +interface Props { + label: string; +} + +const { label } = Astro.props; +--- + +
+ + {label} +
diff --git a/www/src/components/TechStack.astro b/www/src/components/TechStack.astro new file mode 100644 index 0000000..ca98c90 --- /dev/null +++ b/www/src/components/TechStack.astro @@ -0,0 +1,31 @@ +--- +interface TechGroup { + label: string; + items: string[]; +} + +interface Props { + title: string; + groups: TechGroup[]; +} + +const { title, groups } = Astro.props; +--- + +
+

{title}

+
+ { + groups.map((group) => ( +
+

{group.label}

+
+ {group.items.map((item) => ( + {item} + ))} +
+
+ )) + } +
+
diff --git a/www/src/content.config.ts b/www/src/content.config.ts new file mode 100644 index 0000000..bccb93f --- /dev/null +++ b/www/src/content.config.ts @@ -0,0 +1,20 @@ +import { defineCollection } from "astro:content"; +import { glob } from "astro/loaders"; +import { z } from "astro/zod"; + +const footerLinkSchema = z.object({ href: z.string(), label: z.string(), external: z.boolean().optional() }); + +const legalPages = defineCollection({ + loader: glob({ base: "./src/content/legal", pattern: "**/*.md" }), + schema: z.object({ + slug: z.string(), + title: z.string(), + description: z.string(), + effectiveDate: z.string(), + lead: z.string(), + alert: z.string().optional(), + footerLinks: z.array(footerLinkSchema), + }), +}); + +export const collections = { legalPages }; diff --git a/www/src/content/legal/csae-policy.md b/www/src/content/legal/csae-policy.md new file mode 100644 index 0000000..05ce601 --- /dev/null +++ b/www/src/content/legal/csae-policy.md @@ -0,0 +1,58 @@ +--- +slug: csae-policy +title: Child Safety Standards (CSAE) +description: Lazurite Child Safety Standards and CSAE Policy - effective May 3, 2026. +effectiveDate: May 3, 2026 +lead: This page describes the child safety standards for Lazurite by Stormlight Labs, including our policies against child sexual abuse and exploitation (CSAE), child sexual abuse material (CSAM), and related harmful behavior. +alert: "Zero tolerance: content or behavior involving child sexual abuse, exploitation, or endangerment is prohibited." +footerLinks: + - href: /privacy + label: Privacy Policy + - href: /terms + label: Terms of Service +--- + +## 1. Prohibited content and conduct + +Lazurite standards prohibit, at minimum: + +- Creation, sharing, solicitation, or promotion of CSAM. +- Grooming behavior targeting minors. +- Sextortion involving minors. +- Trafficking, solicitation, or sexual exploitation of children. +- Any use of Lazurite to endanger children. + +## 2. In-app reporting and user feedback + +Lazurite provides in-app pathways for users to report content, accounts, and behavior that may violate safety standards, including CSAE concerns. + +Reports are reviewed as a priority category and escalated when they indicate possible child endangerment or CSAM. + +## 3. Response to potential CSAM + +Upon obtaining actual knowledge of potential CSAM, we take appropriate action under our policies and applicable law. Actions may include: + +- Removing or restricting access to violative content. +- Restricting or suspending access to violating accounts and features. +- Preserving records necessary for legal reporting and safety investigations. + +## 4. Legal compliance and external reporting + +We maintain procedures to comply with applicable child safety laws and regulations, including reporting confirmed CSAM to the National Center for Missing and Exploited Children (NCMEC) or the relevant regional authority as required by law. + +If you believe a child is in immediate danger, contact local law enforcement immediately. + +## 5. Child safety point of contact + +Child safety contact for Lazurite / Stormlight Labs: info@stormlightlabs.org + +This contact is designated to receive and coordinate potential notifications related to CSAE and CSAM concerns. + +## 6. Policy updates + +We may update these standards as laws, platform requirements, and enforcement practices evolve. Material updates will be reflected by an updated effective date. + + diff --git a/www/src/content/legal/privacy.md b/www/src/content/legal/privacy.md new file mode 100644 index 0000000..449928b --- /dev/null +++ b/www/src/content/legal/privacy.md @@ -0,0 +1,60 @@ +--- +slug: privacy +title: Privacy Policy +description: Lazurite Privacy Policy - effective April 15, 2026. +effectiveDate: April 15, 2026 +lead: Lazurite is a client for Bluesky. Core app behavior runs from your device, and we do not operate a developer backend for normal use. +footerLinks: + - href: /csae-policy + label: Child Safety Standards + - href: /terms + label: Terms of Service +--- + +## What the app stores on your device + +Lazurite stores account session data, settings, cached content, and other app data locally so the app can work quickly and reliably. + +This local data can include profile metadata, viewed posts, follows, lists, likes, drafts, and media caches. + +## How your data is used + +Local data is used to keep you signed in, remember your preferences, improve loading performance, and support offline-friendly behavior. + +Lazurite does not sell your personal information. + +## Network requests and third parties + +When you use Lazurite, requests are sent directly from your device to Bluesky and related infrastructure. + +Your use of Bluesky remains subject to Bluesky policies, terms, and moderation systems. + +## Permissions + +If you choose to save media, Lazurite requests photo or storage permissions required by your platform. + +Permissions are used only for the feature you invoke. + +## Diagnostics and logs + +Lazurite keeps local app logs to help troubleshoot issues. These logs stay on your device unless you choose to share them. + +Lazurite does not include ad tracking SDKs. + +## Data retention and control + +Data remains on your device until you remove it by signing out, clearing app storage, or uninstalling the app. + +Because Lazurite does not run a central app backend for normal use, most data-control actions happen on your device or through Bluesky account settings. + +## Children + +Lazurite is not directed to children under 13, or under the minimum age required in your jurisdiction. + +## Policy updates + +We may revise this policy from time to time. Material updates will be reflected by a new effective date and app release notes when appropriate. + + diff --git a/www/src/content/legal/terms.md b/www/src/content/legal/terms.md new file mode 100644 index 0000000..95614ae --- /dev/null +++ b/www/src/content/legal/terms.md @@ -0,0 +1,69 @@ +--- +slug: terms +title: Terms of Service +description: Lazurite Terms of Service - effective April 15, 2026. +effectiveDate: April 15, 2026 +lead: These Terms govern your use of Lazurite, a Bluesky client built by Stormlight Labs. By installing or using Lazurite, you agree to these Terms. +footerLinks: + - href: /csae-policy + label: Child Safety Standards + - href: /privacy + label: Privacy Policy +--- + +## What Lazurite is + +Lazurite is client software that helps you access Bluesky from your device. + +Lazurite does not provide the Bluesky network itself. + +## Eligibility + +You must be legally able to agree to these Terms and meet the minimum age requirement in your jurisdiction. + +## License + +We grant you a limited, non-exclusive, non-transferable, revocable license to use Lazurite on devices you control. + +You may not misuse the app, break applicable law, or attempt unauthorized access to systems or accounts. + +## Bluesky terms and policies + +Lazurite depends on Bluesky services, and your use of Bluesky is governed by Bluesky's own legal terms. + +## Your account and activity + +You are responsible for your Bluesky account, credentials, and activity taken through Lazurite. + +You retain rights to your content, subject to Bluesky policies and any third-party rights. + +## Acceptable use + +Do not use Lazurite to harass others, violate rights, distribute unlawful content, or abuse platform infrastructure. + +You are responsible for complying with Bluesky rules and applicable law. + +## Third-party dependencies + +Lazurite depends on Bluesky and related third-party services. + +If those services change, restrict, or discontinue access, features may degrade or stop working. + +## No warranty + +Lazurite is provided "as is" and "as available." We do not guarantee uninterrupted, secure, or error-free operation. + +## Liability + +To the maximum extent permitted by law, Stormlight Labs is not liable for indirect, incidental, or consequential damages arising from your use of Lazurite. + +## Changes and termination + +We may update, suspend, or discontinue parts of Lazurite. + +We may update these Terms. Continued use after updates means you accept the revised Terms. + + diff --git a/www/src/layouts/BaseLayout.astro b/www/src/layouts/BaseLayout.astro new file mode 100644 index 0000000..82722d7 --- /dev/null +++ b/www/src/layouts/BaseLayout.astro @@ -0,0 +1,34 @@ +--- +import "../styles/shared.css"; + +interface Props { + title: string; + description: string; + bodyClass?: string; +} + +const { title, description, bodyClass = "" } = Astro.props; +--- + + + + + + + + + + {title} + + + + + + + + + + diff --git a/www/src/pages/[slug].astro b/www/src/pages/[slug].astro new file mode 100644 index 0000000..f843f94 --- /dev/null +++ b/www/src/pages/[slug].astro @@ -0,0 +1,23 @@ +--- +import { getCollection, render } from "astro:content"; +import LegalDocument from "../components/LegalDocument.astro"; +import BaseLayout from "../layouts/BaseLayout.astro"; + +export async function getStaticPaths() { + const pages = await getCollection("legalPages"); + + return pages.map((page) => ({ + params: { slug: page.data.slug }, + props: { page }, + })); +} + +const { page } = Astro.props; +const { Content } = await render(page); +--- + + + + + + diff --git a/www/src/pages/index.astro b/www/src/pages/index.astro new file mode 100644 index 0000000..d47cd70 --- /dev/null +++ b/www/src/pages/index.astro @@ -0,0 +1,11 @@ +--- +import HomePage from "../components/HomePage.astro"; +import BaseLayout from "../layouts/BaseLayout.astro"; +--- + + + + diff --git a/www/src/pages/oauth/callback/index.astro b/www/src/pages/oauth/callback/index.astro new file mode 100644 index 0000000..bbdb68f --- /dev/null +++ b/www/src/pages/oauth/callback/index.astro @@ -0,0 +1,49 @@ +--- +import BaseLayout from "../../../layouts/BaseLayout.astro"; +--- + + +
+
+

Authentication Complete

+

+ Lazurite is finishing sign-in. If the app does not reopen automatically, tap below. +

+ Open Lazurite +

If this still fails, use your browser menu and choose "Open in app".

+
+
+ + +
diff --git a/www/src/styles/shared.css b/www/src/styles/shared.css new file mode 100644 index 0000000..9d867b4 --- /dev/null +++ b/www/src/styles/shared.css @@ -0,0 +1,716 @@ +:root { + --bg-page: #050607; + --surface-card: #17191c; + --surface-raised: #202329; + --surface-muted: #111315; + --border-subtle: rgba(255, 255, 255, 0.1); + --border-strong: rgba(255, 255, 255, 0.2); + --text-primary: #f4f6fb; + --text-secondary: #b8bec8; + --text-muted: #767d88; + --brand-blue: #7dafff; + --brand-cobalt: #0073de; + --brand-sky: #33b1ff; + --brand-cyan: #08bdba; + --brand-violet: #be95ff; + --brand-rose: #ff8fa3; + --font-title: "Lora", Georgia, serif; + --font-display: "Google Sans", "Avenir Next", sans-serif; + --font-body: "Inter", "Segoe UI", sans-serif; + --font-mono: "Google Sans Code", "SFMono-Regular", monospace; + --shadow-card: 0 18px 60px rgba(0, 0, 0, 0.32); + --radius-card: 8px; +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +html { + background: var(--bg-page); +} + +body { + min-width: 320px; +} + +img { + max-width: 100%; +} + +a { + color: var(--brand-blue); + text-decoration: none; + transition: color 160ms ease; +} + +a:hover { + color: var(--brand-sky); +} + +.site-shell { + min-height: 100vh; + background: var(--bg-page); + color: var(--text-primary); + display: flex; + flex-direction: column; + font-family: var(--font-body); + line-height: 1.6; +} + +.page-container { + width: min(100%, 1240px); + margin-inline: auto; + padding-inline: clamp(1.25rem, 3vw, 2.5rem); +} + +.page-container--home { + flex: 1; + padding-block: clamp(1.5rem, 3vw, 2.5rem); +} + +.home-page { + min-height: 100vh; + display: flex; + flex: 1; + flex-direction: column; +} + +.home-masthead { + display: grid; + justify-items: center; + gap: 0.75rem; + margin-bottom: clamp(3rem, 7vw, 5.5rem); + text-align: center; +} + +.home-masthead__tagline { + color: var(--text-secondary); + font-size: clamp(1rem, 1.8vw, 1.25rem); + letter-spacing: 0; +} + +.home-content { + width: min(100%, 960px); + margin-inline: auto; +} + +.brand-mark { + width: fit-content; + display: inline-flex; + align-items: center; + gap: 0.65rem; + color: var(--text-primary); + font-family: var(--font-title); + font-size: clamp(2.5rem, 7vw, 3.75rem); + font-weight: 700; + letter-spacing: 0; +} + +.brand-mark:hover { + color: var(--text-primary); +} + +.brand-mark__label { + background: linear-gradient(135deg, var(--brand-blue), var(--brand-cobalt) 48%, var(--brand-cyan)); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.brand-mark__icon { + width: 0.86em; + height: 0.86em; + background: linear-gradient(135deg, var(--brand-blue), var(--brand-cyan)); + display: inline-block; + flex: 0 0 auto; + mask: url("/static/logo.svg") center / contain no-repeat; + -webkit-mask: url("/static/logo.svg") center / contain no-repeat; +} + +.hero-section { + display: grid; + justify-items: center; + gap: 1.35rem; + margin-bottom: clamp(2.5rem, 6vw, 4rem); + text-align: center; +} + +.hero-section__title { + max-width: 14ch; + color: var(--text-primary); + font-family: var(--font-display); + font-size: clamp(2.25rem, 5vw, 4.25rem); + font-weight: 700; + line-height: 1.04; + letter-spacing: 0; +} + +.hero-section__copy { + max-width: 760px; + color: var(--text-secondary); + font-size: clamp(1rem, 1.7vw, 1.15rem); + line-height: 1.8; +} + +.status-badge { + display: inline-flex; + align-items: center; + gap: 0.55rem; + min-height: 2.65rem; + padding: 0.65rem 1.2rem; + border: 1px solid var(--border-subtle); + border-radius: 999px; + background: color-mix(in srgb, var(--surface-card), transparent 4%); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04); + color: var(--text-primary); + font-size: 0.875rem; + font-weight: 600; + letter-spacing: 0; +} + +.status-badge__dot { + width: 8px; + height: 8px; + border-radius: 999px; + background: var(--brand-cyan); + animation: status-pulse 2s ease-in-out infinite; +} + +@keyframes status-pulse { + 0%, + 100% { + opacity: 1; + } + + 50% { + opacity: 0.45; + } +} + +.screenshot-showcase { + display: flex; + align-items: flex-end; + justify-content: center; + gap: clamp(1rem, 3vw, 1.75rem); + margin-bottom: clamp(3rem, 7vw, 5rem); +} + +.screenshot-frame { + overflow: hidden; + border: 1px solid var(--border-subtle); + border-radius: var(--radius-card); + background: var(--surface-card); + box-shadow: var(--shadow-card); +} + +.screenshot-frame img { + width: 100%; + height: auto; + display: block; +} + +.screenshot-frame--desktop { + width: min(68vw, 640px); +} + +.screenshot-frame--phone { + width: min(26vw, 200px); + flex: 0 0 auto; +} + +.screenshot-frame--card { + width: 100%; + margin-top: 1.5rem; + box-shadow: none; +} + +.screenshot-frame__caption { + padding: 0.55rem 0.75rem; + background: var(--surface-raised); + color: var(--text-muted); + font-size: 0.75rem; + line-height: 1.4; + text-align: center; +} + +.platform-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: clamp(1rem, 3vw, 2rem); + margin-bottom: clamp(3rem, 7vw, 5rem); +} + +.platform-card, +.feature-card, +.tech-stack { + border: 1px solid var(--border-subtle); + border-radius: var(--radius-card); + background: linear-gradient(180deg, rgba(255, 255, 255, 0.03), transparent 96px), var(--surface-card); +} + +.platform-card { + padding: clamp(1.4rem, 3vw, 2rem); +} + +.platform-card__header { + display: flex; + align-items: center; + gap: 0.75rem; + margin-bottom: 1.25rem; +} + +.platform-card__title, +.section-heading, +.feature-card__title, +.tech-stack__title { + color: var(--text-primary); + font-family: var(--font-display); + font-weight: 700; + letter-spacing: 0; +} + +.platform-card__title { + font-size: 1.35rem; + line-height: 1.2; +} + +.platform-card__description { + margin-bottom: 1.25rem; + color: var(--text-secondary); + font-size: 0.95rem; + line-height: 1.65; +} + +.status-label { + margin-left: auto; + border-radius: 0.25rem; + padding: 0.2rem 0.55rem; + font-size: 0.7rem; + font-weight: 700; + letter-spacing: 0.06em; + line-height: 1.2; + text-transform: uppercase; +} + +.status-label--alpha { + background: rgba(190, 149, 255, 0.14); + color: var(--brand-violet); +} + +.status-label--beta { + background: rgba(8, 189, 186, 0.14); + color: var(--brand-cyan); +} + +.icon-badge { + width: 44px; + height: 44px; + border-radius: 8px; + display: inline-flex; + align-items: center; + justify-content: center; + flex: 0 0 auto; + padding: 10px; +} + +.icon-badge--blue { + background: linear-gradient(135deg, var(--brand-blue), var(--brand-cobalt)); +} + +.icon-badge--violet { + background: linear-gradient(135deg, var(--brand-violet), var(--brand-sky)); +} + +.icon-badge img { + width: 100%; + height: 100%; + display: block; +} + +.tag-list { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + margin-bottom: 1.25rem; +} + +.tag-list--dense { + margin-bottom: 0; +} + +.tag-list__item { + border: 1px solid transparent; + border-radius: 0.4rem; + background: var(--surface-raised); + color: var(--text-secondary); + font-family: var(--font-mono); + font-size: 0.8rem; + line-height: 1.25; + padding: 0.38rem 0.68rem; + transition: + border-color 160ms ease, + color 160ms ease; +} + +.tag-list__item:hover { + border-color: var(--border-strong); + color: var(--text-primary); +} + +.check-list { + list-style: none; +} + +.check-list li { + position: relative; + padding: 0.3rem 0 0.3rem 1.25rem; + color: var(--text-secondary); + font-size: 0.875rem; + line-height: 1.55; +} + +.check-list li::before { + content: ""; + position: absolute; + left: 0; + top: 0.9rem; + width: 6px; + height: 6px; + border-radius: 999px; + background: var(--brand-blue); + opacity: 0.7; +} + +.section-block { + margin-bottom: clamp(3rem, 7vw, 5rem); +} + +.section-heading { + margin-bottom: 1.5rem; + font-size: 1.5rem; + line-height: 1.2; +} + +.feature-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1.25rem; +} + +.feature-card { + padding: 1.5rem; + transition: + transform 160ms ease, + border-color 160ms ease; +} + +.feature-card:hover { + border-color: var(--border-strong); + transform: translateY(-2px); +} + +.feature-card__icon { + margin-bottom: 0.95rem; +} + +.feature-card__title { + margin-bottom: 0.5rem; + font-size: 1.1rem; + line-height: 1.25; +} + +.feature-card__description { + color: var(--text-secondary); + font-size: 0.875rem; + line-height: 1.6; +} + +.tech-stack { + margin-bottom: clamp(3rem, 7vw, 5rem); + padding: clamp(1.4rem, 3vw, 2rem); +} + +.tech-stack__title { + margin-bottom: 1.45rem; + font-size: 1.5rem; + line-height: 1.2; +} + +.tech-stack__groups { + display: grid; + gap: 1rem; +} + +.tech-stack__label { + margin-bottom: 0.5rem; + color: var(--text-muted); + font-size: 0.75rem; + font-weight: 700; + letter-spacing: 0.08em; + line-height: 1.2; + text-transform: uppercase; +} + +.callout { + margin-bottom: clamp(2.5rem, 6vw, 4rem); + border-left: 3px solid var(--brand-blue); + border-radius: var(--radius-card); + background: var(--surface-raised); + color: var(--text-secondary); + font-size: 0.9rem; + line-height: 1.6; + padding: 1rem 1.25rem; +} + +.callout a { + font-weight: 700; +} + +.site-footer { + border-top: 1px solid var(--border-subtle); + color: var(--text-muted); + font-size: 0.875rem; + line-height: 1.7; + margin-top: auto; + padding: 2rem clamp(1.25rem, 3vw, 2rem); + text-align: center; +} + +.site-footer__copy { + max-width: 980px; + margin-inline: auto; +} + +.legal-page, +.oauth-page { + min-height: 100vh; + display: flex; + flex: 1; + flex-direction: column; +} + +.page-container--legal { + width: min(100%, 980px); + flex: 1; + padding-block: clamp(1.5rem, 4vw, 3rem); +} + +.utility-nav { + margin-bottom: 2rem; +} + +.utility-nav a { + color: var(--brand-blue); + font-size: 0.875rem; + font-weight: 600; +} + +.brand-mark--legal { + font-size: clamp(2.25rem, 6vw, 2.75rem); +} + +.legal-document { + margin-top: 1.25rem; + border: 1px solid var(--border-subtle); + border-radius: var(--radius-card); + background: linear-gradient(180deg, rgba(255, 255, 255, 0.03), transparent 120px), var(--surface-card); + padding: clamp(1.35rem, 4vw, 2.25rem); +} + +.legal-document__header { + margin-bottom: 1.5rem; +} + +.legal-document__title { + color: var(--text-primary); + font-family: var(--font-display); + font-size: clamp(1.65rem, 4vw, 2.15rem); + font-weight: 700; + line-height: 1.18; + letter-spacing: 0; +} + +.legal-document__meta, +.legal-document__lead, +.legal-document__content p, +.legal-document__content li, +.oauth-card__hint { + color: var(--text-secondary); +} + +.legal-document__meta { + margin-top: 0.35rem; + color: var(--text-muted); + font-size: 0.875rem; +} + +.legal-document__lead { + margin-top: 1.25rem; + font-size: 0.98rem; + line-height: 1.7; +} + +.legal-document__alert { + margin-top: 1.25rem; + border: 1px solid rgba(255, 143, 163, 0.35); + border-radius: var(--radius-card); + background: rgba(255, 143, 163, 0.12); + color: #ffd8df; + font-size: 0.95rem; + line-height: 1.55; + padding: 0.85rem 1rem; +} + +.legal-document__content { + display: grid; + gap: 0.5rem; +} + +.legal-document__content h2 { + margin-top: 1rem; + color: var(--brand-blue); + font-family: var(--font-display); + font-size: 1.08rem; + font-weight: 700; + line-height: 1.3; + letter-spacing: 0; +} + +.legal-document__content p { + font-size: 0.95rem; + line-height: 1.65; +} + +.legal-document__content ul { + margin: 0.1rem 0 0.75rem 1.25rem; + color: var(--text-secondary); + font-size: 0.95rem; +} + +.legal-document__content li { + margin-bottom: 0.35rem; + line-height: 1.55; +} + +.legal-links { + margin-top: 1.25rem; + border: 1px solid var(--border-subtle); + border-radius: var(--radius-card); + background: var(--surface-raised); + padding: 1rem 1.15rem; +} + +.legal-links p + p { + margin-top: 0.35rem; +} + +.legal-footer { + border-top: 1px solid var(--border-subtle); + color: var(--text-muted); + font-size: 0.875rem; + line-height: 1.7; + margin-top: auto; + padding: 2rem clamp(1.25rem, 3vw, 2rem); + text-align: center; +} + +.legal-footer__copy { + max-width: 860px; + margin-inline: auto; +} + +.oauth-page { + align-items: center; + justify-content: center; + padding: clamp(1.25rem, 4vw, 2rem); +} + +.oauth-card { + width: min(100%, 520px); + border: 1px solid var(--border-subtle); + border-radius: var(--radius-card); + background: linear-gradient(180deg, rgba(255, 255, 255, 0.03), transparent 96px), var(--surface-card); + padding: clamp(1.5rem, 4vw, 2rem); + text-align: center; +} + +.oauth-card__title { + color: var(--text-primary); + font-family: var(--font-display); + font-size: clamp(1.5rem, 4vw, 2rem); + font-weight: 700; + line-height: 1.2; + letter-spacing: 0; +} + +.oauth-card__copy { + margin: 0.9rem 0 1rem; + color: var(--text-secondary); + line-height: 1.65; +} + +.oauth-card__hint { + margin-top: 0.85rem; + font-size: 0.875rem; + line-height: 1.55; +} + +.button { + appearance: none; + border: 0; + border-radius: 999px; + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 2.8rem; + padding: 0.72rem 1.25rem; + font-weight: 700; + line-height: 1.2; +} + +.button--primary { + background: var(--brand-cobalt); + color: #ffffff; +} + +.button--primary:hover { + background: var(--brand-blue); + color: #ffffff; +} + +@media (max-width: 860px) { + .platform-grid, + .feature-grid { + grid-template-columns: 1fr; + } + + .screenshot-showcase { + flex-direction: column; + align-items: center; + } + + .screenshot-frame--desktop { + width: min(100%, 520px); + } + + .screenshot-frame--phone { + width: min(48vw, 180px); + } +} + +@media (max-width: 560px) { + .page-container--home { + padding-block: 1.25rem; + } + + .platform-card__header { + align-items: flex-start; + } + + .status-label { + margin-top: 0.35rem; + } +} diff --git a/www/static/shared.css b/www/static/shared.css deleted file mode 100644 index 55394eb..0000000 --- a/www/static/shared.css +++ /dev/null @@ -1,719 +0,0 @@ -:root { - --bg-dark: #000000; - --surface-dark: #191919; - --surface-variant: #1f1f1f; - --outline: rgba(255, 255, 255, 0.1); - --outline-bright: rgba(255, 255, 255, 0.2); - --text-primary: #f4f6fb; - --text-secondary: #ababab; - --text-tertiary: #6f6f6f; - - --primary: #7dafff; - --secondary: #0073de; - --tertiary: #33b1ff; - --cyan: #08bdba; - --purple: #be95ff; - --error: #ff8080; - - --font-title: "Lora", serif; - --font-display: "Google Sans", sans-serif; - --font-body: "Inter", sans-serif; - --font-mono: "Google Sans Code", monospace; -} - -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body.home-page, -body.legal-page, -body.oauth-callback-page { - font-family: var(--font-body); - background-color: var(--bg-dark); - color: var(--text-primary); - line-height: 1.6; - min-height: 100vh; - display: flex; - flex-direction: column; -} - -body.home-page a:hover, -body.legal-page a:hover { - color: var(--secondary); -} - -body.home-page a, -body.legal-page a { - color: var(--primary); - text-decoration: none; -} - -body.legal-page .container, -.oauth-callback-container { - max-width: 920px; - margin: 0 auto; - padding: 2rem; - flex: 1; -} - -body.home-page .platform, -body.home-page .feature, -body.home-page .tech-stack, -body.legal-page .legal-card, -.oauth-callback-main { - background: var(--surface-dark); - border: 1px solid var(--outline); - border-radius: 1rem; -} - -body.home-page .platform h2, -body.home-page .section-title, -body.home-page .feature h3, -body.home-page .tech-stack h2, -body.home-page .hero h1, -body.legal-page h1, -body.legal-page h2, -body.oauth-callback-page h1 { - font-family: var(--font-display); -} - -body.home-page footer, -body.legal-page footer, -body.legal-page .meta, -.oauth-callback-hint { - font-size: 0.875rem; - color: var(--text-tertiary); -} - -body.home-page .container { - max-width: 1200px; - margin: 0 auto; - padding: 2rem; - flex: 1; - display: flex; - flex-direction: column; - justify-content: center; -} - -body.home-page header { - text-align: center; - margin-bottom: 4rem; -} - -body.home-page .logo, -body.legal-page .logo { - font-family: var(--font-title); - font-weight: 700; - background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 50%, var(--tertiary) 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; - letter-spacing: -0.02em; - display: inline-flex; - align-items: center; - gap: 0.5rem; -} - -body.home-page .logo { - font-size: 3.5rem; - margin-bottom: 1rem; -} - -body.home-page .logo-icon, -body.legal-page .logo-icon { - mask-image: url("/static/logo.svg"); - background-color: var(--primary); - mask-repeat: no-repeat; - mask-size: contain; - mask-position: center; - - -webkit-mask-image: url("/static/logo.svg"); - -webkit-mask-repeat: no-repeat; - -webkit-mask-size: contain; - -webkit-mask-position: center; -} - -body.home-page .logo-icon { - width: 3rem; - height: 3rem; -} - -body.home-page .tagline { - font-size: 1.25rem; - color: var(--text-secondary); - font-weight: 400; - letter-spacing: 0.01em; -} - -body.home-page main { - max-width: 900px; - margin: 0 auto; -} - -body.home-page .hero { - text-align: center; - margin-bottom: 4rem; -} - -body.home-page .hero h1 { - font-family: var(--font-display); - font-size: 2.5rem; - font-weight: 600; - margin-bottom: 1.5rem; - color: var(--text-primary); - line-height: 1.2; -} - -body.home-page .hero p { - font-size: 1.125rem; - color: var(--text-secondary); - margin-bottom: 2rem; - line-height: 1.8; -} - -body.home-page .status-badge { - display: inline-flex; - align-items: center; - gap: 0.5rem; - background: var(--surface-dark); - padding: 0.75rem 1.5rem; - border-radius: 2rem; - border: 1px solid var(--outline); - font-size: 0.875rem; - font-weight: 500; - letter-spacing: 0.02em; - margin-bottom: 3rem; -} - -body.home-page .status-dot { - width: 8px; - height: 8px; - border-radius: 50%; - background: var(--primary); - animation: pulse 2s ease-in-out infinite; -} - -@keyframes pulse { - 0%, - 100% { - opacity: 1; - } - - 50% { - opacity: 0.5; - } -} - -body.home-page .platforms { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 2rem; - margin-bottom: 4rem; -} - -body.home-page .platform { - padding: 2rem; -} - -body.home-page .platform-header { - display: flex; - align-items: center; - gap: 0.75rem; - margin-bottom: 1.25rem; -} - -body.home-page .platform-icon { - width: 40px; - height: 40px; - border-radius: 10px; - display: flex; - align-items: center; - justify-content: center; - flex-shrink: 0; -} - -body.home-page .platform-icon.mobile { - background: linear-gradient(135deg, var(--primary), var(--secondary)); -} - -body.home-page .platform-icon img { - width: 22px; - height: 22px; -} - -body.home-page .platform h2 { - font-family: var(--font-display); - font-size: 1.375rem; - font-weight: 600; -} - -body.home-page .platform-badge { - font-size: 0.6875rem; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.06em; - padding: 0.2rem 0.5rem; - border-radius: 0.25rem; - margin-left: auto; -} - -body.home-page .platform-badge.alpha { - background: rgba(190, 149, 255, 0.15); - color: var(--purple); -} - -body.home-page .platform-badge.beta { - background: rgba(125, 175, 255, 0.15); - color: var(--primary); -} - -body.home-page .platform-desc { - color: var(--text-secondary); - font-size: 0.9375rem; - line-height: 1.6; - margin-bottom: 1.25rem; -} - -body.home-page .platform-targets { - display: flex; - gap: 0.5rem; - flex-wrap: wrap; - margin-bottom: 1.25rem; -} - -body.home-page .target-tag { - background: var(--surface-variant); - padding: 0.3rem 0.625rem; - border-radius: 0.375rem; - font-size: 0.8125rem; - font-family: var(--font-mono); - color: var(--text-secondary); -} - -body.home-page .platform-features { - list-style: none; -} - -body.home-page .platform-features li { - color: var(--text-secondary); - font-size: 0.875rem; - padding: 0.3rem 0; - padding-left: 1.25rem; - position: relative; -} - -body.home-page .platform-features li::before { - content: ""; - position: absolute; - left: 0; - top: 0.7rem; - width: 6px; - height: 6px; - border-radius: 50%; - background: var(--primary); - opacity: 0.6; -} - -body.home-page .platform-screenshot { - margin-top: 1.5rem; - border-radius: 0.75rem; - overflow: hidden; - border: 1px solid var(--outline); -} - -body.home-page .platform-screenshot img { - width: 100%; - height: auto; - display: block; -} - -body.home-page .platform-screenshot .caption { - font-size: 0.75rem; - color: var(--text-tertiary); - text-align: center; - padding: 0.5rem; - background: var(--surface-variant); -} - -body.home-page .hero-screenshots { - display: flex; - gap: 1.5rem; - justify-content: center; - align-items: flex-end; - margin-bottom: 3rem; - padding: 0 1rem; -} - -body.home-page .hero-screenshot { - border-radius: 1rem; - overflow: hidden; - border: 1px solid var(--outline); - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); -} - -body.home-page .hero-screenshot img { - display: block; - width: 100%; - height: auto; -} - -body.home-page .hero-screenshot.phone { - width: 200px; - flex-shrink: 0; -} - -body.home-page .hero-screenshot.desktop-shot { - width: 640px; - flex-shrink: 0; -} - -@media (max-width: 768px) { - body.home-page .hero-screenshots { - flex-direction: column; - align-items: center; - } - - body.home-page .hero-screenshot.phone { - width: 160px; - } - - body.home-page .hero-screenshot.desktop-shot { - width: 100%; - max-width: 360px; - } -} - -body.home-page .section-title { - font-family: var(--font-display); - font-size: 1.5rem; - font-weight: 600; - margin-bottom: 1.5rem; - color: var(--text-primary); -} - -body.home-page .features { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); - gap: 1.5rem; - margin-bottom: 4rem; -} - -body.home-page .feature { - padding: 1.75rem; - transition: - transform 0.2s ease, - border-color 0.2s ease; -} - -body.home-page .feature:hover { - transform: translateY(-2px); - border-color: var(--outline-bright); -} - -body.home-page .feature h3 { - font-family: var(--font-display); - font-size: 1.125rem; - margin-bottom: 0.5rem; - color: var(--text-primary); -} - -body.home-page .feature p { - color: var(--text-secondary); - font-size: 0.875rem; - line-height: 1.6; -} - -body.home-page .feature-icon { - width: 44px; - height: 44px; - background: linear-gradient(135deg, var(--primary), var(--secondary)); - border-radius: 10px; - display: flex; - align-items: center; - justify-content: center; - margin-bottom: 0.875rem; - padding: 10px; -} - -body.home-page .platform-icon.desktop, -body.home-page .feature-icon.alt { - background: linear-gradient(135deg, var(--purple), var(--tertiary)); -} - -body.home-page .feature-icon img { - width: 100%; - height: 100%; -} - -body.home-page .tech-stack { - padding: 2rem; - margin-bottom: 4rem; -} - -body.home-page .tech-stack h2 { - font-family: var(--font-display); - font-size: 1.5rem; - margin-bottom: 1.5rem; - color: var(--text-primary); -} - -body.home-page .tech-group { - margin-bottom: 1rem; -} - -body.home-page .tech-group:last-child { - margin-bottom: 0; -} - -body.home-page .tech-group-label { - font-size: 0.75rem; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.08em; - color: var(--text-tertiary); - margin-bottom: 0.5rem; -} - -body.home-page .tech-list { - display: flex; - flex-wrap: wrap; - gap: 0.5rem; -} - -body.home-page .tech-tag { - background: var(--surface-variant); - padding: 0.4rem 0.875rem; - border-radius: 0.5rem; - font-size: 0.8125rem; - font-family: var(--font-mono); - color: var(--text-secondary); - border: 1px solid transparent; - transition: border-color 0.2s ease; -} - -body.home-page .tech-tag:hover { - border-color: var(--outline-bright); -} - -body.home-page .oauth-info { - background: var(--surface-variant); - padding: 1rem 1.5rem; - border-radius: 0.75rem; - border-left: 3px solid var(--primary); - margin-top: 2rem; - font-size: 0.875rem; - color: var(--text-secondary); -} - -body.home-page .oauth-info a { - font-weight: 500; - transition: color 0.2s ease; -} - -body.home-page .oauth-info a:hover { - text-decoration: underline; -} - -body.home-page footer, -body.legal-page footer { - text-align: center; - padding: 2rem; - color: var(--text-tertiary); - font-size: 0.875rem; - border-top: 1px solid var(--outline); -} - -body.home-page footer { - margin-top: 4rem; -} - -body.home-page footer a { - transition: color 0.2s ease; -} - -@media (max-width: 768px) { - body.home-page .logo { - font-size: 2.5rem; - } - - body.home-page .hero h1 { - font-size: 2rem; - } - - body.home-page .hero p { - font-size: 1rem; - } - - body.home-page .platforms { - grid-template-columns: 1fr; - } - - body.home-page .features { - grid-template-columns: 1fr; - } - - body.home-page .container { - padding: 1.5rem; - } -} - -body.legal-page .top-nav { - display: flex; - justify-content: flex-start; - margin-bottom: 2rem; -} - -body.legal-page .top-nav a { - font-size: 0.875rem; -} - -body.legal-page .logo { - font-size: 2.4rem; -} - -body.legal-page .logo-icon { - width: 2rem; - height: 2rem; -} - -body.legal-page .legal-card { - margin-top: 1.25rem; - padding: 2rem; -} - -body.legal-page h1 { - font-size: 2rem; - line-height: 1.2; - margin-bottom: 0.4rem; -} - -body.legal-page .meta { - margin-bottom: 1.5rem; -} - -body.legal-page .lead { - color: var(--text-secondary); - margin-bottom: 1.5rem; -} - -body.legal-page section { - margin-bottom: 1.25rem; -} - -body.legal-page section:last-of-type { - margin-bottom: 0; -} - -body.legal-page h2 { - font-size: 1.0625rem; - color: var(--primary); - margin-bottom: 0.45rem; -} - -body.legal-page p { - color: var(--text-secondary); - font-size: 0.95rem; - margin-bottom: 0.5rem; -} - -body.legal-page .links { - margin-top: 1.25rem; - background: var(--surface-variant); - border: 1px solid var(--outline); - border-radius: 0.75rem; - padding: 1rem 1.2rem; -} - -body.legal-page .links p { - margin-bottom: 0.35rem; -} - -body.legal-page .links p:last-child { - margin-bottom: 0; -} - -body.legal-page footer { - margin-top: 2rem; -} - -body.privacy-page .links p { - margin-bottom: 0; -} - -body.csae-page .lead { - margin-bottom: 1.25rem; -} - -body.csae-page .alert { - margin-bottom: 1.5rem; - background: rgba(255, 128, 128, 0.12); - border: 1px solid rgba(255, 128, 128, 0.35); - border-radius: 0.75rem; - padding: 0.85rem 1rem; - color: #ffd4d4; - font-size: 0.95rem; -} - -body.csae-page ul { - margin: 0.25rem 0 0.75rem 1.2rem; - color: var(--text-secondary); - font-size: 0.95rem; -} - -body.csae-page li { - margin-bottom: 0.35rem; -} - -@media (max-width: 768px) { - body.legal-page .container, - body.legal-page .legal-card { - padding: 1.25rem; - } - - body.legal-page h1 { - font-size: 1.6rem; - } -} - -.oauth-callback-container { - width: 100%; - display: flex; - align-items: center; - justify-content: center; -} - -.oauth-callback-main { - width: min(520px, 100%); - margin-top: 0; - padding: 2rem; - text-align: center; -} - -.oauth-callback-copy { - margin: 0 0 0.9rem; - line-height: 1.6; -} - -.oauth-callback-button { - appearance: none; - display: inline-block; - border: 0; - border-radius: 999px; - background: var(--secondary); - color: #ffffff; - text-decoration: none; - font-weight: 600; - padding: 12px 20px; - margin-top: 0.3rem; -} - -.oauth-callback-button:hover { - background: var(--primary); -} - -.oauth-callback-hint { - margin-top: 0.85rem; - margin-bottom: 0; -} diff --git a/www/terms.html b/www/terms.html deleted file mode 100644 index c37e793..0000000 --- a/www/terms.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - - Lazurite Terms of Service - - - - - - - -
- - -
-

Terms of Service

-

Effective April 15, 2026

-

- These Terms govern your use of Lazurite, a Bluesky client built by Stormlight Labs. By - installing or using Lazurite, you agree to these Terms. -

- -
-

What Lazurite is

-

Lazurite is client software that helps you access Bluesky from your device.

-

Lazurite does not provide the Bluesky network itself.

-
- -
-

Eligibility

-

- You must be legally able to agree to these Terms and meet the minimum age requirement - in your jurisdiction. -

-
- -
-

License

-

- We grant you a limited, non-exclusive, non-transferable, revocable license to use - Lazurite on devices you control. -

-

- You may not misuse the app, break applicable law, or attempt unauthorized access to - systems or accounts. -

-
- -
-

Bluesky terms and policies

-

- Lazurite depends on Bluesky services, and your use of Bluesky is governed by Bluesky's - own legal terms. -

-
- -
-

Your account and activity

-

- You are responsible for your Bluesky account, credentials, and activity taken through - Lazurite. -

-

- You retain rights to your content, subject to Bluesky policies and any third-party - rights. -

-
- -
-

Acceptable use

-

- Do not use Lazurite to harass others, violate rights, distribute unlawful content, or - abuse platform infrastructure. -

-

You are responsible for complying with Bluesky rules and applicable law.

-
- -
-

Third-party dependencies

-

Lazurite depends on Bluesky and related third-party services.

-

- If those services change, restrict, or discontinue access, features may degrade or stop - working. -

-
- -
-

No warranty

-

- Lazurite is provided "as is" and "as available." We do not guarantee uninterrupted, - secure, or error-free operation. -

-
- -
-

Liability

-

- To the maximum extent permitted by law, Stormlight Labs is not liable for indirect, - incidental, or consequential damages arising from your use of Lazurite. -

-
- -
-

Changes and termination

-

We may update, suspend, or discontinue parts of Lazurite.

-

- We may update these Terms. Continued use after updates means you accept the revised - Terms. -

-
- - -
-
- - - diff --git a/www/tsconfig.json b/www/tsconfig.json new file mode 100644 index 0000000..8bf91d3 --- /dev/null +++ b/www/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "astro/tsconfigs/strict", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"] +} -- 2.51.2