mobile bluesky app made with flutter lazurite.stormlightlabs.org/
mobile bluesky flutter
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

authored by

Owais and committed by
GitHub
e081de24 e7bf2757

+4612 -1412
+1 -5
.prettierrc
··· 1 - { 2 - "bracketSameLine": true, 3 - "printWidth": 120, 4 - "objectWrap": "collapse" 5 - } 1 + { "bracketSameLine": true, "printWidth": 120, "objectWrap": "collapse" }
+28
DEVELOPMENT.md
··· 23 23 | `just gen` | Run `build_runner` for code generation | 24 24 | `just check` | Format, lint, and test in sequence | 25 25 26 + ## Website 27 + 28 + The public website lives in `www` as an Astro project. 29 + 30 + ```sh 31 + cd www 32 + pnpm install 33 + pnpm dev 34 + pnpm build 35 + ``` 36 + 37 + Astro source files live under `www/src`: 38 + 39 + - `/pages` defines routes. 40 + - `/components` holds reusable page sections and layout components. 41 + - `/content/legal` contains the legal pages as Markdown. 42 + - `/styles/shared.css` is the shared stylesheet for the Astro site. 43 + 44 + Static files that must keep exact public routes live in `www/public`, including: 45 + 46 + - `.well-known/apple-app-site-association` 47 + - `.well-known/assetlinks.json` 48 + - `_headers` 49 + - `client-metadata.json` 50 + - favicon and image assets 51 + 52 + The legal routes are `/privacy`, `/terms`, and `/csae-policy`. 53 + 26 54 ## Architecture 27 55 28 56 ### Stack
+24
www/.gitignore
··· 1 + # build output 2 + dist/ 3 + # generated types 4 + .astro/ 5 + 6 + # dependencies 7 + node_modules/ 8 + 9 + # logs 10 + npm-debug.log* 11 + yarn-debug.log* 12 + yarn-error.log* 13 + pnpm-debug.log* 14 + 15 + 16 + # environment variables 17 + .env 18 + .env.production 19 + 20 + # macOS-specific files 21 + .DS_Store 22 + 23 + # jetbrains setting folder 24 + .idea/
+1
www/.markdownlint.json
··· 1 + { "MD033": false, "MD013": false }
+7
www/.prettierrc
··· 1 + { 2 + "bracketSameLine": true, 3 + "printWidth": 120, 4 + "objectWrap": "collapse", 5 + "plugins": ["prettier-plugin-astro"], 6 + "overrides": [{ "files": "*.astro", "options": { "parser": "astro" } }] 7 + }
www/.well-known/apple-app-site-association www/public/.well-known/apple-app-site-association
www/.well-known/assetlinks.json www/public/.well-known/assetlinks.json
www/_headers www/public/_headers
+5
www/astro.config.mjs
··· 1 + // @ts-check 2 + import { defineConfig } from 'astro/config'; 3 + 4 + // https://astro.build/config 5 + export default defineConfig({});
www/client-metadata.json www/public/client-metadata.json
-127
www/csae-policy.html
··· 1 - <!doctype html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8" /> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 - <meta 7 - name="description" 8 - content="Lazurite Child Safety Standards and CSAE Policy - effective May 3, 2026." /> 9 - <meta name="author" content="Stormlight Labs" /> 10 - <title>Lazurite CSAE Policy</title> 11 - <link rel="icon" type="image/svg+xml" href="static/favicon.svg" /> 12 - <link rel="stylesheet" href="/static/shared.css" /> 13 - <link rel="preconnect" href="https://fonts.googleapis.com" /> 14 - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 15 - <link 16 - href="https://fonts.googleapis.com/css2?family=Google+Sans+Code:ital,wght@0,300..800;1,300..800&family=Google+Sans:ital,opsz,wght@0,17..18,400..700;1,17..18,400..700&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Lora:ital,wght@0,400..700;1,400..700&display=swap" 17 - rel="stylesheet" /> 18 - </head> 19 - <body class="legal-page csae-page"> 20 - <div class="container"> 21 - <nav class="top-nav"><a href="./index.html">Back to home</a></nav> 22 - <div class="logo"><span class="logo-icon"></span>Lazurite</div> 23 - <main class="legal-card"> 24 - <h1>Child Safety Standards (CSAE)</h1> 25 - <p class="meta">Effective May 3, 2026</p> 26 - <p class="lead"> 27 - This page describes the child safety standards for Lazurite by Stormlight Labs, including 28 - our policies against child sexual abuse and exploitation (CSAE), child sexual abuse 29 - material (CSAM), and related harmful behavior. 30 - </p> 31 - <p class="alert"> 32 - Zero tolerance: content or behavior involving child sexual abuse, exploitation, or 33 - endangerment is prohibited. 34 - </p> 35 - 36 - <section> 37 - <h2>1) Prohibited content and conduct</h2> 38 - <p>Lazurite standards prohibit, at minimum:</p> 39 - <ul> 40 - <li>Creation, sharing, solicitation, or promotion of CSAM.</li> 41 - <li>Grooming behavior targeting minors.</li> 42 - <li>Sextortion involving minors.</li> 43 - <li>Trafficking, solicitation, or sexual exploitation of children.</li> 44 - <li>Any use of Lazurite to endanger children.</li> 45 - </ul> 46 - </section> 47 - 48 - <section> 49 - <h2>2) In-app reporting and user feedback</h2> 50 - <p> 51 - Lazurite provides in-app pathways for users to report content, accounts, and behavior 52 - that may violate safety standards, including CSAE concerns. 53 - </p> 54 - <p> 55 - Reports are reviewed as a priority category and escalated when they indicate possible 56 - child endangerment or CSAM. 57 - </p> 58 - </section> 59 - 60 - <section> 61 - <h2>3) Response to potential CSAM</h2> 62 - <p> 63 - Upon obtaining actual knowledge of potential CSAM, we take appropriate action under our 64 - policies and applicable law. Actions may include: 65 - </p> 66 - <ul> 67 - <li>Removing or restricting access to violative content.</li> 68 - <li>Restricting or suspending access to violating accounts and features.</li> 69 - <li>Preserving records necessary for legal reporting and safety investigations.</li> 70 - </ul> 71 - </section> 72 - 73 - <section> 74 - <h2>4) Legal compliance and external reporting</h2> 75 - <p> 76 - We maintain procedures to comply with applicable child safety laws and regulations, 77 - including reporting confirmed CSAM to the National Center for Missing and Exploited 78 - Children (NCMEC) or the relevant regional authority as required by law. 79 - </p> 80 - <p> 81 - If you believe a child is in immediate danger, contact local law enforcement 82 - immediately. 83 - </p> 84 - </section> 85 - 86 - <section> 87 - <h2>5) Child safety point of contact</h2> 88 - <p> 89 - Child safety contact for Lazurite / Stormlight Labs: 90 - <a href="mailto:info@stormlightlabs.org">info@stormlightlabs.org</a> 91 - </p> 92 - <p> 93 - This contact is designated to receive and coordinate potential notifications related to 94 - CSAE and CSAM concerns. 95 - </p> 96 - </section> 97 - 98 - <section> 99 - <h2>6) Policy updates</h2> 100 - <p> 101 - We may update these standards as laws, platform requirements, and enforcement practices 102 - evolve. Material updates will be reflected by an updated effective date. 103 - </p> 104 - </section> 105 - 106 - <div class="links"> 107 - <p> 108 - Related pages: <a href="./terms.html">Terms of Service</a> and 109 - <a href="./privacy.html">Privacy Policy</a>. 110 - </p> 111 - <p> 112 - Contact: 113 - <a href="https://stormlightlabs.org" target="_blank" rel="noopener noreferrer">stormlightlabs.org</a> 114 - or <a href="mailto:info@stormlightlabs.org">info@stormlightlabs.org</a> 115 - </p> 116 - </div> 117 - </main> 118 - </div> 119 - <footer> 120 - <p> 121 - Built by <a href="https://stormlightlabs.org" target="_blank" rel="noopener noreferrer">Stormlight Labs</a> 122 - &middot; <a href="./privacy.html">Privacy Policy</a> 123 - &middot; <a href="./terms.html">Terms of Service</a> 124 - </p> 125 - </footer> 126 - </body> 127 - </html>
-233
www/index.html
··· 1 - <!doctype html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8" /> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 - <meta 7 - name="description" 8 - content="Lazurite - A beautiful Bluesky client for mobile and desktop. Material You on iOS & Android, native desktop with semantic search." /> 9 - <meta name="author" content="Stormlight Labs" /> 10 - <title>Lazurite for BlueSky</title> 11 - <link rel="icon" type="image/svg+xml" href="/static/favicon.svg" /> 12 - <link rel="stylesheet" href="/static/shared.css" /> 13 - <link rel="preconnect" href="https://fonts.googleapis.com" /> 14 - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 15 - <link 16 - href="https://fonts.googleapis.com/css2?family=Google+Sans+Code:ital,wght@0,300..800;1,300..800&family=Google+Sans:ital,opsz,wght@0,17..18,400..700;1,17..18,400..700&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Lora:ital,wght@0,400..700;1,400..700&display=swap" 17 - rel="stylesheet" /> 18 - </head> 19 - 20 - <body class="home-page"> 21 - <div class="container"> 22 - <header> 23 - <div class="logo"><span class="logo-icon"></span>Lazurite</div> 24 - <p class="tagline">The ATmosphere client that <em>rocks</em>.</p> 25 - </header> 26 - 27 - <main> 28 - <div class="hero"> 29 - <div class="status-badge"> 30 - <span class="status-dot"></span> 31 - <span>In Active Development</span> 32 - </div> 33 - 34 - <h1>Roam the ATmosphere</h1> 35 - <p> 36 - Lazurite is a client for Bluesky & BlackSky built for people who want more from their social experience. 37 - A full-featured mobile app for iOS and Android, paired with a powerful desktop companion 38 - for macOS, Windows, and Linux. 39 - </p> 40 - </div> 41 - 42 - <div class="hero-screenshots"> 43 - 44 - <div class="hero-screenshot desktop-shot"> 45 - <!-- TODO: replace with actual desktop app screenshot (landscape, ~1280x800) --> 46 - <img 47 - src="./static/desktop-deck.png" 48 - alt="Lazurite desktop workspace screenshot" /> 49 - </div> 50 - <div class="hero-screenshot phone"> 51 - <!-- TODO: replace with actual mobile app screenshot (portrait, ~390x844) --> 52 - <img 53 - src="https://placehold.co/720x1280/191919/33b1ff?text=Mobile%0AProfile&font=inter" 54 - alt="Lazurite mobile profile screenshot" /> 55 - </div> 56 - </div> 57 - 58 - <div class="platforms"> 59 - <div class="platform"> 60 - <div class="platform-header"> 61 - <div class="platform-icon mobile"> 62 - <!-- TODO: add mobile device SVG icon (e.g. smartphone outline, white, 22x22) --> 63 - <img src="static/smartphone.svg" alt="Mobile icon" /> 64 - </div> 65 - <h2>Mobile</h2> 66 - <span class="platform-badge beta">Beta</span> 67 - </div> 68 - <p class="platform-desc"> 69 - Material You design with offline support, smart folders, and full AT Protocol coverage. 70 - Built with Flutter for a native feel on both platforms. 71 - </p> 72 - <div class="platform-targets"> 73 - <span class="target-tag">iOS</span> 74 - <span class="target-tag">Android</span> 75 - </div> 76 - <ul class="platform-features"> 77 - <li>Offline-first with local caching and offline compose</li> 78 - <li>Full DM support with conversation requests</li> 79 - <li>Drafts, scheduled posts, and bookmarks</li> 80 - <li>Content moderation with custom labelers</li> 81 - <li>Multi-account switching with data isolation</li> 82 - <li>Themeable: Oxocarbon, Catppuccin, Nord, Ros&eacute; Pine</li> 83 - </ul> 84 - <div class="platform-screenshot"> 85 - <!-- TODO: replace with actual mobile feed screenshot (~390x480 crop) --> 86 - <img 87 - src="https://placehold.co/720x1280/000000/7dafff?text=Feed+%2B+Compose&font=inter" 88 - alt="Mobile feed and compose" /> 89 - <div class="caption">Your home feed and a composer button</div> 90 - </div> 91 - </div> 92 - 93 - <div class="platform"> 94 - <div class="platform-header"> 95 - <div class="platform-icon desktop"> 96 - <img src="static/desktop.svg" alt="Desktop icon" /> 97 - </div> 98 - <h2>Desktop</h2> 99 - <span class="platform-badge alpha">Alpha</span> 100 - </div> 101 - <p class="platform-desc"> 102 - A native desktop experience built with Tauri and Solid.js. Semantic search 103 - across your saved posts, multi-column layouts, and deep AT Protocol tooling. 104 - </p> 105 - <div class="platform-targets"> 106 - <span class="target-tag">macOS</span> 107 - <span class="target-tag">Windows</span> 108 - <span class="target-tag">Linux</span> 109 - </div> 110 - <ul class="platform-features"> 111 - <li>Full-text and vector search over saved and liked posts</li> 112 - <li>Multi-column workspace layouts</li> 113 - <li>PDS browser for exploring repository data</li> 114 - <li>Composer window for distraction-free posting</li> 115 - <li>Deep-link handling for <code>at://</code> URIs</li> 116 - <li>Global shortcuts (post from anywhere)</li> 117 - </ul> 118 - <div class="platform-screenshot"> 119 - <!-- TODO: replace with actual desktop multi-column screenshot (~640x400 crop) --> 120 - <img 121 - src="./static/desktop-deck.png" 122 - alt="Desktop multi-column layout" /> 123 - <div class="caption">Multi-column workspace with search</div> 124 - </div> 125 - </div> 126 - </div> 127 - 128 - <h2 class="section-title" title="Shared Features">Across both platforms</h2> 129 - <div class="features"> 130 - <div class="feature"> 131 - <div class="feature-icon"> 132 - <img src="static/feed.svg" alt="Feed icon" /> 133 - </div> 134 - <h3>Feeds &amp; Timelines</h3> 135 - <p>Home timeline, custom algorithmic feeds, pinned feeds with drag-to-reorder. Full thread and reply chain rendering.</p> 136 - </div> 137 - 138 - <div class="feature"> 139 - <div class="feature-icon alt"> 140 - <img src="static/search.svg" alt="Search icon" /> 141 - </div> 142 - <h3>Search &amp; Discovery</h3> 143 - <p>Search your saved & liked posts, discover starterpacks with the power of local semantic search with embeddings.</p> 144 - </div> 145 - 146 - <div class="feature"> 147 - <div class="feature-icon"> 148 - <img src="static/lock.svg" alt="Moderation icon" /> 149 - </div> 150 - <h3>Moderation</h3> 151 - <p>Subscribe to labelers, configure per-label preferences, mute and block lists. Adult content controls with granular filtering.</p> 152 - </div> 153 - 154 - <div class="feature"> 155 - <div class="feature-icon alt"> 156 - <img src="static/folder.svg" alt="Lists icon" /> 157 - </div> 158 - <h3>Lists &amp; Starter Packs</h3> 159 - <p>Create and manage curation and moderation lists. Browse, search, and build starter packs to share with others.</p> 160 - </div> 161 - 162 - <div class="feature"> 163 - <div class="feature-icon"> 164 - <img src="static/offline.svg" alt="Offline icon" /> 165 - </div> 166 - <h3>Offline &amp; Fast</h3> 167 - <p>Smart caching with local databases on both platforms. Browse cached content and queue actions while offline.</p> 168 - </div> 169 - 170 - <div class="feature"> 171 - <div class="feature-icon alt"> 172 - <img src="static/graph.svg" alt="Graph icon" /> 173 - </div> 174 - <h3>Social Graph</h3> 175 - <p>Explore connections with a force-directed graph visualization. See mutual follows, followers, and blocking context at a glance.</p> 176 - </div> 177 - </div> 178 - 179 - <div class="tech-stack"> 180 - <h2>Built with</h2> 181 - <div class="tech-group"> 182 - <div class="tech-group-label">Mobile</div> 183 - <div class="tech-list"> 184 - <span class="tech-tag">Flutter</span> 185 - <span class="tech-tag">Dart</span> 186 - <span class="tech-tag">Material 3</span> 187 - <span class="tech-tag">Drift</span> 188 - <span class="tech-tag">BLoC</span> 189 - </div> 190 - </div> 191 - <div class="tech-group"> 192 - <div class="tech-group-label">Desktop</div> 193 - <div class="tech-list"> 194 - <span class="tech-tag">Tauri 2</span> 195 - <span class="tech-tag">Rust</span> 196 - <span class="tech-tag">Solid.js</span> 197 - <span class="tech-tag">SQLite + FTS</span> 198 - <span class="tech-tag">fastembed</span> 199 - </div> 200 - </div> 201 - <div class="tech-group"> 202 - <div class="tech-group-label">Protocol</div> 203 - <div class="tech-list"> 204 - <span class="tech-tag">AT Protocol</span> 205 - <span class="tech-tag">OAuth 2.0 + DPoP</span> 206 - <span class="tech-tag">Constellation</span> 207 - </div> 208 - </div> 209 - </div> 210 - 211 - <div class="oauth-info"> 212 - Follow development updates on Bluesky: 213 - <a href="https://bsky.app/profile/desertthunder.dev" target="_blank" rel="noopener noreferrer" 214 - >@desertthunder.dev</a 215 - > 216 - </div> 217 - </main> 218 - </div> 219 - 220 - <footer> 221 - <p> 222 - Built with &#9889;&#65039; by 223 - <a href="https://desertthunder.dev" target="_blank">Owais</a> 224 - at 225 - <a href="https://stormlightlabs.org" target="_blank">Stormlight Labs</a> 226 - &middot; Powered by the <a href="https://atproto.com" target="_blank">AT Protocol</a> 227 - &middot; <a href="./csae-policy.html">Child Safety Standards</a> 228 - &middot; <a href="./privacy.html">Privacy Policy</a> 229 - &middot; <a href="./terms.html">Terms of Service</a> 230 - </p> 231 - </footer> 232 - </body> 233 - </html>
-56
www/oauth/callback/index.html
··· 1 - <!DOCTYPE html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8" /> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 - <title>Lazurite Authentication Complete</title> 7 - <link rel="preconnect" href="https://fonts.googleapis.com" /> 8 - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 9 - <link 10 - href="https://fonts.googleapis.com/css2?family=Google+Sans+Code:ital,wght@0,300..800;1,300..800&family=Google+Sans:ital,opsz,wght@0,17..18,400..700;1,17..18,400..700&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Lora:ital,wght@0,400..700;1,400..700&display=swap" 11 - rel="stylesheet" /> 12 - <link rel="stylesheet" href="/static/shared.css" /> 13 - </head> 14 - <body class="legal-page oauth-callback-page"> 15 - <div class="container oauth-callback-container"> 16 - <main class="legal-card oauth-callback-main"> 17 - <h1>Authentication Complete</h1> 18 - <p class="lead oauth-callback-copy">Lazurite is finishing sign-in. If the app does not reopen automatically, tap below.</p> 19 - <a id="reopen-link" class="oauth-callback-button" href="#">Open Lazurite</a> 20 - <p class="meta oauth-callback-hint">If this still fails, use your browser menu and choose “Open in app”.</p> 21 - </main> 22 - </div> 23 - <script> 24 - const query = window.location.search || ''; 25 - const fragment = window.location.hash || ''; 26 - const isAppleMobile = 27 - /iPad|iPhone|iPod/.test(window.navigator.userAgent) || 28 - (window.navigator.platform === 'MacIntel' && window.navigator.maxTouchPoints > 1); 29 - const reopenPath = isAppleMobile ? '//oauth/callback' : '/oauth/callback'; 30 - const reopenUrl = `org.stormlightlabs.lazurite:${reopenPath}${query}${fragment}`; 31 - const reopenLink = document.getElementById('reopen-link'); 32 - const autoOpenKey = `lazurite.oauth.reopen.${query}${fragment}`; 33 - 34 - reopenLink.setAttribute('href', reopenUrl); 35 - 36 - function attemptReopen() { 37 - try { 38 - if (window.sessionStorage.getItem(autoOpenKey) === '1') { 39 - return; 40 - } 41 - window.sessionStorage.setItem(autoOpenKey, '1'); 42 - } catch (err) { 43 - console.debug("Storage unavailable; trying a single best-effort reopen.", err); 44 - } 45 - window.location.assign(reopenUrl); 46 - } 47 - 48 - window.addEventListener('load', function () { 49 - if (isAppleMobile) { 50 - return; 51 - } 52 - window.setTimeout(attemptReopen, 250); 53 - }); 54 - </script> 55 - </body> 56 - </html>
+21
www/package.json
··· 1 + { 2 + "name": "www", 3 + "type": "module", 4 + "version": "0.0.1", 5 + "engines": { 6 + "node": ">=22.12.0" 7 + }, 8 + "scripts": { 9 + "dev": "astro dev", 10 + "build": "astro build", 11 + "preview": "astro preview", 12 + "astro": "astro" 13 + }, 14 + "dependencies": { 15 + "astro": "^6.3.0" 16 + }, 17 + "devDependencies": { 18 + "prettier": "^3.8.3", 19 + "prettier-plugin-astro": "^0.14.1" 20 + } 21 + }
+3053
www/pnpm-lock.yaml
··· 1 + lockfileVersion: '9.0' 2 + 3 + settings: 4 + autoInstallPeers: true 5 + excludeLinksFromLockfile: false 6 + 7 + importers: 8 + 9 + .: 10 + dependencies: 11 + astro: 12 + specifier: ^6.3.0 13 + version: 6.3.0(rollup@4.60.3) 14 + devDependencies: 15 + prettier: 16 + specifier: ^3.8.3 17 + version: 3.8.3 18 + prettier-plugin-astro: 19 + specifier: ^0.14.1 20 + version: 0.14.1 21 + 22 + packages: 23 + 24 + '@astrojs/compiler@2.13.1': 25 + resolution: {integrity: sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==} 26 + 27 + '@astrojs/compiler@4.0.0': 28 + resolution: {integrity: sha512-eouss7G8ygdZqHuke033VMcVw5HTZUu+PXd/h06DGDUg/jt5btPYPqh66ENWw/mU78rBrf/oeC4oqoBwMtDMNA==} 29 + 30 + '@astrojs/internal-helpers@0.9.0': 31 + resolution: {integrity: sha512-GdYkzR26re8izmyYlBqf4z2s7zNngmWLFuxw0UKiPNqHraZGS6GKWIwSHgS22RDlu2ePFJ8bzmpBcUszut/SDg==} 32 + 33 + '@astrojs/markdown-remark@7.1.1': 34 + resolution: {integrity: sha512-C6e9BnLGlbdv6bV8MYGeHpHxsUHrCrB4OuRLqi5LI7oiBVcBcqfUN06zpwFQdHgV48QCCrMmLpyqBr7VqC+swA==} 35 + 36 + '@astrojs/prism@4.0.1': 37 + resolution: {integrity: sha512-nksZQVjlferuWzhPsBpQ1JE5XuKAf1id1/9Hj4a9KG4+ofrlzxUUwX4YGQF/SuDiuiGKEnzopGOt38F3AnVWsQ==} 38 + engines: {node: '>=22.12.0'} 39 + 40 + '@astrojs/telemetry@3.3.2': 41 + resolution: {integrity: sha512-j8DNruA8ors99Al39RYZPJK4DC1bKkoNm93mAMuBhY9TCNC4R8n1q7ovFnJ5qhGh5Lsh7pa1gpQVpYpsJPeTHQ==} 42 + engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} 43 + 44 + '@babel/helper-string-parser@7.27.1': 45 + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 46 + engines: {node: '>=6.9.0'} 47 + 48 + '@babel/helper-validator-identifier@7.28.5': 49 + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} 50 + engines: {node: '>=6.9.0'} 51 + 52 + '@babel/parser@7.29.3': 53 + resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} 54 + engines: {node: '>=6.0.0'} 55 + hasBin: true 56 + 57 + '@babel/types@7.29.0': 58 + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} 59 + engines: {node: '>=6.9.0'} 60 + 61 + '@capsizecss/unpack@4.0.0': 62 + resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==} 63 + engines: {node: '>=18'} 64 + 65 + '@clack/core@1.3.0': 66 + resolution: {integrity: sha512-xJPHpAmEQUBrXSLx0gF+q5K/IyihXpsHZcha+jB+tyahsKRK3Dxo4D0coZDewHo12NhiuzC3dTtMPbm53GEAAA==} 67 + engines: {node: '>= 20.12.0'} 68 + 69 + '@clack/prompts@1.3.0': 70 + resolution: {integrity: sha512-GgcWwRCs/xPtaqlMy8qRhPnZf9vlWcWZNHAitnVQ3yk7JmSralSiq5q07yaffYE8SogtDm7zFeKccx1QNVARpw==} 71 + engines: {node: '>= 20.12.0'} 72 + 73 + '@emnapi/runtime@1.10.0': 74 + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} 75 + 76 + '@esbuild/aix-ppc64@0.27.7': 77 + resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==} 78 + engines: {node: '>=18'} 79 + cpu: [ppc64] 80 + os: [aix] 81 + 82 + '@esbuild/android-arm64@0.27.7': 83 + resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==} 84 + engines: {node: '>=18'} 85 + cpu: [arm64] 86 + os: [android] 87 + 88 + '@esbuild/android-arm@0.27.7': 89 + resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==} 90 + engines: {node: '>=18'} 91 + cpu: [arm] 92 + os: [android] 93 + 94 + '@esbuild/android-x64@0.27.7': 95 + resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==} 96 + engines: {node: '>=18'} 97 + cpu: [x64] 98 + os: [android] 99 + 100 + '@esbuild/darwin-arm64@0.27.7': 101 + resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==} 102 + engines: {node: '>=18'} 103 + cpu: [arm64] 104 + os: [darwin] 105 + 106 + '@esbuild/darwin-x64@0.27.7': 107 + resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==} 108 + engines: {node: '>=18'} 109 + cpu: [x64] 110 + os: [darwin] 111 + 112 + '@esbuild/freebsd-arm64@0.27.7': 113 + resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==} 114 + engines: {node: '>=18'} 115 + cpu: [arm64] 116 + os: [freebsd] 117 + 118 + '@esbuild/freebsd-x64@0.27.7': 119 + resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==} 120 + engines: {node: '>=18'} 121 + cpu: [x64] 122 + os: [freebsd] 123 + 124 + '@esbuild/linux-arm64@0.27.7': 125 + resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==} 126 + engines: {node: '>=18'} 127 + cpu: [arm64] 128 + os: [linux] 129 + 130 + '@esbuild/linux-arm@0.27.7': 131 + resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==} 132 + engines: {node: '>=18'} 133 + cpu: [arm] 134 + os: [linux] 135 + 136 + '@esbuild/linux-ia32@0.27.7': 137 + resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==} 138 + engines: {node: '>=18'} 139 + cpu: [ia32] 140 + os: [linux] 141 + 142 + '@esbuild/linux-loong64@0.27.7': 143 + resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==} 144 + engines: {node: '>=18'} 145 + cpu: [loong64] 146 + os: [linux] 147 + 148 + '@esbuild/linux-mips64el@0.27.7': 149 + resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==} 150 + engines: {node: '>=18'} 151 + cpu: [mips64el] 152 + os: [linux] 153 + 154 + '@esbuild/linux-ppc64@0.27.7': 155 + resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==} 156 + engines: {node: '>=18'} 157 + cpu: [ppc64] 158 + os: [linux] 159 + 160 + '@esbuild/linux-riscv64@0.27.7': 161 + resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==} 162 + engines: {node: '>=18'} 163 + cpu: [riscv64] 164 + os: [linux] 165 + 166 + '@esbuild/linux-s390x@0.27.7': 167 + resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==} 168 + engines: {node: '>=18'} 169 + cpu: [s390x] 170 + os: [linux] 171 + 172 + '@esbuild/linux-x64@0.27.7': 173 + resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==} 174 + engines: {node: '>=18'} 175 + cpu: [x64] 176 + os: [linux] 177 + 178 + '@esbuild/netbsd-arm64@0.27.7': 179 + resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==} 180 + engines: {node: '>=18'} 181 + cpu: [arm64] 182 + os: [netbsd] 183 + 184 + '@esbuild/netbsd-x64@0.27.7': 185 + resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==} 186 + engines: {node: '>=18'} 187 + cpu: [x64] 188 + os: [netbsd] 189 + 190 + '@esbuild/openbsd-arm64@0.27.7': 191 + resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==} 192 + engines: {node: '>=18'} 193 + cpu: [arm64] 194 + os: [openbsd] 195 + 196 + '@esbuild/openbsd-x64@0.27.7': 197 + resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==} 198 + engines: {node: '>=18'} 199 + cpu: [x64] 200 + os: [openbsd] 201 + 202 + '@esbuild/openharmony-arm64@0.27.7': 203 + resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==} 204 + engines: {node: '>=18'} 205 + cpu: [arm64] 206 + os: [openharmony] 207 + 208 + '@esbuild/sunos-x64@0.27.7': 209 + resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==} 210 + engines: {node: '>=18'} 211 + cpu: [x64] 212 + os: [sunos] 213 + 214 + '@esbuild/win32-arm64@0.27.7': 215 + resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==} 216 + engines: {node: '>=18'} 217 + cpu: [arm64] 218 + os: [win32] 219 + 220 + '@esbuild/win32-ia32@0.27.7': 221 + resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==} 222 + engines: {node: '>=18'} 223 + cpu: [ia32] 224 + os: [win32] 225 + 226 + '@esbuild/win32-x64@0.27.7': 227 + resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==} 228 + engines: {node: '>=18'} 229 + cpu: [x64] 230 + os: [win32] 231 + 232 + '@img/colour@1.1.0': 233 + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} 234 + engines: {node: '>=18'} 235 + 236 + '@img/sharp-darwin-arm64@0.34.5': 237 + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} 238 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 239 + cpu: [arm64] 240 + os: [darwin] 241 + 242 + '@img/sharp-darwin-x64@0.34.5': 243 + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} 244 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 245 + cpu: [x64] 246 + os: [darwin] 247 + 248 + '@img/sharp-libvips-darwin-arm64@1.2.4': 249 + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} 250 + cpu: [arm64] 251 + os: [darwin] 252 + 253 + '@img/sharp-libvips-darwin-x64@1.2.4': 254 + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} 255 + cpu: [x64] 256 + os: [darwin] 257 + 258 + '@img/sharp-libvips-linux-arm64@1.2.4': 259 + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} 260 + cpu: [arm64] 261 + os: [linux] 262 + libc: [glibc] 263 + 264 + '@img/sharp-libvips-linux-arm@1.2.4': 265 + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} 266 + cpu: [arm] 267 + os: [linux] 268 + libc: [glibc] 269 + 270 + '@img/sharp-libvips-linux-ppc64@1.2.4': 271 + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} 272 + cpu: [ppc64] 273 + os: [linux] 274 + libc: [glibc] 275 + 276 + '@img/sharp-libvips-linux-riscv64@1.2.4': 277 + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} 278 + cpu: [riscv64] 279 + os: [linux] 280 + libc: [glibc] 281 + 282 + '@img/sharp-libvips-linux-s390x@1.2.4': 283 + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} 284 + cpu: [s390x] 285 + os: [linux] 286 + libc: [glibc] 287 + 288 + '@img/sharp-libvips-linux-x64@1.2.4': 289 + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} 290 + cpu: [x64] 291 + os: [linux] 292 + libc: [glibc] 293 + 294 + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': 295 + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} 296 + cpu: [arm64] 297 + os: [linux] 298 + libc: [musl] 299 + 300 + '@img/sharp-libvips-linuxmusl-x64@1.2.4': 301 + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} 302 + cpu: [x64] 303 + os: [linux] 304 + libc: [musl] 305 + 306 + '@img/sharp-linux-arm64@0.34.5': 307 + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} 308 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 309 + cpu: [arm64] 310 + os: [linux] 311 + libc: [glibc] 312 + 313 + '@img/sharp-linux-arm@0.34.5': 314 + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} 315 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 316 + cpu: [arm] 317 + os: [linux] 318 + libc: [glibc] 319 + 320 + '@img/sharp-linux-ppc64@0.34.5': 321 + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} 322 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 323 + cpu: [ppc64] 324 + os: [linux] 325 + libc: [glibc] 326 + 327 + '@img/sharp-linux-riscv64@0.34.5': 328 + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} 329 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 330 + cpu: [riscv64] 331 + os: [linux] 332 + libc: [glibc] 333 + 334 + '@img/sharp-linux-s390x@0.34.5': 335 + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} 336 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 337 + cpu: [s390x] 338 + os: [linux] 339 + libc: [glibc] 340 + 341 + '@img/sharp-linux-x64@0.34.5': 342 + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} 343 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 344 + cpu: [x64] 345 + os: [linux] 346 + libc: [glibc] 347 + 348 + '@img/sharp-linuxmusl-arm64@0.34.5': 349 + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} 350 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 351 + cpu: [arm64] 352 + os: [linux] 353 + libc: [musl] 354 + 355 + '@img/sharp-linuxmusl-x64@0.34.5': 356 + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} 357 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 358 + cpu: [x64] 359 + os: [linux] 360 + libc: [musl] 361 + 362 + '@img/sharp-wasm32@0.34.5': 363 + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} 364 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 365 + cpu: [wasm32] 366 + 367 + '@img/sharp-win32-arm64@0.34.5': 368 + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} 369 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 370 + cpu: [arm64] 371 + os: [win32] 372 + 373 + '@img/sharp-win32-ia32@0.34.5': 374 + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} 375 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 376 + cpu: [ia32] 377 + os: [win32] 378 + 379 + '@img/sharp-win32-x64@0.34.5': 380 + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} 381 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 382 + cpu: [x64] 383 + os: [win32] 384 + 385 + '@jridgewell/sourcemap-codec@1.5.5': 386 + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} 387 + 388 + '@oslojs/encoding@1.1.0': 389 + resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==} 390 + 391 + '@rollup/pluginutils@5.3.0': 392 + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} 393 + engines: {node: '>=14.0.0'} 394 + peerDependencies: 395 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 396 + peerDependenciesMeta: 397 + rollup: 398 + optional: true 399 + 400 + '@rollup/rollup-android-arm-eabi@4.60.3': 401 + resolution: {integrity: sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==} 402 + cpu: [arm] 403 + os: [android] 404 + 405 + '@rollup/rollup-android-arm64@4.60.3': 406 + resolution: {integrity: sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==} 407 + cpu: [arm64] 408 + os: [android] 409 + 410 + '@rollup/rollup-darwin-arm64@4.60.3': 411 + resolution: {integrity: sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==} 412 + cpu: [arm64] 413 + os: [darwin] 414 + 415 + '@rollup/rollup-darwin-x64@4.60.3': 416 + resolution: {integrity: sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==} 417 + cpu: [x64] 418 + os: [darwin] 419 + 420 + '@rollup/rollup-freebsd-arm64@4.60.3': 421 + resolution: {integrity: sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==} 422 + cpu: [arm64] 423 + os: [freebsd] 424 + 425 + '@rollup/rollup-freebsd-x64@4.60.3': 426 + resolution: {integrity: sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==} 427 + cpu: [x64] 428 + os: [freebsd] 429 + 430 + '@rollup/rollup-linux-arm-gnueabihf@4.60.3': 431 + resolution: {integrity: sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==} 432 + cpu: [arm] 433 + os: [linux] 434 + libc: [glibc] 435 + 436 + '@rollup/rollup-linux-arm-musleabihf@4.60.3': 437 + resolution: {integrity: sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==} 438 + cpu: [arm] 439 + os: [linux] 440 + libc: [musl] 441 + 442 + '@rollup/rollup-linux-arm64-gnu@4.60.3': 443 + resolution: {integrity: sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==} 444 + cpu: [arm64] 445 + os: [linux] 446 + libc: [glibc] 447 + 448 + '@rollup/rollup-linux-arm64-musl@4.60.3': 449 + resolution: {integrity: sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==} 450 + cpu: [arm64] 451 + os: [linux] 452 + libc: [musl] 453 + 454 + '@rollup/rollup-linux-loong64-gnu@4.60.3': 455 + resolution: {integrity: sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==} 456 + cpu: [loong64] 457 + os: [linux] 458 + libc: [glibc] 459 + 460 + '@rollup/rollup-linux-loong64-musl@4.60.3': 461 + resolution: {integrity: sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==} 462 + cpu: [loong64] 463 + os: [linux] 464 + libc: [musl] 465 + 466 + '@rollup/rollup-linux-ppc64-gnu@4.60.3': 467 + resolution: {integrity: sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==} 468 + cpu: [ppc64] 469 + os: [linux] 470 + libc: [glibc] 471 + 472 + '@rollup/rollup-linux-ppc64-musl@4.60.3': 473 + resolution: {integrity: sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==} 474 + cpu: [ppc64] 475 + os: [linux] 476 + libc: [musl] 477 + 478 + '@rollup/rollup-linux-riscv64-gnu@4.60.3': 479 + resolution: {integrity: sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==} 480 + cpu: [riscv64] 481 + os: [linux] 482 + libc: [glibc] 483 + 484 + '@rollup/rollup-linux-riscv64-musl@4.60.3': 485 + resolution: {integrity: sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==} 486 + cpu: [riscv64] 487 + os: [linux] 488 + libc: [musl] 489 + 490 + '@rollup/rollup-linux-s390x-gnu@4.60.3': 491 + resolution: {integrity: sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==} 492 + cpu: [s390x] 493 + os: [linux] 494 + libc: [glibc] 495 + 496 + '@rollup/rollup-linux-x64-gnu@4.60.3': 497 + resolution: {integrity: sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==} 498 + cpu: [x64] 499 + os: [linux] 500 + libc: [glibc] 501 + 502 + '@rollup/rollup-linux-x64-musl@4.60.3': 503 + resolution: {integrity: sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==} 504 + cpu: [x64] 505 + os: [linux] 506 + libc: [musl] 507 + 508 + '@rollup/rollup-openbsd-x64@4.60.3': 509 + resolution: {integrity: sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==} 510 + cpu: [x64] 511 + os: [openbsd] 512 + 513 + '@rollup/rollup-openharmony-arm64@4.60.3': 514 + resolution: {integrity: sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==} 515 + cpu: [arm64] 516 + os: [openharmony] 517 + 518 + '@rollup/rollup-win32-arm64-msvc@4.60.3': 519 + resolution: {integrity: sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==} 520 + cpu: [arm64] 521 + os: [win32] 522 + 523 + '@rollup/rollup-win32-ia32-msvc@4.60.3': 524 + resolution: {integrity: sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==} 525 + cpu: [ia32] 526 + os: [win32] 527 + 528 + '@rollup/rollup-win32-x64-gnu@4.60.3': 529 + resolution: {integrity: sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==} 530 + cpu: [x64] 531 + os: [win32] 532 + 533 + '@rollup/rollup-win32-x64-msvc@4.60.3': 534 + resolution: {integrity: sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==} 535 + cpu: [x64] 536 + os: [win32] 537 + 538 + '@shikijs/core@4.0.2': 539 + resolution: {integrity: sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==} 540 + engines: {node: '>=20'} 541 + 542 + '@shikijs/engine-javascript@4.0.2': 543 + resolution: {integrity: sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag==} 544 + engines: {node: '>=20'} 545 + 546 + '@shikijs/engine-oniguruma@4.0.2': 547 + resolution: {integrity: sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==} 548 + engines: {node: '>=20'} 549 + 550 + '@shikijs/langs@4.0.2': 551 + resolution: {integrity: sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==} 552 + engines: {node: '>=20'} 553 + 554 + '@shikijs/primitive@4.0.2': 555 + resolution: {integrity: sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==} 556 + engines: {node: '>=20'} 557 + 558 + '@shikijs/themes@4.0.2': 559 + resolution: {integrity: sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==} 560 + engines: {node: '>=20'} 561 + 562 + '@shikijs/types@4.0.2': 563 + resolution: {integrity: sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==} 564 + engines: {node: '>=20'} 565 + 566 + '@shikijs/vscode-textmate@10.0.2': 567 + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} 568 + 569 + '@types/debug@4.1.13': 570 + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} 571 + 572 + '@types/estree@1.0.8': 573 + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} 574 + 575 + '@types/estree@1.0.9': 576 + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} 577 + 578 + '@types/hast@3.0.4': 579 + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} 580 + 581 + '@types/mdast@4.0.4': 582 + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} 583 + 584 + '@types/ms@2.1.0': 585 + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} 586 + 587 + '@types/nlcst@2.0.3': 588 + resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==} 589 + 590 + '@types/unist@3.0.3': 591 + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} 592 + 593 + '@ungap/structured-clone@1.3.1': 594 + resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} 595 + 596 + anymatch@3.1.3: 597 + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 598 + engines: {node: '>= 8'} 599 + 600 + argparse@2.0.1: 601 + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 602 + 603 + aria-query@5.3.2: 604 + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} 605 + engines: {node: '>= 0.4'} 606 + 607 + array-iterate@2.0.1: 608 + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} 609 + 610 + astro@6.3.0: 611 + resolution: {integrity: sha512-yhDelVblNzQE4mjS0s27T9BZuAlfRCy+qHk6IlMgSr+ADG5QNpyPkroJAVCFRH08Nf2VhDM5dz6n4GWiTB9TlQ==} 612 + engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'} 613 + hasBin: true 614 + 615 + axobject-query@4.1.0: 616 + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} 617 + engines: {node: '>= 0.4'} 618 + 619 + bail@2.0.2: 620 + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} 621 + 622 + boolbase@1.0.0: 623 + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} 624 + 625 + ccount@2.0.1: 626 + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} 627 + 628 + character-entities-html4@2.1.0: 629 + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} 630 + 631 + character-entities-legacy@3.0.0: 632 + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} 633 + 634 + character-entities@2.0.2: 635 + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} 636 + 637 + chokidar@5.0.0: 638 + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} 639 + engines: {node: '>= 20.19.0'} 640 + 641 + ci-info@4.4.0: 642 + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} 643 + engines: {node: '>=8'} 644 + 645 + clsx@2.1.1: 646 + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} 647 + engines: {node: '>=6'} 648 + 649 + comma-separated-tokens@2.0.3: 650 + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} 651 + 652 + commander@11.1.0: 653 + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} 654 + engines: {node: '>=16'} 655 + 656 + common-ancestor-path@2.0.0: 657 + resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==} 658 + engines: {node: '>= 18'} 659 + 660 + cookie-es@1.2.3: 661 + resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==} 662 + 663 + cookie@1.1.1: 664 + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} 665 + engines: {node: '>=18'} 666 + 667 + crossws@0.3.5: 668 + resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==} 669 + 670 + css-select@5.2.2: 671 + resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} 672 + 673 + css-tree@2.2.1: 674 + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} 675 + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} 676 + 677 + css-tree@3.2.1: 678 + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} 679 + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} 680 + 681 + css-what@6.2.2: 682 + resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} 683 + engines: {node: '>= 6'} 684 + 685 + csso@5.0.5: 686 + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} 687 + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} 688 + 689 + debug@4.4.3: 690 + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} 691 + engines: {node: '>=6.0'} 692 + peerDependencies: 693 + supports-color: '*' 694 + peerDependenciesMeta: 695 + supports-color: 696 + optional: true 697 + 698 + decode-named-character-reference@1.3.0: 699 + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} 700 + 701 + defu@6.1.7: 702 + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} 703 + 704 + dequal@2.0.3: 705 + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 706 + engines: {node: '>=6'} 707 + 708 + destr@2.0.5: 709 + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} 710 + 711 + detect-libc@2.1.2: 712 + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} 713 + engines: {node: '>=8'} 714 + 715 + devalue@5.8.0: 716 + resolution: {integrity: sha512-2zA9pFEsnp7vWBZbXF5JAgAq0fsUIt/1XPbRiAmRV3lp/2C3upzH+sADiyy66aFCihoLEsrQHxNM5w1gIDfsBg==} 717 + 718 + devlop@1.1.0: 719 + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} 720 + 721 + diff@8.0.4: 722 + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} 723 + engines: {node: '>=0.3.1'} 724 + 725 + dom-serializer@2.0.0: 726 + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} 727 + 728 + domelementtype@2.3.0: 729 + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} 730 + 731 + domhandler@5.0.3: 732 + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} 733 + engines: {node: '>= 4'} 734 + 735 + domutils@3.2.2: 736 + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} 737 + 738 + dset@3.1.4: 739 + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} 740 + engines: {node: '>=4'} 741 + 742 + entities@4.5.0: 743 + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 744 + engines: {node: '>=0.12'} 745 + 746 + entities@6.0.1: 747 + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} 748 + engines: {node: '>=0.12'} 749 + 750 + es-module-lexer@2.1.0: 751 + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} 752 + 753 + esbuild@0.27.7: 754 + resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==} 755 + engines: {node: '>=18'} 756 + hasBin: true 757 + 758 + escape-string-regexp@5.0.0: 759 + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 760 + engines: {node: '>=12'} 761 + 762 + estree-walker@2.0.2: 763 + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 764 + 765 + eventemitter3@5.0.4: 766 + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} 767 + 768 + extend@3.0.2: 769 + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} 770 + 771 + fast-string-truncated-width@3.0.3: 772 + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} 773 + 774 + fast-string-width@3.0.2: 775 + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} 776 + 777 + fast-wrap-ansi@0.2.0: 778 + resolution: {integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==} 779 + 780 + fdir@6.5.0: 781 + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} 782 + engines: {node: '>=12.0.0'} 783 + peerDependencies: 784 + picomatch: ^3 || ^4 785 + peerDependenciesMeta: 786 + picomatch: 787 + optional: true 788 + 789 + flattie@1.1.1: 790 + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} 791 + engines: {node: '>=8'} 792 + 793 + fontace@0.4.1: 794 + resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==} 795 + 796 + fontkitten@1.0.3: 797 + resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==} 798 + engines: {node: '>=20'} 799 + 800 + fsevents@2.3.3: 801 + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 802 + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 803 + os: [darwin] 804 + 805 + get-tsconfig@5.0.0-beta.4: 806 + resolution: {integrity: sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==} 807 + engines: {node: '>=20.20.0'} 808 + 809 + github-slugger@2.0.0: 810 + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} 811 + 812 + h3@1.15.11: 813 + resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} 814 + 815 + hast-util-from-html@2.0.3: 816 + resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} 817 + 818 + hast-util-from-parse5@8.0.3: 819 + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} 820 + 821 + hast-util-is-element@3.0.0: 822 + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} 823 + 824 + hast-util-parse-selector@4.0.0: 825 + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} 826 + 827 + hast-util-raw@9.1.0: 828 + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} 829 + 830 + hast-util-to-html@9.0.5: 831 + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} 832 + 833 + hast-util-to-parse5@8.0.1: 834 + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} 835 + 836 + hast-util-to-text@4.0.2: 837 + resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} 838 + 839 + hast-util-whitespace@3.0.0: 840 + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} 841 + 842 + hastscript@9.0.1: 843 + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} 844 + 845 + html-escaper@3.0.3: 846 + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} 847 + 848 + html-void-elements@3.0.0: 849 + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} 850 + 851 + http-cache-semantics@4.2.0: 852 + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} 853 + 854 + iron-webcrypto@1.2.1: 855 + resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} 856 + 857 + is-docker@3.0.0: 858 + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} 859 + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 860 + hasBin: true 861 + 862 + is-docker@4.0.0: 863 + resolution: {integrity: sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==} 864 + engines: {node: '>=20'} 865 + hasBin: true 866 + 867 + is-inside-container@1.0.0: 868 + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} 869 + engines: {node: '>=14.16'} 870 + hasBin: true 871 + 872 + is-plain-obj@4.1.0: 873 + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} 874 + engines: {node: '>=12'} 875 + 876 + is-wsl@3.1.1: 877 + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} 878 + engines: {node: '>=16'} 879 + 880 + js-yaml@4.1.1: 881 + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} 882 + hasBin: true 883 + 884 + jsonc-parser@3.3.1: 885 + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} 886 + 887 + longest-streak@3.1.0: 888 + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} 889 + 890 + lru-cache@11.3.6: 891 + resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==} 892 + engines: {node: 20 || >=22} 893 + 894 + magic-string@0.30.21: 895 + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} 896 + 897 + magicast@0.5.2: 898 + resolution: {integrity: sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==} 899 + 900 + markdown-table@3.0.4: 901 + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} 902 + 903 + mdast-util-definitions@6.0.0: 904 + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} 905 + 906 + mdast-util-find-and-replace@3.0.2: 907 + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} 908 + 909 + mdast-util-from-markdown@2.0.3: 910 + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} 911 + 912 + mdast-util-gfm-autolink-literal@2.0.1: 913 + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} 914 + 915 + mdast-util-gfm-footnote@2.1.0: 916 + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} 917 + 918 + mdast-util-gfm-strikethrough@2.0.0: 919 + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} 920 + 921 + mdast-util-gfm-table@2.0.0: 922 + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} 923 + 924 + mdast-util-gfm-task-list-item@2.0.0: 925 + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} 926 + 927 + mdast-util-gfm@3.1.0: 928 + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} 929 + 930 + mdast-util-phrasing@4.1.0: 931 + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} 932 + 933 + mdast-util-to-hast@13.2.1: 934 + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} 935 + 936 + mdast-util-to-markdown@2.1.2: 937 + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} 938 + 939 + mdast-util-to-string@4.0.0: 940 + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} 941 + 942 + mdn-data@2.0.28: 943 + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} 944 + 945 + mdn-data@2.27.1: 946 + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} 947 + 948 + micromark-core-commonmark@2.0.3: 949 + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} 950 + 951 + micromark-extension-gfm-autolink-literal@2.1.0: 952 + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} 953 + 954 + micromark-extension-gfm-footnote@2.1.0: 955 + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} 956 + 957 + micromark-extension-gfm-strikethrough@2.1.0: 958 + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} 959 + 960 + micromark-extension-gfm-table@2.1.1: 961 + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} 962 + 963 + micromark-extension-gfm-tagfilter@2.0.0: 964 + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} 965 + 966 + micromark-extension-gfm-task-list-item@2.1.0: 967 + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} 968 + 969 + micromark-extension-gfm@3.0.0: 970 + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} 971 + 972 + micromark-factory-destination@2.0.1: 973 + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} 974 + 975 + micromark-factory-label@2.0.1: 976 + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} 977 + 978 + micromark-factory-space@2.0.1: 979 + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} 980 + 981 + micromark-factory-title@2.0.1: 982 + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} 983 + 984 + micromark-factory-whitespace@2.0.1: 985 + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} 986 + 987 + micromark-util-character@2.1.1: 988 + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} 989 + 990 + micromark-util-chunked@2.0.1: 991 + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} 992 + 993 + micromark-util-classify-character@2.0.1: 994 + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} 995 + 996 + micromark-util-combine-extensions@2.0.1: 997 + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} 998 + 999 + micromark-util-decode-numeric-character-reference@2.0.2: 1000 + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} 1001 + 1002 + micromark-util-decode-string@2.0.1: 1003 + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} 1004 + 1005 + micromark-util-encode@2.0.1: 1006 + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} 1007 + 1008 + micromark-util-html-tag-name@2.0.1: 1009 + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} 1010 + 1011 + micromark-util-normalize-identifier@2.0.1: 1012 + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} 1013 + 1014 + micromark-util-resolve-all@2.0.1: 1015 + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} 1016 + 1017 + micromark-util-sanitize-uri@2.0.1: 1018 + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} 1019 + 1020 + micromark-util-subtokenize@2.1.0: 1021 + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} 1022 + 1023 + micromark-util-symbol@2.0.1: 1024 + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} 1025 + 1026 + micromark-util-types@2.0.2: 1027 + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} 1028 + 1029 + micromark@4.0.2: 1030 + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} 1031 + 1032 + mrmime@2.0.1: 1033 + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} 1034 + engines: {node: '>=10'} 1035 + 1036 + ms@2.1.3: 1037 + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1038 + 1039 + nanoid@3.3.12: 1040 + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} 1041 + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1042 + hasBin: true 1043 + 1044 + neotraverse@0.6.18: 1045 + resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} 1046 + engines: {node: '>= 10'} 1047 + 1048 + nlcst-to-string@4.0.0: 1049 + resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} 1050 + 1051 + node-fetch-native@1.6.7: 1052 + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} 1053 + 1054 + node-mock-http@1.0.4: 1055 + resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} 1056 + 1057 + normalize-path@3.0.0: 1058 + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1059 + engines: {node: '>=0.10.0'} 1060 + 1061 + nth-check@2.1.1: 1062 + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} 1063 + 1064 + obug@2.1.1: 1065 + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} 1066 + 1067 + ofetch@1.5.1: 1068 + resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} 1069 + 1070 + ohash@2.0.11: 1071 + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} 1072 + 1073 + oniguruma-parser@0.12.2: 1074 + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} 1075 + 1076 + oniguruma-to-es@4.3.6: 1077 + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} 1078 + 1079 + p-limit@7.3.0: 1080 + resolution: {integrity: sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==} 1081 + engines: {node: '>=20'} 1082 + 1083 + p-queue@9.2.0: 1084 + resolution: {integrity: sha512-dWgLE8AH0HjQ9fe74pUkKkvzzYT18Inp4zra3lKHnnwqGvcfcUBrvF2EAVX+envufDNBOzpPq/IBUONDbI7+3g==} 1085 + engines: {node: '>=20'} 1086 + 1087 + p-timeout@7.0.1: 1088 + resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==} 1089 + engines: {node: '>=20'} 1090 + 1091 + package-manager-detector@1.6.0: 1092 + resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} 1093 + 1094 + parse-latin@7.0.0: 1095 + resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} 1096 + 1097 + parse5@7.3.0: 1098 + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} 1099 + 1100 + piccolore@0.1.3: 1101 + resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} 1102 + 1103 + picocolors@1.1.1: 1104 + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1105 + 1106 + picomatch@2.3.2: 1107 + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} 1108 + engines: {node: '>=8.6'} 1109 + 1110 + picomatch@4.0.4: 1111 + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} 1112 + engines: {node: '>=12'} 1113 + 1114 + postcss@8.5.14: 1115 + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} 1116 + engines: {node: ^10 || ^12 || >=14} 1117 + 1118 + prettier-plugin-astro@0.14.1: 1119 + resolution: {integrity: sha512-RiBETaaP9veVstE4vUwSIcdATj6dKmXljouXc/DDNwBSPTp8FRkLGDSGFClKsAFeeg+13SB0Z1JZvbD76bigJw==} 1120 + engines: {node: ^14.15.0 || >=16.0.0} 1121 + 1122 + prettier@3.8.3: 1123 + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} 1124 + engines: {node: '>=14'} 1125 + hasBin: true 1126 + 1127 + prismjs@1.30.0: 1128 + resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} 1129 + engines: {node: '>=6'} 1130 + 1131 + property-information@7.1.0: 1132 + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} 1133 + 1134 + radix3@1.1.2: 1135 + resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} 1136 + 1137 + readdirp@5.0.0: 1138 + resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} 1139 + engines: {node: '>= 20.19.0'} 1140 + 1141 + regex-recursion@6.0.2: 1142 + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} 1143 + 1144 + regex-utilities@2.3.0: 1145 + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} 1146 + 1147 + regex@6.1.0: 1148 + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} 1149 + 1150 + rehype-parse@9.0.1: 1151 + resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} 1152 + 1153 + rehype-raw@7.0.0: 1154 + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} 1155 + 1156 + rehype-stringify@10.0.1: 1157 + resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} 1158 + 1159 + rehype@13.0.2: 1160 + resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==} 1161 + 1162 + remark-gfm@4.0.1: 1163 + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} 1164 + 1165 + remark-parse@11.0.0: 1166 + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} 1167 + 1168 + remark-rehype@11.1.2: 1169 + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} 1170 + 1171 + remark-smartypants@3.0.2: 1172 + resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==} 1173 + engines: {node: '>=16.0.0'} 1174 + 1175 + remark-stringify@11.0.0: 1176 + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} 1177 + 1178 + resolve-pkg-maps@1.0.0: 1179 + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 1180 + 1181 + retext-latin@4.0.0: 1182 + resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} 1183 + 1184 + retext-smartypants@6.2.0: 1185 + resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==} 1186 + 1187 + retext-stringify@4.0.0: 1188 + resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==} 1189 + 1190 + retext@9.0.0: 1191 + resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==} 1192 + 1193 + rollup@4.60.3: 1194 + resolution: {integrity: sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==} 1195 + engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1196 + hasBin: true 1197 + 1198 + s.color@0.0.15: 1199 + resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} 1200 + 1201 + sass-formatter@0.7.9: 1202 + resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==} 1203 + 1204 + sax@1.6.0: 1205 + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} 1206 + engines: {node: '>=11.0.0'} 1207 + 1208 + semver@7.7.4: 1209 + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} 1210 + engines: {node: '>=10'} 1211 + hasBin: true 1212 + 1213 + sharp@0.34.5: 1214 + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} 1215 + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} 1216 + 1217 + shiki@4.0.2: 1218 + resolution: {integrity: sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==} 1219 + engines: {node: '>=20'} 1220 + 1221 + sisteransi@1.0.5: 1222 + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 1223 + 1224 + smol-toml@1.6.1: 1225 + resolution: {integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==} 1226 + engines: {node: '>= 18'} 1227 + 1228 + source-map-js@1.2.1: 1229 + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 1230 + engines: {node: '>=0.10.0'} 1231 + 1232 + space-separated-tokens@2.0.2: 1233 + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} 1234 + 1235 + stringify-entities@4.0.4: 1236 + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} 1237 + 1238 + suf-log@2.5.3: 1239 + resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} 1240 + 1241 + svgo@4.0.1: 1242 + resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} 1243 + engines: {node: '>=16'} 1244 + hasBin: true 1245 + 1246 + tiny-inflate@1.0.3: 1247 + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} 1248 + 1249 + tinyclip@0.1.12: 1250 + resolution: {integrity: sha512-Ae3OVUqifDw0wBriIBS7yVaW44Dp6eSHQcyq4Igc7eN2TJH/2YsicswaW+J/OuMvhpDPOKEgpAZCjkb4hpoyeA==} 1251 + engines: {node: ^16.14.0 || >= 17.3.0} 1252 + 1253 + tinyexec@1.1.2: 1254 + resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} 1255 + engines: {node: '>=18'} 1256 + 1257 + tinyglobby@0.2.16: 1258 + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} 1259 + engines: {node: '>=12.0.0'} 1260 + 1261 + trim-lines@3.0.1: 1262 + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} 1263 + 1264 + trough@2.2.0: 1265 + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} 1266 + 1267 + tslib@2.8.1: 1268 + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} 1269 + 1270 + ufo@1.6.4: 1271 + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} 1272 + 1273 + ultrahtml@1.6.0: 1274 + resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} 1275 + 1276 + uncrypto@0.1.3: 1277 + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} 1278 + 1279 + unified@11.0.5: 1280 + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} 1281 + 1282 + unifont@0.7.4: 1283 + resolution: {integrity: sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg==} 1284 + 1285 + unist-util-find-after@5.0.0: 1286 + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} 1287 + 1288 + unist-util-is@6.0.1: 1289 + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} 1290 + 1291 + unist-util-modify-children@4.0.0: 1292 + resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==} 1293 + 1294 + unist-util-position@5.0.0: 1295 + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} 1296 + 1297 + unist-util-remove-position@5.0.0: 1298 + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} 1299 + 1300 + unist-util-stringify-position@4.0.0: 1301 + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} 1302 + 1303 + unist-util-visit-children@3.0.0: 1304 + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} 1305 + 1306 + unist-util-visit-parents@6.0.2: 1307 + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} 1308 + 1309 + unist-util-visit@5.1.0: 1310 + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} 1311 + 1312 + unstorage@1.17.5: 1313 + resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==} 1314 + peerDependencies: 1315 + '@azure/app-configuration': ^1.8.0 1316 + '@azure/cosmos': ^4.2.0 1317 + '@azure/data-tables': ^13.3.0 1318 + '@azure/identity': ^4.6.0 1319 + '@azure/keyvault-secrets': ^4.9.0 1320 + '@azure/storage-blob': ^12.26.0 1321 + '@capacitor/preferences': ^6 || ^7 || ^8 1322 + '@deno/kv': '>=0.9.0' 1323 + '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0 1324 + '@planetscale/database': ^1.19.0 1325 + '@upstash/redis': ^1.34.3 1326 + '@vercel/blob': '>=0.27.1' 1327 + '@vercel/functions': ^2.2.12 || ^3.0.0 1328 + '@vercel/kv': ^1 || ^2 || ^3 1329 + aws4fetch: ^1.0.20 1330 + db0: '>=0.2.1' 1331 + idb-keyval: ^6.2.1 1332 + ioredis: ^5.4.2 1333 + uploadthing: ^7.4.4 1334 + peerDependenciesMeta: 1335 + '@azure/app-configuration': 1336 + optional: true 1337 + '@azure/cosmos': 1338 + optional: true 1339 + '@azure/data-tables': 1340 + optional: true 1341 + '@azure/identity': 1342 + optional: true 1343 + '@azure/keyvault-secrets': 1344 + optional: true 1345 + '@azure/storage-blob': 1346 + optional: true 1347 + '@capacitor/preferences': 1348 + optional: true 1349 + '@deno/kv': 1350 + optional: true 1351 + '@netlify/blobs': 1352 + optional: true 1353 + '@planetscale/database': 1354 + optional: true 1355 + '@upstash/redis': 1356 + optional: true 1357 + '@vercel/blob': 1358 + optional: true 1359 + '@vercel/functions': 1360 + optional: true 1361 + '@vercel/kv': 1362 + optional: true 1363 + aws4fetch: 1364 + optional: true 1365 + db0: 1366 + optional: true 1367 + idb-keyval: 1368 + optional: true 1369 + ioredis: 1370 + optional: true 1371 + uploadthing: 1372 + optional: true 1373 + 1374 + vfile-location@5.0.3: 1375 + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} 1376 + 1377 + vfile-message@4.0.3: 1378 + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} 1379 + 1380 + vfile@6.0.3: 1381 + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} 1382 + 1383 + vite@7.3.3: 1384 + resolution: {integrity: sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==} 1385 + engines: {node: ^20.19.0 || >=22.12.0} 1386 + hasBin: true 1387 + peerDependencies: 1388 + '@types/node': ^20.19.0 || >=22.12.0 1389 + jiti: '>=1.21.0' 1390 + less: ^4.0.0 1391 + lightningcss: ^1.21.0 1392 + sass: ^1.70.0 1393 + sass-embedded: ^1.70.0 1394 + stylus: '>=0.54.8' 1395 + sugarss: ^5.0.0 1396 + terser: ^5.16.0 1397 + tsx: ^4.8.1 1398 + yaml: ^2.4.2 1399 + peerDependenciesMeta: 1400 + '@types/node': 1401 + optional: true 1402 + jiti: 1403 + optional: true 1404 + less: 1405 + optional: true 1406 + lightningcss: 1407 + optional: true 1408 + sass: 1409 + optional: true 1410 + sass-embedded: 1411 + optional: true 1412 + stylus: 1413 + optional: true 1414 + sugarss: 1415 + optional: true 1416 + terser: 1417 + optional: true 1418 + tsx: 1419 + optional: true 1420 + yaml: 1421 + optional: true 1422 + 1423 + vitefu@1.1.3: 1424 + resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==} 1425 + peerDependencies: 1426 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 1427 + peerDependenciesMeta: 1428 + vite: 1429 + optional: true 1430 + 1431 + web-namespaces@2.0.1: 1432 + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} 1433 + 1434 + which-pm-runs@1.1.0: 1435 + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} 1436 + engines: {node: '>=4'} 1437 + 1438 + xxhash-wasm@1.1.0: 1439 + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} 1440 + 1441 + yargs-parser@22.0.0: 1442 + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} 1443 + engines: {node: ^20.19.0 || ^22.12.0 || >=23} 1444 + 1445 + yocto-queue@1.2.2: 1446 + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} 1447 + engines: {node: '>=12.20'} 1448 + 1449 + zod@4.4.3: 1450 + resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} 1451 + 1452 + zwitch@2.0.4: 1453 + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} 1454 + 1455 + snapshots: 1456 + 1457 + '@astrojs/compiler@2.13.1': {} 1458 + 1459 + '@astrojs/compiler@4.0.0': {} 1460 + 1461 + '@astrojs/internal-helpers@0.9.0': 1462 + dependencies: 1463 + picomatch: 4.0.4 1464 + 1465 + '@astrojs/markdown-remark@7.1.1': 1466 + dependencies: 1467 + '@astrojs/internal-helpers': 0.9.0 1468 + '@astrojs/prism': 4.0.1 1469 + github-slugger: 2.0.0 1470 + hast-util-from-html: 2.0.3 1471 + hast-util-to-text: 4.0.2 1472 + js-yaml: 4.1.1 1473 + mdast-util-definitions: 6.0.0 1474 + rehype-raw: 7.0.0 1475 + rehype-stringify: 10.0.1 1476 + remark-gfm: 4.0.1 1477 + remark-parse: 11.0.0 1478 + remark-rehype: 11.1.2 1479 + remark-smartypants: 3.0.2 1480 + retext-smartypants: 6.2.0 1481 + shiki: 4.0.2 1482 + smol-toml: 1.6.1 1483 + unified: 11.0.5 1484 + unist-util-remove-position: 5.0.0 1485 + unist-util-visit: 5.1.0 1486 + unist-util-visit-parents: 6.0.2 1487 + vfile: 6.0.3 1488 + transitivePeerDependencies: 1489 + - supports-color 1490 + 1491 + '@astrojs/prism@4.0.1': 1492 + dependencies: 1493 + prismjs: 1.30.0 1494 + 1495 + '@astrojs/telemetry@3.3.2': 1496 + dependencies: 1497 + ci-info: 4.4.0 1498 + dset: 3.1.4 1499 + is-docker: 4.0.0 1500 + is-wsl: 3.1.1 1501 + which-pm-runs: 1.1.0 1502 + 1503 + '@babel/helper-string-parser@7.27.1': {} 1504 + 1505 + '@babel/helper-validator-identifier@7.28.5': {} 1506 + 1507 + '@babel/parser@7.29.3': 1508 + dependencies: 1509 + '@babel/types': 7.29.0 1510 + 1511 + '@babel/types@7.29.0': 1512 + dependencies: 1513 + '@babel/helper-string-parser': 7.27.1 1514 + '@babel/helper-validator-identifier': 7.28.5 1515 + 1516 + '@capsizecss/unpack@4.0.0': 1517 + dependencies: 1518 + fontkitten: 1.0.3 1519 + 1520 + '@clack/core@1.3.0': 1521 + dependencies: 1522 + fast-wrap-ansi: 0.2.0 1523 + sisteransi: 1.0.5 1524 + 1525 + '@clack/prompts@1.3.0': 1526 + dependencies: 1527 + '@clack/core': 1.3.0 1528 + fast-string-width: 3.0.2 1529 + fast-wrap-ansi: 0.2.0 1530 + sisteransi: 1.0.5 1531 + 1532 + '@emnapi/runtime@1.10.0': 1533 + dependencies: 1534 + tslib: 2.8.1 1535 + optional: true 1536 + 1537 + '@esbuild/aix-ppc64@0.27.7': 1538 + optional: true 1539 + 1540 + '@esbuild/android-arm64@0.27.7': 1541 + optional: true 1542 + 1543 + '@esbuild/android-arm@0.27.7': 1544 + optional: true 1545 + 1546 + '@esbuild/android-x64@0.27.7': 1547 + optional: true 1548 + 1549 + '@esbuild/darwin-arm64@0.27.7': 1550 + optional: true 1551 + 1552 + '@esbuild/darwin-x64@0.27.7': 1553 + optional: true 1554 + 1555 + '@esbuild/freebsd-arm64@0.27.7': 1556 + optional: true 1557 + 1558 + '@esbuild/freebsd-x64@0.27.7': 1559 + optional: true 1560 + 1561 + '@esbuild/linux-arm64@0.27.7': 1562 + optional: true 1563 + 1564 + '@esbuild/linux-arm@0.27.7': 1565 + optional: true 1566 + 1567 + '@esbuild/linux-ia32@0.27.7': 1568 + optional: true 1569 + 1570 + '@esbuild/linux-loong64@0.27.7': 1571 + optional: true 1572 + 1573 + '@esbuild/linux-mips64el@0.27.7': 1574 + optional: true 1575 + 1576 + '@esbuild/linux-ppc64@0.27.7': 1577 + optional: true 1578 + 1579 + '@esbuild/linux-riscv64@0.27.7': 1580 + optional: true 1581 + 1582 + '@esbuild/linux-s390x@0.27.7': 1583 + optional: true 1584 + 1585 + '@esbuild/linux-x64@0.27.7': 1586 + optional: true 1587 + 1588 + '@esbuild/netbsd-arm64@0.27.7': 1589 + optional: true 1590 + 1591 + '@esbuild/netbsd-x64@0.27.7': 1592 + optional: true 1593 + 1594 + '@esbuild/openbsd-arm64@0.27.7': 1595 + optional: true 1596 + 1597 + '@esbuild/openbsd-x64@0.27.7': 1598 + optional: true 1599 + 1600 + '@esbuild/openharmony-arm64@0.27.7': 1601 + optional: true 1602 + 1603 + '@esbuild/sunos-x64@0.27.7': 1604 + optional: true 1605 + 1606 + '@esbuild/win32-arm64@0.27.7': 1607 + optional: true 1608 + 1609 + '@esbuild/win32-ia32@0.27.7': 1610 + optional: true 1611 + 1612 + '@esbuild/win32-x64@0.27.7': 1613 + optional: true 1614 + 1615 + '@img/colour@1.1.0': 1616 + optional: true 1617 + 1618 + '@img/sharp-darwin-arm64@0.34.5': 1619 + optionalDependencies: 1620 + '@img/sharp-libvips-darwin-arm64': 1.2.4 1621 + optional: true 1622 + 1623 + '@img/sharp-darwin-x64@0.34.5': 1624 + optionalDependencies: 1625 + '@img/sharp-libvips-darwin-x64': 1.2.4 1626 + optional: true 1627 + 1628 + '@img/sharp-libvips-darwin-arm64@1.2.4': 1629 + optional: true 1630 + 1631 + '@img/sharp-libvips-darwin-x64@1.2.4': 1632 + optional: true 1633 + 1634 + '@img/sharp-libvips-linux-arm64@1.2.4': 1635 + optional: true 1636 + 1637 + '@img/sharp-libvips-linux-arm@1.2.4': 1638 + optional: true 1639 + 1640 + '@img/sharp-libvips-linux-ppc64@1.2.4': 1641 + optional: true 1642 + 1643 + '@img/sharp-libvips-linux-riscv64@1.2.4': 1644 + optional: true 1645 + 1646 + '@img/sharp-libvips-linux-s390x@1.2.4': 1647 + optional: true 1648 + 1649 + '@img/sharp-libvips-linux-x64@1.2.4': 1650 + optional: true 1651 + 1652 + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': 1653 + optional: true 1654 + 1655 + '@img/sharp-libvips-linuxmusl-x64@1.2.4': 1656 + optional: true 1657 + 1658 + '@img/sharp-linux-arm64@0.34.5': 1659 + optionalDependencies: 1660 + '@img/sharp-libvips-linux-arm64': 1.2.4 1661 + optional: true 1662 + 1663 + '@img/sharp-linux-arm@0.34.5': 1664 + optionalDependencies: 1665 + '@img/sharp-libvips-linux-arm': 1.2.4 1666 + optional: true 1667 + 1668 + '@img/sharp-linux-ppc64@0.34.5': 1669 + optionalDependencies: 1670 + '@img/sharp-libvips-linux-ppc64': 1.2.4 1671 + optional: true 1672 + 1673 + '@img/sharp-linux-riscv64@0.34.5': 1674 + optionalDependencies: 1675 + '@img/sharp-libvips-linux-riscv64': 1.2.4 1676 + optional: true 1677 + 1678 + '@img/sharp-linux-s390x@0.34.5': 1679 + optionalDependencies: 1680 + '@img/sharp-libvips-linux-s390x': 1.2.4 1681 + optional: true 1682 + 1683 + '@img/sharp-linux-x64@0.34.5': 1684 + optionalDependencies: 1685 + '@img/sharp-libvips-linux-x64': 1.2.4 1686 + optional: true 1687 + 1688 + '@img/sharp-linuxmusl-arm64@0.34.5': 1689 + optionalDependencies: 1690 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 1691 + optional: true 1692 + 1693 + '@img/sharp-linuxmusl-x64@0.34.5': 1694 + optionalDependencies: 1695 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 1696 + optional: true 1697 + 1698 + '@img/sharp-wasm32@0.34.5': 1699 + dependencies: 1700 + '@emnapi/runtime': 1.10.0 1701 + optional: true 1702 + 1703 + '@img/sharp-win32-arm64@0.34.5': 1704 + optional: true 1705 + 1706 + '@img/sharp-win32-ia32@0.34.5': 1707 + optional: true 1708 + 1709 + '@img/sharp-win32-x64@0.34.5': 1710 + optional: true 1711 + 1712 + '@jridgewell/sourcemap-codec@1.5.5': {} 1713 + 1714 + '@oslojs/encoding@1.1.0': {} 1715 + 1716 + '@rollup/pluginutils@5.3.0(rollup@4.60.3)': 1717 + dependencies: 1718 + '@types/estree': 1.0.9 1719 + estree-walker: 2.0.2 1720 + picomatch: 4.0.4 1721 + optionalDependencies: 1722 + rollup: 4.60.3 1723 + 1724 + '@rollup/rollup-android-arm-eabi@4.60.3': 1725 + optional: true 1726 + 1727 + '@rollup/rollup-android-arm64@4.60.3': 1728 + optional: true 1729 + 1730 + '@rollup/rollup-darwin-arm64@4.60.3': 1731 + optional: true 1732 + 1733 + '@rollup/rollup-darwin-x64@4.60.3': 1734 + optional: true 1735 + 1736 + '@rollup/rollup-freebsd-arm64@4.60.3': 1737 + optional: true 1738 + 1739 + '@rollup/rollup-freebsd-x64@4.60.3': 1740 + optional: true 1741 + 1742 + '@rollup/rollup-linux-arm-gnueabihf@4.60.3': 1743 + optional: true 1744 + 1745 + '@rollup/rollup-linux-arm-musleabihf@4.60.3': 1746 + optional: true 1747 + 1748 + '@rollup/rollup-linux-arm64-gnu@4.60.3': 1749 + optional: true 1750 + 1751 + '@rollup/rollup-linux-arm64-musl@4.60.3': 1752 + optional: true 1753 + 1754 + '@rollup/rollup-linux-loong64-gnu@4.60.3': 1755 + optional: true 1756 + 1757 + '@rollup/rollup-linux-loong64-musl@4.60.3': 1758 + optional: true 1759 + 1760 + '@rollup/rollup-linux-ppc64-gnu@4.60.3': 1761 + optional: true 1762 + 1763 + '@rollup/rollup-linux-ppc64-musl@4.60.3': 1764 + optional: true 1765 + 1766 + '@rollup/rollup-linux-riscv64-gnu@4.60.3': 1767 + optional: true 1768 + 1769 + '@rollup/rollup-linux-riscv64-musl@4.60.3': 1770 + optional: true 1771 + 1772 + '@rollup/rollup-linux-s390x-gnu@4.60.3': 1773 + optional: true 1774 + 1775 + '@rollup/rollup-linux-x64-gnu@4.60.3': 1776 + optional: true 1777 + 1778 + '@rollup/rollup-linux-x64-musl@4.60.3': 1779 + optional: true 1780 + 1781 + '@rollup/rollup-openbsd-x64@4.60.3': 1782 + optional: true 1783 + 1784 + '@rollup/rollup-openharmony-arm64@4.60.3': 1785 + optional: true 1786 + 1787 + '@rollup/rollup-win32-arm64-msvc@4.60.3': 1788 + optional: true 1789 + 1790 + '@rollup/rollup-win32-ia32-msvc@4.60.3': 1791 + optional: true 1792 + 1793 + '@rollup/rollup-win32-x64-gnu@4.60.3': 1794 + optional: true 1795 + 1796 + '@rollup/rollup-win32-x64-msvc@4.60.3': 1797 + optional: true 1798 + 1799 + '@shikijs/core@4.0.2': 1800 + dependencies: 1801 + '@shikijs/primitive': 4.0.2 1802 + '@shikijs/types': 4.0.2 1803 + '@shikijs/vscode-textmate': 10.0.2 1804 + '@types/hast': 3.0.4 1805 + hast-util-to-html: 9.0.5 1806 + 1807 + '@shikijs/engine-javascript@4.0.2': 1808 + dependencies: 1809 + '@shikijs/types': 4.0.2 1810 + '@shikijs/vscode-textmate': 10.0.2 1811 + oniguruma-to-es: 4.3.6 1812 + 1813 + '@shikijs/engine-oniguruma@4.0.2': 1814 + dependencies: 1815 + '@shikijs/types': 4.0.2 1816 + '@shikijs/vscode-textmate': 10.0.2 1817 + 1818 + '@shikijs/langs@4.0.2': 1819 + dependencies: 1820 + '@shikijs/types': 4.0.2 1821 + 1822 + '@shikijs/primitive@4.0.2': 1823 + dependencies: 1824 + '@shikijs/types': 4.0.2 1825 + '@shikijs/vscode-textmate': 10.0.2 1826 + '@types/hast': 3.0.4 1827 + 1828 + '@shikijs/themes@4.0.2': 1829 + dependencies: 1830 + '@shikijs/types': 4.0.2 1831 + 1832 + '@shikijs/types@4.0.2': 1833 + dependencies: 1834 + '@shikijs/vscode-textmate': 10.0.2 1835 + '@types/hast': 3.0.4 1836 + 1837 + '@shikijs/vscode-textmate@10.0.2': {} 1838 + 1839 + '@types/debug@4.1.13': 1840 + dependencies: 1841 + '@types/ms': 2.1.0 1842 + 1843 + '@types/estree@1.0.8': {} 1844 + 1845 + '@types/estree@1.0.9': {} 1846 + 1847 + '@types/hast@3.0.4': 1848 + dependencies: 1849 + '@types/unist': 3.0.3 1850 + 1851 + '@types/mdast@4.0.4': 1852 + dependencies: 1853 + '@types/unist': 3.0.3 1854 + 1855 + '@types/ms@2.1.0': {} 1856 + 1857 + '@types/nlcst@2.0.3': 1858 + dependencies: 1859 + '@types/unist': 3.0.3 1860 + 1861 + '@types/unist@3.0.3': {} 1862 + 1863 + '@ungap/structured-clone@1.3.1': {} 1864 + 1865 + anymatch@3.1.3: 1866 + dependencies: 1867 + normalize-path: 3.0.0 1868 + picomatch: 2.3.2 1869 + 1870 + argparse@2.0.1: {} 1871 + 1872 + aria-query@5.3.2: {} 1873 + 1874 + array-iterate@2.0.1: {} 1875 + 1876 + astro@6.3.0(rollup@4.60.3): 1877 + dependencies: 1878 + '@astrojs/compiler': 4.0.0 1879 + '@astrojs/internal-helpers': 0.9.0 1880 + '@astrojs/markdown-remark': 7.1.1 1881 + '@astrojs/telemetry': 3.3.2 1882 + '@capsizecss/unpack': 4.0.0 1883 + '@clack/prompts': 1.3.0 1884 + '@oslojs/encoding': 1.1.0 1885 + '@rollup/pluginutils': 5.3.0(rollup@4.60.3) 1886 + aria-query: 5.3.2 1887 + axobject-query: 4.1.0 1888 + ci-info: 4.4.0 1889 + clsx: 2.1.1 1890 + common-ancestor-path: 2.0.0 1891 + cookie: 1.1.1 1892 + devalue: 5.8.0 1893 + diff: 8.0.4 1894 + dset: 3.1.4 1895 + es-module-lexer: 2.1.0 1896 + esbuild: 0.27.7 1897 + flattie: 1.1.1 1898 + fontace: 0.4.1 1899 + get-tsconfig: 5.0.0-beta.4 1900 + github-slugger: 2.0.0 1901 + html-escaper: 3.0.3 1902 + http-cache-semantics: 4.2.0 1903 + js-yaml: 4.1.1 1904 + jsonc-parser: 3.3.1 1905 + magic-string: 0.30.21 1906 + magicast: 0.5.2 1907 + mrmime: 2.0.1 1908 + neotraverse: 0.6.18 1909 + obug: 2.1.1 1910 + p-limit: 7.3.0 1911 + p-queue: 9.2.0 1912 + package-manager-detector: 1.6.0 1913 + piccolore: 0.1.3 1914 + picomatch: 4.0.4 1915 + rehype: 13.0.2 1916 + semver: 7.7.4 1917 + shiki: 4.0.2 1918 + smol-toml: 1.6.1 1919 + svgo: 4.0.1 1920 + tinyclip: 0.1.12 1921 + tinyexec: 1.1.2 1922 + tinyglobby: 0.2.16 1923 + ultrahtml: 1.6.0 1924 + unifont: 0.7.4 1925 + unist-util-visit: 5.1.0 1926 + unstorage: 1.17.5 1927 + vfile: 6.0.3 1928 + vite: 7.3.3 1929 + vitefu: 1.1.3(vite@7.3.3) 1930 + xxhash-wasm: 1.1.0 1931 + yargs-parser: 22.0.0 1932 + zod: 4.4.3 1933 + optionalDependencies: 1934 + sharp: 0.34.5 1935 + transitivePeerDependencies: 1936 + - '@azure/app-configuration' 1937 + - '@azure/cosmos' 1938 + - '@azure/data-tables' 1939 + - '@azure/identity' 1940 + - '@azure/keyvault-secrets' 1941 + - '@azure/storage-blob' 1942 + - '@capacitor/preferences' 1943 + - '@deno/kv' 1944 + - '@netlify/blobs' 1945 + - '@planetscale/database' 1946 + - '@types/node' 1947 + - '@upstash/redis' 1948 + - '@vercel/blob' 1949 + - '@vercel/functions' 1950 + - '@vercel/kv' 1951 + - aws4fetch 1952 + - db0 1953 + - idb-keyval 1954 + - ioredis 1955 + - jiti 1956 + - less 1957 + - lightningcss 1958 + - rollup 1959 + - sass 1960 + - sass-embedded 1961 + - stylus 1962 + - sugarss 1963 + - supports-color 1964 + - terser 1965 + - tsx 1966 + - uploadthing 1967 + - yaml 1968 + 1969 + axobject-query@4.1.0: {} 1970 + 1971 + bail@2.0.2: {} 1972 + 1973 + boolbase@1.0.0: {} 1974 + 1975 + ccount@2.0.1: {} 1976 + 1977 + character-entities-html4@2.1.0: {} 1978 + 1979 + character-entities-legacy@3.0.0: {} 1980 + 1981 + character-entities@2.0.2: {} 1982 + 1983 + chokidar@5.0.0: 1984 + dependencies: 1985 + readdirp: 5.0.0 1986 + 1987 + ci-info@4.4.0: {} 1988 + 1989 + clsx@2.1.1: {} 1990 + 1991 + comma-separated-tokens@2.0.3: {} 1992 + 1993 + commander@11.1.0: {} 1994 + 1995 + common-ancestor-path@2.0.0: {} 1996 + 1997 + cookie-es@1.2.3: {} 1998 + 1999 + cookie@1.1.1: {} 2000 + 2001 + crossws@0.3.5: 2002 + dependencies: 2003 + uncrypto: 0.1.3 2004 + 2005 + css-select@5.2.2: 2006 + dependencies: 2007 + boolbase: 1.0.0 2008 + css-what: 6.2.2 2009 + domhandler: 5.0.3 2010 + domutils: 3.2.2 2011 + nth-check: 2.1.1 2012 + 2013 + css-tree@2.2.1: 2014 + dependencies: 2015 + mdn-data: 2.0.28 2016 + source-map-js: 1.2.1 2017 + 2018 + css-tree@3.2.1: 2019 + dependencies: 2020 + mdn-data: 2.27.1 2021 + source-map-js: 1.2.1 2022 + 2023 + css-what@6.2.2: {} 2024 + 2025 + csso@5.0.5: 2026 + dependencies: 2027 + css-tree: 2.2.1 2028 + 2029 + debug@4.4.3: 2030 + dependencies: 2031 + ms: 2.1.3 2032 + 2033 + decode-named-character-reference@1.3.0: 2034 + dependencies: 2035 + character-entities: 2.0.2 2036 + 2037 + defu@6.1.7: {} 2038 + 2039 + dequal@2.0.3: {} 2040 + 2041 + destr@2.0.5: {} 2042 + 2043 + detect-libc@2.1.2: 2044 + optional: true 2045 + 2046 + devalue@5.8.0: {} 2047 + 2048 + devlop@1.1.0: 2049 + dependencies: 2050 + dequal: 2.0.3 2051 + 2052 + diff@8.0.4: {} 2053 + 2054 + dom-serializer@2.0.0: 2055 + dependencies: 2056 + domelementtype: 2.3.0 2057 + domhandler: 5.0.3 2058 + entities: 4.5.0 2059 + 2060 + domelementtype@2.3.0: {} 2061 + 2062 + domhandler@5.0.3: 2063 + dependencies: 2064 + domelementtype: 2.3.0 2065 + 2066 + domutils@3.2.2: 2067 + dependencies: 2068 + dom-serializer: 2.0.0 2069 + domelementtype: 2.3.0 2070 + domhandler: 5.0.3 2071 + 2072 + dset@3.1.4: {} 2073 + 2074 + entities@4.5.0: {} 2075 + 2076 + entities@6.0.1: {} 2077 + 2078 + es-module-lexer@2.1.0: {} 2079 + 2080 + esbuild@0.27.7: 2081 + optionalDependencies: 2082 + '@esbuild/aix-ppc64': 0.27.7 2083 + '@esbuild/android-arm': 0.27.7 2084 + '@esbuild/android-arm64': 0.27.7 2085 + '@esbuild/android-x64': 0.27.7 2086 + '@esbuild/darwin-arm64': 0.27.7 2087 + '@esbuild/darwin-x64': 0.27.7 2088 + '@esbuild/freebsd-arm64': 0.27.7 2089 + '@esbuild/freebsd-x64': 0.27.7 2090 + '@esbuild/linux-arm': 0.27.7 2091 + '@esbuild/linux-arm64': 0.27.7 2092 + '@esbuild/linux-ia32': 0.27.7 2093 + '@esbuild/linux-loong64': 0.27.7 2094 + '@esbuild/linux-mips64el': 0.27.7 2095 + '@esbuild/linux-ppc64': 0.27.7 2096 + '@esbuild/linux-riscv64': 0.27.7 2097 + '@esbuild/linux-s390x': 0.27.7 2098 + '@esbuild/linux-x64': 0.27.7 2099 + '@esbuild/netbsd-arm64': 0.27.7 2100 + '@esbuild/netbsd-x64': 0.27.7 2101 + '@esbuild/openbsd-arm64': 0.27.7 2102 + '@esbuild/openbsd-x64': 0.27.7 2103 + '@esbuild/openharmony-arm64': 0.27.7 2104 + '@esbuild/sunos-x64': 0.27.7 2105 + '@esbuild/win32-arm64': 0.27.7 2106 + '@esbuild/win32-ia32': 0.27.7 2107 + '@esbuild/win32-x64': 0.27.7 2108 + 2109 + escape-string-regexp@5.0.0: {} 2110 + 2111 + estree-walker@2.0.2: {} 2112 + 2113 + eventemitter3@5.0.4: {} 2114 + 2115 + extend@3.0.2: {} 2116 + 2117 + fast-string-truncated-width@3.0.3: {} 2118 + 2119 + fast-string-width@3.0.2: 2120 + dependencies: 2121 + fast-string-truncated-width: 3.0.3 2122 + 2123 + fast-wrap-ansi@0.2.0: 2124 + dependencies: 2125 + fast-string-width: 3.0.2 2126 + 2127 + fdir@6.5.0(picomatch@4.0.4): 2128 + optionalDependencies: 2129 + picomatch: 4.0.4 2130 + 2131 + flattie@1.1.1: {} 2132 + 2133 + fontace@0.4.1: 2134 + dependencies: 2135 + fontkitten: 1.0.3 2136 + 2137 + fontkitten@1.0.3: 2138 + dependencies: 2139 + tiny-inflate: 1.0.3 2140 + 2141 + fsevents@2.3.3: 2142 + optional: true 2143 + 2144 + get-tsconfig@5.0.0-beta.4: 2145 + dependencies: 2146 + resolve-pkg-maps: 1.0.0 2147 + 2148 + github-slugger@2.0.0: {} 2149 + 2150 + h3@1.15.11: 2151 + dependencies: 2152 + cookie-es: 1.2.3 2153 + crossws: 0.3.5 2154 + defu: 6.1.7 2155 + destr: 2.0.5 2156 + iron-webcrypto: 1.2.1 2157 + node-mock-http: 1.0.4 2158 + radix3: 1.1.2 2159 + ufo: 1.6.4 2160 + uncrypto: 0.1.3 2161 + 2162 + hast-util-from-html@2.0.3: 2163 + dependencies: 2164 + '@types/hast': 3.0.4 2165 + devlop: 1.1.0 2166 + hast-util-from-parse5: 8.0.3 2167 + parse5: 7.3.0 2168 + vfile: 6.0.3 2169 + vfile-message: 4.0.3 2170 + 2171 + hast-util-from-parse5@8.0.3: 2172 + dependencies: 2173 + '@types/hast': 3.0.4 2174 + '@types/unist': 3.0.3 2175 + devlop: 1.1.0 2176 + hastscript: 9.0.1 2177 + property-information: 7.1.0 2178 + vfile: 6.0.3 2179 + vfile-location: 5.0.3 2180 + web-namespaces: 2.0.1 2181 + 2182 + hast-util-is-element@3.0.0: 2183 + dependencies: 2184 + '@types/hast': 3.0.4 2185 + 2186 + hast-util-parse-selector@4.0.0: 2187 + dependencies: 2188 + '@types/hast': 3.0.4 2189 + 2190 + hast-util-raw@9.1.0: 2191 + dependencies: 2192 + '@types/hast': 3.0.4 2193 + '@types/unist': 3.0.3 2194 + '@ungap/structured-clone': 1.3.1 2195 + hast-util-from-parse5: 8.0.3 2196 + hast-util-to-parse5: 8.0.1 2197 + html-void-elements: 3.0.0 2198 + mdast-util-to-hast: 13.2.1 2199 + parse5: 7.3.0 2200 + unist-util-position: 5.0.0 2201 + unist-util-visit: 5.1.0 2202 + vfile: 6.0.3 2203 + web-namespaces: 2.0.1 2204 + zwitch: 2.0.4 2205 + 2206 + hast-util-to-html@9.0.5: 2207 + dependencies: 2208 + '@types/hast': 3.0.4 2209 + '@types/unist': 3.0.3 2210 + ccount: 2.0.1 2211 + comma-separated-tokens: 2.0.3 2212 + hast-util-whitespace: 3.0.0 2213 + html-void-elements: 3.0.0 2214 + mdast-util-to-hast: 13.2.1 2215 + property-information: 7.1.0 2216 + space-separated-tokens: 2.0.2 2217 + stringify-entities: 4.0.4 2218 + zwitch: 2.0.4 2219 + 2220 + hast-util-to-parse5@8.0.1: 2221 + dependencies: 2222 + '@types/hast': 3.0.4 2223 + comma-separated-tokens: 2.0.3 2224 + devlop: 1.1.0 2225 + property-information: 7.1.0 2226 + space-separated-tokens: 2.0.2 2227 + web-namespaces: 2.0.1 2228 + zwitch: 2.0.4 2229 + 2230 + hast-util-to-text@4.0.2: 2231 + dependencies: 2232 + '@types/hast': 3.0.4 2233 + '@types/unist': 3.0.3 2234 + hast-util-is-element: 3.0.0 2235 + unist-util-find-after: 5.0.0 2236 + 2237 + hast-util-whitespace@3.0.0: 2238 + dependencies: 2239 + '@types/hast': 3.0.4 2240 + 2241 + hastscript@9.0.1: 2242 + dependencies: 2243 + '@types/hast': 3.0.4 2244 + comma-separated-tokens: 2.0.3 2245 + hast-util-parse-selector: 4.0.0 2246 + property-information: 7.1.0 2247 + space-separated-tokens: 2.0.2 2248 + 2249 + html-escaper@3.0.3: {} 2250 + 2251 + html-void-elements@3.0.0: {} 2252 + 2253 + http-cache-semantics@4.2.0: {} 2254 + 2255 + iron-webcrypto@1.2.1: {} 2256 + 2257 + is-docker@3.0.0: {} 2258 + 2259 + is-docker@4.0.0: {} 2260 + 2261 + is-inside-container@1.0.0: 2262 + dependencies: 2263 + is-docker: 3.0.0 2264 + 2265 + is-plain-obj@4.1.0: {} 2266 + 2267 + is-wsl@3.1.1: 2268 + dependencies: 2269 + is-inside-container: 1.0.0 2270 + 2271 + js-yaml@4.1.1: 2272 + dependencies: 2273 + argparse: 2.0.1 2274 + 2275 + jsonc-parser@3.3.1: {} 2276 + 2277 + longest-streak@3.1.0: {} 2278 + 2279 + lru-cache@11.3.6: {} 2280 + 2281 + magic-string@0.30.21: 2282 + dependencies: 2283 + '@jridgewell/sourcemap-codec': 1.5.5 2284 + 2285 + magicast@0.5.2: 2286 + dependencies: 2287 + '@babel/parser': 7.29.3 2288 + '@babel/types': 7.29.0 2289 + source-map-js: 1.2.1 2290 + 2291 + markdown-table@3.0.4: {} 2292 + 2293 + mdast-util-definitions@6.0.0: 2294 + dependencies: 2295 + '@types/mdast': 4.0.4 2296 + '@types/unist': 3.0.3 2297 + unist-util-visit: 5.1.0 2298 + 2299 + mdast-util-find-and-replace@3.0.2: 2300 + dependencies: 2301 + '@types/mdast': 4.0.4 2302 + escape-string-regexp: 5.0.0 2303 + unist-util-is: 6.0.1 2304 + unist-util-visit-parents: 6.0.2 2305 + 2306 + mdast-util-from-markdown@2.0.3: 2307 + dependencies: 2308 + '@types/mdast': 4.0.4 2309 + '@types/unist': 3.0.3 2310 + decode-named-character-reference: 1.3.0 2311 + devlop: 1.1.0 2312 + mdast-util-to-string: 4.0.0 2313 + micromark: 4.0.2 2314 + micromark-util-decode-numeric-character-reference: 2.0.2 2315 + micromark-util-decode-string: 2.0.1 2316 + micromark-util-normalize-identifier: 2.0.1 2317 + micromark-util-symbol: 2.0.1 2318 + micromark-util-types: 2.0.2 2319 + unist-util-stringify-position: 4.0.0 2320 + transitivePeerDependencies: 2321 + - supports-color 2322 + 2323 + mdast-util-gfm-autolink-literal@2.0.1: 2324 + dependencies: 2325 + '@types/mdast': 4.0.4 2326 + ccount: 2.0.1 2327 + devlop: 1.1.0 2328 + mdast-util-find-and-replace: 3.0.2 2329 + micromark-util-character: 2.1.1 2330 + 2331 + mdast-util-gfm-footnote@2.1.0: 2332 + dependencies: 2333 + '@types/mdast': 4.0.4 2334 + devlop: 1.1.0 2335 + mdast-util-from-markdown: 2.0.3 2336 + mdast-util-to-markdown: 2.1.2 2337 + micromark-util-normalize-identifier: 2.0.1 2338 + transitivePeerDependencies: 2339 + - supports-color 2340 + 2341 + mdast-util-gfm-strikethrough@2.0.0: 2342 + dependencies: 2343 + '@types/mdast': 4.0.4 2344 + mdast-util-from-markdown: 2.0.3 2345 + mdast-util-to-markdown: 2.1.2 2346 + transitivePeerDependencies: 2347 + - supports-color 2348 + 2349 + mdast-util-gfm-table@2.0.0: 2350 + dependencies: 2351 + '@types/mdast': 4.0.4 2352 + devlop: 1.1.0 2353 + markdown-table: 3.0.4 2354 + mdast-util-from-markdown: 2.0.3 2355 + mdast-util-to-markdown: 2.1.2 2356 + transitivePeerDependencies: 2357 + - supports-color 2358 + 2359 + mdast-util-gfm-task-list-item@2.0.0: 2360 + dependencies: 2361 + '@types/mdast': 4.0.4 2362 + devlop: 1.1.0 2363 + mdast-util-from-markdown: 2.0.3 2364 + mdast-util-to-markdown: 2.1.2 2365 + transitivePeerDependencies: 2366 + - supports-color 2367 + 2368 + mdast-util-gfm@3.1.0: 2369 + dependencies: 2370 + mdast-util-from-markdown: 2.0.3 2371 + mdast-util-gfm-autolink-literal: 2.0.1 2372 + mdast-util-gfm-footnote: 2.1.0 2373 + mdast-util-gfm-strikethrough: 2.0.0 2374 + mdast-util-gfm-table: 2.0.0 2375 + mdast-util-gfm-task-list-item: 2.0.0 2376 + mdast-util-to-markdown: 2.1.2 2377 + transitivePeerDependencies: 2378 + - supports-color 2379 + 2380 + mdast-util-phrasing@4.1.0: 2381 + dependencies: 2382 + '@types/mdast': 4.0.4 2383 + unist-util-is: 6.0.1 2384 + 2385 + mdast-util-to-hast@13.2.1: 2386 + dependencies: 2387 + '@types/hast': 3.0.4 2388 + '@types/mdast': 4.0.4 2389 + '@ungap/structured-clone': 1.3.1 2390 + devlop: 1.1.0 2391 + micromark-util-sanitize-uri: 2.0.1 2392 + trim-lines: 3.0.1 2393 + unist-util-position: 5.0.0 2394 + unist-util-visit: 5.1.0 2395 + vfile: 6.0.3 2396 + 2397 + mdast-util-to-markdown@2.1.2: 2398 + dependencies: 2399 + '@types/mdast': 4.0.4 2400 + '@types/unist': 3.0.3 2401 + longest-streak: 3.1.0 2402 + mdast-util-phrasing: 4.1.0 2403 + mdast-util-to-string: 4.0.0 2404 + micromark-util-classify-character: 2.0.1 2405 + micromark-util-decode-string: 2.0.1 2406 + unist-util-visit: 5.1.0 2407 + zwitch: 2.0.4 2408 + 2409 + mdast-util-to-string@4.0.0: 2410 + dependencies: 2411 + '@types/mdast': 4.0.4 2412 + 2413 + mdn-data@2.0.28: {} 2414 + 2415 + mdn-data@2.27.1: {} 2416 + 2417 + micromark-core-commonmark@2.0.3: 2418 + dependencies: 2419 + decode-named-character-reference: 1.3.0 2420 + devlop: 1.1.0 2421 + micromark-factory-destination: 2.0.1 2422 + micromark-factory-label: 2.0.1 2423 + micromark-factory-space: 2.0.1 2424 + micromark-factory-title: 2.0.1 2425 + micromark-factory-whitespace: 2.0.1 2426 + micromark-util-character: 2.1.1 2427 + micromark-util-chunked: 2.0.1 2428 + micromark-util-classify-character: 2.0.1 2429 + micromark-util-html-tag-name: 2.0.1 2430 + micromark-util-normalize-identifier: 2.0.1 2431 + micromark-util-resolve-all: 2.0.1 2432 + micromark-util-subtokenize: 2.1.0 2433 + micromark-util-symbol: 2.0.1 2434 + micromark-util-types: 2.0.2 2435 + 2436 + micromark-extension-gfm-autolink-literal@2.1.0: 2437 + dependencies: 2438 + micromark-util-character: 2.1.1 2439 + micromark-util-sanitize-uri: 2.0.1 2440 + micromark-util-symbol: 2.0.1 2441 + micromark-util-types: 2.0.2 2442 + 2443 + micromark-extension-gfm-footnote@2.1.0: 2444 + dependencies: 2445 + devlop: 1.1.0 2446 + micromark-core-commonmark: 2.0.3 2447 + micromark-factory-space: 2.0.1 2448 + micromark-util-character: 2.1.1 2449 + micromark-util-normalize-identifier: 2.0.1 2450 + micromark-util-sanitize-uri: 2.0.1 2451 + micromark-util-symbol: 2.0.1 2452 + micromark-util-types: 2.0.2 2453 + 2454 + micromark-extension-gfm-strikethrough@2.1.0: 2455 + dependencies: 2456 + devlop: 1.1.0 2457 + micromark-util-chunked: 2.0.1 2458 + micromark-util-classify-character: 2.0.1 2459 + micromark-util-resolve-all: 2.0.1 2460 + micromark-util-symbol: 2.0.1 2461 + micromark-util-types: 2.0.2 2462 + 2463 + micromark-extension-gfm-table@2.1.1: 2464 + dependencies: 2465 + devlop: 1.1.0 2466 + micromark-factory-space: 2.0.1 2467 + micromark-util-character: 2.1.1 2468 + micromark-util-symbol: 2.0.1 2469 + micromark-util-types: 2.0.2 2470 + 2471 + micromark-extension-gfm-tagfilter@2.0.0: 2472 + dependencies: 2473 + micromark-util-types: 2.0.2 2474 + 2475 + micromark-extension-gfm-task-list-item@2.1.0: 2476 + dependencies: 2477 + devlop: 1.1.0 2478 + micromark-factory-space: 2.0.1 2479 + micromark-util-character: 2.1.1 2480 + micromark-util-symbol: 2.0.1 2481 + micromark-util-types: 2.0.2 2482 + 2483 + micromark-extension-gfm@3.0.0: 2484 + dependencies: 2485 + micromark-extension-gfm-autolink-literal: 2.1.0 2486 + micromark-extension-gfm-footnote: 2.1.0 2487 + micromark-extension-gfm-strikethrough: 2.1.0 2488 + micromark-extension-gfm-table: 2.1.1 2489 + micromark-extension-gfm-tagfilter: 2.0.0 2490 + micromark-extension-gfm-task-list-item: 2.1.0 2491 + micromark-util-combine-extensions: 2.0.1 2492 + micromark-util-types: 2.0.2 2493 + 2494 + micromark-factory-destination@2.0.1: 2495 + dependencies: 2496 + micromark-util-character: 2.1.1 2497 + micromark-util-symbol: 2.0.1 2498 + micromark-util-types: 2.0.2 2499 + 2500 + micromark-factory-label@2.0.1: 2501 + dependencies: 2502 + devlop: 1.1.0 2503 + micromark-util-character: 2.1.1 2504 + micromark-util-symbol: 2.0.1 2505 + micromark-util-types: 2.0.2 2506 + 2507 + micromark-factory-space@2.0.1: 2508 + dependencies: 2509 + micromark-util-character: 2.1.1 2510 + micromark-util-types: 2.0.2 2511 + 2512 + micromark-factory-title@2.0.1: 2513 + dependencies: 2514 + micromark-factory-space: 2.0.1 2515 + micromark-util-character: 2.1.1 2516 + micromark-util-symbol: 2.0.1 2517 + micromark-util-types: 2.0.2 2518 + 2519 + micromark-factory-whitespace@2.0.1: 2520 + dependencies: 2521 + micromark-factory-space: 2.0.1 2522 + micromark-util-character: 2.1.1 2523 + micromark-util-symbol: 2.0.1 2524 + micromark-util-types: 2.0.2 2525 + 2526 + micromark-util-character@2.1.1: 2527 + dependencies: 2528 + micromark-util-symbol: 2.0.1 2529 + micromark-util-types: 2.0.2 2530 + 2531 + micromark-util-chunked@2.0.1: 2532 + dependencies: 2533 + micromark-util-symbol: 2.0.1 2534 + 2535 + micromark-util-classify-character@2.0.1: 2536 + dependencies: 2537 + micromark-util-character: 2.1.1 2538 + micromark-util-symbol: 2.0.1 2539 + micromark-util-types: 2.0.2 2540 + 2541 + micromark-util-combine-extensions@2.0.1: 2542 + dependencies: 2543 + micromark-util-chunked: 2.0.1 2544 + micromark-util-types: 2.0.2 2545 + 2546 + micromark-util-decode-numeric-character-reference@2.0.2: 2547 + dependencies: 2548 + micromark-util-symbol: 2.0.1 2549 + 2550 + micromark-util-decode-string@2.0.1: 2551 + dependencies: 2552 + decode-named-character-reference: 1.3.0 2553 + micromark-util-character: 2.1.1 2554 + micromark-util-decode-numeric-character-reference: 2.0.2 2555 + micromark-util-symbol: 2.0.1 2556 + 2557 + micromark-util-encode@2.0.1: {} 2558 + 2559 + micromark-util-html-tag-name@2.0.1: {} 2560 + 2561 + micromark-util-normalize-identifier@2.0.1: 2562 + dependencies: 2563 + micromark-util-symbol: 2.0.1 2564 + 2565 + micromark-util-resolve-all@2.0.1: 2566 + dependencies: 2567 + micromark-util-types: 2.0.2 2568 + 2569 + micromark-util-sanitize-uri@2.0.1: 2570 + dependencies: 2571 + micromark-util-character: 2.1.1 2572 + micromark-util-encode: 2.0.1 2573 + micromark-util-symbol: 2.0.1 2574 + 2575 + micromark-util-subtokenize@2.1.0: 2576 + dependencies: 2577 + devlop: 1.1.0 2578 + micromark-util-chunked: 2.0.1 2579 + micromark-util-symbol: 2.0.1 2580 + micromark-util-types: 2.0.2 2581 + 2582 + micromark-util-symbol@2.0.1: {} 2583 + 2584 + micromark-util-types@2.0.2: {} 2585 + 2586 + micromark@4.0.2: 2587 + dependencies: 2588 + '@types/debug': 4.1.13 2589 + debug: 4.4.3 2590 + decode-named-character-reference: 1.3.0 2591 + devlop: 1.1.0 2592 + micromark-core-commonmark: 2.0.3 2593 + micromark-factory-space: 2.0.1 2594 + micromark-util-character: 2.1.1 2595 + micromark-util-chunked: 2.0.1 2596 + micromark-util-combine-extensions: 2.0.1 2597 + micromark-util-decode-numeric-character-reference: 2.0.2 2598 + micromark-util-encode: 2.0.1 2599 + micromark-util-normalize-identifier: 2.0.1 2600 + micromark-util-resolve-all: 2.0.1 2601 + micromark-util-sanitize-uri: 2.0.1 2602 + micromark-util-subtokenize: 2.1.0 2603 + micromark-util-symbol: 2.0.1 2604 + micromark-util-types: 2.0.2 2605 + transitivePeerDependencies: 2606 + - supports-color 2607 + 2608 + mrmime@2.0.1: {} 2609 + 2610 + ms@2.1.3: {} 2611 + 2612 + nanoid@3.3.12: {} 2613 + 2614 + neotraverse@0.6.18: {} 2615 + 2616 + nlcst-to-string@4.0.0: 2617 + dependencies: 2618 + '@types/nlcst': 2.0.3 2619 + 2620 + node-fetch-native@1.6.7: {} 2621 + 2622 + node-mock-http@1.0.4: {} 2623 + 2624 + normalize-path@3.0.0: {} 2625 + 2626 + nth-check@2.1.1: 2627 + dependencies: 2628 + boolbase: 1.0.0 2629 + 2630 + obug@2.1.1: {} 2631 + 2632 + ofetch@1.5.1: 2633 + dependencies: 2634 + destr: 2.0.5 2635 + node-fetch-native: 1.6.7 2636 + ufo: 1.6.4 2637 + 2638 + ohash@2.0.11: {} 2639 + 2640 + oniguruma-parser@0.12.2: {} 2641 + 2642 + oniguruma-to-es@4.3.6: 2643 + dependencies: 2644 + oniguruma-parser: 0.12.2 2645 + regex: 6.1.0 2646 + regex-recursion: 6.0.2 2647 + 2648 + p-limit@7.3.0: 2649 + dependencies: 2650 + yocto-queue: 1.2.2 2651 + 2652 + p-queue@9.2.0: 2653 + dependencies: 2654 + eventemitter3: 5.0.4 2655 + p-timeout: 7.0.1 2656 + 2657 + p-timeout@7.0.1: {} 2658 + 2659 + package-manager-detector@1.6.0: {} 2660 + 2661 + parse-latin@7.0.0: 2662 + dependencies: 2663 + '@types/nlcst': 2.0.3 2664 + '@types/unist': 3.0.3 2665 + nlcst-to-string: 4.0.0 2666 + unist-util-modify-children: 4.0.0 2667 + unist-util-visit-children: 3.0.0 2668 + vfile: 6.0.3 2669 + 2670 + parse5@7.3.0: 2671 + dependencies: 2672 + entities: 6.0.1 2673 + 2674 + piccolore@0.1.3: {} 2675 + 2676 + picocolors@1.1.1: {} 2677 + 2678 + picomatch@2.3.2: {} 2679 + 2680 + picomatch@4.0.4: {} 2681 + 2682 + postcss@8.5.14: 2683 + dependencies: 2684 + nanoid: 3.3.12 2685 + picocolors: 1.1.1 2686 + source-map-js: 1.2.1 2687 + 2688 + prettier-plugin-astro@0.14.1: 2689 + dependencies: 2690 + '@astrojs/compiler': 2.13.1 2691 + prettier: 3.8.3 2692 + sass-formatter: 0.7.9 2693 + 2694 + prettier@3.8.3: {} 2695 + 2696 + prismjs@1.30.0: {} 2697 + 2698 + property-information@7.1.0: {} 2699 + 2700 + radix3@1.1.2: {} 2701 + 2702 + readdirp@5.0.0: {} 2703 + 2704 + regex-recursion@6.0.2: 2705 + dependencies: 2706 + regex-utilities: 2.3.0 2707 + 2708 + regex-utilities@2.3.0: {} 2709 + 2710 + regex@6.1.0: 2711 + dependencies: 2712 + regex-utilities: 2.3.0 2713 + 2714 + rehype-parse@9.0.1: 2715 + dependencies: 2716 + '@types/hast': 3.0.4 2717 + hast-util-from-html: 2.0.3 2718 + unified: 11.0.5 2719 + 2720 + rehype-raw@7.0.0: 2721 + dependencies: 2722 + '@types/hast': 3.0.4 2723 + hast-util-raw: 9.1.0 2724 + vfile: 6.0.3 2725 + 2726 + rehype-stringify@10.0.1: 2727 + dependencies: 2728 + '@types/hast': 3.0.4 2729 + hast-util-to-html: 9.0.5 2730 + unified: 11.0.5 2731 + 2732 + rehype@13.0.2: 2733 + dependencies: 2734 + '@types/hast': 3.0.4 2735 + rehype-parse: 9.0.1 2736 + rehype-stringify: 10.0.1 2737 + unified: 11.0.5 2738 + 2739 + remark-gfm@4.0.1: 2740 + dependencies: 2741 + '@types/mdast': 4.0.4 2742 + mdast-util-gfm: 3.1.0 2743 + micromark-extension-gfm: 3.0.0 2744 + remark-parse: 11.0.0 2745 + remark-stringify: 11.0.0 2746 + unified: 11.0.5 2747 + transitivePeerDependencies: 2748 + - supports-color 2749 + 2750 + remark-parse@11.0.0: 2751 + dependencies: 2752 + '@types/mdast': 4.0.4 2753 + mdast-util-from-markdown: 2.0.3 2754 + micromark-util-types: 2.0.2 2755 + unified: 11.0.5 2756 + transitivePeerDependencies: 2757 + - supports-color 2758 + 2759 + remark-rehype@11.1.2: 2760 + dependencies: 2761 + '@types/hast': 3.0.4 2762 + '@types/mdast': 4.0.4 2763 + mdast-util-to-hast: 13.2.1 2764 + unified: 11.0.5 2765 + vfile: 6.0.3 2766 + 2767 + remark-smartypants@3.0.2: 2768 + dependencies: 2769 + retext: 9.0.0 2770 + retext-smartypants: 6.2.0 2771 + unified: 11.0.5 2772 + unist-util-visit: 5.1.0 2773 + 2774 + remark-stringify@11.0.0: 2775 + dependencies: 2776 + '@types/mdast': 4.0.4 2777 + mdast-util-to-markdown: 2.1.2 2778 + unified: 11.0.5 2779 + 2780 + resolve-pkg-maps@1.0.0: {} 2781 + 2782 + retext-latin@4.0.0: 2783 + dependencies: 2784 + '@types/nlcst': 2.0.3 2785 + parse-latin: 7.0.0 2786 + unified: 11.0.5 2787 + 2788 + retext-smartypants@6.2.0: 2789 + dependencies: 2790 + '@types/nlcst': 2.0.3 2791 + nlcst-to-string: 4.0.0 2792 + unist-util-visit: 5.1.0 2793 + 2794 + retext-stringify@4.0.0: 2795 + dependencies: 2796 + '@types/nlcst': 2.0.3 2797 + nlcst-to-string: 4.0.0 2798 + unified: 11.0.5 2799 + 2800 + retext@9.0.0: 2801 + dependencies: 2802 + '@types/nlcst': 2.0.3 2803 + retext-latin: 4.0.0 2804 + retext-stringify: 4.0.0 2805 + unified: 11.0.5 2806 + 2807 + rollup@4.60.3: 2808 + dependencies: 2809 + '@types/estree': 1.0.8 2810 + optionalDependencies: 2811 + '@rollup/rollup-android-arm-eabi': 4.60.3 2812 + '@rollup/rollup-android-arm64': 4.60.3 2813 + '@rollup/rollup-darwin-arm64': 4.60.3 2814 + '@rollup/rollup-darwin-x64': 4.60.3 2815 + '@rollup/rollup-freebsd-arm64': 4.60.3 2816 + '@rollup/rollup-freebsd-x64': 4.60.3 2817 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.3 2818 + '@rollup/rollup-linux-arm-musleabihf': 4.60.3 2819 + '@rollup/rollup-linux-arm64-gnu': 4.60.3 2820 + '@rollup/rollup-linux-arm64-musl': 4.60.3 2821 + '@rollup/rollup-linux-loong64-gnu': 4.60.3 2822 + '@rollup/rollup-linux-loong64-musl': 4.60.3 2823 + '@rollup/rollup-linux-ppc64-gnu': 4.60.3 2824 + '@rollup/rollup-linux-ppc64-musl': 4.60.3 2825 + '@rollup/rollup-linux-riscv64-gnu': 4.60.3 2826 + '@rollup/rollup-linux-riscv64-musl': 4.60.3 2827 + '@rollup/rollup-linux-s390x-gnu': 4.60.3 2828 + '@rollup/rollup-linux-x64-gnu': 4.60.3 2829 + '@rollup/rollup-linux-x64-musl': 4.60.3 2830 + '@rollup/rollup-openbsd-x64': 4.60.3 2831 + '@rollup/rollup-openharmony-arm64': 4.60.3 2832 + '@rollup/rollup-win32-arm64-msvc': 4.60.3 2833 + '@rollup/rollup-win32-ia32-msvc': 4.60.3 2834 + '@rollup/rollup-win32-x64-gnu': 4.60.3 2835 + '@rollup/rollup-win32-x64-msvc': 4.60.3 2836 + fsevents: 2.3.3 2837 + 2838 + s.color@0.0.15: {} 2839 + 2840 + sass-formatter@0.7.9: 2841 + dependencies: 2842 + suf-log: 2.5.3 2843 + 2844 + sax@1.6.0: {} 2845 + 2846 + semver@7.7.4: {} 2847 + 2848 + sharp@0.34.5: 2849 + dependencies: 2850 + '@img/colour': 1.1.0 2851 + detect-libc: 2.1.2 2852 + semver: 7.7.4 2853 + optionalDependencies: 2854 + '@img/sharp-darwin-arm64': 0.34.5 2855 + '@img/sharp-darwin-x64': 0.34.5 2856 + '@img/sharp-libvips-darwin-arm64': 1.2.4 2857 + '@img/sharp-libvips-darwin-x64': 1.2.4 2858 + '@img/sharp-libvips-linux-arm': 1.2.4 2859 + '@img/sharp-libvips-linux-arm64': 1.2.4 2860 + '@img/sharp-libvips-linux-ppc64': 1.2.4 2861 + '@img/sharp-libvips-linux-riscv64': 1.2.4 2862 + '@img/sharp-libvips-linux-s390x': 1.2.4 2863 + '@img/sharp-libvips-linux-x64': 1.2.4 2864 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 2865 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 2866 + '@img/sharp-linux-arm': 0.34.5 2867 + '@img/sharp-linux-arm64': 0.34.5 2868 + '@img/sharp-linux-ppc64': 0.34.5 2869 + '@img/sharp-linux-riscv64': 0.34.5 2870 + '@img/sharp-linux-s390x': 0.34.5 2871 + '@img/sharp-linux-x64': 0.34.5 2872 + '@img/sharp-linuxmusl-arm64': 0.34.5 2873 + '@img/sharp-linuxmusl-x64': 0.34.5 2874 + '@img/sharp-wasm32': 0.34.5 2875 + '@img/sharp-win32-arm64': 0.34.5 2876 + '@img/sharp-win32-ia32': 0.34.5 2877 + '@img/sharp-win32-x64': 0.34.5 2878 + optional: true 2879 + 2880 + shiki@4.0.2: 2881 + dependencies: 2882 + '@shikijs/core': 4.0.2 2883 + '@shikijs/engine-javascript': 4.0.2 2884 + '@shikijs/engine-oniguruma': 4.0.2 2885 + '@shikijs/langs': 4.0.2 2886 + '@shikijs/themes': 4.0.2 2887 + '@shikijs/types': 4.0.2 2888 + '@shikijs/vscode-textmate': 10.0.2 2889 + '@types/hast': 3.0.4 2890 + 2891 + sisteransi@1.0.5: {} 2892 + 2893 + smol-toml@1.6.1: {} 2894 + 2895 + source-map-js@1.2.1: {} 2896 + 2897 + space-separated-tokens@2.0.2: {} 2898 + 2899 + stringify-entities@4.0.4: 2900 + dependencies: 2901 + character-entities-html4: 2.1.0 2902 + character-entities-legacy: 3.0.0 2903 + 2904 + suf-log@2.5.3: 2905 + dependencies: 2906 + s.color: 0.0.15 2907 + 2908 + svgo@4.0.1: 2909 + dependencies: 2910 + commander: 11.1.0 2911 + css-select: 5.2.2 2912 + css-tree: 3.2.1 2913 + css-what: 6.2.2 2914 + csso: 5.0.5 2915 + picocolors: 1.1.1 2916 + sax: 1.6.0 2917 + 2918 + tiny-inflate@1.0.3: {} 2919 + 2920 + tinyclip@0.1.12: {} 2921 + 2922 + tinyexec@1.1.2: {} 2923 + 2924 + tinyglobby@0.2.16: 2925 + dependencies: 2926 + fdir: 6.5.0(picomatch@4.0.4) 2927 + picomatch: 4.0.4 2928 + 2929 + trim-lines@3.0.1: {} 2930 + 2931 + trough@2.2.0: {} 2932 + 2933 + tslib@2.8.1: 2934 + optional: true 2935 + 2936 + ufo@1.6.4: {} 2937 + 2938 + ultrahtml@1.6.0: {} 2939 + 2940 + uncrypto@0.1.3: {} 2941 + 2942 + unified@11.0.5: 2943 + dependencies: 2944 + '@types/unist': 3.0.3 2945 + bail: 2.0.2 2946 + devlop: 1.1.0 2947 + extend: 3.0.2 2948 + is-plain-obj: 4.1.0 2949 + trough: 2.2.0 2950 + vfile: 6.0.3 2951 + 2952 + unifont@0.7.4: 2953 + dependencies: 2954 + css-tree: 3.2.1 2955 + ofetch: 1.5.1 2956 + ohash: 2.0.11 2957 + 2958 + unist-util-find-after@5.0.0: 2959 + dependencies: 2960 + '@types/unist': 3.0.3 2961 + unist-util-is: 6.0.1 2962 + 2963 + unist-util-is@6.0.1: 2964 + dependencies: 2965 + '@types/unist': 3.0.3 2966 + 2967 + unist-util-modify-children@4.0.0: 2968 + dependencies: 2969 + '@types/unist': 3.0.3 2970 + array-iterate: 2.0.1 2971 + 2972 + unist-util-position@5.0.0: 2973 + dependencies: 2974 + '@types/unist': 3.0.3 2975 + 2976 + unist-util-remove-position@5.0.0: 2977 + dependencies: 2978 + '@types/unist': 3.0.3 2979 + unist-util-visit: 5.1.0 2980 + 2981 + unist-util-stringify-position@4.0.0: 2982 + dependencies: 2983 + '@types/unist': 3.0.3 2984 + 2985 + unist-util-visit-children@3.0.0: 2986 + dependencies: 2987 + '@types/unist': 3.0.3 2988 + 2989 + unist-util-visit-parents@6.0.2: 2990 + dependencies: 2991 + '@types/unist': 3.0.3 2992 + unist-util-is: 6.0.1 2993 + 2994 + unist-util-visit@5.1.0: 2995 + dependencies: 2996 + '@types/unist': 3.0.3 2997 + unist-util-is: 6.0.1 2998 + unist-util-visit-parents: 6.0.2 2999 + 3000 + unstorage@1.17.5: 3001 + dependencies: 3002 + anymatch: 3.1.3 3003 + chokidar: 5.0.0 3004 + destr: 2.0.5 3005 + h3: 1.15.11 3006 + lru-cache: 11.3.6 3007 + node-fetch-native: 1.6.7 3008 + ofetch: 1.5.1 3009 + ufo: 1.6.4 3010 + 3011 + vfile-location@5.0.3: 3012 + dependencies: 3013 + '@types/unist': 3.0.3 3014 + vfile: 6.0.3 3015 + 3016 + vfile-message@4.0.3: 3017 + dependencies: 3018 + '@types/unist': 3.0.3 3019 + unist-util-stringify-position: 4.0.0 3020 + 3021 + vfile@6.0.3: 3022 + dependencies: 3023 + '@types/unist': 3.0.3 3024 + vfile-message: 4.0.3 3025 + 3026 + vite@7.3.3: 3027 + dependencies: 3028 + esbuild: 0.27.7 3029 + fdir: 6.5.0(picomatch@4.0.4) 3030 + picomatch: 4.0.4 3031 + postcss: 8.5.14 3032 + rollup: 4.60.3 3033 + tinyglobby: 0.2.16 3034 + optionalDependencies: 3035 + fsevents: 2.3.3 3036 + 3037 + vitefu@1.1.3(vite@7.3.3): 3038 + optionalDependencies: 3039 + vite: 7.3.3 3040 + 3041 + web-namespaces@2.0.1: {} 3042 + 3043 + which-pm-runs@1.1.0: {} 3044 + 3045 + xxhash-wasm@1.1.0: {} 3046 + 3047 + yargs-parser@22.0.0: {} 3048 + 3049 + yocto-queue@1.2.2: {} 3050 + 3051 + zod@4.4.3: {} 3052 + 3053 + zwitch@2.0.4: {}
+3
www/pnpm-workspace.yaml
··· 1 + allowBuilds: 2 + esbuild: true 3 + sharp: true
-125
www/privacy.html
··· 1 - <!doctype html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8" /> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 - <meta 7 - name="description" 8 - content="Lazurite Privacy Policy - effective April 15, 2026." /> 9 - <meta name="author" content="Stormlight Labs" /> 10 - <title>Lazurite Privacy Policy</title> 11 - <link rel="icon" type="image/svg+xml" href="static/favicon.svg" /> 12 - <link rel="stylesheet" href="/static/shared.css" /> 13 - <link rel="preconnect" href="https://fonts.googleapis.com" /> 14 - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 15 - <link 16 - href="https://fonts.googleapis.com/css2?family=Google+Sans+Code:ital,wght@0,300..800;1,300..800&family=Google+Sans:ital,opsz,wght@0,17..18,400..700;1,17..18,400..700&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Lora:ital,wght@0,400..700;1,400..700&display=swap" 17 - rel="stylesheet" /> 18 - </head> 19 - <body class="legal-page privacy-page"> 20 - <div class="container"> 21 - <nav class="top-nav"><a href="./index.html">Back to home</a></nav> 22 - <div class="logo"><span class="logo-icon"></span>Lazurite</div> 23 - <main class="legal-card"> 24 - <h1>Privacy Policy</h1> 25 - <p class="meta">Effective April 15, 2026</p> 26 - <p class="lead"> 27 - Lazurite is a client for Bluesky. Core app behavior runs from your device, and we do not 28 - operate a developer backend for normal use. 29 - </p> 30 - 31 - <section> 32 - <h2>What the app stores on your device</h2> 33 - <p> 34 - Lazurite stores account session data, settings, cached content, and other app data 35 - locally so the app can work quickly and reliably. 36 - </p> 37 - <p> 38 - This local data can include profile metadata, viewed posts, follows, lists, likes, 39 - drafts, and media caches. 40 - </p> 41 - </section> 42 - 43 - <section> 44 - <h2>How your data is used</h2> 45 - <p> 46 - Local data is used to keep you signed in, remember your preferences, improve loading 47 - performance, and support offline-friendly behavior. 48 - </p> 49 - <p>Lazurite does not sell your personal information.</p> 50 - </section> 51 - 52 - <section> 53 - <h2>Network requests and third parties</h2> 54 - <p> 55 - When you use Lazurite, requests are sent directly from your device to Bluesky and 56 - related infrastructure. 57 - </p> 58 - <p> 59 - Your use of Bluesky remains subject to Bluesky policies, terms, and moderation systems. 60 - </p> 61 - </section> 62 - 63 - <section> 64 - <h2>Permissions</h2> 65 - <p> 66 - If you choose to save media, Lazurite requests photo or storage permissions required by 67 - your platform. 68 - </p> 69 - <p>Permissions are used only for the feature you invoke.</p> 70 - </section> 71 - 72 - <section> 73 - <h2>Diagnostics and logs</h2> 74 - <p> 75 - Lazurite keeps local app logs to help troubleshoot issues. These logs stay on your 76 - device unless you choose to share them. 77 - </p> 78 - <p>Lazurite does not include ad tracking SDKs.</p> 79 - </section> 80 - 81 - <section> 82 - <h2>Data retention and control</h2> 83 - <p> 84 - Data remains on your device until you remove it by signing out, clearing app storage, 85 - or uninstalling the app. 86 - </p> 87 - <p> 88 - Because Lazurite does not run a central app backend for normal use, most data-control 89 - actions happen on your device or through Bluesky account settings. 90 - </p> 91 - </section> 92 - 93 - <section> 94 - <h2>Children</h2> 95 - <p> 96 - Lazurite is not directed to children under 13, or under the minimum age required in 97 - your jurisdiction. 98 - </p> 99 - </section> 100 - 101 - <section> 102 - <h2>Policy updates</h2> 103 - <p> 104 - We may revise this policy from time to time. Material updates will be reflected by a 105 - new effective date and app release notes when appropriate. 106 - </p> 107 - </section> 108 - 109 - <div class="links"> 110 - <p> 111 - Contact: <a href="https://stormlightlabs.org" target="_blank" rel="noopener noreferrer">stormlightlabs.org</a> 112 - or <a href="mailto:info@stormlightlabs.org">info@stormlightlabs.org</a> 113 - </p> 114 - </div> 115 - </main> 116 - </div> 117 - <footer> 118 - <p> 119 - Built by <a href="https://stormlightlabs.org" target="_blank" rel="noopener noreferrer">Stormlight Labs</a> 120 - &middot; <a href="./csae-policy.html">Child Safety Standards</a> 121 - &middot; <a href="./terms.html">Terms of Service</a> 122 - </p> 123 - </footer> 124 - </body> 125 - </html>
www/public/favicon.ico

This is a binary file and will not be displayed.

+15
www/src/components/BrandMark.astro
··· 1 + --- 2 + interface Props { 3 + href?: string; 4 + label?: string; 5 + class?: string; 6 + } 7 + 8 + const { href, label = "Lazurite", class: className = "" } = Astro.props; 9 + const Element = href ? "a" : "div"; 10 + --- 11 + 12 + <Element href={href} class:list={["brand-mark", className]}> 13 + <span class="brand-mark__icon" aria-hidden="true"></span> 14 + <span class="brand-mark__label">{label}</span> 15 + </Element>
+19
www/src/components/FeatureCard.astro
··· 1 + --- 2 + import IconBadge from "./IconBadge.astro"; 3 + 4 + interface Props { 5 + title: string; 6 + description: string; 7 + icon: string; 8 + iconAlt: string; 9 + iconTone?: "blue" | "violet"; 10 + } 11 + 12 + const { title, description, icon, iconAlt, iconTone = "blue" } = Astro.props; 13 + --- 14 + 15 + <article class="feature-card"> 16 + <IconBadge src={icon} alt={iconAlt} tone={iconTone} class="feature-card__icon" /> 17 + <h3 class="feature-card__title">{title}</h3> 18 + <p class="feature-card__description">{description}</p> 19 + </article>
+185
www/src/components/HomePage.astro
··· 1 + --- 2 + import BrandMark from "./BrandMark.astro"; 3 + import FeatureCard from "./FeatureCard.astro"; 4 + import PlatformCard from "./PlatformCard.astro"; 5 + import ScreenshotFrame from "./ScreenshotFrame.astro"; 6 + import SiteFooter from "./SiteFooter.astro"; 7 + import StatusBadge from "./StatusBadge.astro"; 8 + import TechStack from "./TechStack.astro"; 9 + 10 + const screenshots = [ 11 + { 12 + src: "/static/desktop-deck.png", 13 + alt: "Lazurite desktop workspace screenshot", 14 + variant: "desktop" as const, 15 + loading: "eager" as const, 16 + }, 17 + { 18 + src: "https://placehold.co/720x1280/191919/33b1ff?text=Mobile%0AProfile&font=inter", 19 + alt: "Lazurite mobile profile screenshot", 20 + variant: "phone" as const, 21 + loading: "lazy" as const, 22 + }, 23 + ]; 24 + 25 + const platforms = [ 26 + { 27 + title: "Mobile", 28 + description: 29 + "Material You design with offline support, smart folders, and full AT Protocol coverage. Built with Flutter for a native feel on both platforms.", 30 + badge: "Beta", 31 + badgeTone: "beta" as const, 32 + icon: "/static/smartphone.svg", 33 + iconAlt: "Mobile icon", 34 + iconTone: "blue" as const, 35 + targets: ["iOS", "Android"], 36 + features: [ 37 + "Offline-first with local caching and offline compose", 38 + "Full DM support with conversation requests", 39 + "Drafts, scheduled posts, and bookmarks", 40 + "Content moderation with custom labelers", 41 + "Multi-account switching with data isolation", 42 + "Themeable: Oxocarbon, Catppuccin, Nord, Rose Pine", 43 + ], 44 + screenshot: { 45 + src: "https://placehold.co/720x1280/000000/7dafff?text=Feed+%2B+Compose&font=inter", 46 + alt: "Mobile feed and compose", 47 + caption: "Your home feed and a composer button", 48 + }, 49 + }, 50 + { 51 + title: "Desktop", 52 + description: 53 + "A native desktop experience built with Tauri and Solid.js. Semantic search across your saved posts, multi-column layouts, and deep AT Protocol tooling.", 54 + badge: "Alpha", 55 + badgeTone: "alpha" as const, 56 + icon: "/static/desktop.svg", 57 + iconAlt: "Desktop icon", 58 + iconTone: "violet" as const, 59 + targets: ["macOS", "Windows", "Linux"], 60 + features: [ 61 + "Full-text and vector search over saved and liked posts", 62 + "Multi-column workspace layouts", 63 + "PDS browser for exploring repository data", 64 + "Composer window for distraction-free posting", 65 + "Deep-link handling for at:// URIs", 66 + "Global shortcuts (post from anywhere)", 67 + ], 68 + screenshot: { 69 + src: "/static/desktop-deck.png", 70 + alt: "Desktop multi-column layout", 71 + caption: "Multi-column workspace with search", 72 + }, 73 + }, 74 + ]; 75 + 76 + const features = [ 77 + { 78 + title: "Feeds & Timelines", 79 + description: 80 + "Home timeline, custom algorithmic feeds, pinned feeds with drag-to-reorder. Full thread and reply chain rendering.", 81 + icon: "/static/feed.svg", 82 + iconAlt: "Feed icon", 83 + }, 84 + { 85 + title: "Search & Discovery", 86 + description: 87 + "Search your saved & liked posts, discover starterpacks with the power of local semantic search with embeddings.", 88 + icon: "/static/search.svg", 89 + iconAlt: "Search icon", 90 + iconTone: "violet" as const, 91 + }, 92 + { 93 + title: "Moderation", 94 + description: 95 + "Subscribe to labelers, configure per-label preferences, mute and block lists. Adult content controls with granular filtering.", 96 + icon: "/static/lock.svg", 97 + iconAlt: "Moderation icon", 98 + }, 99 + { 100 + title: "Lists & Starter Packs", 101 + description: 102 + "Create and manage curation and moderation lists. Browse, search, and build starter packs to share with others.", 103 + icon: "/static/folder.svg", 104 + iconAlt: "Lists icon", 105 + iconTone: "violet" as const, 106 + }, 107 + { 108 + title: "Offline & Fast", 109 + description: 110 + "Smart caching with local databases on both platforms. Browse cached content and queue actions while offline.", 111 + icon: "/static/offline.svg", 112 + iconAlt: "Offline icon", 113 + }, 114 + { 115 + title: "Social Graph", 116 + description: 117 + "Explore connections with a force-directed graph visualization. See mutual follows, followers, and blocking context at a glance.", 118 + icon: "/static/graph.svg", 119 + iconAlt: "Graph icon", 120 + iconTone: "violet" as const, 121 + }, 122 + ]; 123 + 124 + const techGroups = [ 125 + { label: "Mobile", items: ["Flutter", "Dart", "Material 3", "Drift", "BLoC"] }, 126 + { label: "Desktop", items: ["Tauri 2", "Rust", "Solid.js", "SQLite + FTS", "fastembed"] }, 127 + { label: "Protocol", items: ["AT Protocol", "OAuth 2.0 + DPoP", "Constellation"] }, 128 + ]; 129 + --- 130 + 131 + <div class="home-page"> 132 + <div class="page-container page-container--home"> 133 + <header class="home-masthead"> 134 + <BrandMark /> 135 + <p class="home-masthead__tagline">The ATmosphere client that <em>rocks</em>.</p> 136 + </header> 137 + 138 + <main class="home-content"> 139 + <section class="hero-section" aria-labelledby="hero-title"> 140 + <StatusBadge label="In Active Development" /> 141 + <h1 id="hero-title" class="hero-section__title">Roam the ATmosphere</h1> 142 + <p class="hero-section__copy"> 143 + Lazurite is a client for Bluesky & BlackSky built for people who want more from their 144 + social experience. A full-featured mobile app for iOS and Android, paired with a powerful 145 + desktop companion for macOS, Windows, and Linux. 146 + </p> 147 + </section> 148 + 149 + <section class="screenshot-showcase" aria-label="Lazurite app screenshots"> 150 + { 151 + screenshots.map((screenshot) => ( 152 + <ScreenshotFrame 153 + src={screenshot.src} 154 + alt={screenshot.alt} 155 + variant={screenshot.variant} 156 + loading={screenshot.loading} 157 + /> 158 + )) 159 + } 160 + </section> 161 + 162 + <section class="platform-grid" aria-label="Platforms"> 163 + {platforms.map((platform) => <PlatformCard {...platform} />)} 164 + </section> 165 + 166 + <section class="section-block" aria-labelledby="shared-features-title"> 167 + <h2 id="shared-features-title" class="section-heading">Across both platforms</h2> 168 + <div class="feature-grid"> 169 + {features.map((feature) => <FeatureCard {...feature} />)} 170 + </div> 171 + </section> 172 + 173 + <TechStack title="Built with" groups={techGroups} /> 174 + 175 + <aside class="callout"> 176 + Follow development updates on Bluesky: 177 + <a href="https://bsky.app/profile/desertthunder.dev" target="_blank" rel="noopener noreferrer"> 178 + @desertthunder.dev 179 + </a> 180 + </aside> 181 + </main> 182 + </div> 183 + 184 + <SiteFooter /> 185 + </div>
+14
www/src/components/IconBadge.astro
··· 1 + --- 2 + interface Props { 3 + src: string; 4 + alt: string; 5 + tone?: "blue" | "violet"; 6 + class?: string; 7 + } 8 + 9 + const { src, alt, tone = "blue", class: className = "" } = Astro.props; 10 + --- 11 + 12 + <span class:list={["icon-badge", `icon-badge--${tone}`, className]}> 13 + <img src={src} alt={alt} loading="lazy" decoding="async" /> 14 + </span>
+51
www/src/components/LegalDocument.astro
··· 1 + --- 2 + import type { CollectionEntry } from "astro:content"; 3 + import BrandMark from "./BrandMark.astro"; 4 + 5 + interface Props { 6 + page: CollectionEntry<"legalPages">["data"]; 7 + } 8 + 9 + const { page } = Astro.props; 10 + --- 11 + 12 + <div class="legal-page"> 13 + <div class="page-container page-container--legal"> 14 + <nav class="utility-nav" aria-label="Legal page navigation"> 15 + <a href="/">Back to home</a> 16 + </nav> 17 + <BrandMark href="/" class="brand-mark--legal" /> 18 + 19 + <main class="legal-document"> 20 + <header class="legal-document__header"> 21 + <h1 class="legal-document__title">{page.title}</h1> 22 + <p class="legal-document__meta">Effective {page.effectiveDate}</p> 23 + <p class="legal-document__lead">{page.lead}</p> 24 + {page.alert && <p class="legal-document__alert">{page.alert}</p>} 25 + </header> 26 + <div class="legal-document__content"> 27 + <slot /> 28 + </div> 29 + </main> 30 + </div> 31 + 32 + <footer class="legal-footer"> 33 + <p class="legal-footer__copy"> 34 + Built by 35 + <a href="https://stormlightlabs.org" target="_blank" rel="noopener noreferrer">Stormlight Labs</a> 36 + { 37 + page.footerLinks.map((link) => ( 38 + <> 39 + &nbsp;&middot;&nbsp; 40 + <a 41 + href={link.href} 42 + target={link.external ? "_blank" : undefined} 43 + rel={link.external ? "noopener noreferrer" : undefined}> 44 + {link.label} 45 + </a> 46 + </> 47 + )) 48 + } 49 + </p> 50 + </footer> 51 + </div>
+57
www/src/components/PlatformCard.astro
··· 1 + --- 2 + import IconBadge from "./IconBadge.astro"; 3 + import ScreenshotFrame from "./ScreenshotFrame.astro"; 4 + 5 + interface PlatformScreenshot { 6 + src: string; 7 + alt: string; 8 + caption: string; 9 + } 10 + 11 + interface Props { 12 + title: string; 13 + description: string; 14 + badge: string; 15 + badgeTone: "alpha" | "beta"; 16 + icon: string; 17 + iconAlt: string; 18 + iconTone: "blue" | "violet"; 19 + targets: string[]; 20 + features: string[]; 21 + screenshot: PlatformScreenshot; 22 + } 23 + 24 + const { 25 + title, 26 + description, 27 + badge, 28 + badgeTone, 29 + icon, 30 + iconAlt, 31 + iconTone, 32 + targets, 33 + features, 34 + screenshot, 35 + } = Astro.props; 36 + --- 37 + 38 + <article class="platform-card"> 39 + <header class="platform-card__header"> 40 + <IconBadge src={icon} alt={iconAlt} tone={iconTone} /> 41 + <h2 class="platform-card__title">{title}</h2> 42 + <span class:list={["status-label", `status-label--${badgeTone}`]}>{badge}</span> 43 + </header> 44 + <p class="platform-card__description">{description}</p> 45 + <div class="tag-list" aria-label={`${title} platforms`}> 46 + {targets.map((target) => <span class="tag-list__item">{target}</span>)} 47 + </div> 48 + <ul class="check-list"> 49 + {features.map((feature) => <li>{feature}</li>)} 50 + </ul> 51 + <ScreenshotFrame 52 + src={screenshot.src} 53 + alt={screenshot.alt} 54 + caption={screenshot.caption} 55 + variant="card" 56 + /> 57 + </article>
+16
www/src/components/ScreenshotFrame.astro
··· 1 + --- 2 + interface Props { 3 + src: string; 4 + alt: string; 5 + variant?: "desktop" | "phone" | "card"; 6 + caption?: string; 7 + loading?: "eager" | "lazy"; 8 + } 9 + 10 + const { src, alt, variant = "card", caption, loading = "lazy" } = Astro.props; 11 + --- 12 + 13 + <figure class:list={["screenshot-frame", `screenshot-frame--${variant}`]}> 14 + <img src={src} alt={alt} loading={loading} decoding="async" /> 15 + {caption && <figcaption class="screenshot-frame__caption">{caption}</figcaption>} 16 + </figure>
+24
www/src/components/SiteFooter.astro
··· 1 + --- 2 + const footerLinks = [ 3 + { href: "https://desertthunder.dev", label: "Owais", external: true }, 4 + { href: "https://stormlightlabs.org", label: "Stormlight Labs", external: true }, 5 + { href: "https://atproto.com", label: "AT Protocol", external: true }, 6 + { href: "/csae-policy", label: "Child Safety Standards" }, 7 + { href: "/privacy", label: "Privacy Policy" }, 8 + { href: "/terms", label: "Terms of Service" }, 9 + ]; 10 + --- 11 + 12 + <footer class="site-footer"> 13 + <p class="site-footer__copy"> 14 + Built with <span aria-label="lightning">&#9889;&#65039;</span> by 15 + <a href={footerLinks[0].href} target="_blank" rel="noopener noreferrer">{footerLinks[0].label}</a> 16 + at 17 + <a href={footerLinks[1].href} target="_blank" rel="noopener noreferrer">{footerLinks[1].label}</a> 18 + &middot; Powered by the 19 + <a href={footerLinks[2].href} target="_blank" rel="noopener noreferrer">{footerLinks[2].label}</a> 20 + &middot; <a href={footerLinks[3].href}>{footerLinks[3].label}</a> 21 + &middot; <a href={footerLinks[4].href}>{footerLinks[4].label}</a> 22 + &middot; <a href={footerLinks[5].href}>{footerLinks[5].label}</a> 23 + </p> 24 + </footer>
+12
www/src/components/StatusBadge.astro
··· 1 + --- 2 + interface Props { 3 + label: string; 4 + } 5 + 6 + const { label } = Astro.props; 7 + --- 8 + 9 + <div class="status-badge"> 10 + <span class="status-badge__dot" aria-hidden="true"></span> 11 + <span>{label}</span> 12 + </div>
+31
www/src/components/TechStack.astro
··· 1 + --- 2 + interface TechGroup { 3 + label: string; 4 + items: string[]; 5 + } 6 + 7 + interface Props { 8 + title: string; 9 + groups: TechGroup[]; 10 + } 11 + 12 + const { title, groups } = Astro.props; 13 + --- 14 + 15 + <section class="tech-stack" aria-labelledby="tech-stack-title"> 16 + <h2 id="tech-stack-title" class="tech-stack__title">{title}</h2> 17 + <div class="tech-stack__groups"> 18 + { 19 + groups.map((group) => ( 20 + <div class="tech-stack__group"> 21 + <h3 class="tech-stack__label">{group.label}</h3> 22 + <div class="tag-list tag-list--dense"> 23 + {group.items.map((item) => ( 24 + <span class="tag-list__item">{item}</span> 25 + ))} 26 + </div> 27 + </div> 28 + )) 29 + } 30 + </div> 31 + </section>
+20
www/src/content.config.ts
··· 1 + import { defineCollection } from "astro:content"; 2 + import { glob } from "astro/loaders"; 3 + import { z } from "astro/zod"; 4 + 5 + const footerLinkSchema = z.object({ href: z.string(), label: z.string(), external: z.boolean().optional() }); 6 + 7 + const legalPages = defineCollection({ 8 + loader: glob({ base: "./src/content/legal", pattern: "**/*.md" }), 9 + schema: z.object({ 10 + slug: z.string(), 11 + title: z.string(), 12 + description: z.string(), 13 + effectiveDate: z.string(), 14 + lead: z.string(), 15 + alert: z.string().optional(), 16 + footerLinks: z.array(footerLinkSchema), 17 + }), 18 + }); 19 + 20 + export const collections = { legalPages };
+58
www/src/content/legal/csae-policy.md
··· 1 + --- 2 + slug: csae-policy 3 + title: Child Safety Standards (CSAE) 4 + description: Lazurite Child Safety Standards and CSAE Policy - effective May 3, 2026. 5 + effectiveDate: May 3, 2026 6 + 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. 7 + alert: "Zero tolerance: content or behavior involving child sexual abuse, exploitation, or endangerment is prohibited." 8 + footerLinks: 9 + - href: /privacy 10 + label: Privacy Policy 11 + - href: /terms 12 + label: Terms of Service 13 + --- 14 + 15 + ## 1. Prohibited content and conduct 16 + 17 + Lazurite standards prohibit, at minimum: 18 + 19 + - Creation, sharing, solicitation, or promotion of CSAM. 20 + - Grooming behavior targeting minors. 21 + - Sextortion involving minors. 22 + - Trafficking, solicitation, or sexual exploitation of children. 23 + - Any use of Lazurite to endanger children. 24 + 25 + ## 2. In-app reporting and user feedback 26 + 27 + Lazurite provides in-app pathways for users to report content, accounts, and behavior that may violate safety standards, including CSAE concerns. 28 + 29 + Reports are reviewed as a priority category and escalated when they indicate possible child endangerment or CSAM. 30 + 31 + ## 3. Response to potential CSAM 32 + 33 + Upon obtaining actual knowledge of potential CSAM, we take appropriate action under our policies and applicable law. Actions may include: 34 + 35 + - Removing or restricting access to violative content. 36 + - Restricting or suspending access to violating accounts and features. 37 + - Preserving records necessary for legal reporting and safety investigations. 38 + 39 + ## 4. Legal compliance and external reporting 40 + 41 + 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. 42 + 43 + If you believe a child is in immediate danger, contact local law enforcement immediately. 44 + 45 + ## 5. Child safety point of contact 46 + 47 + Child safety contact for Lazurite / Stormlight Labs: <a href="mailto:info@stormlightlabs.org">info@stormlightlabs.org</a> 48 + 49 + This contact is designated to receive and coordinate potential notifications related to CSAE and CSAM concerns. 50 + 51 + ## 6. Policy updates 52 + 53 + We may update these standards as laws, platform requirements, and enforcement practices evolve. Material updates will be reflected by an updated effective date. 54 + 55 + <div class="legal-links"> 56 + <p>Related pages: <a href="/terms">Terms of Service</a> and <a href="/privacy">Privacy Policy</a>.</p> 57 + <p>Contact: <a href="https://stormlightlabs.org" target="_blank" rel="noopener noreferrer">stormlightlabs.org</a> or <a href="mailto:info@stormlightlabs.org">info@stormlightlabs.org</a></p> 58 + </div>
+60
www/src/content/legal/privacy.md
··· 1 + --- 2 + slug: privacy 3 + title: Privacy Policy 4 + description: Lazurite Privacy Policy - effective April 15, 2026. 5 + effectiveDate: April 15, 2026 6 + 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. 7 + footerLinks: 8 + - href: /csae-policy 9 + label: Child Safety Standards 10 + - href: /terms 11 + label: Terms of Service 12 + --- 13 + 14 + ## What the app stores on your device 15 + 16 + Lazurite stores account session data, settings, cached content, and other app data locally so the app can work quickly and reliably. 17 + 18 + This local data can include profile metadata, viewed posts, follows, lists, likes, drafts, and media caches. 19 + 20 + ## How your data is used 21 + 22 + Local data is used to keep you signed in, remember your preferences, improve loading performance, and support offline-friendly behavior. 23 + 24 + Lazurite does not sell your personal information. 25 + 26 + ## Network requests and third parties 27 + 28 + When you use Lazurite, requests are sent directly from your device to Bluesky and related infrastructure. 29 + 30 + Your use of Bluesky remains subject to Bluesky policies, terms, and moderation systems. 31 + 32 + ## Permissions 33 + 34 + If you choose to save media, Lazurite requests photo or storage permissions required by your platform. 35 + 36 + Permissions are used only for the feature you invoke. 37 + 38 + ## Diagnostics and logs 39 + 40 + Lazurite keeps local app logs to help troubleshoot issues. These logs stay on your device unless you choose to share them. 41 + 42 + Lazurite does not include ad tracking SDKs. 43 + 44 + ## Data retention and control 45 + 46 + Data remains on your device until you remove it by signing out, clearing app storage, or uninstalling the app. 47 + 48 + 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. 49 + 50 + ## Children 51 + 52 + Lazurite is not directed to children under 13, or under the minimum age required in your jurisdiction. 53 + 54 + ## Policy updates 55 + 56 + 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. 57 + 58 + <div class="legal-links"> 59 + <p>Contact: <a href="https://stormlightlabs.org" target="_blank" rel="noopener noreferrer">stormlightlabs.org</a> or <a href="mailto:info@stormlightlabs.org">info@stormlightlabs.org</a></p> 60 + </div>
+69
www/src/content/legal/terms.md
··· 1 + --- 2 + slug: terms 3 + title: Terms of Service 4 + description: Lazurite Terms of Service - effective April 15, 2026. 5 + effectiveDate: April 15, 2026 6 + 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. 7 + footerLinks: 8 + - href: /csae-policy 9 + label: Child Safety Standards 10 + - href: /privacy 11 + label: Privacy Policy 12 + --- 13 + 14 + ## What Lazurite is 15 + 16 + Lazurite is client software that helps you access Bluesky from your device. 17 + 18 + Lazurite does not provide the Bluesky network itself. 19 + 20 + ## Eligibility 21 + 22 + You must be legally able to agree to these Terms and meet the minimum age requirement in your jurisdiction. 23 + 24 + ## License 25 + 26 + We grant you a limited, non-exclusive, non-transferable, revocable license to use Lazurite on devices you control. 27 + 28 + You may not misuse the app, break applicable law, or attempt unauthorized access to systems or accounts. 29 + 30 + ## Bluesky terms and policies 31 + 32 + Lazurite depends on Bluesky services, and your use of Bluesky is governed by Bluesky's own legal terms. 33 + 34 + ## Your account and activity 35 + 36 + You are responsible for your Bluesky account, credentials, and activity taken through Lazurite. 37 + 38 + You retain rights to your content, subject to Bluesky policies and any third-party rights. 39 + 40 + ## Acceptable use 41 + 42 + Do not use Lazurite to harass others, violate rights, distribute unlawful content, or abuse platform infrastructure. 43 + 44 + You are responsible for complying with Bluesky rules and applicable law. 45 + 46 + ## Third-party dependencies 47 + 48 + Lazurite depends on Bluesky and related third-party services. 49 + 50 + If those services change, restrict, or discontinue access, features may degrade or stop working. 51 + 52 + ## No warranty 53 + 54 + Lazurite is provided "as is" and "as available." We do not guarantee uninterrupted, secure, or error-free operation. 55 + 56 + ## Liability 57 + 58 + To the maximum extent permitted by law, Stormlight Labs is not liable for indirect, incidental, or consequential damages arising from your use of Lazurite. 59 + 60 + ## Changes and termination 61 + 62 + We may update, suspend, or discontinue parts of Lazurite. 63 + 64 + We may update these Terms. Continued use after updates means you accept the revised Terms. 65 + 66 + <div class="legal-links"> 67 + <p>Bluesky legal pages: <a href="https://bsky.social/about/support/privacy-policy" target="_blank" rel="noopener noreferrer">Privacy Policy</a> and <a href="https://bsky.social/about/support/tos" target="_blank" rel="noopener noreferrer">Terms of Service</a>.</p> 68 + <p>Contact: <a href="https://stormlightlabs.org" target="_blank" rel="noopener noreferrer">stormlightlabs.org</a> or <a href="mailto:info@stormlightlabs.org">info@stormlightlabs.org</a></p> 69 + </div>
+34
www/src/layouts/BaseLayout.astro
··· 1 + --- 2 + import "../styles/shared.css"; 3 + 4 + interface Props { 5 + title: string; 6 + description: string; 7 + bodyClass?: string; 8 + } 9 + 10 + const { title, description, bodyClass = "" } = Astro.props; 11 + --- 12 + 13 + <!doctype html> 14 + <html lang="en"> 15 + <head> 16 + <meta charset="utf-8" /> 17 + <meta name="viewport" content="width=device-width" /> 18 + <meta name="description" content={description} /> 19 + <meta name="author" content="Stormlight Labs" /> 20 + <meta name="generator" content={Astro.generator} /> 21 + <title>{title}</title> 22 + <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> 23 + <link rel="icon" href="/favicon.ico" /> 24 + <link rel="preconnect" href="https://fonts.googleapis.com" /> 25 + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 26 + <link 27 + href="https://fonts.googleapis.com/css2?family=Google+Sans+Code:ital,wght@0,300..800;1,300..800&family=Google+Sans:ital,opsz,wght@0,17..18,400..700;1,17..18,400..700&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Lora:ital,wght@0,400..700;1,400..700&display=swap" 28 + rel="stylesheet" 29 + /> 30 + </head> 31 + <body class:list={["site-shell", bodyClass]}> 32 + <slot /> 33 + </body> 34 + </html>
+23
www/src/pages/[slug].astro
··· 1 + --- 2 + import { getCollection, render } from "astro:content"; 3 + import LegalDocument from "../components/LegalDocument.astro"; 4 + import BaseLayout from "../layouts/BaseLayout.astro"; 5 + 6 + export async function getStaticPaths() { 7 + const pages = await getCollection("legalPages"); 8 + 9 + return pages.map((page) => ({ 10 + params: { slug: page.data.slug }, 11 + props: { page }, 12 + })); 13 + } 14 + 15 + const { page } = Astro.props; 16 + const { Content } = await render(page); 17 + --- 18 + 19 + <BaseLayout title={`Lazurite ${page.data.title}`} description={page.data.description}> 20 + <LegalDocument page={page.data}> 21 + <Content /> 22 + </LegalDocument> 23 + </BaseLayout>
+11
www/src/pages/index.astro
··· 1 + --- 2 + import HomePage from "../components/HomePage.astro"; 3 + import BaseLayout from "../layouts/BaseLayout.astro"; 4 + --- 5 + 6 + <BaseLayout 7 + title="Lazurite for BlueSky" 8 + description="Lazurite - A beautiful Bluesky client for mobile and desktop. Material You on iOS & Android, native desktop with semantic search." 9 + > 10 + <HomePage /> 11 + </BaseLayout>
+49
www/src/pages/oauth/callback/index.astro
··· 1 + --- 2 + import BaseLayout from "../../../layouts/BaseLayout.astro"; 3 + --- 4 + 5 + <BaseLayout title="Lazurite Authentication Complete" description="Lazurite authentication callback page."> 6 + <main class="oauth-page"> 7 + <section class="oauth-card" aria-labelledby="oauth-title"> 8 + <h1 id="oauth-title" class="oauth-card__title">Authentication Complete</h1> 9 + <p class="oauth-card__copy"> 10 + Lazurite is finishing sign-in. If the app does not reopen automatically, tap below. 11 + </p> 12 + <a id="reopen-link" class="button button--primary" href="#">Open Lazurite</a> 13 + <p class="oauth-card__hint">If this still fails, use your browser menu and choose "Open in app".</p> 14 + </section> 15 + </main> 16 + 17 + <script is:inline> 18 + const query = window.location.search || ""; 19 + const fragment = window.location.hash || ""; 20 + const isAppleMobile = 21 + /iPad|iPhone|iPod/.test(window.navigator.userAgent) || 22 + (window.navigator.platform === "MacIntel" && window.navigator.maxTouchPoints > 1); 23 + const reopenPath = isAppleMobile ? "//oauth/callback" : "/oauth/callback"; 24 + const reopenUrl = `org.stormlightlabs.lazurite:${reopenPath}${query}${fragment}`; 25 + const reopenLink = document.getElementById("reopen-link"); 26 + const autoOpenKey = `lazurite.oauth.reopen.${query}${fragment}`; 27 + 28 + reopenLink.setAttribute("href", reopenUrl); 29 + 30 + function attemptReopen() { 31 + try { 32 + if (window.sessionStorage.getItem(autoOpenKey) === "1") { 33 + return; 34 + } 35 + window.sessionStorage.setItem(autoOpenKey, "1"); 36 + } catch (err) { 37 + console.debug("Storage unavailable; trying a single best-effort reopen.", err); 38 + } 39 + window.location.assign(reopenUrl); 40 + } 41 + 42 + window.addEventListener("load", function () { 43 + if (isAppleMobile) { 44 + return; 45 + } 46 + window.setTimeout(attemptReopen, 250); 47 + }); 48 + </script> 49 + </BaseLayout>
+716
www/src/styles/shared.css
··· 1 + :root { 2 + --bg-page: #050607; 3 + --surface-card: #17191c; 4 + --surface-raised: #202329; 5 + --surface-muted: #111315; 6 + --border-subtle: rgba(255, 255, 255, 0.1); 7 + --border-strong: rgba(255, 255, 255, 0.2); 8 + --text-primary: #f4f6fb; 9 + --text-secondary: #b8bec8; 10 + --text-muted: #767d88; 11 + --brand-blue: #7dafff; 12 + --brand-cobalt: #0073de; 13 + --brand-sky: #33b1ff; 14 + --brand-cyan: #08bdba; 15 + --brand-violet: #be95ff; 16 + --brand-rose: #ff8fa3; 17 + --font-title: "Lora", Georgia, serif; 18 + --font-display: "Google Sans", "Avenir Next", sans-serif; 19 + --font-body: "Inter", "Segoe UI", sans-serif; 20 + --font-mono: "Google Sans Code", "SFMono-Regular", monospace; 21 + --shadow-card: 0 18px 60px rgba(0, 0, 0, 0.32); 22 + --radius-card: 8px; 23 + } 24 + 25 + * { 26 + box-sizing: border-box; 27 + margin: 0; 28 + padding: 0; 29 + } 30 + 31 + html { 32 + background: var(--bg-page); 33 + } 34 + 35 + body { 36 + min-width: 320px; 37 + } 38 + 39 + img { 40 + max-width: 100%; 41 + } 42 + 43 + a { 44 + color: var(--brand-blue); 45 + text-decoration: none; 46 + transition: color 160ms ease; 47 + } 48 + 49 + a:hover { 50 + color: var(--brand-sky); 51 + } 52 + 53 + .site-shell { 54 + min-height: 100vh; 55 + background: var(--bg-page); 56 + color: var(--text-primary); 57 + display: flex; 58 + flex-direction: column; 59 + font-family: var(--font-body); 60 + line-height: 1.6; 61 + } 62 + 63 + .page-container { 64 + width: min(100%, 1240px); 65 + margin-inline: auto; 66 + padding-inline: clamp(1.25rem, 3vw, 2.5rem); 67 + } 68 + 69 + .page-container--home { 70 + flex: 1; 71 + padding-block: clamp(1.5rem, 3vw, 2.5rem); 72 + } 73 + 74 + .home-page { 75 + min-height: 100vh; 76 + display: flex; 77 + flex: 1; 78 + flex-direction: column; 79 + } 80 + 81 + .home-masthead { 82 + display: grid; 83 + justify-items: center; 84 + gap: 0.75rem; 85 + margin-bottom: clamp(3rem, 7vw, 5.5rem); 86 + text-align: center; 87 + } 88 + 89 + .home-masthead__tagline { 90 + color: var(--text-secondary); 91 + font-size: clamp(1rem, 1.8vw, 1.25rem); 92 + letter-spacing: 0; 93 + } 94 + 95 + .home-content { 96 + width: min(100%, 960px); 97 + margin-inline: auto; 98 + } 99 + 100 + .brand-mark { 101 + width: fit-content; 102 + display: inline-flex; 103 + align-items: center; 104 + gap: 0.65rem; 105 + color: var(--text-primary); 106 + font-family: var(--font-title); 107 + font-size: clamp(2.5rem, 7vw, 3.75rem); 108 + font-weight: 700; 109 + letter-spacing: 0; 110 + } 111 + 112 + .brand-mark:hover { 113 + color: var(--text-primary); 114 + } 115 + 116 + .brand-mark__label { 117 + background: linear-gradient(135deg, var(--brand-blue), var(--brand-cobalt) 48%, var(--brand-cyan)); 118 + background-clip: text; 119 + -webkit-background-clip: text; 120 + -webkit-text-fill-color: transparent; 121 + } 122 + 123 + .brand-mark__icon { 124 + width: 0.86em; 125 + height: 0.86em; 126 + background: linear-gradient(135deg, var(--brand-blue), var(--brand-cyan)); 127 + display: inline-block; 128 + flex: 0 0 auto; 129 + mask: url("/static/logo.svg") center / contain no-repeat; 130 + -webkit-mask: url("/static/logo.svg") center / contain no-repeat; 131 + } 132 + 133 + .hero-section { 134 + display: grid; 135 + justify-items: center; 136 + gap: 1.35rem; 137 + margin-bottom: clamp(2.5rem, 6vw, 4rem); 138 + text-align: center; 139 + } 140 + 141 + .hero-section__title { 142 + max-width: 14ch; 143 + color: var(--text-primary); 144 + font-family: var(--font-display); 145 + font-size: clamp(2.25rem, 5vw, 4.25rem); 146 + font-weight: 700; 147 + line-height: 1.04; 148 + letter-spacing: 0; 149 + } 150 + 151 + .hero-section__copy { 152 + max-width: 760px; 153 + color: var(--text-secondary); 154 + font-size: clamp(1rem, 1.7vw, 1.15rem); 155 + line-height: 1.8; 156 + } 157 + 158 + .status-badge { 159 + display: inline-flex; 160 + align-items: center; 161 + gap: 0.55rem; 162 + min-height: 2.65rem; 163 + padding: 0.65rem 1.2rem; 164 + border: 1px solid var(--border-subtle); 165 + border-radius: 999px; 166 + background: color-mix(in srgb, var(--surface-card), transparent 4%); 167 + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04); 168 + color: var(--text-primary); 169 + font-size: 0.875rem; 170 + font-weight: 600; 171 + letter-spacing: 0; 172 + } 173 + 174 + .status-badge__dot { 175 + width: 8px; 176 + height: 8px; 177 + border-radius: 999px; 178 + background: var(--brand-cyan); 179 + animation: status-pulse 2s ease-in-out infinite; 180 + } 181 + 182 + @keyframes status-pulse { 183 + 0%, 184 + 100% { 185 + opacity: 1; 186 + } 187 + 188 + 50% { 189 + opacity: 0.45; 190 + } 191 + } 192 + 193 + .screenshot-showcase { 194 + display: flex; 195 + align-items: flex-end; 196 + justify-content: center; 197 + gap: clamp(1rem, 3vw, 1.75rem); 198 + margin-bottom: clamp(3rem, 7vw, 5rem); 199 + } 200 + 201 + .screenshot-frame { 202 + overflow: hidden; 203 + border: 1px solid var(--border-subtle); 204 + border-radius: var(--radius-card); 205 + background: var(--surface-card); 206 + box-shadow: var(--shadow-card); 207 + } 208 + 209 + .screenshot-frame img { 210 + width: 100%; 211 + height: auto; 212 + display: block; 213 + } 214 + 215 + .screenshot-frame--desktop { 216 + width: min(68vw, 640px); 217 + } 218 + 219 + .screenshot-frame--phone { 220 + width: min(26vw, 200px); 221 + flex: 0 0 auto; 222 + } 223 + 224 + .screenshot-frame--card { 225 + width: 100%; 226 + margin-top: 1.5rem; 227 + box-shadow: none; 228 + } 229 + 230 + .screenshot-frame__caption { 231 + padding: 0.55rem 0.75rem; 232 + background: var(--surface-raised); 233 + color: var(--text-muted); 234 + font-size: 0.75rem; 235 + line-height: 1.4; 236 + text-align: center; 237 + } 238 + 239 + .platform-grid { 240 + display: grid; 241 + grid-template-columns: repeat(2, minmax(0, 1fr)); 242 + gap: clamp(1rem, 3vw, 2rem); 243 + margin-bottom: clamp(3rem, 7vw, 5rem); 244 + } 245 + 246 + .platform-card, 247 + .feature-card, 248 + .tech-stack { 249 + border: 1px solid var(--border-subtle); 250 + border-radius: var(--radius-card); 251 + background: linear-gradient(180deg, rgba(255, 255, 255, 0.03), transparent 96px), var(--surface-card); 252 + } 253 + 254 + .platform-card { 255 + padding: clamp(1.4rem, 3vw, 2rem); 256 + } 257 + 258 + .platform-card__header { 259 + display: flex; 260 + align-items: center; 261 + gap: 0.75rem; 262 + margin-bottom: 1.25rem; 263 + } 264 + 265 + .platform-card__title, 266 + .section-heading, 267 + .feature-card__title, 268 + .tech-stack__title { 269 + color: var(--text-primary); 270 + font-family: var(--font-display); 271 + font-weight: 700; 272 + letter-spacing: 0; 273 + } 274 + 275 + .platform-card__title { 276 + font-size: 1.35rem; 277 + line-height: 1.2; 278 + } 279 + 280 + .platform-card__description { 281 + margin-bottom: 1.25rem; 282 + color: var(--text-secondary); 283 + font-size: 0.95rem; 284 + line-height: 1.65; 285 + } 286 + 287 + .status-label { 288 + margin-left: auto; 289 + border-radius: 0.25rem; 290 + padding: 0.2rem 0.55rem; 291 + font-size: 0.7rem; 292 + font-weight: 700; 293 + letter-spacing: 0.06em; 294 + line-height: 1.2; 295 + text-transform: uppercase; 296 + } 297 + 298 + .status-label--alpha { 299 + background: rgba(190, 149, 255, 0.14); 300 + color: var(--brand-violet); 301 + } 302 + 303 + .status-label--beta { 304 + background: rgba(8, 189, 186, 0.14); 305 + color: var(--brand-cyan); 306 + } 307 + 308 + .icon-badge { 309 + width: 44px; 310 + height: 44px; 311 + border-radius: 8px; 312 + display: inline-flex; 313 + align-items: center; 314 + justify-content: center; 315 + flex: 0 0 auto; 316 + padding: 10px; 317 + } 318 + 319 + .icon-badge--blue { 320 + background: linear-gradient(135deg, var(--brand-blue), var(--brand-cobalt)); 321 + } 322 + 323 + .icon-badge--violet { 324 + background: linear-gradient(135deg, var(--brand-violet), var(--brand-sky)); 325 + } 326 + 327 + .icon-badge img { 328 + width: 100%; 329 + height: 100%; 330 + display: block; 331 + } 332 + 333 + .tag-list { 334 + display: flex; 335 + flex-wrap: wrap; 336 + gap: 0.5rem; 337 + margin-bottom: 1.25rem; 338 + } 339 + 340 + .tag-list--dense { 341 + margin-bottom: 0; 342 + } 343 + 344 + .tag-list__item { 345 + border: 1px solid transparent; 346 + border-radius: 0.4rem; 347 + background: var(--surface-raised); 348 + color: var(--text-secondary); 349 + font-family: var(--font-mono); 350 + font-size: 0.8rem; 351 + line-height: 1.25; 352 + padding: 0.38rem 0.68rem; 353 + transition: 354 + border-color 160ms ease, 355 + color 160ms ease; 356 + } 357 + 358 + .tag-list__item:hover { 359 + border-color: var(--border-strong); 360 + color: var(--text-primary); 361 + } 362 + 363 + .check-list { 364 + list-style: none; 365 + } 366 + 367 + .check-list li { 368 + position: relative; 369 + padding: 0.3rem 0 0.3rem 1.25rem; 370 + color: var(--text-secondary); 371 + font-size: 0.875rem; 372 + line-height: 1.55; 373 + } 374 + 375 + .check-list li::before { 376 + content: ""; 377 + position: absolute; 378 + left: 0; 379 + top: 0.9rem; 380 + width: 6px; 381 + height: 6px; 382 + border-radius: 999px; 383 + background: var(--brand-blue); 384 + opacity: 0.7; 385 + } 386 + 387 + .section-block { 388 + margin-bottom: clamp(3rem, 7vw, 5rem); 389 + } 390 + 391 + .section-heading { 392 + margin-bottom: 1.5rem; 393 + font-size: 1.5rem; 394 + line-height: 1.2; 395 + } 396 + 397 + .feature-grid { 398 + display: grid; 399 + grid-template-columns: repeat(3, minmax(0, 1fr)); 400 + gap: 1.25rem; 401 + } 402 + 403 + .feature-card { 404 + padding: 1.5rem; 405 + transition: 406 + transform 160ms ease, 407 + border-color 160ms ease; 408 + } 409 + 410 + .feature-card:hover { 411 + border-color: var(--border-strong); 412 + transform: translateY(-2px); 413 + } 414 + 415 + .feature-card__icon { 416 + margin-bottom: 0.95rem; 417 + } 418 + 419 + .feature-card__title { 420 + margin-bottom: 0.5rem; 421 + font-size: 1.1rem; 422 + line-height: 1.25; 423 + } 424 + 425 + .feature-card__description { 426 + color: var(--text-secondary); 427 + font-size: 0.875rem; 428 + line-height: 1.6; 429 + } 430 + 431 + .tech-stack { 432 + margin-bottom: clamp(3rem, 7vw, 5rem); 433 + padding: clamp(1.4rem, 3vw, 2rem); 434 + } 435 + 436 + .tech-stack__title { 437 + margin-bottom: 1.45rem; 438 + font-size: 1.5rem; 439 + line-height: 1.2; 440 + } 441 + 442 + .tech-stack__groups { 443 + display: grid; 444 + gap: 1rem; 445 + } 446 + 447 + .tech-stack__label { 448 + margin-bottom: 0.5rem; 449 + color: var(--text-muted); 450 + font-size: 0.75rem; 451 + font-weight: 700; 452 + letter-spacing: 0.08em; 453 + line-height: 1.2; 454 + text-transform: uppercase; 455 + } 456 + 457 + .callout { 458 + margin-bottom: clamp(2.5rem, 6vw, 4rem); 459 + border-left: 3px solid var(--brand-blue); 460 + border-radius: var(--radius-card); 461 + background: var(--surface-raised); 462 + color: var(--text-secondary); 463 + font-size: 0.9rem; 464 + line-height: 1.6; 465 + padding: 1rem 1.25rem; 466 + } 467 + 468 + .callout a { 469 + font-weight: 700; 470 + } 471 + 472 + .site-footer { 473 + border-top: 1px solid var(--border-subtle); 474 + color: var(--text-muted); 475 + font-size: 0.875rem; 476 + line-height: 1.7; 477 + margin-top: auto; 478 + padding: 2rem clamp(1.25rem, 3vw, 2rem); 479 + text-align: center; 480 + } 481 + 482 + .site-footer__copy { 483 + max-width: 980px; 484 + margin-inline: auto; 485 + } 486 + 487 + .legal-page, 488 + .oauth-page { 489 + min-height: 100vh; 490 + display: flex; 491 + flex: 1; 492 + flex-direction: column; 493 + } 494 + 495 + .page-container--legal { 496 + width: min(100%, 980px); 497 + flex: 1; 498 + padding-block: clamp(1.5rem, 4vw, 3rem); 499 + } 500 + 501 + .utility-nav { 502 + margin-bottom: 2rem; 503 + } 504 + 505 + .utility-nav a { 506 + color: var(--brand-blue); 507 + font-size: 0.875rem; 508 + font-weight: 600; 509 + } 510 + 511 + .brand-mark--legal { 512 + font-size: clamp(2.25rem, 6vw, 2.75rem); 513 + } 514 + 515 + .legal-document { 516 + margin-top: 1.25rem; 517 + border: 1px solid var(--border-subtle); 518 + border-radius: var(--radius-card); 519 + background: linear-gradient(180deg, rgba(255, 255, 255, 0.03), transparent 120px), var(--surface-card); 520 + padding: clamp(1.35rem, 4vw, 2.25rem); 521 + } 522 + 523 + .legal-document__header { 524 + margin-bottom: 1.5rem; 525 + } 526 + 527 + .legal-document__title { 528 + color: var(--text-primary); 529 + font-family: var(--font-display); 530 + font-size: clamp(1.65rem, 4vw, 2.15rem); 531 + font-weight: 700; 532 + line-height: 1.18; 533 + letter-spacing: 0; 534 + } 535 + 536 + .legal-document__meta, 537 + .legal-document__lead, 538 + .legal-document__content p, 539 + .legal-document__content li, 540 + .oauth-card__hint { 541 + color: var(--text-secondary); 542 + } 543 + 544 + .legal-document__meta { 545 + margin-top: 0.35rem; 546 + color: var(--text-muted); 547 + font-size: 0.875rem; 548 + } 549 + 550 + .legal-document__lead { 551 + margin-top: 1.25rem; 552 + font-size: 0.98rem; 553 + line-height: 1.7; 554 + } 555 + 556 + .legal-document__alert { 557 + margin-top: 1.25rem; 558 + border: 1px solid rgba(255, 143, 163, 0.35); 559 + border-radius: var(--radius-card); 560 + background: rgba(255, 143, 163, 0.12); 561 + color: #ffd8df; 562 + font-size: 0.95rem; 563 + line-height: 1.55; 564 + padding: 0.85rem 1rem; 565 + } 566 + 567 + .legal-document__content { 568 + display: grid; 569 + gap: 0.5rem; 570 + } 571 + 572 + .legal-document__content h2 { 573 + margin-top: 1rem; 574 + color: var(--brand-blue); 575 + font-family: var(--font-display); 576 + font-size: 1.08rem; 577 + font-weight: 700; 578 + line-height: 1.3; 579 + letter-spacing: 0; 580 + } 581 + 582 + .legal-document__content p { 583 + font-size: 0.95rem; 584 + line-height: 1.65; 585 + } 586 + 587 + .legal-document__content ul { 588 + margin: 0.1rem 0 0.75rem 1.25rem; 589 + color: var(--text-secondary); 590 + font-size: 0.95rem; 591 + } 592 + 593 + .legal-document__content li { 594 + margin-bottom: 0.35rem; 595 + line-height: 1.55; 596 + } 597 + 598 + .legal-links { 599 + margin-top: 1.25rem; 600 + border: 1px solid var(--border-subtle); 601 + border-radius: var(--radius-card); 602 + background: var(--surface-raised); 603 + padding: 1rem 1.15rem; 604 + } 605 + 606 + .legal-links p + p { 607 + margin-top: 0.35rem; 608 + } 609 + 610 + .legal-footer { 611 + border-top: 1px solid var(--border-subtle); 612 + color: var(--text-muted); 613 + font-size: 0.875rem; 614 + line-height: 1.7; 615 + margin-top: auto; 616 + padding: 2rem clamp(1.25rem, 3vw, 2rem); 617 + text-align: center; 618 + } 619 + 620 + .legal-footer__copy { 621 + max-width: 860px; 622 + margin-inline: auto; 623 + } 624 + 625 + .oauth-page { 626 + align-items: center; 627 + justify-content: center; 628 + padding: clamp(1.25rem, 4vw, 2rem); 629 + } 630 + 631 + .oauth-card { 632 + width: min(100%, 520px); 633 + border: 1px solid var(--border-subtle); 634 + border-radius: var(--radius-card); 635 + background: linear-gradient(180deg, rgba(255, 255, 255, 0.03), transparent 96px), var(--surface-card); 636 + padding: clamp(1.5rem, 4vw, 2rem); 637 + text-align: center; 638 + } 639 + 640 + .oauth-card__title { 641 + color: var(--text-primary); 642 + font-family: var(--font-display); 643 + font-size: clamp(1.5rem, 4vw, 2rem); 644 + font-weight: 700; 645 + line-height: 1.2; 646 + letter-spacing: 0; 647 + } 648 + 649 + .oauth-card__copy { 650 + margin: 0.9rem 0 1rem; 651 + color: var(--text-secondary); 652 + line-height: 1.65; 653 + } 654 + 655 + .oauth-card__hint { 656 + margin-top: 0.85rem; 657 + font-size: 0.875rem; 658 + line-height: 1.55; 659 + } 660 + 661 + .button { 662 + appearance: none; 663 + border: 0; 664 + border-radius: 999px; 665 + display: inline-flex; 666 + align-items: center; 667 + justify-content: center; 668 + min-height: 2.8rem; 669 + padding: 0.72rem 1.25rem; 670 + font-weight: 700; 671 + line-height: 1.2; 672 + } 673 + 674 + .button--primary { 675 + background: var(--brand-cobalt); 676 + color: #ffffff; 677 + } 678 + 679 + .button--primary:hover { 680 + background: var(--brand-blue); 681 + color: #ffffff; 682 + } 683 + 684 + @media (max-width: 860px) { 685 + .platform-grid, 686 + .feature-grid { 687 + grid-template-columns: 1fr; 688 + } 689 + 690 + .screenshot-showcase { 691 + flex-direction: column; 692 + align-items: center; 693 + } 694 + 695 + .screenshot-frame--desktop { 696 + width: min(100%, 520px); 697 + } 698 + 699 + .screenshot-frame--phone { 700 + width: min(48vw, 180px); 701 + } 702 + } 703 + 704 + @media (max-width: 560px) { 705 + .page-container--home { 706 + padding-block: 1.25rem; 707 + } 708 + 709 + .platform-card__header { 710 + align-items: flex-start; 711 + } 712 + 713 + .status-label { 714 + margin-top: 0.35rem; 715 + } 716 + }
www/static/desktop-deck.png www/public/static/desktop-deck.png
www/static/desktop.svg www/public/static/desktop.svg
www/static/favicon.svg www/public/favicon.svg
www/static/feed.svg www/public/static/feed.svg
www/static/folder.svg www/public/static/folder.svg
www/static/graph.svg www/public/static/graph.svg
www/static/lock.svg www/public/static/lock.svg
www/static/logo.svg www/public/static/logo.svg
www/static/message.svg www/public/static/message.svg
www/static/offline.svg www/public/static/offline.svg
www/static/palette.svg www/public/static/palette.svg
www/static/search.svg www/public/static/search.svg
-719
www/static/shared.css
··· 1 - :root { 2 - --bg-dark: #000000; 3 - --surface-dark: #191919; 4 - --surface-variant: #1f1f1f; 5 - --outline: rgba(255, 255, 255, 0.1); 6 - --outline-bright: rgba(255, 255, 255, 0.2); 7 - --text-primary: #f4f6fb; 8 - --text-secondary: #ababab; 9 - --text-tertiary: #6f6f6f; 10 - 11 - --primary: #7dafff; 12 - --secondary: #0073de; 13 - --tertiary: #33b1ff; 14 - --cyan: #08bdba; 15 - --purple: #be95ff; 16 - --error: #ff8080; 17 - 18 - --font-title: "Lora", serif; 19 - --font-display: "Google Sans", sans-serif; 20 - --font-body: "Inter", sans-serif; 21 - --font-mono: "Google Sans Code", monospace; 22 - } 23 - 24 - * { 25 - margin: 0; 26 - padding: 0; 27 - box-sizing: border-box; 28 - } 29 - 30 - body.home-page, 31 - body.legal-page, 32 - body.oauth-callback-page { 33 - font-family: var(--font-body); 34 - background-color: var(--bg-dark); 35 - color: var(--text-primary); 36 - line-height: 1.6; 37 - min-height: 100vh; 38 - display: flex; 39 - flex-direction: column; 40 - } 41 - 42 - body.home-page a:hover, 43 - body.legal-page a:hover { 44 - color: var(--secondary); 45 - } 46 - 47 - body.home-page a, 48 - body.legal-page a { 49 - color: var(--primary); 50 - text-decoration: none; 51 - } 52 - 53 - body.legal-page .container, 54 - .oauth-callback-container { 55 - max-width: 920px; 56 - margin: 0 auto; 57 - padding: 2rem; 58 - flex: 1; 59 - } 60 - 61 - body.home-page .platform, 62 - body.home-page .feature, 63 - body.home-page .tech-stack, 64 - body.legal-page .legal-card, 65 - .oauth-callback-main { 66 - background: var(--surface-dark); 67 - border: 1px solid var(--outline); 68 - border-radius: 1rem; 69 - } 70 - 71 - body.home-page .platform h2, 72 - body.home-page .section-title, 73 - body.home-page .feature h3, 74 - body.home-page .tech-stack h2, 75 - body.home-page .hero h1, 76 - body.legal-page h1, 77 - body.legal-page h2, 78 - body.oauth-callback-page h1 { 79 - font-family: var(--font-display); 80 - } 81 - 82 - body.home-page footer, 83 - body.legal-page footer, 84 - body.legal-page .meta, 85 - .oauth-callback-hint { 86 - font-size: 0.875rem; 87 - color: var(--text-tertiary); 88 - } 89 - 90 - body.home-page .container { 91 - max-width: 1200px; 92 - margin: 0 auto; 93 - padding: 2rem; 94 - flex: 1; 95 - display: flex; 96 - flex-direction: column; 97 - justify-content: center; 98 - } 99 - 100 - body.home-page header { 101 - text-align: center; 102 - margin-bottom: 4rem; 103 - } 104 - 105 - body.home-page .logo, 106 - body.legal-page .logo { 107 - font-family: var(--font-title); 108 - font-weight: 700; 109 - background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 50%, var(--tertiary) 100%); 110 - -webkit-background-clip: text; 111 - -webkit-text-fill-color: transparent; 112 - background-clip: text; 113 - letter-spacing: -0.02em; 114 - display: inline-flex; 115 - align-items: center; 116 - gap: 0.5rem; 117 - } 118 - 119 - body.home-page .logo { 120 - font-size: 3.5rem; 121 - margin-bottom: 1rem; 122 - } 123 - 124 - body.home-page .logo-icon, 125 - body.legal-page .logo-icon { 126 - mask-image: url("/static/logo.svg"); 127 - background-color: var(--primary); 128 - mask-repeat: no-repeat; 129 - mask-size: contain; 130 - mask-position: center; 131 - 132 - -webkit-mask-image: url("/static/logo.svg"); 133 - -webkit-mask-repeat: no-repeat; 134 - -webkit-mask-size: contain; 135 - -webkit-mask-position: center; 136 - } 137 - 138 - body.home-page .logo-icon { 139 - width: 3rem; 140 - height: 3rem; 141 - } 142 - 143 - body.home-page .tagline { 144 - font-size: 1.25rem; 145 - color: var(--text-secondary); 146 - font-weight: 400; 147 - letter-spacing: 0.01em; 148 - } 149 - 150 - body.home-page main { 151 - max-width: 900px; 152 - margin: 0 auto; 153 - } 154 - 155 - body.home-page .hero { 156 - text-align: center; 157 - margin-bottom: 4rem; 158 - } 159 - 160 - body.home-page .hero h1 { 161 - font-family: var(--font-display); 162 - font-size: 2.5rem; 163 - font-weight: 600; 164 - margin-bottom: 1.5rem; 165 - color: var(--text-primary); 166 - line-height: 1.2; 167 - } 168 - 169 - body.home-page .hero p { 170 - font-size: 1.125rem; 171 - color: var(--text-secondary); 172 - margin-bottom: 2rem; 173 - line-height: 1.8; 174 - } 175 - 176 - body.home-page .status-badge { 177 - display: inline-flex; 178 - align-items: center; 179 - gap: 0.5rem; 180 - background: var(--surface-dark); 181 - padding: 0.75rem 1.5rem; 182 - border-radius: 2rem; 183 - border: 1px solid var(--outline); 184 - font-size: 0.875rem; 185 - font-weight: 500; 186 - letter-spacing: 0.02em; 187 - margin-bottom: 3rem; 188 - } 189 - 190 - body.home-page .status-dot { 191 - width: 8px; 192 - height: 8px; 193 - border-radius: 50%; 194 - background: var(--primary); 195 - animation: pulse 2s ease-in-out infinite; 196 - } 197 - 198 - @keyframes pulse { 199 - 0%, 200 - 100% { 201 - opacity: 1; 202 - } 203 - 204 - 50% { 205 - opacity: 0.5; 206 - } 207 - } 208 - 209 - body.home-page .platforms { 210 - display: grid; 211 - grid-template-columns: 1fr 1fr; 212 - gap: 2rem; 213 - margin-bottom: 4rem; 214 - } 215 - 216 - body.home-page .platform { 217 - padding: 2rem; 218 - } 219 - 220 - body.home-page .platform-header { 221 - display: flex; 222 - align-items: center; 223 - gap: 0.75rem; 224 - margin-bottom: 1.25rem; 225 - } 226 - 227 - body.home-page .platform-icon { 228 - width: 40px; 229 - height: 40px; 230 - border-radius: 10px; 231 - display: flex; 232 - align-items: center; 233 - justify-content: center; 234 - flex-shrink: 0; 235 - } 236 - 237 - body.home-page .platform-icon.mobile { 238 - background: linear-gradient(135deg, var(--primary), var(--secondary)); 239 - } 240 - 241 - body.home-page .platform-icon img { 242 - width: 22px; 243 - height: 22px; 244 - } 245 - 246 - body.home-page .platform h2 { 247 - font-family: var(--font-display); 248 - font-size: 1.375rem; 249 - font-weight: 600; 250 - } 251 - 252 - body.home-page .platform-badge { 253 - font-size: 0.6875rem; 254 - font-weight: 600; 255 - text-transform: uppercase; 256 - letter-spacing: 0.06em; 257 - padding: 0.2rem 0.5rem; 258 - border-radius: 0.25rem; 259 - margin-left: auto; 260 - } 261 - 262 - body.home-page .platform-badge.alpha { 263 - background: rgba(190, 149, 255, 0.15); 264 - color: var(--purple); 265 - } 266 - 267 - body.home-page .platform-badge.beta { 268 - background: rgba(125, 175, 255, 0.15); 269 - color: var(--primary); 270 - } 271 - 272 - body.home-page .platform-desc { 273 - color: var(--text-secondary); 274 - font-size: 0.9375rem; 275 - line-height: 1.6; 276 - margin-bottom: 1.25rem; 277 - } 278 - 279 - body.home-page .platform-targets { 280 - display: flex; 281 - gap: 0.5rem; 282 - flex-wrap: wrap; 283 - margin-bottom: 1.25rem; 284 - } 285 - 286 - body.home-page .target-tag { 287 - background: var(--surface-variant); 288 - padding: 0.3rem 0.625rem; 289 - border-radius: 0.375rem; 290 - font-size: 0.8125rem; 291 - font-family: var(--font-mono); 292 - color: var(--text-secondary); 293 - } 294 - 295 - body.home-page .platform-features { 296 - list-style: none; 297 - } 298 - 299 - body.home-page .platform-features li { 300 - color: var(--text-secondary); 301 - font-size: 0.875rem; 302 - padding: 0.3rem 0; 303 - padding-left: 1.25rem; 304 - position: relative; 305 - } 306 - 307 - body.home-page .platform-features li::before { 308 - content: ""; 309 - position: absolute; 310 - left: 0; 311 - top: 0.7rem; 312 - width: 6px; 313 - height: 6px; 314 - border-radius: 50%; 315 - background: var(--primary); 316 - opacity: 0.6; 317 - } 318 - 319 - body.home-page .platform-screenshot { 320 - margin-top: 1.5rem; 321 - border-radius: 0.75rem; 322 - overflow: hidden; 323 - border: 1px solid var(--outline); 324 - } 325 - 326 - body.home-page .platform-screenshot img { 327 - width: 100%; 328 - height: auto; 329 - display: block; 330 - } 331 - 332 - body.home-page .platform-screenshot .caption { 333 - font-size: 0.75rem; 334 - color: var(--text-tertiary); 335 - text-align: center; 336 - padding: 0.5rem; 337 - background: var(--surface-variant); 338 - } 339 - 340 - body.home-page .hero-screenshots { 341 - display: flex; 342 - gap: 1.5rem; 343 - justify-content: center; 344 - align-items: flex-end; 345 - margin-bottom: 3rem; 346 - padding: 0 1rem; 347 - } 348 - 349 - body.home-page .hero-screenshot { 350 - border-radius: 1rem; 351 - overflow: hidden; 352 - border: 1px solid var(--outline); 353 - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); 354 - } 355 - 356 - body.home-page .hero-screenshot img { 357 - display: block; 358 - width: 100%; 359 - height: auto; 360 - } 361 - 362 - body.home-page .hero-screenshot.phone { 363 - width: 200px; 364 - flex-shrink: 0; 365 - } 366 - 367 - body.home-page .hero-screenshot.desktop-shot { 368 - width: 640px; 369 - flex-shrink: 0; 370 - } 371 - 372 - @media (max-width: 768px) { 373 - body.home-page .hero-screenshots { 374 - flex-direction: column; 375 - align-items: center; 376 - } 377 - 378 - body.home-page .hero-screenshot.phone { 379 - width: 160px; 380 - } 381 - 382 - body.home-page .hero-screenshot.desktop-shot { 383 - width: 100%; 384 - max-width: 360px; 385 - } 386 - } 387 - 388 - body.home-page .section-title { 389 - font-family: var(--font-display); 390 - font-size: 1.5rem; 391 - font-weight: 600; 392 - margin-bottom: 1.5rem; 393 - color: var(--text-primary); 394 - } 395 - 396 - body.home-page .features { 397 - display: grid; 398 - grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); 399 - gap: 1.5rem; 400 - margin-bottom: 4rem; 401 - } 402 - 403 - body.home-page .feature { 404 - padding: 1.75rem; 405 - transition: 406 - transform 0.2s ease, 407 - border-color 0.2s ease; 408 - } 409 - 410 - body.home-page .feature:hover { 411 - transform: translateY(-2px); 412 - border-color: var(--outline-bright); 413 - } 414 - 415 - body.home-page .feature h3 { 416 - font-family: var(--font-display); 417 - font-size: 1.125rem; 418 - margin-bottom: 0.5rem; 419 - color: var(--text-primary); 420 - } 421 - 422 - body.home-page .feature p { 423 - color: var(--text-secondary); 424 - font-size: 0.875rem; 425 - line-height: 1.6; 426 - } 427 - 428 - body.home-page .feature-icon { 429 - width: 44px; 430 - height: 44px; 431 - background: linear-gradient(135deg, var(--primary), var(--secondary)); 432 - border-radius: 10px; 433 - display: flex; 434 - align-items: center; 435 - justify-content: center; 436 - margin-bottom: 0.875rem; 437 - padding: 10px; 438 - } 439 - 440 - body.home-page .platform-icon.desktop, 441 - body.home-page .feature-icon.alt { 442 - background: linear-gradient(135deg, var(--purple), var(--tertiary)); 443 - } 444 - 445 - body.home-page .feature-icon img { 446 - width: 100%; 447 - height: 100%; 448 - } 449 - 450 - body.home-page .tech-stack { 451 - padding: 2rem; 452 - margin-bottom: 4rem; 453 - } 454 - 455 - body.home-page .tech-stack h2 { 456 - font-family: var(--font-display); 457 - font-size: 1.5rem; 458 - margin-bottom: 1.5rem; 459 - color: var(--text-primary); 460 - } 461 - 462 - body.home-page .tech-group { 463 - margin-bottom: 1rem; 464 - } 465 - 466 - body.home-page .tech-group:last-child { 467 - margin-bottom: 0; 468 - } 469 - 470 - body.home-page .tech-group-label { 471 - font-size: 0.75rem; 472 - font-weight: 600; 473 - text-transform: uppercase; 474 - letter-spacing: 0.08em; 475 - color: var(--text-tertiary); 476 - margin-bottom: 0.5rem; 477 - } 478 - 479 - body.home-page .tech-list { 480 - display: flex; 481 - flex-wrap: wrap; 482 - gap: 0.5rem; 483 - } 484 - 485 - body.home-page .tech-tag { 486 - background: var(--surface-variant); 487 - padding: 0.4rem 0.875rem; 488 - border-radius: 0.5rem; 489 - font-size: 0.8125rem; 490 - font-family: var(--font-mono); 491 - color: var(--text-secondary); 492 - border: 1px solid transparent; 493 - transition: border-color 0.2s ease; 494 - } 495 - 496 - body.home-page .tech-tag:hover { 497 - border-color: var(--outline-bright); 498 - } 499 - 500 - body.home-page .oauth-info { 501 - background: var(--surface-variant); 502 - padding: 1rem 1.5rem; 503 - border-radius: 0.75rem; 504 - border-left: 3px solid var(--primary); 505 - margin-top: 2rem; 506 - font-size: 0.875rem; 507 - color: var(--text-secondary); 508 - } 509 - 510 - body.home-page .oauth-info a { 511 - font-weight: 500; 512 - transition: color 0.2s ease; 513 - } 514 - 515 - body.home-page .oauth-info a:hover { 516 - text-decoration: underline; 517 - } 518 - 519 - body.home-page footer, 520 - body.legal-page footer { 521 - text-align: center; 522 - padding: 2rem; 523 - color: var(--text-tertiary); 524 - font-size: 0.875rem; 525 - border-top: 1px solid var(--outline); 526 - } 527 - 528 - body.home-page footer { 529 - margin-top: 4rem; 530 - } 531 - 532 - body.home-page footer a { 533 - transition: color 0.2s ease; 534 - } 535 - 536 - @media (max-width: 768px) { 537 - body.home-page .logo { 538 - font-size: 2.5rem; 539 - } 540 - 541 - body.home-page .hero h1 { 542 - font-size: 2rem; 543 - } 544 - 545 - body.home-page .hero p { 546 - font-size: 1rem; 547 - } 548 - 549 - body.home-page .platforms { 550 - grid-template-columns: 1fr; 551 - } 552 - 553 - body.home-page .features { 554 - grid-template-columns: 1fr; 555 - } 556 - 557 - body.home-page .container { 558 - padding: 1.5rem; 559 - } 560 - } 561 - 562 - body.legal-page .top-nav { 563 - display: flex; 564 - justify-content: flex-start; 565 - margin-bottom: 2rem; 566 - } 567 - 568 - body.legal-page .top-nav a { 569 - font-size: 0.875rem; 570 - } 571 - 572 - body.legal-page .logo { 573 - font-size: 2.4rem; 574 - } 575 - 576 - body.legal-page .logo-icon { 577 - width: 2rem; 578 - height: 2rem; 579 - } 580 - 581 - body.legal-page .legal-card { 582 - margin-top: 1.25rem; 583 - padding: 2rem; 584 - } 585 - 586 - body.legal-page h1 { 587 - font-size: 2rem; 588 - line-height: 1.2; 589 - margin-bottom: 0.4rem; 590 - } 591 - 592 - body.legal-page .meta { 593 - margin-bottom: 1.5rem; 594 - } 595 - 596 - body.legal-page .lead { 597 - color: var(--text-secondary); 598 - margin-bottom: 1.5rem; 599 - } 600 - 601 - body.legal-page section { 602 - margin-bottom: 1.25rem; 603 - } 604 - 605 - body.legal-page section:last-of-type { 606 - margin-bottom: 0; 607 - } 608 - 609 - body.legal-page h2 { 610 - font-size: 1.0625rem; 611 - color: var(--primary); 612 - margin-bottom: 0.45rem; 613 - } 614 - 615 - body.legal-page p { 616 - color: var(--text-secondary); 617 - font-size: 0.95rem; 618 - margin-bottom: 0.5rem; 619 - } 620 - 621 - body.legal-page .links { 622 - margin-top: 1.25rem; 623 - background: var(--surface-variant); 624 - border: 1px solid var(--outline); 625 - border-radius: 0.75rem; 626 - padding: 1rem 1.2rem; 627 - } 628 - 629 - body.legal-page .links p { 630 - margin-bottom: 0.35rem; 631 - } 632 - 633 - body.legal-page .links p:last-child { 634 - margin-bottom: 0; 635 - } 636 - 637 - body.legal-page footer { 638 - margin-top: 2rem; 639 - } 640 - 641 - body.privacy-page .links p { 642 - margin-bottom: 0; 643 - } 644 - 645 - body.csae-page .lead { 646 - margin-bottom: 1.25rem; 647 - } 648 - 649 - body.csae-page .alert { 650 - margin-bottom: 1.5rem; 651 - background: rgba(255, 128, 128, 0.12); 652 - border: 1px solid rgba(255, 128, 128, 0.35); 653 - border-radius: 0.75rem; 654 - padding: 0.85rem 1rem; 655 - color: #ffd4d4; 656 - font-size: 0.95rem; 657 - } 658 - 659 - body.csae-page ul { 660 - margin: 0.25rem 0 0.75rem 1.2rem; 661 - color: var(--text-secondary); 662 - font-size: 0.95rem; 663 - } 664 - 665 - body.csae-page li { 666 - margin-bottom: 0.35rem; 667 - } 668 - 669 - @media (max-width: 768px) { 670 - body.legal-page .container, 671 - body.legal-page .legal-card { 672 - padding: 1.25rem; 673 - } 674 - 675 - body.legal-page h1 { 676 - font-size: 1.6rem; 677 - } 678 - } 679 - 680 - .oauth-callback-container { 681 - width: 100%; 682 - display: flex; 683 - align-items: center; 684 - justify-content: center; 685 - } 686 - 687 - .oauth-callback-main { 688 - width: min(520px, 100%); 689 - margin-top: 0; 690 - padding: 2rem; 691 - text-align: center; 692 - } 693 - 694 - .oauth-callback-copy { 695 - margin: 0 0 0.9rem; 696 - line-height: 1.6; 697 - } 698 - 699 - .oauth-callback-button { 700 - appearance: none; 701 - display: inline-block; 702 - border: 0; 703 - border-radius: 999px; 704 - background: var(--secondary); 705 - color: #ffffff; 706 - text-decoration: none; 707 - font-weight: 600; 708 - padding: 12px 20px; 709 - margin-top: 0.3rem; 710 - } 711 - 712 - .oauth-callback-button:hover { 713 - background: var(--primary); 714 - } 715 - 716 - .oauth-callback-hint { 717 - margin-top: 0.85rem; 718 - margin-bottom: 0; 719 - }
www/static/smartphone.svg www/public/static/smartphone.svg
-147
www/terms.html
··· 1 - <!doctype html> 2 - <html lang="en"> 3 - <head> 4 - <meta charset="UTF-8" /> 5 - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 6 - <meta 7 - name="description" 8 - content="Lazurite Terms of Service - effective April 15, 2026." /> 9 - <meta name="author" content="Stormlight Labs" /> 10 - <title>Lazurite Terms of Service</title> 11 - <link rel="icon" type="image/svg+xml" href="static/favicon.svg" /> 12 - <link rel="stylesheet" href="/static/shared.css" /> 13 - <link rel="preconnect" href="https://fonts.googleapis.com" /> 14 - <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 15 - <link 16 - href="https://fonts.googleapis.com/css2?family=Google+Sans+Code:ital,wght@0,300..800;1,300..800&family=Google+Sans:ital,opsz,wght@0,17..18,400..700;1,17..18,400..700&family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&family=Lora:ital,wght@0,400..700;1,400..700&display=swap" 17 - rel="stylesheet" /> 18 - </head> 19 - <body class="legal-page terms-page"> 20 - <div class="container"> 21 - <nav class="top-nav"><a href="./index.html">Back to home</a></nav> 22 - <div class="logo"><span class="logo-icon"></span>Lazurite</div> 23 - <main class="legal-card"> 24 - <h1>Terms of Service</h1> 25 - <p class="meta">Effective April 15, 2026</p> 26 - <p class="lead"> 27 - These Terms govern your use of Lazurite, a Bluesky client built by Stormlight Labs. By 28 - installing or using Lazurite, you agree to these Terms. 29 - </p> 30 - 31 - <section> 32 - <h2>What Lazurite is</h2> 33 - <p>Lazurite is client software that helps you access Bluesky from your device.</p> 34 - <p>Lazurite does not provide the Bluesky network itself.</p> 35 - </section> 36 - 37 - <section> 38 - <h2>Eligibility</h2> 39 - <p> 40 - You must be legally able to agree to these Terms and meet the minimum age requirement 41 - in your jurisdiction. 42 - </p> 43 - </section> 44 - 45 - <section> 46 - <h2>License</h2> 47 - <p> 48 - We grant you a limited, non-exclusive, non-transferable, revocable license to use 49 - Lazurite on devices you control. 50 - </p> 51 - <p> 52 - You may not misuse the app, break applicable law, or attempt unauthorized access to 53 - systems or accounts. 54 - </p> 55 - </section> 56 - 57 - <section> 58 - <h2>Bluesky terms and policies</h2> 59 - <p> 60 - Lazurite depends on Bluesky services, and your use of Bluesky is governed by Bluesky's 61 - own legal terms. 62 - </p> 63 - </section> 64 - 65 - <section> 66 - <h2>Your account and activity</h2> 67 - <p> 68 - You are responsible for your Bluesky account, credentials, and activity taken through 69 - Lazurite. 70 - </p> 71 - <p> 72 - You retain rights to your content, subject to Bluesky policies and any third-party 73 - rights. 74 - </p> 75 - </section> 76 - 77 - <section> 78 - <h2>Acceptable use</h2> 79 - <p> 80 - Do not use Lazurite to harass others, violate rights, distribute unlawful content, or 81 - abuse platform infrastructure. 82 - </p> 83 - <p>You are responsible for complying with Bluesky rules and applicable law.</p> 84 - </section> 85 - 86 - <section> 87 - <h2>Third-party dependencies</h2> 88 - <p>Lazurite depends on Bluesky and related third-party services.</p> 89 - <p> 90 - If those services change, restrict, or discontinue access, features may degrade or stop 91 - working. 92 - </p> 93 - </section> 94 - 95 - <section> 96 - <h2>No warranty</h2> 97 - <p> 98 - Lazurite is provided "as is" and "as available." We do not guarantee uninterrupted, 99 - secure, or error-free operation. 100 - </p> 101 - </section> 102 - 103 - <section> 104 - <h2>Liability</h2> 105 - <p> 106 - To the maximum extent permitted by law, Stormlight Labs is not liable for indirect, 107 - incidental, or consequential damages arising from your use of Lazurite. 108 - </p> 109 - </section> 110 - 111 - <section> 112 - <h2>Changes and termination</h2> 113 - <p>We may update, suspend, or discontinue parts of Lazurite.</p> 114 - <p> 115 - We may update these Terms. Continued use after updates means you accept the revised 116 - Terms. 117 - </p> 118 - </section> 119 - 120 - <div class="links"> 121 - <p> 122 - Bluesky legal pages: 123 - <a href="https://bsky.social/about/support/privacy-policy" target="_blank" rel="noopener noreferrer" 124 - >Privacy Policy</a 125 - > 126 - and 127 - <a href="https://bsky.social/about/support/tos" target="_blank" rel="noopener noreferrer" 128 - >Terms of Service</a 129 - >. 130 - </p> 131 - <p> 132 - Contact: 133 - <a href="https://stormlightlabs.org" target="_blank" rel="noopener noreferrer">stormlightlabs.org</a> 134 - or <a href="mailto:info@stormlightlabs.org">info@stormlightlabs.org</a> 135 - </p> 136 - </div> 137 - </main> 138 - </div> 139 - <footer> 140 - <p> 141 - Built by <a href="https://stormlightlabs.org" target="_blank" rel="noopener noreferrer">Stormlight Labs</a> 142 - &middot; <a href="./csae-policy.html">Child Safety Standards</a> 143 - &middot; <a href="./privacy.html">Privacy Policy</a> 144 - </p> 145 - </footer> 146 - </body> 147 - </html>
+5
www/tsconfig.json
··· 1 + { 2 + "extends": "astro/tsconfigs/strict", 3 + "include": [".astro/types.d.ts", "**/*"], 4 + "exclude": ["dist"] 5 + }