diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md
index 5fd463b..d4b6ca7 100644
--- a/.claude/CLAUDE.md
+++ b/.claude/CLAUDE.md
@@ -1,4 +1,3 @@
-
You are an expert in TypeScript, Angular, and scalable web application development. You write functional, maintainable, performant, and accessible code following Angular and TypeScript best practices.
## TypeScript Best Practices
diff --git a/.dockerignore b/.dockerignore
index f7a793a..ee3e169 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,6 +1,6 @@
node_modules
-.angular
dist
+.astro
.git
.gitignore
Dockerfile
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..4008bc1
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,44 @@
+name: CI
+
+on:
+ push:
+ branches: [main, 'feat/**']
+ pull_request:
+
+concurrency:
+ group: ci-${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ timeout-minutes: 15
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Install pnpm
+ uses: pnpm/action-setup@v4
+ with:
+ version: 11.5.2
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 22
+ cache: pnpm
+
+ - name: Install dependencies
+ run: pnpm install --frozen-lockfile
+
+ - name: Format check
+ run: pnpm format:check
+
+ - name: Type check
+ run: pnpm check
+
+ - name: Build
+ run: pnpm build
+
+ - name: SEO checks
+ run: pnpm seo:check
diff --git a/.gitignore b/.gitignore
index 854acd5..800146d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,44 +1,32 @@
-# See https://docs.github.com/get-started/getting-started-with-git/ignoring-files for more about ignoring files.
+# Build output
+dist/
-# Compiled output
-/dist
-/tmp
-/out-tsc
-/bazel-out
+# Generated types
+.astro/
-# Node
-/node_modules
-npm-debug.log
-yarn-error.log
+# Dependencies
+node_modules/
-# IDEs and editors
-.idea/
-.project
-.classpath
-.c9/
-*.launch
-.settings/
-*.sublime-workspace
+# Logs
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Environment variables
+.env
+.env.production
+.env*.local
-# Visual Studio Code
+# Editors / IDEs
+.idea/
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
-!.vscode/mcp.json
.history/*
-# Miscellaneous
-/.angular/cache
-.sass-cache/
-/connect.lock
-/coverage
-/libpeerconnection.log
-testem.log
-/typings
-__screenshots__/
-
# System files
.DS_Store
Thumbs.db
diff --git a/.postcssrc.json b/.postcssrc.json
deleted file mode 100644
index 72f908d..0000000
--- a/.postcssrc.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "plugins": {
- "@tailwindcss/postcss": {}
- }
-}
\ No newline at end of file
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..8b62d94
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,7 @@
+dist
+node_modules
+.astro
+pnpm-lock.yaml
+*.webp
+*.ico
+*.png
diff --git a/.prettierrc b/.prettierrc
index d6c16d7..67b408e 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -1,11 +1,13 @@
{
"printWidth": 100,
"singleQuote": true,
+ "plugins": ["prettier-plugin-astro", "prettier-plugin-tailwindcss"],
+ "tailwindStylesheet": "./src/styles/global.css",
"overrides": [
{
- "files": "*.html",
+ "files": "*.astro",
"options": {
- "parser": "angular"
+ "parser": "astro"
}
}
]
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index 77b3745..fad1d2c 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -1,4 +1,7 @@
{
- // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846
- "recommendations": ["angular.ng-template"]
+ "recommendations": [
+ "astro-build.astro-vscode",
+ "bradlc.vscode-tailwindcss",
+ "esbenp.prettier-vscode"
+ ]
}
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 925af83..d642209 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -1,20 +1,11 @@
{
- // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
- "name": "ng serve",
- "type": "chrome",
+ "command": "./node_modules/.bin/astro dev",
+ "name": "Development server",
"request": "launch",
- "preLaunchTask": "npm: start",
- "url": "http://localhost:4200/"
- },
- {
- "name": "ng test",
- "type": "chrome",
- "request": "launch",
- "preLaunchTask": "npm: test",
- "url": "http://localhost:9876/debug.html"
+ "type": "node-terminal"
}
]
}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index 244306f..ec53177 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -1,10 +1,9 @@
{
- // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"type": "npm",
- "script": "start",
+ "script": "dev",
"isBackground": true,
"problemMatcher": {
"owner": "typescript",
@@ -12,31 +11,23 @@
"background": {
"activeOnStart": true,
"beginsPattern": {
- "regexp": "Changes detected"
+ "regexp": "astro.*ready|Local"
},
"endsPattern": {
- "regexp": "bundle generation (complete|failed)"
+ "regexp": "Local\\s+http"
}
}
}
},
{
"type": "npm",
- "script": "test",
- "isBackground": true,
- "problemMatcher": {
- "owner": "typescript",
- "pattern": "$tsc",
- "background": {
- "activeOnStart": true,
- "beginsPattern": {
- "regexp": "Changes detected"
- },
- "endsPattern": {
- "regexp": "bundle generation (complete|failed)"
- }
- }
- }
+ "script": "check",
+ "problemMatcher": ["$tsc"]
+ },
+ {
+ "type": "npm",
+ "script": "build",
+ "problemMatcher": ["$tsc"]
}
]
}
diff --git a/AGENTS.md b/AGENTS.md
new file mode 100644
index 0000000..c5ff429
--- /dev/null
+++ b/AGENTS.md
@@ -0,0 +1,22 @@
+## Development
+
+When starting the dev server, use background mode:
+
+```
+astro dev --background
+```
+
+Manage the background server with `astro dev stop`, `astro dev status`, and `astro dev logs`.
+
+## Documentation
+
+Full documentation: https://docs.astro.build
+
+Consult these guides before working on related tasks:
+
+- [Adding pages, dynamic routes, or middleware](https://docs.astro.build/en/guides/routing/)
+- [Working with Astro components](https://docs.astro.build/en/basics/astro-components/)
+- [Using React, Vue, Svelte, or other framework components](https://docs.astro.build/en/guides/framework-components/)
+- [Adding or managing content](https://docs.astro.build/en/guides/content-collections/)
+- [Adding styles or using Tailwind](https://docs.astro.build/en/guides/styling/)
+- [Supporting multiple languages](https://docs.astro.build/en/guides/internationalization/)
diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 120000
index 0000000..47dc3e3
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1 @@
+AGENTS.md
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index 38b23d4..91946cd 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,31 +1,25 @@
-# Stage 1: Build the static page
+# Stage 1: Build the static site
FROM node:26-alpine AS builder
WORKDIR /app
-# Install pnpm
-RUN npm install -g pnpm
+RUN npm install -g pnpm@11.5.2
-# Copy package.json and pnpm-lock.yaml
-COPY package.json pnpm-lock.yaml pnpm-workspace.yaml nginx.conf ./
+COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
-# Install dependencies
RUN pnpm install --frozen-lockfile
-# Copy the rest of the application code
COPY . .
-# Build the application
RUN pnpm build
-# Stage 2: Serve the static files using Nginx alpine (lightweight)
+# Stage 2: Serve static files with nginx
FROM nginx:alpine
-# Copy custom nginx configuration for gzip and caching
COPY nginx.conf /etc/nginx/conf.d/default.conf
+COPY --from=builder /app/dist /usr/share/nginx/html
-# Copy build output from Stage 1 to Nginx public folder
-COPY --from=builder /app/dist/funput/browser /usr/share/nginx/html
+RUN nginx -t
EXPOSE 80
diff --git a/README.md b/README.md
index aea5eac..c85dd53 100644
--- a/README.md
+++ b/README.md
@@ -4,53 +4,58 @@ Official marketing site for [Funput](https://funput.app) — an open-source Viet
**Live site:** [funput.app](https://funput.app)
-Built with [Angular](https://angular.dev/) 22, [Tailwind CSS](https://tailwindcss.com/) 4, and served via nginx in Docker.
+Built with [Astro](https://astro.build/) and [Tailwind CSS](https://tailwindcss.com/) 4. Static output is served via nginx in Docker.
## Prerequisites
-- [Node.js](https://nodejs.org/) **24+** (Node 26 recommended for Docker)
-- [pnpm](https://pnpm.io/) **11.5+** (see `packageManager` in `package.json`)
+- [Node.js](https://nodejs.org/) **22.12+** (Node 26 recommended for Docker)
+- [pnpm](https://pnpm.dev/) **11.5+** (see `packageManager` in `package.json`)
## Getting started
-Install dependencies:
-
```bash
pnpm install
+pnpm dev --background
```
-Start the development server:
-
-```bash
-pnpm start
-```
-
-Open [http://localhost:4200](http://localhost:4200).
+Open [http://localhost:4321](http://localhost:4321).
-## Build
-
-Production build (output under `dist/funput/`):
+## Scripts
-```bash
-pnpm build
-```
+| Command | Description |
+| ------------------- | --------------------------------- |
+| `pnpm dev` | Dev server |
+| `pnpm build` | Production static build (`dist/`) |
+| `pnpm preview` | Preview the production build |
+| `pnpm check` | Astro + TypeScript checks |
+| `pnpm format` | Format with Prettier |
+| `pnpm format:check` | Check Prettier formatting |
-Run unit tests:
+## Project layout
-```bash
-pnpm test
```
-
-Format with Prettier:
-
-```bash
-pnpm format
-pnpm format:check
+website/
+├── public/ # Static assets (icons, robots, OG image, llms.txt)
+├── src/
+│ ├── components/ # Home experience, shared header/footer, SEO
+│ ├── content/
+│ │ ├── blog/ # Blog Markdown/MDX (Content Collections)
+│ │ └── privacy.md # Privacy policy (Markdown)
+│ ├── content.config.ts
+│ ├── layouts/ # Shared page layouts
+│ ├── lib/ # Constants, platforms, SEO helpers
+│ ├── pages/ # File-based routes
+│ └── styles/ # Global CSS (Tailwind + design tokens)
+├── .github/workflows/ # CI (format, check, build)
+├── astro.config.mjs
+├── Dockerfile
+├── nginx.conf
+└── package.json
```
## Docker
-Multi-stage image: Node 26 (build) + nginx alpine (serve static browser output).
+Multi-stage image: Node 26 (build) + nginx alpine (serve `dist/`).
```bash
docker build -t funput-landing .
@@ -59,31 +64,6 @@ docker run --rm -p 8080:80 funput-landing
Then open [http://localhost:8080](http://localhost:8080).
-## Project layout
-
-```
-website/
-├── public/ # Static assets (icons, robots, sitemap, OG image)
-├── src/
-│ ├── app/ # Components, routes, constants
-│ ├── index.html # SEO meta, structured data
-│ └── server.ts # SSR entry (Express)
-├── Dockerfile
-├── nginx.conf
-└── package.json
-```
-
-## Scripts
-
-| Command | Description |
-| ------- | ----------- |
-| `pnpm start` | Dev server (`ng serve`) |
-| `pnpm build` | Production build |
-| `pnpm test` | Unit tests (Vitest) |
-| `pnpm format` | Format sources with Prettier |
-| `pnpm format:check` | Check Prettier formatting |
-| `pnpm serve:ssr:funput` | Serve SSR build locally |
-
## Links
- **Main repository:** [github.com/Funput/Funput](https://github.com/Funput/Funput)
@@ -94,12 +74,20 @@ website/
1. Fork the repository and create a feature branch.
2. Install dependencies with `pnpm install`.
-3. Make your changes; keep UI and copy consistent with the existing site.
-4. Before opening a pull request, run `pnpm format:check`, `pnpm test`, and `pnpm build`.
+3. Make your changes; keep structure and copy consistent with the existing site.
+4. Before opening a pull request, run `pnpm format:check`, `pnpm check`, and `pnpm build`.
5. Open a PR with a clear description of the change.
## License
-MIT — see [LICENSE](./LICENSE). Brand and trademark notes are in [NOTICE](./NOTICE).
+See [LICENSE](LICENSE) and [NOTICE](NOTICE).
+
+## Design system
+
+The site uses a paper, orange, and sage palette with Vietnamese typography. Shared tokens, layout utilities, and article typography live in `src/styles/global.css`. `BaseLayout.astro` supplies the same header and footer to every page.
+
+- `HomeExperience.astro`: landing page and interactive tone marks.
+- `ReadingLayout.astro`: blog articles and the privacy policy, with a heading-based table of contents.
+- `src/pages/blog/index.astro`: journal listing and empty state. Draft posts stay unpublished.
-The Funput application itself is also MIT; see [Funput/Funput](https://github.com/Funput/Funput/blob/main/LICENSE).
+Manage the background preview with `pnpm astro dev status`, `pnpm astro dev logs`, and `pnpm astro dev stop`.
diff --git a/angular.json b/angular.json
deleted file mode 100644
index 04c1a37..0000000
--- a/angular.json
+++ /dev/null
@@ -1,81 +0,0 @@
-{
- "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
- "version": 1,
- "cli": {
- "packageManager": "pnpm"
- },
- "newProjectRoot": "projects",
- "projects": {
- "funput": {
- "projectType": "application",
- "schematics": {},
- "root": "",
- "sourceRoot": "src",
- "prefix": "app",
- "architect": {
- "build": {
- "builder": "@angular/build:application",
- "options": {
- "browser": "src/main.ts",
- "tsConfig": "tsconfig.app.json",
- "assets": [
- {
- "glob": "**/*",
- "input": "public"
- }
- ],
- "styles": [
- "src/styles.css"
- ],
- "server": "src/main.server.ts",
- "outputMode": "server",
- "security": {
- "allowedHosts": []
- },
- "ssr": {
- "entry": "src/server.ts"
- }
- },
- "configurations": {
- "production": {
- "budgets": [
- {
- "type": "initial",
- "maximumWarning": "500kB",
- "maximumError": "1MB"
- },
- {
- "type": "anyComponentStyle",
- "maximumWarning": "4kB",
- "maximumError": "8kB"
- }
- ],
- "outputHashing": "all"
- },
- "development": {
- "optimization": false,
- "extractLicenses": false,
- "sourceMap": true
- }
- },
- "defaultConfiguration": "production"
- },
- "serve": {
- "builder": "@angular/build:dev-server",
- "configurations": {
- "production": {
- "buildTarget": "funput:build:production"
- },
- "development": {
- "buildTarget": "funput:build:development"
- }
- },
- "defaultConfiguration": "development"
- },
- "test": {
- "builder": "@angular/build:unit-test"
- }
- }
- }
- }
-}
diff --git a/astro.config.mjs b/astro.config.mjs
new file mode 100644
index 0000000..3b28716
--- /dev/null
+++ b/astro.config.mjs
@@ -0,0 +1,15 @@
+// @ts-check
+import { defineConfig } from 'astro/config';
+import mdx from '@astrojs/mdx';
+import sitemap from '@astrojs/sitemap';
+import tailwindcss from '@tailwindcss/vite';
+
+// https://astro.build/config
+export default defineConfig({
+ site: 'https://funput.app',
+ trailingSlash: 'always',
+ integrations: [mdx(), sitemap()],
+ vite: {
+ plugins: [tailwindcss()],
+ },
+});
diff --git a/audits/seo.md b/audits/seo.md
new file mode 100644
index 0000000..cc62d9b
--- /dev/null
+++ b/audits/seo.md
@@ -0,0 +1,60 @@
+# Funput SEO audit — 2026-09-27
+
+## Completed in the Astro source
+
+- Consistent trailing-slash canonicals and generated sitemap URLs.
+- Static HTML landing pages at `/macos/`, `/windows/`, `/linux/`, `/ios/` and `/android/`, linked from the homepage and footer.
+- MobileApplication entities with stable IDs, platform requirements, screenshots, and official store identifiers and download links.
+- Organization/WebSite/WebPage metadata on public pages; BlogPosting and breadcrumbs for published articles.
+- Removed FAQ schema whose questions were not present on the homepage, and removed hard-coded modification dates.
+- Open Graph/Twitter image descriptions and verified 1200 × 630 image dimensions.
+- iOS Smart App Banner on the iOS landing page.
+- Existing wildcard robots permission retained; updated llms.txt with canonical app landing pages.
+- Added a noindex 404 page and changed nginx to return actual 404 responses for missing routes.
+- Preserved the previous `/sitemap.xml` address with a redirect to `/sitemap-index.xml`.
+- Added nginx redirect from www to the canonical hostname, subject to the upstream DNS/TLS/proxy routing reaching nginx.
+- Added `pnpm seo:check` and a CI step to validate generated HTML, canonical URLs, sitemap, internal links and fragments, app identities, store links, and robots.
+
+## Verification
+
+`pnpm format:check`, `pnpm check`, `pnpm build`, `pnpm seo:check`, and `git diff --check` passed. The final build has 13 HTML files and 12 indexable sitemap URLs (404 excluded). Local `/ios/` returns HTTP 200. The first published article is `/blog/funput-la-gi/`; its BlogPosting schema, publication metadata and discovery from the blog index pass automated validation.
+
+The nginx changes have not been executed in a container: Docker is installed but its daemon is not running. Verify nginx syntax and HTTP status behavior in the deployment environment before release. JSON-LD checks validate the generated data and relationships; they do not substitute for Google's Rich Results Test. No ratings or reviews have been invented to satisfy rich-result requirements.
+
+## Public site observations (before deployment)
+
+- `https://funput.app/` returns 200 and serves the previous website, not this Astro build.
+- `https://funput.app/robots.txt` allows crawling and currently points to the old `/sitemap.xml`.
+- `/sitemap.xml` returns XML. `/sitemap-index.xml` currently returns homepage HTML, not XML.
+- A deliberately nonexistent URL returns homepage HTML with 200 (soft-404 behavior).
+- `http://funput.app/` redirects to HTTPS.
+- `https://www.funput.app/` returned 503 from this environment. Investigate upstream hosting/DNS/TLS configuration; the source change alone cannot establish that it is fixed.
+- The official App Store listing resolves to Funput: Bàn phím tiếng Việt, ID `6788829996`, and lists iOS/iPadOS 18.6+.
+- Google Play returned HTTP 200 with the Vietnamese Funput description for package `app.funput.funput` using the Vietnamese locale/storefront. The web-search tool could not fetch that listing, so its availability was checked through a direct HTTP request.
+
+## Required after deployment
+
+1. Deploy this Astro build and nginx configuration. Verify the canonical hostname, www redirect, all five platform pages, sitemap XML content types, and a real HTTP 404 on an unknown path. Ensure upstream/CDN routing does not restore the old SPA fallback.
+2. Submit `https://funput.app/sitemap-index.xml` in the owner's Google Search Console and Bing Webmaster Tools. Inspect the homepage and all five platform URLs; request indexing if appropriate. Account verification/submission was not performed in this task.
+3. Run Google's Rich Results Test against deployed pages and inspect crawler access/CDN bot rules and logs. A wildcard robots Allow does not override a WAF challenge or IP block. Validate legitimate crawler identities before changing security rules.
+4. Keep the store listings' website/support/privacy links pointing at the official site. Store-console settings were not changed.
+5. Monitor actual indexing, crawl errors and Core Web Vitals. No production performance audit or authenticated index-coverage inspection was performed.
+
+No implementation can guarantee inclusion or ranking across every search engine or AI agent. llms.txt is an optional readable summary, not an indexing requirement or a guarantee. Search availability and model-training crawler preferences are separate concerns.
+
+## Primary references
+
+- [Google: Software app structured data](https://developers.google.com/search/docs/appearance/structured-data/software-app)
+- [Google: General structured data guidelines](https://developers.google.com/search/docs/appearance/structured-data/sd-policies)
+- [Google: Optimizing for generative AI search](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide)
+- [Bing: Sitemaps](https://www2.bing.com/webmasters/help/sitemaps-3b5cf6ed)
+- [OpenAI: Crawlers and OAI-SearchBot](https://developers.openai.com/api/docs/bots)
+- [Apple: Smart App Banners](https://developer.apple.com/documentation/webkit/promoting-apps-with-smart-app-banners)
+
+## Desktop platform expansion
+
+Added individual macOS, Windows and Linux pages with platform-specific screenshots, compatibility requirements, setup steps and visible questions. Desktop SoftwareApplication entities share stable IDs with the homepage and are connected to each page through mainEntity. Every platform page links to the other four; all five are linked from the homepage, footer and llms.txt. Compatibility and installation copy was checked against the app platform READMEs, including macOS installer privileges and Linux x86-64 support.
+
+## Guide series
+
+Published Telex/VNI/advanced Telex, iPhone/iPad setup, and Windows 10/11 setup guides. BlogPosting metadata, blog index links and sitemap entries are checked for all published articles. Platform landing pages link to their setup guides. iOS guide screenshots are processed by Astro with Sharp into WebP at build time.
diff --git a/nginx.conf b/nginx.conf
index bcaae06..537040e 100644
--- a/nginx.conf
+++ b/nginx.conf
@@ -1,21 +1,43 @@
+# TLS terminates at the deployment's reverse proxy.
server {
listen 80;
- server_name localhost;
+ server_name www.funput.app;
+ return 308 https://funput.app$request_uri;
+}
+
+server {
+ listen 80 default_server;
+ server_name funput.app localhost;
+ root /usr/share/nginx/html;
+ index index.html;
+
+ # Preserve the sitemap address used by the previous website.
+ location = /sitemap.xml {
+ return 301 /sitemap-index.xml;
+ }
+ # Missing pages must be real 404s, not a successful copy of the homepage.
+ error_page 404 /404.html;
+ location = /404.html {
+ add_header X-Robots-Tag "noindex, follow" always;
+ }
location / {
- root /usr/share/nginx/html;
- index index.html index.htm;
- try_files $uri $uri/ /index.html;
+ try_files $uri $uri/ =404;
+ }
+
+ # Crawling instructions and sitemaps should refresh promptly after deployment.
+ location ~* \.(xml|txt)$ {
+ try_files $uri =404;
+ expires 1h;
+ add_header Cache-Control "public, no-transform";
}
- # Cache static assets
- location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|otf)$ {
- root /usr/share/nginx/html;
+ location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|webp|woff|woff2|ttf|otf)$ {
+ try_files $uri =404;
expires 30d;
add_header Cache-Control "public, no-transform";
}
- # Gzip compression
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml;
gzip_min_length 1000;
diff --git a/package.json b/package.json
index 09419ea..245449b 100644
--- a/package.json
+++ b/package.json
@@ -1,46 +1,43 @@
{
"name": "funput",
+ "type": "module",
"version": "1.0.0",
- "scripts": {
- "ng": "ng",
- "start": "ng serve",
- "build": "ng build",
- "watch": "ng build --watch --configuration development",
- "test": "ng test",
- "format": "prettier --write .",
- "format:check": "prettier --check .",
- "serve:ssr:funput": "node dist/funput/server/server.mjs"
- },
"private": true,
"packageManager": "pnpm@11.5.2",
"engines": {
- "node": ">=20"
+ "node": ">=22.12.0"
+ },
+ "scripts": {
+ "dev": "astro dev",
+ "build": "astro build",
+ "preview": "astro preview",
+ "check": "astro check",
+ "format": "prettier --write .",
+ "format:check": "prettier --check .",
+ "astro": "astro",
+ "seo:check": "python3 scripts/check_seo.py"
},
"dependencies": {
- "@angular/common": "^22.0.0",
- "@angular/compiler": "^22.0.0",
- "@angular/core": "^22.0.0",
- "@angular/forms": "^22.0.0",
- "@angular/platform-browser": "^22.0.0",
- "@angular/platform-server": "^22.0.0",
- "@angular/router": "^22.0.0",
- "@angular/ssr": "^22.0.3",
- "express": "^5.1.0",
- "rxjs": "~7.8.0",
- "tslib": "^2.3.0"
+ "@astrojs/mdx": "^8.0.2",
+ "@astrojs/sitemap": "^3.7.4",
+ "@fontsource/be-vietnam-pro": "^5.3.0",
+ "@fontsource/plus-jakarta-sans": "^5.3.0",
+ "@tailwindcss/typography": "^0.5.20",
+ "@tailwindcss/vite": "^4.3.3",
+ "astro": "^7.3.5",
+ "sharp": "^0.35.4",
+ "tailwindcss": "^4.3.3"
},
"devDependencies": {
- "@angular/build": "^22.0.3",
- "@angular/cli": "^22.0.3",
- "@angular/compiler-cli": "^22.0.0",
- "@tailwindcss/postcss": "^4.1.12",
- "@types/express": "^5.0.1",
- "@types/node": "^20.17.19",
- "jsdom": "^28.0.0",
- "postcss": "^8.5.3",
- "prettier": "^3.8.1",
- "tailwindcss": "^4.1.12",
- "typescript": "~6.0.2",
- "vitest": "^4.0.8"
+ "@astrojs/check": "^0.9.10",
+ "@types/qrcode": "^1.5.6",
+ "prettier": "^3.9.9",
+ "prettier-plugin-astro": "^1.1.0",
+ "prettier-plugin-tailwindcss": "^0.8.1",
+ "qrcode": "^1.5.4",
+ "typescript": "~6.0.3"
+ },
+ "allowScripts": {
+ "esbuild": true
}
-}
\ No newline at end of file
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f8817bc..443f1e9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -8,912 +8,693 @@ importers:
.:
dependencies:
- '@angular/common':
- specifier: ^22.0.0
- version: 22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2)
- '@angular/compiler':
- specifier: ^22.0.0
- version: 22.0.2
- '@angular/core':
- specifier: ^22.0.0
- version: 22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)
- '@angular/forms':
- specifier: ^22.0.0
- version: 22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)))(rxjs@7.8.2)
- '@angular/platform-browser':
- specifier: ^22.0.0
- version: 22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))
- '@angular/platform-server':
- specifier: ^22.0.0
- version: 22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@22.0.2)(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)))(rxjs@7.8.2)
- '@angular/router':
- specifier: ^22.0.0
- version: 22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)))(rxjs@7.8.2)
- '@angular/ssr':
- specifier: ^22.0.3
- version: 22.0.3(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(@angular/platform-server@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@22.0.2)(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/router@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)))(rxjs@7.8.2))
- express:
- specifier: ^5.1.0
- version: 5.2.1
- rxjs:
- specifier: ~7.8.0
- version: 7.8.2
- tslib:
- specifier: ^2.3.0
- version: 2.8.1
+ '@astrojs/mdx':
+ specifier: ^8.0.2
+ version: 8.0.2(@astrojs/markdown-satteri@0.4.2)(astro@7.3.5(@types/node@24.13.6)(jiti@2.7.0)(yaml@2.9.1))
+ '@astrojs/sitemap':
+ specifier: ^3.7.4
+ version: 3.7.4
+ '@fontsource/be-vietnam-pro':
+ specifier: ^5.3.0
+ version: 5.3.0
+ '@fontsource/plus-jakarta-sans':
+ specifier: ^5.3.0
+ version: 5.3.0
+ '@tailwindcss/typography':
+ specifier: ^0.5.20
+ version: 0.5.20(tailwindcss@4.3.3)
+ '@tailwindcss/vite':
+ specifier: ^4.3.3
+ version: 4.3.3(vite@8.3.1(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))
+ astro:
+ specifier: ^7.3.5
+ version: 7.3.5(@types/node@24.13.6)(jiti@2.7.0)(yaml@2.9.1)
+ sharp:
+ specifier: ^0.35.4
+ version: 0.35.4(@types/node@24.13.6)
+ tailwindcss:
+ specifier: ^4.3.3
+ version: 4.3.3
devDependencies:
- '@angular/build':
- specifier: ^22.0.3
- version: 22.0.3(5ce02b17d3abbea08b56e311955e9b52)
- '@angular/cli':
- specifier: ^22.0.3
- version: 22.0.3(@types/node@20.19.43)(chokidar@5.0.0)
- '@angular/compiler-cli':
- specifier: ^22.0.0
- version: 22.0.2(@angular/compiler@22.0.2)(typescript@6.0.3)
- '@tailwindcss/postcss':
- specifier: ^4.1.12
- version: 4.3.1
- '@types/express':
- specifier: ^5.0.1
- version: 5.0.6
- '@types/node':
- specifier: ^20.17.19
- version: 20.19.43
- jsdom:
- specifier: ^28.0.0
- version: 28.1.0
- postcss:
- specifier: ^8.5.3
- version: 8.5.15
+ '@astrojs/check':
+ specifier: ^0.9.10
+ version: 0.9.10(@emnapi/runtime@1.11.3)(prettier-plugin-astro@1.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(prettier@3.9.9))(prettier@3.9.9)(typescript@6.0.3)
+ '@types/qrcode':
+ specifier: ^1.5.6
+ version: 1.5.6
prettier:
- specifier: ^3.8.1
- version: 3.8.4
- tailwindcss:
- specifier: ^4.1.12
- version: 4.3.1
+ specifier: ^3.9.9
+ version: 3.9.9
+ prettier-plugin-astro:
+ specifier: ^1.1.0
+ version: 1.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(prettier@3.9.9)
+ prettier-plugin-tailwindcss:
+ specifier: ^0.8.1
+ version: 0.8.1(prettier-plugin-astro@1.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(prettier@3.9.9))(prettier@3.9.9)
+ qrcode:
+ specifier: ^1.5.4
+ version: 1.5.4
typescript:
- specifier: ~6.0.2
+ specifier: ~6.0.3
version: 6.0.3
- vitest:
- specifier: ^4.0.8
- version: 4.1.9(@types/node@20.19.43)(jsdom@28.1.0)(vite@7.3.5(@types/node@20.19.43)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0))
packages:
- '@acemir/cssom@0.9.31':
- resolution: {integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==}
+ '@astrojs/astro2tsx@0.1.1':
+ resolution: {integrity: sha512-VNhvoKzs0FXF3iq+2QVIjTqA6awKDKpd2U7khYg3AhcxjM1KMINEma4IeqQnMqJUakw0MNQygntLvLmSPS5pLA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
- '@algolia/abtesting@1.18.0':
- resolution: {integrity: sha512-8siuLG+FIns1AjZ/g2SDVwHz9S+ObacDQISEJvS8XsNei1zl3FXqfqQrBpmrG7ACWCyesXHbicMJtvRbg00FEw==}
- engines: {node: '>= 14.0.0'}
+ '@astrojs/check@0.9.10':
+ resolution: {integrity: sha512-zgx/UQMozdjOa3bOxjgeCFdtpE3c9rRX6xHwa+2QXvy8z8Akifu2AtubHyv/zzC2znO8dl8fFWL4K+Ba9kS8HQ==}
+ hasBin: true
+ peerDependencies:
+ typescript: ^5.0.0 || ^6.0.0
- '@algolia/client-abtesting@5.52.0':
- resolution: {integrity: sha512-wtwPgyPmO7b7sQPVgoK29c1VpfS08DnnJCmxX/oU1pV2DlMRJCzQcLN7JSloYpodyKHwM8+9wOzlAM0co3TDmA==}
- engines: {node: '>= 14.0.0'}
+ '@astrojs/compiler-binding-android-arm64@0.4.1':
+ resolution: {integrity: sha512-Wtx2DZORuNTLASLLZ8hlrjFaJe1LUloatcCn9EPq7knBhRpjMGXeJANIJMeBZG4igvz7x+3nyAJM2iwCSW9xog==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
- '@algolia/client-analytics@5.52.0':
- resolution: {integrity: sha512-9KY36bRl4AH7RjqSeDDOKnjsz4IxQFBEOB8/fWmEbdQe+Isbs5jGzVJu9NEPQ1Tgwxlf8Uf07Swj3jZyMNUZ2g==}
- engines: {node: '>= 14.0.0'}
+ '@astrojs/compiler-binding-android-arm64@0.5.0':
+ resolution: {integrity: sha512-wVviC/1KaBqGVF0DbTZ8UtAE3c8TN84CCe7w4ju3SGzo/ByWKn8HCqSU/+1wdltGCCSa30pjVk3H8DQUgnfhRQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
- '@algolia/client-common@5.52.0':
- resolution: {integrity: sha512-3a/qM3dzJqqfTx7Yrw7uGQ98I3Q0rDfb4Vkv0wEzko96l7YQMxfBVz/VbLq2N+c59GweYv6Vhp8mPeqnWJSITw==}
- engines: {node: '>= 14.0.0'}
+ '@astrojs/compiler-binding-darwin-arm64@0.4.1':
+ resolution: {integrity: sha512-7iwXcU+hB60Y1SvOfnWHNioT72gDsDQKaDipXh2Onwp/TvQMozhbvhy13wJR8Af940a0h6PbddCeJFpj791UDA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
- '@algolia/client-insights@5.52.0':
- resolution: {integrity: sha512-Rki7ACbMcvbQW0BuM84x9dkGHY47ABmv4jU6tYssat2k02p3mIUms2YOLUAMeknhmnFsj6lb6ZzOXdMWMyc1sA==}
- engines: {node: '>= 14.0.0'}
+ '@astrojs/compiler-binding-darwin-arm64@0.5.0':
+ resolution: {integrity: sha512-5NNIkaGeiztD9QQfhOy+nNrBCZVeHqVZPlfJVjTKq4yJiiSsxAhuBzmVlmK3BDhbSgUT8dai4JV5m6t4/BIQaw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
- '@algolia/client-personalization@5.52.0':
- resolution: {integrity: sha512-96s4Uzc3kk+/f4jJXIVVGWP5XlngOGNQ1x6hW9AT59pOixHlOs5tqJg+ZUS/GQ6h/iYP0ceQcmxDQeLyCLTaDQ==}
- engines: {node: '>= 14.0.0'}
+ '@astrojs/compiler-binding-darwin-x64@0.4.1':
+ resolution: {integrity: sha512-pifjICos49RXhSVKSDu5gDB0/8j0O7DmxSp1DaWW2PyLG5ekwSkcrfOZto5JqhdI7QYMZB3XOiXpsdOXpS4npA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
- '@algolia/client-query-suggestions@5.52.0':
- resolution: {integrity: sha512-lqeycNpSPe5Qa0OUWpejVvYQjQWV5nQuLT0a4aq7XzRAvCxprV/6Lf841EygdD2nrFnuS58ok7Au1uOtXzpnkg==}
- engines: {node: '>= 14.0.0'}
+ '@astrojs/compiler-binding-darwin-x64@0.5.0':
+ resolution: {integrity: sha512-HU/waaccOQDXpvjoWA/9xzadNZIcWKblJoaw19lCxfVs6AHQYdZZOzZUQjY8HaLYGerTXjdADbra2XU+kXk9Og==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
- '@algolia/client-search@5.52.0':
- resolution: {integrity: sha512-ly1wETVGRo30cx61O7fetESN+ElL9c9K+bD/AVgnT1ar4c6v+/Yqjrhdtu6Fm4D0s4NZP081Isf6tunH1wUXHg==}
- engines: {node: '>= 14.0.0'}
+ '@astrojs/compiler-binding-linux-arm64-gnu@0.4.1':
+ resolution: {integrity: sha512-hsZMlNWc6LqWHh9LlSwTq1/XCY7pxA5rkkKIdZRV8mgbOz9OwLvjEoe5Jry13eIZjMUQO8XnQyzk8o/Pjw2YFA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
- '@algolia/ingestion@1.52.0':
- resolution: {integrity: sha512-U4EeTvgmluRjj39ykZSAd5X+a6LD5m7/mcOWDmB7hqm1R6QY0yT8jLxpNVEjYhzgEN5hcDGW6X67EWQY8KiYGQ==}
- engines: {node: '>= 14.0.0'}
+ '@astrojs/compiler-binding-linux-arm64-gnu@0.5.0':
+ resolution: {integrity: sha512-a21petBJRi0mNBf+gkRZFoWdGH+VOo0zRQSzM4Nuez5RL5rFFkmbondMejkaRZzvE3LVYU2NVD5MGRgAs4V+nQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
- '@algolia/monitoring@1.52.0':
- resolution: {integrity: sha512-FCPnDcILfpTE94u7BVlV4DmnSV5wE3+j25EEF+3dYPrVzkVCSoAHs318oWDGxnxsAgiL4HpL12Jc4XHmw9shpA==}
- engines: {node: '>= 14.0.0'}
+ '@astrojs/compiler-binding-linux-arm64-musl@0.4.1':
+ resolution: {integrity: sha512-a3EW27f+Z9uf57vYmpLgUriA1y9wDhKz57PT8D8XlFZt2HZEWhUxKuxI1jvKVI9p8okYee11WXEm/FHY1G9yoQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
- '@algolia/recommend@5.52.0':
- resolution: {integrity: sha512-br3DO7n4N8CXwTRbZS0MnB4WQ9YHfNjCwkCEzVR/wek/qNTDQKDb0nROmkFaNZ8ucUqUVKZi074dbwMwRDlK8Q==}
- engines: {node: '>= 14.0.0'}
+ '@astrojs/compiler-binding-linux-arm64-musl@0.5.0':
+ resolution: {integrity: sha512-t5rmu23b/6e6v0bhPibCtwPdABXMRL+bUaJXdkJwTpkINp4zCgH6fNa5Z6+RgkgFSCpmg9uf1MtRIqx1gdmBaA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
- '@algolia/requester-browser-xhr@5.52.0':
- resolution: {integrity: sha512-b0T/Ca2c9KyEslKsVrGZvbe1UrrKKSdfXhBZ2pbpKahFUzJfziRZ0urbOm7V65O0tO/jwU+Lo/+bIiiyhzGt8w==}
- engines: {node: '>= 14.0.0'}
+ '@astrojs/compiler-binding-linux-x64-gnu@0.4.1':
+ resolution: {integrity: sha512-XruPTKB/SS4DFzeAjQ1ZyM0ieHDjapHkOSnnzRApZ4FXY2YAI7UY3mETjfJiIS/acyZyrnPH5jObv1gATTdUJQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
- '@algolia/requester-fetch@5.52.0':
- resolution: {integrity: sha512-ozBT8J/mtD4H4IAojw8QPirlcL2gHrI1BGuZ4/ZXXO/rTE1yQ4VIPJj4mTTbwo4FbkS1MoJsD/DsrqLzhnc4/g==}
- engines: {node: '>= 14.0.0'}
+ '@astrojs/compiler-binding-linux-x64-gnu@0.5.0':
+ resolution: {integrity: sha512-JWtouuxSiDb2OKKFsxOwfqlpJuZHo1ExirlBGfDgoJVG5zeJWwcd2tU2w4UaJA4suT/tAFSLk/vFhM5fLjWV4A==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
- '@algolia/requester-node-http@5.52.0':
- resolution: {integrity: sha512-gyyWcLD22tnabmoit4iukCXuoRc5HYJuUjPSEa8a0D/f/NlRafpWi52AlAaa4Uu/rsl7saHsJFTNjTptWbu2+A==}
- engines: {node: '>= 14.0.0'}
+ '@astrojs/compiler-binding-linux-x64-musl@0.4.1':
+ resolution: {integrity: sha512-E8j7lGanqNpudtkUbsFaOLJhmwFe4Ecqux7K9hkj4wULIPNZRM2bYZNcMSj8r1oWvaUiwZl8LaaNwv3+14jqhw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
- '@alloc/quick-lru@5.2.0':
- resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
- engines: {node: '>=10'}
+ '@astrojs/compiler-binding-linux-x64-musl@0.5.0':
+ resolution: {integrity: sha512-LlaSO5v3UC6IxuTKXDViWV/fFHYhLKSO9Of118lNBXv/sjIWwziU+jjENxPgxfq/4oUeOu+613y6H93LBPNTOA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
- '@ampproject/remapping@2.3.0':
- resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
- engines: {node: '>=6.0.0'}
+ '@astrojs/compiler-binding-wasm32-wasi@0.4.1':
+ resolution: {integrity: sha512-vNLxIv41ZE+nmPFtw24cRW5ZXG+ZPcAGtgigtjCP8lvcxKI7u2GrXoMsCgEH5fMw8WCEJpwLvsVBg15rJKAkyA==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
- '@angular-devkit/architect@0.2200.3':
- resolution: {integrity: sha512-Ru+ucNkTZr98gmeaBYjq3zZwh32yGofAeB8+GJL/ZNy0x+7NzK6b+OatdzwT4l7mCWFC5vL8iYu0B4++M66Jpg==}
- engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
- hasBin: true
+ '@astrojs/compiler-binding-wasm32-wasi@0.5.0':
+ resolution: {integrity: sha512-IP+Cp0m9yKg/AUT47077vHEaAOh/oT/iUZx1PDnV2GJzUxLSEotdQy5Hhv+ycvEadO/DbETSJfAWeV7kte4etQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [wasm32]
- '@angular-devkit/core@22.0.3':
- resolution: {integrity: sha512-pBjo1JKwI8GbNdTo/Z0g+ZekqlTBCJWmzIC5fgGW9q5eRjl1y+5N5jlX8UAyyMCeUTTwsfpQdkAM2jyi/jcvjA==}
- engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
- peerDependencies:
- chokidar: ^5.0.0
- peerDependenciesMeta:
- chokidar:
- optional: true
+ '@astrojs/compiler-binding-win32-arm64-msvc@0.4.1':
+ resolution: {integrity: sha512-/xTDgRsFDoTh0/+KFXJ74DY4Jqn8CoSHwa8UP5RAblHfnRHkenwfSl4zYDET61O9vXKLk09UzHjjq09yP20/AQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
- '@angular-devkit/schematics@22.0.3':
- resolution: {integrity: sha512-aIp5sQDHdhyLbeVJF/k3w079XhW91mNAo2OliZllBCjoYhkIXNnWECOx5y2nXtCChyFJA2+ZgNST7NIDvtz1/w==}
- engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
+ '@astrojs/compiler-binding-win32-arm64-msvc@0.5.0':
+ resolution: {integrity: sha512-v6plwy5GQBGvfv4QgiGhy/qkkQvYKW7Zh2vBArOnsGEDNHyUS43CWYwIQdw4ZdVVmLsFyhwTiueDZEP6zejddQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
- '@angular/build@22.0.3':
- resolution: {integrity: sha512-pwFDRCp+r8JK+fCtScPldizcS75wSpn3u/4goDf2FRa4Y9wzTvq6T0XpFHqdpgq6HcIlIZWwAqqW6XqEM9/pKQ==}
- engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
- peerDependencies:
- '@angular/compiler': ^22.0.0
- '@angular/compiler-cli': ^22.0.0
- '@angular/core': ^22.0.0
- '@angular/localize': ^22.0.0
- '@angular/platform-browser': ^22.0.0
- '@angular/platform-server': ^22.0.0
- '@angular/service-worker': ^22.0.0
- '@angular/ssr': ^22.0.3
- istanbul-lib-instrument: ^6.0.0
- karma: ^6.4.0
- less: ^4.2.0
- ng-packagr: ^22.0.0
- postcss: ^8.4.0
- tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0
- tslib: ^2.3.0
- typescript: '>=6.0 <6.1'
- vitest: ^4.0.8
- peerDependenciesMeta:
- '@angular/core':
- optional: true
- '@angular/localize':
- optional: true
- '@angular/platform-browser':
- optional: true
- '@angular/platform-server':
- optional: true
- '@angular/service-worker':
- optional: true
- '@angular/ssr':
- optional: true
- istanbul-lib-instrument:
- optional: true
- karma:
- optional: true
- less:
- optional: true
- ng-packagr:
- optional: true
- postcss:
- optional: true
- tailwindcss:
- optional: true
- vitest:
- optional: true
+ '@astrojs/compiler-binding-win32-x64-msvc@0.4.1':
+ resolution: {integrity: sha512-0x5J6iHZO0Fjo/CVzoIbXKzWnGESftDbEUQ/oXQ61HhUAFoR7+T1jfToZSNAS+gYyBXHSTpMWYC7lzarbhClcg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
- '@angular/cli@22.0.3':
- resolution: {integrity: sha512-YgFzfQu3Il6Aka8IdH4pk7faieICaca5Wklke0jMTKBUxzLGWw82X7+J/Lox7FERb6LHtxiHpa6ttXqerCZvgg==}
- engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
- hasBin: true
+ '@astrojs/compiler-binding-win32-x64-msvc@0.5.0':
+ resolution: {integrity: sha512-SgM158cSCJ248UIXaCCW2WqSTjOoFlDv93ed/ATguJqYpZNNVMlOdcPlgNH7WYj/OYeD0rIQr7XyRAYhB7+G1A==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
- '@angular/common@22.0.2':
- resolution: {integrity: sha512-XSkHYRwrM54v4GZ+fg9KU1KbSIE/iQF33VXKo5zqVNKO11MnAbJ59qzyqX/5EzSeogHyBoHApprFKACsCAKm/Q==}
- engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0}
- peerDependencies:
- '@angular/core': 22.0.2
- rxjs: ^6.5.3 || ^7.4.0
+ '@astrojs/compiler-binding@0.4.1':
+ resolution: {integrity: sha512-ZYVDW1P58OXyxqZbOMp+/2U9KA7y2esIx9r4pWdpZ/l6fCZhaw4ul+D7EgpRVxYLkyTWqzANbTTUFGPFP8zDHA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
- '@angular/compiler-cli@22.0.2':
- resolution: {integrity: sha512-jBGGWdbrPQhIHWUz523CLQqEh/iYWxzZt7U9y0Ocdbas4/OlHcqaERO/K4ULkxclWX8MWYQoxal/MZbYOBfXgw==}
- engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0}
- hasBin: true
- peerDependencies:
- '@angular/compiler': 22.0.2
- typescript: '>=6.0 <6.1'
- peerDependenciesMeta:
- typescript:
- optional: true
+ '@astrojs/compiler-binding@0.5.0':
+ resolution: {integrity: sha512-PxFTx3WoxQnbgUvvwmF6LRQwhHO77a4pewOtJvzxlrYtQ90tLgomLKvks/akrd2iix2ngGlOhxQonKNd8YoBHg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
- '@angular/compiler@22.0.2':
- resolution: {integrity: sha512-5G+h/4/iCfqdTBsSgjB46Oe4oC6jXutCpFc5JYWRpnJWsbp3UfwRhwGVWIV1DBPnR8H/3QZzteRP1jINiH5+hg==}
- engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0}
+ '@astrojs/compiler-rs@0.4.1':
+ resolution: {integrity: sha512-//NmAuRhy7eU9iP0ceI5Pymy55M+nUZ//kS6XeOyhBWdDib2KbJOyFaVJ52k7sDkJwTKVox7oPu3SpYiVnGm5A==}
+ engines: {node: '>=22.12.0'}
- '@angular/core@22.0.2':
- resolution: {integrity: sha512-YMs6OZNeXh4tg67ePwSRN426WYvjqGdjxEwLrdOONKAruOmJAzW/Tqe328k/4SHfdbJTR87GPpRi5FzVP43DRA==}
- engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0}
- peerDependencies:
- '@angular/compiler': 22.0.2
- rxjs: ^6.5.3 || ^7.4.0
- zone.js: ~0.15.0 || ~0.16.0
- peerDependenciesMeta:
- '@angular/compiler':
- optional: true
- zone.js:
- optional: true
+ '@astrojs/compiler-rs@0.5.0':
+ resolution: {integrity: sha512-2xIypn5R33FRWCXXXv0sfbDj8xcOvc2VmIbteytxMjOzP9LiGfvqaAFJjhdAjzhs6+ZKzYzbSE79rrPObYW5mg==}
+ engines: {node: '>=22.12.0'}
- '@angular/forms@22.0.2':
- resolution: {integrity: sha512-k2WhkE8Of8/JRYEojSgfygiXbP6I7f/yZ/jgJzFGRC1FlF5w5erQMFx8KPg1J5CRE8kYPzW8rM4tSVCq7AaDUg==}
- engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0}
- peerDependencies:
- '@angular/common': 22.0.2
- '@angular/core': 22.0.2
- '@angular/platform-browser': 22.0.2
- rxjs: ^6.5.3 || ^7.4.0
-
- '@angular/platform-browser@22.0.2':
- resolution: {integrity: sha512-xUkpJo/Jwa7rgpoSnZs5TeuOD3SDQL+CPJrMGjHivsqWMcAqzSNnIOcbNDJRSxAYkZ9zlJ1+h39JWSUk99rRBw==}
- engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0}
+ '@astrojs/internal-helpers@0.11.0':
+ resolution: {integrity: sha512-3rzxJ+xbo0+8YyqOzLziIN32wmsHdCjEVz2sGOpRxJ+Ben/KiLph4ItxBy1abEL+E8fkRzqjg0rfXmaHJGw9JA==}
+
+ '@astrojs/language-server@2.17.1':
+ resolution: {integrity: sha512-gG7bvMVNIXgoSe1pM9dI1HsSDLU1EIc/dSAYQ0DuReLyLkOBjsiqvaRYgQltWaldLxh0bNEqjgreLfjd9OnUxQ==}
+ hasBin: true
peerDependencies:
- '@angular/animations': 22.0.2
- '@angular/common': 22.0.2
- '@angular/core': 22.0.2
+ prettier: ^3.0.0
+ prettier-plugin-astro: '>=0.11.0'
peerDependenciesMeta:
- '@angular/animations':
+ prettier:
+ optional: true
+ prettier-plugin-astro:
optional: true
- '@angular/platform-server@22.0.2':
- resolution: {integrity: sha512-Od7vS94fasYpQ0tTSsCVe4c4yuXUW0ByffHOrpqkNsqZIAQwwFQE4DtblJijK9nRsu2AO41SBBQ33OFmR8fRrA==}
- engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0}
- peerDependencies:
- '@angular/common': 22.0.2
- '@angular/compiler': 22.0.2
- '@angular/core': 22.0.2
- '@angular/platform-browser': 22.0.2
- rxjs: ^6.5.3 || ^7.4.0
-
- '@angular/router@22.0.2':
- resolution: {integrity: sha512-uiYlcbOyBliFq1v7O3nMyZtM8scDBurjk4AU2wEPWxSVAXuEjyfnAvowyPzVzGYAEKrsYtcg2TWSsQraqHUbnA==}
- engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0}
- peerDependencies:
- '@angular/common': 22.0.2
- '@angular/core': 22.0.2
- '@angular/platform-browser': 22.0.2
- rxjs: ^6.5.3 || ^7.4.0
+ '@astrojs/markdown-satteri@0.4.2':
+ resolution: {integrity: sha512-g4QehXnB/MzxQWnSf17NciFInMqEJy9948p8cc7zGg/r7995m0Ln5PMr3Xlnj24iey1LchaoZ3SzTOa3D4P/3w==}
- '@angular/ssr@22.0.3':
- resolution: {integrity: sha512-zs0tWPfQTpxiel+W8B6WyTIQq/Rst9izGM6dM5l9uEwxWV6HRlxlEd/XM0tcUjjqbYkUkxNTo43qnzujkMrEEA==}
+ '@astrojs/mdx@8.0.2':
+ resolution: {integrity: sha512-WedIVP2Bu8fXSzxb3ZYZ8xDrWWjf2SRKCneh52Llhoa+O3lcpHPhoZVP3FerlivUaH/0LJz2yVaCNvMdg0u8Bw==}
+ engines: {node: '>=22.12.0'}
peerDependencies:
- '@angular/common': ^22.0.0
- '@angular/core': ^22.0.0
- '@angular/platform-server': ^22.0.0
- '@angular/router': ^22.0.0
+ '@astrojs/markdown-remark': ^7.3.0
+ '@astrojs/markdown-satteri': ^0.4.0
+ astro: ^7.2.10
peerDependenciesMeta:
- '@angular/platform-server':
+ '@astrojs/markdown-remark':
optional: true
- '@asamuzakjp/css-color@5.1.11':
- resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==}
- engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
+ '@astrojs/prism@4.0.2':
+ resolution: {integrity: sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA==}
+ engines: {node: '>=22.12.0'}
- '@asamuzakjp/dom-selector@6.8.1':
- resolution: {integrity: sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==}
+ '@astrojs/sitemap@3.7.4':
+ resolution: {integrity: sha512-LbKNC24bdUWcQf/pThB6qLlSqHojxGjZDURIzFocY8rlWnAn2t74nnhnK6S5x0NHriHoAduLEpVjRykmeGiVvA==}
- '@asamuzakjp/generational-cache@1.0.1':
- resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==}
- engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
+ '@astrojs/telemetry@3.3.3':
+ resolution: {integrity: sha512-C1TLn5sPJr0x4vk56piHWKbnqlEB8BKyte5Y45V02U+D7BGO5eMqZDH5aPjnkXQWJggvmsTXxH03QMZ9NgWLzQ==}
+ engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0}
- '@asamuzakjp/nwsapi@2.3.9':
- resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==}
+ '@astrojs/yaml2ts@0.2.4':
+ resolution: {integrity: sha512-8oddpOae35pJsXPQXhTkM0ypfKPskVsh2bCxRtbf7e+/Epw2nReakFYpLKjZMEr75CsoF203PMnCocpfz0s69A==}
- '@babel/code-frame@7.29.7':
- resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==}
+ '@babel/helper-string-parser@7.29.7':
+ resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==}
engines: {node: '>=6.9.0'}
- '@babel/compat-data@7.29.7':
- resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==}
+ '@babel/helper-validator-identifier@7.29.7':
+ resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==}
engines: {node: '>=6.9.0'}
- '@babel/core@7.29.0':
- resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==}
- engines: {node: '>=6.9.0'}
+ '@babel/parser@7.29.9':
+ resolution: {integrity: sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
- '@babel/generator@7.29.7':
- resolution: {integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==}
+ '@babel/types@7.29.8':
+ resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==}
engines: {node: '>=6.9.0'}
- '@babel/helper-annotate-as-pure@7.27.3':
- resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==}
- engines: {node: '>=6.9.0'}
+ '@bruits/satteri-darwin-arm64@0.10.5':
+ resolution: {integrity: sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==}
+ cpu: [arm64]
+ os: [darwin]
- '@babel/helper-compilation-targets@7.29.7':
- resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==}
- engines: {node: '>=6.9.0'}
+ '@bruits/satteri-darwin-x64@0.10.5':
+ resolution: {integrity: sha512-IjnLe3nKspq6qaeqGgjT7MT8VrTV74yWRlaag7ZdNsI8TDAYZ0iPxMCo+9KQZHUk5EyVB+reBI/PFWL5KuFw9Q==}
+ cpu: [x64]
+ os: [darwin]
- '@babel/helper-globals@7.29.7':
- resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==}
- engines: {node: '>=6.9.0'}
+ '@bruits/satteri-linux-arm64-gnu@0.10.5':
+ resolution: {integrity: sha512-glkYXZCJywjP13v67eAyAMSJdF+ncvEbYvgi/wOtffL9tQ27lr/zsyzUfgs+ovjJ9d8JNQKiXeiArJcX8PJL9w==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
- '@babel/helper-module-imports@7.29.7':
- resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==}
- engines: {node: '>=6.9.0'}
+ '@bruits/satteri-linux-arm64-musl@0.10.5':
+ resolution: {integrity: sha512-yWdgG1g17Nh2QyGVlFUxGRa3FEFwiMcpZEyMNWkbM3deC94cmVc+/i9OuyFpdKuWo3GkgoCtYVOoxk1uCnCZIA==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
- '@babel/helper-module-transforms@7.29.7':
- resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
+ '@bruits/satteri-linux-x64-gnu@0.10.5':
+ resolution: {integrity: sha512-FVaLoPT1fBgGl0J+AYebyyXJYBachGl8Oyyrf1lye4RTqCB4S0Gwkj1uM9RJyThUOvx5VUmAT1CnNh1SFHA+kw==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
- '@babel/helper-split-export-declaration@7.24.7':
- resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==}
- engines: {node: '>=6.9.0'}
+ '@bruits/satteri-linux-x64-musl@0.10.5':
+ resolution: {integrity: sha512-EHpVAx2bqW3GINHTKkljtxVfQmVDGWIuwOYOP5YghTj+0PkBa2o8oKPRtQ9Kbsr1Fye8jtUcDjhwj2jMNugZKg==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
- '@babel/helper-string-parser@7.29.7':
- resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==}
- engines: {node: '>=6.9.0'}
+ '@bruits/satteri-wasm32-wasi@0.10.5':
+ resolution: {integrity: sha512-ypz8c/Zmipxp4IoeDa228Gstv6TLzVmNs3yC6wKCoNSOjx1iwpgzu87Y3hTkXFdwChVGU85qeUDuOIarGUZQLw==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
- '@babel/helper-validator-identifier@7.29.7':
- resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==}
- engines: {node: '>=6.9.0'}
+ '@bruits/satteri-win32-arm64-msvc@0.10.5':
+ resolution: {integrity: sha512-siTV88nb0LRqNpkL2gXboqCwVdq95sLtzMHS1/3eONV2gLbB3NAK46wmSMvCO/yquBvI2lvaFIfd8P12ecsxBw==}
+ cpu: [arm64]
+ os: [win32]
- '@babel/helper-validator-option@7.29.7':
- resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==}
- engines: {node: '>=6.9.0'}
+ '@bruits/satteri-win32-x64-msvc@0.10.5':
+ resolution: {integrity: sha512-C3IfPvfvMXmlzBxaMPKFS1XiuV9pu2mC7YqkPk7PSvTgPZ8gbdASIpHpztDLvTTQjqZ0z1Ol8tK5X+V6XXC0wQ==}
+ cpu: [x64]
+ os: [win32]
- '@babel/helpers@7.29.7':
- resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==}
- engines: {node: '>=6.9.0'}
+ '@capsizecss/unpack@4.0.1':
+ resolution: {integrity: sha512-CuNiSqg7+e1cO/GjffyMOm5Tt2jUF9CWHHnvQ/UkqvtkGfHdgwEC0wpmq7fkN3gxwpRnrAN0WzO3vREKmNolMQ==}
+ engines: {node: '>=18'}
- '@babel/parser@7.29.7':
- resolution: {integrity: sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==}
- engines: {node: '>=6.0.0'}
- hasBin: true
+ '@clack/core@1.5.1':
+ resolution: {integrity: sha512-iHTrHA8MtVuLl2TfZySmcKv1qO2PoyC9Z7pfSDozEuV5vtY3/wcOPKJXlqJ5Oq2Cx5DDGQGAMVx6HZfRRoVEbQ==}
+ engines: {node: '>= 20.12.0'}
- '@babel/template@7.29.7':
- resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==}
- engines: {node: '>=6.9.0'}
+ '@clack/prompts@1.8.1':
+ resolution: {integrity: sha512-dlT1m5e/0yUL0kRNcQn7yGLVThkgbB0Ga/1AmfDDC/8ik6AIiSf2QLQO2zPYvefsHP0aFgxO93cVLCCfDp7kzQ==}
+ engines: {node: '>= 20.12.0'}
- '@babel/traverse@7.29.7':
- resolution: {integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==}
- engines: {node: '>=6.9.0'}
+ '@emmetio/abbreviation@2.3.3':
+ resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==}
- '@babel/types@7.29.7':
- resolution: {integrity: sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==}
- engines: {node: '>=6.9.0'}
+ '@emmetio/css-abbreviation@2.1.8':
+ resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==}
- '@bramus/specificity@2.4.2':
- resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==}
- hasBin: true
+ '@emmetio/css-parser@0.4.1':
+ resolution: {integrity: sha512-2bC6m0MV/voF4CTZiAbG5MWKbq5EBmDPKu9Sb7s7nVcEzNQlrZP6mFFFlIaISM8X6514H9shWMme1fCm8cWAfQ==}
- '@csstools/color-helpers@6.0.2':
- resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==}
- engines: {node: '>=20.19.0'}
+ '@emmetio/html-matcher@1.3.0':
+ resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==}
- '@csstools/css-calc@3.2.1':
- resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==}
- engines: {node: '>=20.19.0'}
- peerDependencies:
- '@csstools/css-parser-algorithms': ^4.0.0
- '@csstools/css-tokenizer': ^4.0.0
+ '@emmetio/scanner@1.0.4':
+ resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==}
- '@csstools/css-color-parser@4.1.7':
- resolution: {integrity: sha512-CmjJFQTFQx/U/xNJhSjCQ0ilpesPmNQ8+eOUeM/+kDOVW33qsIjeOXc27vrQDdWVkf83ZSWwtg7kXSUvKDJ8cQ==}
- engines: {node: '>=20.19.0'}
- peerDependencies:
- '@csstools/css-parser-algorithms': ^4.0.0
- '@csstools/css-tokenizer': ^4.0.0
+ '@emmetio/stream-reader-utils@0.1.0':
+ resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==}
- '@csstools/css-parser-algorithms@4.0.0':
- resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==}
- engines: {node: '>=20.19.0'}
- peerDependencies:
- '@csstools/css-tokenizer': ^4.0.0
+ '@emmetio/stream-reader@2.2.0':
+ resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==}
- '@csstools/css-syntax-patches-for-csstree@1.1.5':
- resolution: {integrity: sha512-oNjBvzLq2GPZtJphCjLqXow/cHySHSgtxvKZb7OqSZ/xHgw6NWNhfad+6AB9cLeVm6eA9d/qMll3JdEHjy6M+A==}
- peerDependencies:
- css-tree: ^3.2.1
- peerDependenciesMeta:
- css-tree:
- optional: true
+ '@emnapi/core@1.11.1':
+ resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==}
- '@csstools/css-tokenizer@4.0.0':
- resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==}
- engines: {node: '>=20.19.0'}
+ '@emnapi/core@1.11.3':
+ resolution: {integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==}
- '@esbuild/aix-ppc64@0.27.7':
- resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==}
- engines: {node: '>=18'}
- cpu: [ppc64]
- os: [aix]
+ '@emnapi/runtime@1.11.1':
+ resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==}
+
+ '@emnapi/runtime@1.11.3':
+ resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==}
- '@esbuild/aix-ppc64@0.28.1':
- resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==}
+ '@emnapi/wasi-threads@1.2.2':
+ resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==}
+
+ '@emnapi/wasi-threads@1.2.3':
+ resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==}
+
+ '@esbuild/aix-ppc64@0.28.2':
+ resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
- '@esbuild/android-arm64@0.27.7':
- resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [android]
-
- '@esbuild/android-arm64@0.28.1':
- resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==}
+ '@esbuild/android-arm64@0.28.2':
+ resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
- '@esbuild/android-arm@0.27.7':
- resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==}
- engines: {node: '>=18'}
- cpu: [arm]
- os: [android]
-
- '@esbuild/android-arm@0.28.1':
- resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==}
+ '@esbuild/android-arm@0.28.2':
+ resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
- '@esbuild/android-x64@0.27.7':
- resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [android]
-
- '@esbuild/android-x64@0.28.1':
- resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==}
+ '@esbuild/android-x64@0.28.2':
+ resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
- '@esbuild/darwin-arm64@0.27.7':
- resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [darwin]
-
- '@esbuild/darwin-arm64@0.28.1':
- resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==}
+ '@esbuild/darwin-arm64@0.28.2':
+ resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
- '@esbuild/darwin-x64@0.27.7':
- resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [darwin]
-
- '@esbuild/darwin-x64@0.28.1':
- resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==}
+ '@esbuild/darwin-x64@0.28.2':
+ resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
- '@esbuild/freebsd-arm64@0.27.7':
- resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [freebsd]
-
- '@esbuild/freebsd-arm64@0.28.1':
- resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==}
+ '@esbuild/freebsd-arm64@0.28.2':
+ resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
- '@esbuild/freebsd-x64@0.27.7':
- resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [freebsd]
-
- '@esbuild/freebsd-x64@0.28.1':
- resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==}
+ '@esbuild/freebsd-x64@0.28.2':
+ resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
- '@esbuild/linux-arm64@0.27.7':
- resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [linux]
-
- '@esbuild/linux-arm64@0.28.1':
- resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==}
+ '@esbuild/linux-arm64@0.28.2':
+ resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
- '@esbuild/linux-arm@0.27.7':
- resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==}
- engines: {node: '>=18'}
- cpu: [arm]
- os: [linux]
-
- '@esbuild/linux-arm@0.28.1':
- resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==}
+ '@esbuild/linux-arm@0.28.2':
+ resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
- '@esbuild/linux-ia32@0.27.7':
- resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==}
- engines: {node: '>=18'}
- cpu: [ia32]
- os: [linux]
-
- '@esbuild/linux-ia32@0.28.1':
- resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==}
+ '@esbuild/linux-ia32@0.28.2':
+ resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
- '@esbuild/linux-loong64@0.27.7':
- resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==}
- engines: {node: '>=18'}
- cpu: [loong64]
- os: [linux]
-
- '@esbuild/linux-loong64@0.28.1':
- resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==}
+ '@esbuild/linux-loong64@0.28.2':
+ resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
- '@esbuild/linux-mips64el@0.27.7':
- resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==}
- engines: {node: '>=18'}
- cpu: [mips64el]
- os: [linux]
-
- '@esbuild/linux-mips64el@0.28.1':
- resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==}
+ '@esbuild/linux-mips64el@0.28.2':
+ resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
- '@esbuild/linux-ppc64@0.27.7':
- resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==}
- engines: {node: '>=18'}
- cpu: [ppc64]
- os: [linux]
-
- '@esbuild/linux-ppc64@0.28.1':
- resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==}
+ '@esbuild/linux-ppc64@0.28.2':
+ resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
- '@esbuild/linux-riscv64@0.27.7':
- resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==}
- engines: {node: '>=18'}
- cpu: [riscv64]
- os: [linux]
-
- '@esbuild/linux-riscv64@0.28.1':
- resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==}
+ '@esbuild/linux-riscv64@0.28.2':
+ resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
- '@esbuild/linux-s390x@0.27.7':
- resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==}
- engines: {node: '>=18'}
- cpu: [s390x]
- os: [linux]
-
- '@esbuild/linux-s390x@0.28.1':
- resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==}
+ '@esbuild/linux-s390x@0.28.2':
+ resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
- '@esbuild/linux-x64@0.27.7':
- resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [linux]
-
- '@esbuild/linux-x64@0.28.1':
- resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==}
+ '@esbuild/linux-x64@0.28.2':
+ resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
- '@esbuild/netbsd-arm64@0.27.7':
- resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [netbsd]
-
- '@esbuild/netbsd-arm64@0.28.1':
- resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==}
+ '@esbuild/netbsd-arm64@0.28.2':
+ resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
- '@esbuild/netbsd-x64@0.27.7':
- resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==}
+ '@esbuild/netbsd-x64@0.28.2':
+ resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
- '@esbuild/netbsd-x64@0.28.1':
- resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==}
+ '@esbuild/openbsd-arm64@0.28.2':
+ resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==}
engines: {node: '>=18'}
- cpu: [x64]
- os: [netbsd]
+ cpu: [arm64]
+ os: [openbsd]
- '@esbuild/openbsd-arm64@0.27.7':
- resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==}
+ '@esbuild/openbsd-x64@0.28.2':
+ resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==}
engines: {node: '>=18'}
- cpu: [arm64]
+ cpu: [x64]
os: [openbsd]
- '@esbuild/openbsd-arm64@0.28.1':
- resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==}
+ '@esbuild/openharmony-arm64@0.28.2':
+ resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==}
engines: {node: '>=18'}
cpu: [arm64]
- os: [openbsd]
+ os: [openharmony]
- '@esbuild/openbsd-x64@0.27.7':
- resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==}
+ '@esbuild/sunos-x64@0.28.2':
+ resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==}
engines: {node: '>=18'}
cpu: [x64]
- os: [openbsd]
+ os: [sunos]
- '@esbuild/openbsd-x64@0.28.1':
- resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [openbsd]
-
- '@esbuild/openharmony-arm64@0.27.7':
- resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==}
+ '@esbuild/win32-arm64@0.28.2':
+ resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==}
engines: {node: '>=18'}
cpu: [arm64]
- os: [openharmony]
+ os: [win32]
- '@esbuild/openharmony-arm64@0.28.1':
- resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==}
+ '@esbuild/win32-ia32@0.28.2':
+ resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==}
engines: {node: '>=18'}
- cpu: [arm64]
- os: [openharmony]
+ cpu: [ia32]
+ os: [win32]
- '@esbuild/sunos-x64@0.27.7':
- resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==}
+ '@esbuild/win32-x64@0.28.2':
+ resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==}
engines: {node: '>=18'}
cpu: [x64]
- os: [sunos]
+ os: [win32]
- '@esbuild/sunos-x64@0.28.1':
- resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [sunos]
+ '@fontsource/be-vietnam-pro@5.3.0':
+ resolution: {integrity: sha512-xhAQBGHDxP5BF8IJxedy5MoWUmc1DlPCcZbMLhvnPkf8TaYCbbUVs3LjpuJ4BYdTrdiCLaewNaY8z+owq/FqFw==}
- '@esbuild/win32-arm64@0.27.7':
- resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==}
- engines: {node: '>=18'}
- cpu: [arm64]
- os: [win32]
+ '@fontsource/plus-jakarta-sans@5.3.0':
+ resolution: {integrity: sha512-9WRw3G74Ve4cyPApAZSXLPY5DiLOZXDn7Q7dIBjFBpA0Pj56ljDItEdy2UUajjJxRuTg2HkMLO5C3K2nAQORWg==}
- '@esbuild/win32-arm64@0.28.1':
- resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==}
+ '@img/colour@1.1.0':
+ resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
engines: {node: '>=18'}
+
+ '@img/sharp-darwin-arm64@0.35.4':
+ resolution: {integrity: sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==}
+ engines: {node: '>=20.9.0'}
cpu: [arm64]
- os: [win32]
+ os: [darwin]
- '@esbuild/win32-ia32@0.27.7':
- resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==}
- engines: {node: '>=18'}
- cpu: [ia32]
- os: [win32]
+ '@img/sharp-darwin-x64@0.35.4':
+ resolution: {integrity: sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==}
+ engines: {node: '>=20.9.0'}
+ cpu: [x64]
+ os: [darwin]
- '@esbuild/win32-ia32@0.28.1':
- resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==}
- engines: {node: '>=18'}
- cpu: [ia32]
- os: [win32]
+ '@img/sharp-freebsd-wasm32@0.35.4':
+ resolution: {integrity: sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==}
+ engines: {node: '>=20.9.0'}
+ os: [freebsd]
- '@esbuild/win32-x64@0.27.7':
- resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==}
- engines: {node: '>=18'}
- cpu: [x64]
- os: [win32]
+ '@img/sharp-libvips-darwin-arm64@1.3.3':
+ resolution: {integrity: sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==}
+ cpu: [arm64]
+ os: [darwin]
- '@esbuild/win32-x64@0.28.1':
- resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==}
- engines: {node: '>=18'}
+ '@img/sharp-libvips-darwin-x64@1.3.3':
+ resolution: {integrity: sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==}
cpu: [x64]
- os: [win32]
-
- '@exodus/bytes@1.15.1':
- resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==}
- engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
- peerDependencies:
- '@noble/hashes': ^1.8.0 || ^2.0.0
- peerDependenciesMeta:
- '@noble/hashes':
- optional: true
+ os: [darwin]
- '@gar/promise-retry@1.0.3':
- resolution: {integrity: sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ '@img/sharp-libvips-linux-arm64@1.3.3':
+ resolution: {integrity: sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
- '@harperfast/extended-iterable@1.0.3':
- resolution: {integrity: sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw==}
+ '@img/sharp-libvips-linux-arm@1.3.3':
+ resolution: {integrity: sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
- '@hono/node-server@1.19.14':
- resolution: {integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==}
- engines: {node: '>=18.14.1'}
- peerDependencies:
- hono: ^4
+ '@img/sharp-libvips-linux-ppc64@1.3.3':
+ resolution: {integrity: sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
- '@inquirer/ansi@2.0.7':
- resolution: {integrity: sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==}
- engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
+ '@img/sharp-libvips-linux-riscv64@1.3.3':
+ resolution: {integrity: sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
- '@inquirer/checkbox@5.2.1':
- resolution: {integrity: sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw==}
- engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
- peerDependencies:
- '@types/node': '>=18'
- peerDependenciesMeta:
- '@types/node':
- optional: true
+ '@img/sharp-libvips-linux-s390x@1.3.3':
+ resolution: {integrity: sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
- '@inquirer/confirm@6.0.12':
- resolution: {integrity: sha512-h9FgGun3QwVYNj5TWIZZ+slii73bMoBFjPfVIGtnFuL4t8gBiNDV9PcSfIzkuxvgquJKt9nr1QzszpBzTbH8Og==}
- engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'}
- peerDependencies:
- '@types/node': '>=18'
- peerDependenciesMeta:
- '@types/node':
- optional: true
+ '@img/sharp-libvips-linux-x64@1.3.3':
+ resolution: {integrity: sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
- '@inquirer/confirm@6.1.1':
- resolution: {integrity: sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==}
- engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
- peerDependencies:
- '@types/node': '>=18'
- peerDependenciesMeta:
- '@types/node':
- optional: true
+ '@img/sharp-libvips-linuxmusl-arm64@1.3.3':
+ resolution: {integrity: sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
- '@inquirer/core@11.2.1':
- resolution: {integrity: sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==}
- engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
- peerDependencies:
- '@types/node': '>=18'
- peerDependenciesMeta:
- '@types/node':
- optional: true
+ '@img/sharp-libvips-linuxmusl-x64@1.3.3':
+ resolution: {integrity: sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
- '@inquirer/editor@5.2.2':
- resolution: {integrity: sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg==}
- engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
- peerDependencies:
- '@types/node': '>=18'
- peerDependenciesMeta:
- '@types/node':
- optional: true
+ '@img/sharp-linux-arm64@0.35.4':
+ resolution: {integrity: sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==}
+ engines: {node: '>=20.9.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
- '@inquirer/expand@5.1.1':
- resolution: {integrity: sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g==}
- engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
- peerDependencies:
- '@types/node': '>=18'
- peerDependenciesMeta:
- '@types/node':
- optional: true
+ '@img/sharp-linux-arm@0.35.4':
+ resolution: {integrity: sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==}
+ engines: {node: '>=20.9.0'}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
- '@inquirer/external-editor@3.0.3':
- resolution: {integrity: sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA==}
- engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
- peerDependencies:
- '@types/node': '>=18'
- peerDependenciesMeta:
- '@types/node':
- optional: true
+ '@img/sharp-linux-ppc64@0.35.4':
+ resolution: {integrity: sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==}
+ engines: {node: '>=20.9.0'}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
- '@inquirer/figures@2.0.7':
- resolution: {integrity: sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==}
- engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
+ '@img/sharp-linux-riscv64@0.35.4':
+ resolution: {integrity: sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==}
+ engines: {node: '>=20.9.0'}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
- '@inquirer/input@5.1.2':
- resolution: {integrity: sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg==}
- engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
- peerDependencies:
- '@types/node': '>=18'
- peerDependenciesMeta:
- '@types/node':
- optional: true
+ '@img/sharp-linux-s390x@0.35.4':
+ resolution: {integrity: sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==}
+ engines: {node: '>=20.9.0'}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
- '@inquirer/number@4.1.1':
- resolution: {integrity: sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA==}
- engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
- peerDependencies:
- '@types/node': '>=18'
- peerDependenciesMeta:
- '@types/node':
- optional: true
+ '@img/sharp-linux-x64@0.35.4':
+ resolution: {integrity: sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==}
+ engines: {node: '>=20.9.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
- '@inquirer/password@5.1.1':
- resolution: {integrity: sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg==}
- engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
- peerDependencies:
- '@types/node': '>=18'
- peerDependenciesMeta:
- '@types/node':
- optional: true
+ '@img/sharp-linuxmusl-arm64@0.35.4':
+ resolution: {integrity: sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==}
+ engines: {node: '>=20.9.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
- '@inquirer/prompts@8.4.2':
- resolution: {integrity: sha512-XJmn/wY4AX56l1BRU+ZjDrFtg9+2uBEi4JvJQj82kwJDQKiPgSn4CEsbfGGygS4Gw6rkL4W18oATjfVfaqub2Q==}
- engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'}
- peerDependencies:
- '@types/node': '>=18'
- peerDependenciesMeta:
- '@types/node':
- optional: true
+ '@img/sharp-linuxmusl-x64@0.35.4':
+ resolution: {integrity: sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==}
+ engines: {node: '>=20.9.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
- '@inquirer/rawlist@5.3.1':
- resolution: {integrity: sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og==}
- engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
- peerDependencies:
- '@types/node': '>=18'
- peerDependenciesMeta:
- '@types/node':
- optional: true
+ '@img/sharp-wasm32@0.35.4':
+ resolution: {integrity: sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==}
+ engines: {node: '>=20.9.0'}
- '@inquirer/search@4.2.1':
- resolution: {integrity: sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g==}
- engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
- peerDependencies:
- '@types/node': '>=18'
- peerDependenciesMeta:
- '@types/node':
- optional: true
+ '@img/sharp-webcontainers-wasm32@0.35.4':
+ resolution: {integrity: sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==}
+ engines: {node: '>=20.9.0'}
+ cpu: [wasm32]
- '@inquirer/select@5.2.1':
- resolution: {integrity: sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw==}
- engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
- peerDependencies:
- '@types/node': '>=18'
- peerDependenciesMeta:
- '@types/node':
- optional: true
+ '@img/sharp-win32-arm64@0.35.4':
+ resolution: {integrity: sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==}
+ engines: {node: '>=20.9.0'}
+ cpu: [arm64]
+ os: [win32]
- '@inquirer/type@4.0.7':
- resolution: {integrity: sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==}
- engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
- peerDependencies:
- '@types/node': '>=18'
- peerDependenciesMeta:
- '@types/node':
- optional: true
+ '@img/sharp-win32-ia32@0.35.4':
+ resolution: {integrity: sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==}
+ engines: {node: ^20.9.0}
+ cpu: [ia32]
+ os: [win32]
- '@isaacs/fs-minipass@4.0.1':
- resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
- engines: {node: '>=18.0.0'}
+ '@img/sharp-win32-x64@0.35.4':
+ resolution: {integrity: sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==}
+ engines: {node: '>=20.9.0'}
+ cpu: [x64]
+ os: [win32]
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
@@ -925,564 +706,221 @@ packages:
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
- '@jridgewell/sourcemap-codec@1.5.5':
- resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+ '@jridgewell/sourcemap-codec@1.6.0':
+ resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==}
'@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
- '@listr2/prompt-adapter-inquirer@4.2.3':
- resolution: {integrity: sha512-Co9U3AJ3LW0J8XBHjVoNKA79dMAyFt8EZH3OaKTMcDTj8r+6kG3vSUPq/eGLHT7P0iK3uLaFfhdFYd3033P24g==}
- engines: {node: '>=22.13.0'}
- peerDependencies:
- '@inquirer/prompts': '>= 3 < 9'
- listr2: 10.2.1
-
- '@lmdb/lmdb-darwin-arm64@3.5.4':
- resolution: {integrity: sha512-Kk4Kz3iyu1QiLsLZBS9Af1eSKUC8VR2T+/jyE2iAyuGw2VwK08pp5iTbZnXn6sWu0LogO/RFktMxOjiDA2sS3w==}
- cpu: [arm64]
- os: [darwin]
-
- '@lmdb/lmdb-darwin-x64@3.5.4':
- resolution: {integrity: sha512-BEe5Rp3trn26oxoXOVL5HVDoiYmjUDwr8NRPkBOdUdCSBEorKI+7JrZLRKAdxO+G6cGQLgseXk0gR7qIQa7aGw==}
- cpu: [x64]
- os: [darwin]
-
- '@lmdb/lmdb-linux-arm64@3.5.4':
- resolution: {integrity: sha512-cUXEengO8o60v1SWerJTH4/RH4U3+9jC0/4njp2Z9NdmvaGzhKsbRM2wpXuRYrN8tytsoJCg0SvWEWwHAwLbCA==}
- cpu: [arm64]
- os: [linux]
-
- '@lmdb/lmdb-linux-arm@3.5.4':
- resolution: {integrity: sha512-SGbFR7816uBcTHc2ZY4S6WyOkl9bICnzqTQd2Mv4V/j24cfds88xx2nC6cm/y8zGQL7Ds31YF/5NGxjgcdM5Hw==}
- cpu: [arm]
- os: [linux]
-
- '@lmdb/lmdb-linux-x64@3.5.4':
- resolution: {integrity: sha512-Gxq8jpgOWXwd0PUR+c9R2Ik1/uBnGd5GMIIzRRDqABCkvmjtC3KWcyhesV9jSPCz759isl0NlbsstZ2oyvk8lA==}
- cpu: [x64]
- os: [linux]
-
- '@lmdb/lmdb-win32-arm64@3.5.4':
- resolution: {integrity: sha512-pKv1DJ1bPZAaHkdFsSz5IDfUG8x9vntgquXF9/Dm2xuupcIe/EkLzylpoBxppFVK5vzbV561Dq26jNY2fIMA7g==}
- cpu: [arm64]
- os: [win32]
-
- '@lmdb/lmdb-win32-x64@3.5.4':
- resolution: {integrity: sha512-JF1BmLCm9kGEVZgYmJq43zeQVdHVgAJnTi/NURWEsy6L1ZrrlSmdltS+D17QN4LODwf+1LMXAA9auIZVXtWwzw==}
- cpu: [x64]
- os: [win32]
-
- '@modelcontextprotocol/sdk@1.29.0':
- resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==}
- engines: {node: '>=18'}
+ '@napi-rs/wasm-runtime@1.2.4':
+ resolution: {integrity: sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==}
+ engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0}
peerDependencies:
- '@cfworker/json-schema': ^4.1.1
- zod: ^3.25 || ^4.0
- peerDependenciesMeta:
- '@cfworker/json-schema':
- optional: true
-
- '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4':
- resolution: {integrity: sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==}
- cpu: [arm64]
- os: [darwin]
-
- '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4':
- resolution: {integrity: sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==}
- cpu: [x64]
- os: [darwin]
-
- '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4':
- resolution: {integrity: sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==}
- cpu: [arm64]
- os: [linux]
+ '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4
+ '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4
- '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4':
- resolution: {integrity: sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==}
- cpu: [arm]
- os: [linux]
+ '@oslojs/encoding@1.1.0':
+ resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==}
- '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4':
- resolution: {integrity: sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==}
- cpu: [x64]
- os: [linux]
+ '@oxc-project/types@0.151.0':
+ resolution: {integrity: sha512-J1yXrIlNDZVzE3ada310xeAw7nH8yCAyLPuUIsjKatFPmfn5bS1oW+cM+QsGOtVWd5nhSpbwZWx/rue+r5Z+PA==}
- '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4':
- resolution: {integrity: sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==}
- cpu: [x64]
- os: [win32]
+ '@prettier/parse-srcset@3.1.0':
+ resolution: {integrity: sha512-FIRv2rZotO9NP/r66taYqD1zICpPiBbrECqjKV/xqNotqDxF7fLzzUeK+1RSRx9Tenk0DajR/GcRmTJ2qtHaKQ==}
- '@napi-rs/nice-android-arm-eabi@1.1.1':
- resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==}
- engines: {node: '>= 10'}
+ '@rolldown/binding-android-arm-eabi@1.2.11':
+ resolution: {integrity: sha512-A5kXfGKvKWWZE0TtPrfsvT+q4Y5d1QG8gGUzpYjGydM+fARM9MuX90PrXYXe0XbsDVgyxxNzHo6giCj90bsFNw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [android]
- '@napi-rs/nice-android-arm64@1.1.1':
- resolution: {integrity: sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==}
- engines: {node: '>= 10'}
+ '@rolldown/binding-android-arm64@1.2.11':
+ resolution: {integrity: sha512-z6cTycz+iJ4PVkuL4HHW4DfTfoeU/2nqYYuSOrTmH7yHK5Y0LCOnA03V4ZNxavyVaU1oOqUgIg2klN/s+USGOA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
- '@napi-rs/nice-darwin-arm64@1.1.1':
- resolution: {integrity: sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==}
- engines: {node: '>= 10'}
+ '@rolldown/binding-darwin-arm64@1.2.11':
+ resolution: {integrity: sha512-jShvqNtP6vDC6/A5JOAzbVV+DkgHqhl/ScVCJEbt+TUY6QYz7YnXcrg3sLtFBniro0f/Ld50ZwCWA6f7KYD1nQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
- '@napi-rs/nice-darwin-x64@1.1.1':
- resolution: {integrity: sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==}
- engines: {node: '>= 10'}
+ '@rolldown/binding-darwin-x64@1.2.11':
+ resolution: {integrity: sha512-f2i2xiNWq1Z1l2++q2fuhZRdLAT3aqxD6vRNm1RAxpUoBcdqNB3C0s1Bt+K+PbEx2F5F4gQp6hqKkphCY/xF9w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
- '@napi-rs/nice-freebsd-x64@1.1.1':
- resolution: {integrity: sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==}
- engines: {node: '>= 10'}
+ '@rolldown/binding-freebsd-x64@1.2.11':
+ resolution: {integrity: sha512-4Ir5FSOKIAMr4r0kExpt1s3bMgzJU3rA45AYOHtQpls0oNeqcYBKrWMlckrYH4KCfGLfkfn1tN1dmZPMVsdXow==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
- '@napi-rs/nice-linux-arm-gnueabihf@1.1.1':
- resolution: {integrity: sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==}
- engines: {node: '>= 10'}
+ '@rolldown/binding-linux-arm-gnueabihf@1.2.11':
+ resolution: {integrity: sha512-/gnRDM+39BROzAN/k1OZjDPnDMcZxB/0EUxKjONO5yVkNEvlsoMDrxGNKgZi/ttFriS2gwlDNzB65pvNbFOXIQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
- '@napi-rs/nice-linux-arm64-gnu@1.1.1':
- resolution: {integrity: sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==}
- engines: {node: '>= 10'}
+ '@rolldown/binding-linux-arm64-gnu@1.2.11':
+ resolution: {integrity: sha512-PFaK8HwvAHbaKbBcDNQihjMKYvFnA5hiENx/l5tphTDz1E0WFp32l0A7aq7lyUwGsRw/xSrNIy/gIK4thrSCrw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@napi-rs/nice-linux-arm64-musl@1.1.1':
- resolution: {integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==}
- engines: {node: '>= 10'}
+ '@rolldown/binding-linux-arm64-musl@1.2.11':
+ resolution: {integrity: sha512-AskzJUIKRLPxkruR1wLKewGbOw+EYfU/9lOrBFj4AFrEA8hPpKFnODWNu2WLaNs0QNkEb9QIJufmVZZIL/bJlg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@napi-rs/nice-linux-ppc64-gnu@1.1.1':
- resolution: {integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==}
- engines: {node: '>= 10'}
+ '@rolldown/binding-linux-ppc64-gnu@1.2.11':
+ resolution: {integrity: sha512-qlUGAheh2yh8afH7QBgx0PrRHN85hKnNd78x8MeMhXivuevgd8vgf6/CstOzmNKY/lLTHvNTrPy98cLnAugzJw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ppc64]
os: [linux]
libc: [glibc]
- '@napi-rs/nice-linux-riscv64-gnu@1.1.1':
- resolution: {integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==}
- engines: {node: '>= 10'}
- cpu: [riscv64]
- os: [linux]
- libc: [glibc]
-
- '@napi-rs/nice-linux-s390x-gnu@1.1.1':
- resolution: {integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==}
- engines: {node: '>= 10'}
+ '@rolldown/binding-linux-s390x-gnu@1.2.11':
+ resolution: {integrity: sha512-secpEad+0vCbSfn8upFySkDskv+bGPk3THSDS9Y89yc4rb4kzqHp8Dmyd9BkQW4SnhNXBZCl/6CrO//hZahNJQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [s390x]
os: [linux]
libc: [glibc]
- '@napi-rs/nice-linux-x64-gnu@1.1.1':
- resolution: {integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==}
- engines: {node: '>= 10'}
+ '@rolldown/binding-linux-x64-gnu@1.2.11':
+ resolution: {integrity: sha512-mOVBT3dPpkWm8XBWPmU4bf+U6dYDLeMo/9ojUmis4N0L5uu10qra5vOyngZ7/PSdoE4G9KvRt4bloRxNjLas7A==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@napi-rs/nice-linux-x64-musl@1.1.1':
- resolution: {integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==}
- engines: {node: '>= 10'}
+ '@rolldown/binding-linux-x64-musl@1.2.11':
+ resolution: {integrity: sha512-Is78i9A8Ui4SqcxUwFJ9uMmjDn58IbVTjFWYdQestFEgeuEmHMLGNriXnVJKkwG2YiZjw8cP0zCTyDMdDGtOOg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [musl]
- '@napi-rs/nice-openharmony-arm64@1.1.1':
- resolution: {integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==}
- engines: {node: '>= 10'}
+ '@rolldown/binding-openharmony-arm64@1.2.11':
+ resolution: {integrity: sha512-dUCXneZ87INUMyQ0D+C0HrEBNUPNXHaPmU5GTjyKTJEiussw9Kaj5Ln8UztPe4epV/ffvgNBEadksdYhmW6xJA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
- '@napi-rs/nice-win32-arm64-msvc@1.1.1':
- resolution: {integrity: sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==}
- engines: {node: '>= 10'}
+ '@rolldown/binding-win32-arm64-msvc@1.2.11':
+ resolution: {integrity: sha512-jByxb6qfd+bH1xUd0qnfFnb17i9sWBPY2tOavJ0l3tdr3OTu+Kvtm8cd/JV5nFt657b1VqGltxg9olOEfofXWw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
- '@napi-rs/nice-win32-ia32-msvc@1.1.1':
- resolution: {integrity: sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==}
- engines: {node: '>= 10'}
- cpu: [ia32]
- os: [win32]
-
- '@napi-rs/nice-win32-x64-msvc@1.1.1':
- resolution: {integrity: sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==}
- engines: {node: '>= 10'}
+ '@rolldown/binding-win32-x64-msvc@1.2.11':
+ resolution: {integrity: sha512-/PzKqzAJ03i19oy2ItPvyvaVjOjBCNnfaJs8yvUdGBKmiESgnrJSQ2awd81QzFbbnAmu7YO9ZnJrDCb9VSJPRA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
- '@napi-rs/nice@1.1.1':
- resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==}
- engines: {node: '>= 10'}
+ '@rolldown/pluginutils@1.0.1':
+ resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==}
- '@npmcli/agent@4.0.2':
- resolution: {integrity: sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ '@shikijs/core@4.4.3':
+ resolution: {integrity: sha512-QCR4q2ZO/ILJEuwiBMel4wdcTDb1JGwfjKTxPDF6x8ixOaluPrVqIn06C99AcRPhmYlBR56d/Fb+GN58GzExpg==}
+ engines: {node: '>=20'}
- '@npmcli/fs@5.0.0':
- resolution: {integrity: sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ '@shikijs/engine-javascript@4.4.3':
+ resolution: {integrity: sha512-FbOjFJp9VLdo1Wevs10BBtVxiTWwNLqZh5Gkhjgda/ioL15YOgeSl9n+6XMa3qRlPQzfhFNe641SrynFHYG0nQ==}
+ engines: {node: '>=20'}
- '@npmcli/git@7.0.2':
- resolution: {integrity: sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ '@shikijs/engine-oniguruma@4.4.3':
+ resolution: {integrity: sha512-EcOQkxdxGQrc1Row/cC2c96/v1dbZqGnEVu1qTuT/MJmp6+cXCvQussowVmCv5Tqr3KuY3c7IbM6HTW3LJ1k9w==}
+ engines: {node: '>=20'}
- '@npmcli/installed-package-contents@4.0.0':
- resolution: {integrity: sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==}
- engines: {node: ^20.17.0 || >=22.9.0}
- hasBin: true
+ '@shikijs/langs@4.4.3':
+ resolution: {integrity: sha512-ePic0yfAJGOF83D5wBHK/00EjK65oahBYxFk5epgq33WRv7X9UuxLEV8PtR0szC0z8dl7INIpIodB99JRFlR+A==}
+ engines: {node: '>=20'}
- '@npmcli/node-gyp@5.0.0':
- resolution: {integrity: sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ '@shikijs/primitive@4.4.3':
+ resolution: {integrity: sha512-m0wBeLDQDeIxRdUmrCPdQqfuUamDwRL5isCfYbguKD6NiaKpVbsv+3J81DyIKgNW5h4WAIIr8T4EkgQrBBxvaQ==}
+ engines: {node: '>=20'}
- '@npmcli/package-json@7.0.5':
- resolution: {integrity: sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ '@shikijs/themes@4.4.3':
+ resolution: {integrity: sha512-w8UHjeUnIR965KMWJHUPXOc2mNJUnK3vpVLYLvw5IYU2mnTTJ89E24OrJDBNiJDQ0qzb0tc4l7mrIXx5cFeIyw==}
+ engines: {node: '>=20'}
- '@npmcli/promise-spawn@9.0.1':
- resolution: {integrity: sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ '@shikijs/types@4.4.3':
+ resolution: {integrity: sha512-UEJxmRR++MAGR6hugn0vgVS2W/6lWAts84FFSrnlH9sP0LNol7E5+NQ792pH8liWUhyMyjhTgSUH3k7iD7tc5g==}
+ engines: {node: '>=20'}
- '@npmcli/redact@4.0.0':
- resolution: {integrity: sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ '@shikijs/vscode-textmate@10.0.2':
+ resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
- '@npmcli/run-script@10.0.4':
- resolution: {integrity: sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ '@tailwindcss/node@4.3.3':
+ resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==}
- '@parcel/watcher-android-arm64@2.5.6':
- resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==}
- engines: {node: '>= 10.0.0'}
+ '@tailwindcss/oxide-android-arm64@4.3.3':
+ resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==}
+ engines: {node: '>= 20'}
cpu: [arm64]
os: [android]
- '@parcel/watcher-darwin-arm64@2.5.6':
- resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==}
- engines: {node: '>= 10.0.0'}
+ '@tailwindcss/oxide-darwin-arm64@4.3.3':
+ resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==}
+ engines: {node: '>= 20'}
cpu: [arm64]
os: [darwin]
- '@parcel/watcher-darwin-x64@2.5.6':
- resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==}
- engines: {node: '>= 10.0.0'}
+ '@tailwindcss/oxide-darwin-x64@4.3.3':
+ resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==}
+ engines: {node: '>= 20'}
cpu: [x64]
os: [darwin]
- '@parcel/watcher-freebsd-x64@2.5.6':
- resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==}
- engines: {node: '>= 10.0.0'}
+ '@tailwindcss/oxide-freebsd-x64@4.3.3':
+ resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==}
+ engines: {node: '>= 20'}
cpu: [x64]
os: [freebsd]
- '@parcel/watcher-linux-arm-glibc@2.5.6':
- resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==}
- engines: {node: '>= 10.0.0'}
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3':
+ resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==}
+ engines: {node: '>= 20'}
cpu: [arm]
os: [linux]
- libc: [glibc]
- '@parcel/watcher-linux-arm-musl@2.5.6':
- resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==}
- engines: {node: '>= 10.0.0'}
- cpu: [arm]
- os: [linux]
- libc: [musl]
-
- '@parcel/watcher-linux-arm64-glibc@2.5.6':
- resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==}
- engines: {node: '>= 10.0.0'}
- cpu: [arm64]
- os: [linux]
- libc: [glibc]
-
- '@parcel/watcher-linux-arm64-musl@2.5.6':
- resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==}
- engines: {node: '>= 10.0.0'}
- cpu: [arm64]
- os: [linux]
- libc: [musl]
-
- '@parcel/watcher-linux-x64-glibc@2.5.6':
- resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==}
- engines: {node: '>= 10.0.0'}
- cpu: [x64]
- os: [linux]
- libc: [glibc]
-
- '@parcel/watcher-linux-x64-musl@2.5.6':
- resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==}
- engines: {node: '>= 10.0.0'}
- cpu: [x64]
- os: [linux]
- libc: [musl]
-
- '@parcel/watcher-win32-arm64@2.5.6':
- resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==}
- engines: {node: '>= 10.0.0'}
- cpu: [arm64]
- os: [win32]
-
- '@parcel/watcher-win32-ia32@2.5.6':
- resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==}
- engines: {node: '>= 10.0.0'}
- cpu: [ia32]
- os: [win32]
-
- '@parcel/watcher-win32-x64@2.5.6':
- resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==}
- engines: {node: '>= 10.0.0'}
- cpu: [x64]
- os: [win32]
-
- '@parcel/watcher@2.5.6':
- resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==}
- engines: {node: '>= 10.0.0'}
-
- '@rollup/rollup-android-arm-eabi@4.60.2':
- resolution: {integrity: sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==}
- cpu: [arm]
- os: [android]
-
- '@rollup/rollup-android-arm64@4.60.2':
- resolution: {integrity: sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==}
- cpu: [arm64]
- os: [android]
-
- '@rollup/rollup-darwin-arm64@4.60.2':
- resolution: {integrity: sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==}
- cpu: [arm64]
- os: [darwin]
-
- '@rollup/rollup-darwin-x64@4.60.2':
- resolution: {integrity: sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==}
- cpu: [x64]
- os: [darwin]
-
- '@rollup/rollup-freebsd-arm64@4.60.2':
- resolution: {integrity: sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==}
- cpu: [arm64]
- os: [freebsd]
-
- '@rollup/rollup-freebsd-x64@4.60.2':
- resolution: {integrity: sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==}
- cpu: [x64]
- os: [freebsd]
-
- '@rollup/rollup-linux-arm-gnueabihf@4.60.2':
- resolution: {integrity: sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==}
- cpu: [arm]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-arm-musleabihf@4.60.2':
- resolution: {integrity: sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==}
- cpu: [arm]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-arm64-gnu@4.60.2':
- resolution: {integrity: sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==}
- cpu: [arm64]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-arm64-musl@4.60.2':
- resolution: {integrity: sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==}
- cpu: [arm64]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-loong64-gnu@4.60.2':
- resolution: {integrity: sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==}
- cpu: [loong64]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-loong64-musl@4.60.2':
- resolution: {integrity: sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==}
- cpu: [loong64]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-ppc64-gnu@4.60.2':
- resolution: {integrity: sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==}
- cpu: [ppc64]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-ppc64-musl@4.60.2':
- resolution: {integrity: sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==}
- cpu: [ppc64]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-riscv64-gnu@4.60.2':
- resolution: {integrity: sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==}
- cpu: [riscv64]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-riscv64-musl@4.60.2':
- resolution: {integrity: sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==}
- cpu: [riscv64]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-linux-s390x-gnu@4.60.2':
- resolution: {integrity: sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==}
- cpu: [s390x]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-x64-gnu@4.60.2':
- resolution: {integrity: sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==}
- cpu: [x64]
- os: [linux]
- libc: [glibc]
-
- '@rollup/rollup-linux-x64-musl@4.60.2':
- resolution: {integrity: sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==}
- cpu: [x64]
- os: [linux]
- libc: [musl]
-
- '@rollup/rollup-openbsd-x64@4.60.2':
- resolution: {integrity: sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==}
- cpu: [x64]
- os: [openbsd]
-
- '@rollup/rollup-openharmony-arm64@4.60.2':
- resolution: {integrity: sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==}
- cpu: [arm64]
- os: [openharmony]
-
- '@rollup/rollup-win32-arm64-msvc@4.60.2':
- resolution: {integrity: sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==}
- cpu: [arm64]
- os: [win32]
-
- '@rollup/rollup-win32-ia32-msvc@4.60.2':
- resolution: {integrity: sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==}
- cpu: [ia32]
- os: [win32]
-
- '@rollup/rollup-win32-x64-gnu@4.60.2':
- resolution: {integrity: sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==}
- cpu: [x64]
- os: [win32]
-
- '@rollup/rollup-win32-x64-msvc@4.60.2':
- resolution: {integrity: sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==}
- cpu: [x64]
- os: [win32]
-
- '@schematics/angular@22.0.3':
- resolution: {integrity: sha512-iAUqIoRcK1CCHDm5E4Q1SI7rpVtsHJ+0qv5ll72wV3C1eCNdeDuGV0lX7PXEEkwd4y//s6yqI9o7f6VZZd6Fbw==}
- engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'}
-
- '@sigstore/bundle@4.0.0':
- resolution: {integrity: sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==}
- engines: {node: ^20.17.0 || >=22.9.0}
-
- '@sigstore/core@3.2.1':
- resolution: {integrity: sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g==}
- engines: {node: ^20.17.0 || >=22.9.0}
-
- '@sigstore/protobuf-specs@0.5.1':
- resolution: {integrity: sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g==}
- engines: {node: ^18.17.0 || >=20.5.0}
-
- '@sigstore/sign@4.1.1':
- resolution: {integrity: sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ==}
- engines: {node: ^20.17.0 || >=22.9.0}
-
- '@sigstore/tuf@4.0.2':
- resolution: {integrity: sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ==}
- engines: {node: ^20.17.0 || >=22.9.0}
-
- '@sigstore/verify@3.1.1':
- resolution: {integrity: sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA==}
- engines: {node: ^20.17.0 || >=22.9.0}
-
- '@standard-schema/spec@1.1.0':
- resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
-
- '@tailwindcss/node@4.3.1':
- resolution: {integrity: sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==}
-
- '@tailwindcss/oxide-android-arm64@4.3.1':
- resolution: {integrity: sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==}
- engines: {node: '>= 20'}
- cpu: [arm64]
- os: [android]
-
- '@tailwindcss/oxide-darwin-arm64@4.3.1':
- resolution: {integrity: sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==}
- engines: {node: '>= 20'}
- cpu: [arm64]
- os: [darwin]
-
- '@tailwindcss/oxide-darwin-x64@4.3.1':
- resolution: {integrity: sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==}
- engines: {node: '>= 20'}
- cpu: [x64]
- os: [darwin]
-
- '@tailwindcss/oxide-freebsd-x64@4.3.1':
- resolution: {integrity: sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==}
- engines: {node: '>= 20'}
- cpu: [x64]
- os: [freebsd]
-
- '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1':
- resolution: {integrity: sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==}
- engines: {node: '>= 20'}
- cpu: [arm]
- os: [linux]
-
- '@tailwindcss/oxide-linux-arm64-gnu@4.3.1':
- resolution: {integrity: sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==}
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.3':
+ resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@tailwindcss/oxide-linux-arm64-musl@4.3.1':
- resolution: {integrity: sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==}
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.3':
+ resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@tailwindcss/oxide-linux-x64-gnu@4.3.1':
- resolution: {integrity: sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==}
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.3':
+ resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==}
engines: {node: '>= 20'}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@tailwindcss/oxide-linux-x64-musl@4.3.1':
- resolution: {integrity: sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==}
+ '@tailwindcss/oxide-linux-x64-musl@4.3.3':
+ resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==}
engines: {node: '>= 20'}
cpu: [x64]
os: [linux]
libc: [musl]
- '@tailwindcss/oxide-wasm32-wasi@4.3.1':
- resolution: {integrity: sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==}
+ '@tailwindcss/oxide-wasm32-wasi@4.3.3':
+ resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==}
engines: {node: '>=14.0.0'}
cpu: [wasm32]
bundledDependencies:
@@ -1493,224 +931,173 @@ packages:
- '@emnapi/wasi-threads'
- tslib
- '@tailwindcss/oxide-win32-arm64-msvc@4.3.1':
- resolution: {integrity: sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==}
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.3':
+ resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==}
engines: {node: '>= 20'}
cpu: [arm64]
os: [win32]
- '@tailwindcss/oxide-win32-x64-msvc@4.3.1':
- resolution: {integrity: sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==}
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.3':
+ resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==}
engines: {node: '>= 20'}
cpu: [x64]
os: [win32]
- '@tailwindcss/oxide@4.3.1':
- resolution: {integrity: sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==}
+ '@tailwindcss/oxide@4.3.3':
+ resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==}
engines: {node: '>= 20'}
- '@tailwindcss/postcss@4.3.1':
- resolution: {integrity: sha512-dNJuNbdEJT/SWRuXTYP1WSamelsz3ztkUsdtWQPjrexysrTpaEPM40P/71knXiXLYEojqPOEGitVLLpPMS5T6A==}
-
- '@tufjs/canonical-json@2.0.0':
- resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==}
- engines: {node: ^16.14.0 || >=18.0.0}
-
- '@tufjs/models@4.1.0':
- resolution: {integrity: sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==}
- engines: {node: ^20.17.0 || >=22.9.0}
-
- '@types/body-parser@1.19.6':
- resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==}
-
- '@types/chai@5.2.3':
- resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
+ '@tailwindcss/typography@0.5.20':
+ resolution: {integrity: sha512-hwbzQuNUfcPvbegQFatVPl/MY/tcM9KLl963hQ5laJKPh81TEZ1+dNG9PirGvcaDBkp+BCshExAyKVPW91dozw==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || >=4.0.0 || insiders'
- '@types/connect@3.4.38':
- resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
+ '@tailwindcss/vite@4.3.3':
+ resolution: {integrity: sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==}
+ peerDependencies:
+ vite: ^5.2.0 || ^6 || ^7 || ^8
- '@types/deep-eql@4.0.2':
- resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==}
+ '@tybys/wasm-util@0.10.4':
+ resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==}
- '@types/estree@1.0.8':
- resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+ '@types/estree-jsx@1.0.5':
+ resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
'@types/estree@1.0.9':
resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
- '@types/express-serve-static-core@5.1.1':
- resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==}
-
- '@types/express@5.0.6':
- resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==}
+ '@types/hast@3.0.5':
+ resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==}
- '@types/http-errors@2.0.5':
- resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==}
+ '@types/mdast@4.0.4':
+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
- '@types/node@20.19.43':
- resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==}
+ '@types/nlcst@2.0.3':
+ resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==}
- '@types/qs@6.15.1':
- resolution: {integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==}
+ '@types/node@24.13.6':
+ resolution: {integrity: sha512-SGrw/h3KPFshy3OE6ZL53LMBG5vGQQ8/gIpiqz/kRZhPJ7HgwCEs8LBuNtWLa8dvGZVpSF7+Bf+c11HUrCb/yg==}
- '@types/range-parser@1.2.7':
- resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
+ '@types/qrcode@1.5.6':
+ resolution: {integrity: sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==}
- '@types/send@1.2.1':
- resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==}
+ '@types/sax@1.2.7':
+ resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==}
- '@types/serve-static@2.2.0':
- resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==}
+ '@types/unist@3.0.3':
+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
- '@vitejs/plugin-basic-ssl@2.3.0':
- resolution: {integrity: sha512-bdyo8rB3NnQbikdMpHaML9Z1OZPBu6fFOBo+OtxsBlvMJtysWskmBcnbIDhUqgC8tcxNv/a+BcV5U+2nQMm1OQ==}
- engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
- peerDependencies:
- vite: ^6.0.0 || ^7.0.0 || ^8.0.0
-
- '@vitest/expect@4.1.9':
- resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==}
+ '@ungap/structured-clone@1.4.0':
+ resolution: {integrity: sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==}
- '@vitest/mocker@4.1.9':
- resolution: {integrity: sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==}
+ '@volar/kit@2.4.28':
+ resolution: {integrity: sha512-cKX4vK9dtZvDRaAzeoUdaAJEew6IdxHNCRrdp5Kvcl6zZOqb6jTOfk3kXkIkG3T7oTFXguEMt5+9ptyqYR84Pg==}
peerDependencies:
- msw: ^2.4.9
- vite: ^6.0.0 || ^7.0.0 || ^8.0.0
- peerDependenciesMeta:
- msw:
- optional: true
- vite:
- optional: true
-
- '@vitest/pretty-format@4.1.9':
- resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==}
-
- '@vitest/runner@4.1.9':
- resolution: {integrity: sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==}
+ typescript: '*'
- '@vitest/snapshot@4.1.9':
- resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==}
+ '@volar/language-core@2.4.28':
+ resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==}
- '@vitest/spy@4.1.9':
- resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==}
+ '@volar/language-server@2.4.28':
+ resolution: {integrity: sha512-NqcLnE5gERKuS4PUFwlhMxf6vqYo7hXtbMFbViXcbVkbZ905AIVWhnSo0ZNBC2V127H1/2zP7RvVOVnyITFfBw==}
- '@vitest/utils@4.1.9':
- resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==}
+ '@volar/language-service@2.4.28':
+ resolution: {integrity: sha512-Rh/wYCZJrI5vCwMk9xyw/Z+MsWxlJY1rmMZPsxUoJKfzIRjS/NF1NmnuEcrMbEVGja00aVpCsInJfixQTMdvLw==}
- '@yarnpkg/lockfile@1.1.0':
- resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==}
+ '@volar/source-map@2.4.28':
+ resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==}
- abbrev@4.0.0:
- resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ '@volar/typescript@2.4.28':
+ resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==}
- accepts@2.0.0:
- resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==}
- engines: {node: '>= 0.6'}
+ '@vscode/emmet-helper@2.11.0':
+ resolution: {integrity: sha512-QLxjQR3imPZPQltfbWRnHU6JecWTF1QSWhx3GAKQpslx7y3Dp6sIIXhKjiUJ/BR9FX8PVthjr9PD6pNwOJfAzw==}
- agent-base@7.1.4:
- resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
- engines: {node: '>= 14'}
+ '@vscode/l10n@0.0.18':
+ resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==}
- agent-base@9.0.0:
- resolution: {integrity: sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==}
- engines: {node: '>= 20'}
-
- ajv-formats@3.0.1:
- resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
+ ajv-draft-04@1.0.0:
+ resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==}
peerDependencies:
- ajv: ^8.0.0
+ ajv: ^8.5.0
peerDependenciesMeta:
ajv:
optional: true
+ ajv-i18n@4.2.0:
+ resolution: {integrity: sha512-v/ei2UkCEeuKNXh8RToiFsUclmU+G57LO1Oo22OagNMENIw+Yb8eMwvHu7Vn9fmkjJyv6XclhJ8TbuigSglPkg==}
+ peerDependencies:
+ ajv: ^8.0.0-beta.0
+
ajv@8.20.0:
resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==}
- algoliasearch@5.52.0:
- resolution: {integrity: sha512-0ZzY9mjqV7gop/AH8pIBiAS8giXP7WcSiUfoFYIzYAK9QC5c37E4SIVtJVBMwlURc0/uNt2o4RcNRvdHa4CJ5w==}
- engines: {node: '>= 14.0.0'}
+ am-i-vibing@0.4.0:
+ resolution: {integrity: sha512-MxT4XZL7pzLHpuvhDKdMaQHMGGkJDLluKBLsbstn+8wv9sWcFT6h+0ve9qkml95amVTZtZV83gQe2hY+ojgHLg==}
+ hasBin: true
- ansi-escapes@7.3.0:
- resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==}
- engines: {node: '>=18'}
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
- ansi-regex@6.2.2:
- resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
+ ansi-regex@6.3.0:
+ resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==}
engines: {node: '>=12'}
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
ansi-styles@6.2.3:
resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
engines: {node: '>=12'}
- assertion-error@2.0.1:
- resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
- engines: {node: '>=12'}
-
- balanced-match@4.0.4:
- resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
- engines: {node: 18 || 20 || >=22}
-
- baseline-browser-mapping@2.10.38:
- resolution: {integrity: sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==}
- engines: {node: '>=6.0.0'}
- hasBin: true
-
- beasties@0.4.2:
- resolution: {integrity: sha512-NvcGjG/7AVUAfRbvrJmHunDQS9uHnE6Q/7AkaPr8oKE8HjOlpjRG5075z/th2Tmlezk3VlaaS8+X9I1RwHJMQw==}
- engines: {node: '>=18.0.0'}
-
- bidi-js@1.0.3:
- resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==}
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
- body-parser@2.3.0:
- resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==}
- engines: {node: '>=18'}
+ arg@5.0.2:
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
- boolbase@1.0.0:
- resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
- brace-expansion@5.0.6:
- resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==}
- engines: {node: 18 || 20 || >=22}
+ aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
- browserslist@4.28.2:
- resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ astro@7.3.5:
+ resolution: {integrity: sha512-1p/ernaq/RuESbM5NMjWzbO6SiebMGrGcYlGjMfBhzzgM+n/X7AUmVyw8BqW2QYCdivpsHwJBcD1fqmlTZjZHg==}
+ engines: {node: '>=22.12.0', npm: '>=9.6.5', pnpm: '>=7.1.0'}
hasBin: true
+ peerDependencies:
+ '@astrojs/markdown-remark': ^7.3.0
+ peerDependenciesMeta:
+ '@astrojs/markdown-remark':
+ optional: true
- buffer-from@1.1.2:
- resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
-
- bytes@3.1.2:
- resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
- engines: {node: '>= 0.8'}
-
- cacache@20.0.4:
- resolution: {integrity: sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==}
- engines: {node: ^20.17.0 || >=22.9.0}
-
- call-bind-apply-helpers@1.0.2:
- resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+ axobject-query@4.1.0:
+ resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
engines: {node: '>= 0.4'}
- call-bound@1.0.4:
- resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
- engines: {node: '>= 0.4'}
+ bail@2.0.2:
+ resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
- caniuse-lite@1.0.30001799:
- resolution: {integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==}
+ boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
- chai@6.2.2:
- resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==}
- engines: {node: '>=18'}
+ camelcase@5.3.1:
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ engines: {node: '>=6'}
+
+ ccount@2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
- chalk@5.6.2:
- resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
- engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+ character-entities-html4@2.1.0:
+ resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
- chardet@2.1.1:
- resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==}
+ character-entities-legacy@3.0.0:
+ resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
chokidar@4.0.3:
resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
@@ -1720,67 +1107,56 @@ packages:
resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
engines: {node: '>= 20.19.0'}
- chownr@3.0.0:
- resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
- engines: {node: '>=18'}
-
- cli-cursor@5.0.0:
- resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
- engines: {node: '>=18'}
-
- cli-spinners@3.4.0:
- resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==}
- engines: {node: '>=18.20'}
-
- cli-truncate@5.2.0:
- resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==}
- engines: {node: '>=20'}
+ ci-info@4.4.0:
+ resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==}
+ engines: {node: '>=8'}
- cli-width@4.1.0:
- resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
- engines: {node: '>= 12'}
+ cliui@6.0.0:
+ resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==}
cliui@9.0.1:
resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==}
engines: {node: '>=20'}
- content-disposition@1.1.0:
- resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==}
- engines: {node: '>=18'}
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
- content-type@1.0.5:
- resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
- engines: {node: '>= 0.6'}
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
- content-type@2.0.0:
- resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==}
- engines: {node: '>=18'}
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
- convert-source-map@1.9.0:
- resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+ comma-separated-tokens@2.0.3:
+ resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
- convert-source-map@2.0.0:
- resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+ commander@11.1.0:
+ resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
+ engines: {node: '>=16'}
- cookie-signature@1.2.2:
- resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==}
- engines: {node: '>=6.6.0'}
+ common-ancestor-path@2.0.0:
+ resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==}
+ engines: {node: '>= 18'}
- cookie@0.7.2:
- resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
- engines: {node: '>= 0.6'}
+ cookie-es@1.2.3:
+ resolution: {integrity: sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==}
- cors@2.8.6:
- resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==}
- engines: {node: '>= 0.10'}
+ cookie@2.0.1:
+ resolution: {integrity: sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==}
+ engines: {node: '>=22'}
- cross-spawn@7.0.6:
- resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
- engines: {node: '>= 8'}
+ crossws@0.3.5:
+ resolution: {integrity: sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==}
css-select@6.0.0:
resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==}
+ css-tree@2.2.1:
+ resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
css-tree@3.2.1:
resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
@@ -1789,34 +1165,46 @@ packages:
resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==}
engines: {node: '>= 6'}
- cssstyle@6.2.0:
- resolution: {integrity: sha512-Fm5NvhYathRnXNVndkUsCCuR63DCLVVwGOOwQw782coXFi5HhkXdu289l59HlXZBawsyNccXfWRYvLzcDCdDig==}
- engines: {node: '>=20'}
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
- data-urls@7.0.0:
- resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==}
- engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
+ csso@5.0.5:
+ resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
+ engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
- debug@4.4.3:
- resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
+ decamelize@1.2.0:
+ resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
+ engines: {node: '>=0.10.0'}
- decimal.js@10.6.0:
- resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==}
+ defu@6.1.7:
+ resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==}
+
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
- depd@2.0.0:
- resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
- engines: {node: '>= 0.8'}
+ destr@2.0.5:
+ resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==}
detect-libc@2.1.2:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
+ devalue@5.9.4:
+ resolution: {integrity: sha512-sPAT4pztbu6586/hrhOnMKS17IJrvg12mXiSPSS3W5qDeN2RGgvZ0diZCm31dBbnevfVmujNO3IM2wrS4Y2Rhg==}
+
+ devlop@1.1.0:
+ resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+
+ diff@9.0.0:
+ resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==}
+ engines: {node: '>=0.3.1'}
+
+ dijkstrajs@1.0.3:
+ resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==}
+
dom-serializer@2.0.0:
resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
@@ -1830,69 +1218,32 @@ packages:
domutils@3.2.2:
resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
- dunder-proto@1.0.1:
- resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
- engines: {node: '>= 0.4'}
-
- ee-first@1.1.1:
- resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+ dset@3.1.4:
+ resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==}
+ engines: {node: '>=4'}
- electron-to-chromium@1.5.376:
- resolution: {integrity: sha512-cUVA7/RvbFTEuw/i3obUwDTRIXojaxkResf+ibByPFxjc6XK3VNtcQXV0NSbAlJ0FMjcJGgftVVB4Qo184EXvA==}
+ emmet@2.4.11:
+ resolution: {integrity: sha512-23QPJB3moh/U9sT4rQzGgeyyGIrcM+GH5uVYg2C6wZIxAIJq7Ng3QLT79tl8FUwDXhyq9SusfknOrofAKqvgyQ==}
emoji-regex@10.6.0:
resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
- encodeurl@2.0.0:
- resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
- engines: {node: '>= 0.8'}
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
- enhanced-resolve@5.21.6:
- resolution: {integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==}
+ enhanced-resolve@5.25.1:
+ resolution: {integrity: sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w==}
engines: {node: '>=10.13.0'}
entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
- entities@7.0.1:
- resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
- engines: {node: '>=0.12'}
-
- entities@8.0.0:
- resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==}
- engines: {node: '>=20.19.0'}
+ es-module-lexer@2.3.2:
+ resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==}
- env-paths@2.2.1:
- resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
- engines: {node: '>=6'}
-
- environment@1.1.0:
- resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
- engines: {node: '>=18'}
-
- es-define-property@1.0.1:
- resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
- engines: {node: '>= 0.4'}
-
- es-errors@1.3.0:
- resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
- engines: {node: '>= 0.4'}
-
- es-module-lexer@2.1.0:
- resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==}
-
- es-object-atoms@1.1.2:
- resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==}
- engines: {node: '>= 0.4'}
-
- esbuild@0.27.7:
- resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==}
- engines: {node: '>=18'}
- hasBin: true
-
- esbuild@0.28.1:
- resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==}
+ esbuild@0.28.2:
+ resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==}
engines: {node: '>=18'}
hasBin: true
@@ -1900,43 +1251,11 @@ packages:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
- escape-html@1.0.3:
- resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
-
- estree-walker@3.0.3:
- resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
-
- etag@1.8.1:
- resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
- engines: {node: '>= 0.6'}
-
eventemitter3@5.0.4:
resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==}
- eventsource-parser@3.1.0:
- resolution: {integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==}
- engines: {node: '>=18.0.0'}
-
- eventsource@3.0.7:
- resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==}
- engines: {node: '>=18.0.0'}
-
- expect-type@1.3.0:
- resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==}
- engines: {node: '>=12.0.0'}
-
- exponential-backoff@3.1.3:
- resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==}
-
- express-rate-limit@8.5.2:
- resolution: {integrity: sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==}
- engines: {node: '>= 16'}
- peerDependencies:
- express: '>= 4.11'
-
- express@5.2.1:
- resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==}
- engines: {node: '>= 18'}
+ extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
@@ -1947,8 +1266,8 @@ packages:
fast-string-width@3.0.2:
resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==}
- fast-uri@3.1.2:
- resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==}
+ fast-uri@3.1.8:
+ resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==}
fast-wrap-ansi@0.2.2:
resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==}
@@ -1962,210 +1281,102 @@ packages:
picomatch:
optional: true
- finalhandler@2.1.1:
- resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==}
- engines: {node: '>= 18.0.0'}
+ find-proc@0.2.0:
+ resolution: {integrity: sha512-a6h2nTrgB3g5Wrn4au9Ux4kMk7IJtyF6oA8uGn+mk3weLZssUtc1cp6meHIzzuW2o1srrBAxzkmXLbqjRkgB6w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+
+ find-up@4.1.0:
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+ engines: {node: '>=8'}
- forwarded@0.2.0:
- resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
- engines: {node: '>= 0.6'}
+ flattie@1.1.1:
+ resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==}
+ engines: {node: '>=8'}
- fresh@2.0.0:
- resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==}
- engines: {node: '>= 0.8'}
+ fontace@0.4.1:
+ resolution: {integrity: sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==}
- fs-minipass@3.0.3:
- resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==}
- engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ fontkitten@1.0.3:
+ resolution: {integrity: sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw==}
+ engines: {node: '>=20'}
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
- function-bind@1.1.2:
- resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
-
- gensync@1.0.0-beta.2:
- resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
- engines: {node: '>=6.9.0'}
-
get-caller-file@2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
- get-east-asian-width@1.6.0:
- resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==}
+ get-east-asian-width@1.7.0:
+ resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==}
engines: {node: '>=18'}
- get-intrinsic@1.3.0:
- resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
- engines: {node: '>= 0.4'}
-
- get-proto@1.0.1:
- resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
- engines: {node: '>= 0.4'}
-
- glob-to-regexp@0.4.1:
- resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
-
- glob@13.0.6:
- resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==}
- engines: {node: 18 || 20 || >=22}
+ get-tsconfig@5.0.0-beta.4:
+ resolution: {integrity: sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ==}
+ engines: {node: '>=20.20.0'}
- gopd@1.2.0:
- resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
- engines: {node: '>= 0.4'}
+ github-slugger@2.0.0:
+ resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==}
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
- has-symbols@1.1.0:
- resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
- engines: {node: '>= 0.4'}
-
- hasown@2.0.4:
- resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
- engines: {node: '>= 0.4'}
+ h3@1.15.11:
+ resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==}
- hono@4.12.26:
- resolution: {integrity: sha512-uyZtpnYxM9CmQ7QsQknM4zN8EftNqhON1qYeIKM0Se67CCEe2c44xyGURwB0axX2fBDu1dqHrHAc1hmNT8ITkw==}
- engines: {node: '>=16.9.0'}
+ hast-util-to-html@9.0.5:
+ resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==}
- hosted-git-info@9.0.3:
- resolution: {integrity: sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ hast-util-whitespace@3.0.0:
+ resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
- html-encoding-sniffer@6.0.0:
- resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==}
- engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
+ html-escaper@3.0.3:
+ resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}
- htmlparser2@10.1.0:
- resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==}
+ html-void-elements@3.0.0:
+ resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
http-cache-semantics@4.2.0:
resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==}
- http-errors@2.0.1:
- resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==}
- engines: {node: '>= 0.8'}
-
- http-proxy-agent@7.0.2:
- resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
- engines: {node: '>= 14'}
-
- https-proxy-agent@7.0.6:
- resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
- engines: {node: '>= 14'}
-
- https-proxy-agent@9.0.0:
- resolution: {integrity: sha512-/MVmHp58WkOypgFhCLk4fzpPcFQvTJ/e6LBI7irpIO2HfxUbpmYoHF+KzipzJpxxzJu7aJNWQ0xojJ/dzV2G5g==}
- engines: {node: '>= 20'}
-
- iconv-lite@0.7.2:
- resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==}
- engines: {node: '>=0.10.0'}
-
- ignore-walk@8.0.0:
- resolution: {integrity: sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==}
- engines: {node: ^20.17.0 || >=22.9.0}
-
- immutable@5.1.6:
- resolution: {integrity: sha512-q1swsS8K7L8usSHuOqF2TAoCCkonYz0SG38wLAggaa4Wml70zixIvt2ql4coQ2C2B3hTjltJry4r6bULwgAXLQ==}
-
- inherits@2.0.4:
- resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
-
- ini@6.0.0:
- resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==}
- engines: {node: ^20.17.0 || >=22.9.0}
-
- ip-address@10.2.0:
- resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==}
- engines: {node: '>= 12'}
-
- ipaddr.js@1.9.1:
- resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
- engines: {node: '>= 0.10'}
+ iron-webcrypto@1.2.1:
+ resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==}
- is-extglob@2.1.1:
- resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
- engines: {node: '>=0.10.0'}
-
- is-fullwidth-code-point@5.1.0:
- resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==}
- engines: {node: '>=18'}
+ is-docker@4.0.0:
+ resolution: {integrity: sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA==}
+ engines: {node: '>=20'}
+ hasBin: true
- is-glob@4.0.3:
- resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
- engines: {node: '>=0.10.0'}
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
- is-interactive@2.0.0:
- resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
+ is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
engines: {node: '>=12'}
- is-potential-custom-element-name@1.0.1:
- resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
-
- is-promise@4.0.0:
- resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
-
- is-unicode-supported@2.1.0:
- resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==}
- engines: {node: '>=18'}
-
- isexe@2.0.0:
- resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
-
- isexe@4.0.0:
- resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==}
- engines: {node: '>=20'}
-
jiti@2.7.0:
resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
hasBin: true
- jose@6.2.3:
- resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==}
-
- js-tokens@4.0.0:
- resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
-
- jsdom@28.1.0:
- resolution: {integrity: sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==}
- engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
- peerDependencies:
- canvas: ^3.0.0
- peerDependenciesMeta:
- canvas:
- optional: true
-
- jsesc@3.1.0:
- resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
- engines: {node: '>=6'}
+ js-yaml@4.3.2:
+ resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==}
hasBin: true
- json-parse-even-better-errors@5.0.0:
- resolution: {integrity: sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==}
- engines: {node: ^20.17.0 || >=22.9.0}
-
json-schema-traverse@1.0.0:
resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
- json-schema-typed@8.0.2:
- resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==}
-
- json5@2.2.3:
- resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
- engines: {node: '>=6'}
- hasBin: true
+ jsonc-parser@2.3.1:
+ resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==}
jsonc-parser@3.3.1:
resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==}
- jsonparse@1.3.1:
- resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
- engines: {'0': node >= 0.2.0}
+ kleur@4.1.5:
+ resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+ engines: {node: '>=6'}
lightningcss-android-arm64@1.32.0:
resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
@@ -2173,30 +1384,60 @@ packages:
cpu: [arm64]
os: [android]
+ lightningcss-android-arm64@1.33.0:
+ resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
+
lightningcss-darwin-arm64@1.32.0:
resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [darwin]
+ lightningcss-darwin-arm64@1.33.0:
+ resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
lightningcss-darwin-x64@1.32.0:
resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [darwin]
+ lightningcss-darwin-x64@1.33.0:
+ resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
lightningcss-freebsd-x64@1.32.0:
resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [freebsd]
+ lightningcss-freebsd-x64@1.33.0:
+ resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
lightningcss-linux-arm-gnueabihf@1.32.0:
resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
engines: {node: '>= 12.0.0'}
cpu: [arm]
os: [linux]
+ lightningcss-linux-arm-gnueabihf@1.33.0:
+ resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
lightningcss-linux-arm64-gnu@1.32.0:
resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
engines: {node: '>= 12.0.0'}
@@ -2204,6 +1445,13 @@ packages:
os: [linux]
libc: [glibc]
+ lightningcss-linux-arm64-gnu@1.33.0:
+ resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
lightningcss-linux-arm64-musl@1.32.0:
resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
engines: {node: '>= 12.0.0'}
@@ -2211,6 +1459,13 @@ packages:
os: [linux]
libc: [musl]
+ lightningcss-linux-arm64-musl@1.33.0:
+ resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
lightningcss-linux-x64-gnu@1.32.0:
resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
engines: {node: '>= 12.0.0'}
@@ -2218,6 +1473,13 @@ packages:
os: [linux]
libc: [glibc]
+ lightningcss-linux-x64-gnu@1.33.0:
+ resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
lightningcss-linux-x64-musl@1.32.0:
resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
engines: {node: '>= 12.0.0'}
@@ -2225,606 +1487,573 @@ packages:
os: [linux]
libc: [musl]
+ lightningcss-linux-x64-musl@1.33.0:
+ resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
lightningcss-win32-arm64-msvc@1.32.0:
resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [win32]
+ lightningcss-win32-arm64-msvc@1.33.0:
+ resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
lightningcss-win32-x64-msvc@1.32.0:
resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [win32]
+ lightningcss-win32-x64-msvc@1.33.0:
+ resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
lightningcss@1.32.0:
resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
engines: {node: '>= 12.0.0'}
- listr2@10.2.1:
- resolution: {integrity: sha512-7I5knELsJKTUjXG+A6BkKAiGkW1i25fNa/xlUl9hFtk15WbE9jndA89xu5FzQKrY5llajE1hfZZFMILXkDHk/Q==}
- engines: {node: '>=22.13.0'}
-
- lmdb@3.5.4:
- resolution: {integrity: sha512-9FKQA6G1MMtqNxfxvSBNXD/axeG2QRjYbNh0/ykRL5xYcRbCm2vXq7B9bhc7nSuKdHzr8/BHIwfPuYYH1UsXXw==}
- hasBin: true
-
- log-symbols@7.0.1:
- resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==}
- engines: {node: '>=18'}
+ lightningcss@1.33.0:
+ resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==}
+ engines: {node: '>= 12.0.0'}
- log-update@6.1.0:
- resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
- engines: {node: '>=18'}
+ locate-path@5.0.0:
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+ engines: {node: '>=8'}
- lru-cache@11.5.1:
- resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==}
+ lru-cache@11.5.3:
+ resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==}
engines: {node: 20 || >=22}
- lru-cache@5.1.1:
- resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
-
magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
- make-fetch-happen@15.0.6:
- resolution: {integrity: sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw==}
- engines: {node: ^20.17.0 || >=22.9.0}
-
- math-intrinsics@1.1.0:
- resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
- engines: {node: '>= 0.4'}
-
- mdn-data@2.27.1:
- resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==}
-
- media-typer@1.1.0:
- resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==}
- engines: {node: '>= 0.8'}
+ magic-string@1.4.2:
+ resolution: {integrity: sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==}
- merge-descriptors@2.0.0:
- resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==}
- engines: {node: '>=18'}
-
- mime-db@1.54.0:
- resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==}
- engines: {node: '>= 0.6'}
-
- mime-types@3.0.2:
- resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==}
- engines: {node: '>=18'}
+ magicast@0.5.5:
+ resolution: {integrity: sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==}
- mimic-function@5.0.1:
- resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
- engines: {node: '>=18'}
-
- minimatch@10.2.5:
- resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==}
- engines: {node: 18 || 20 || >=22}
+ mdast-util-to-hast@13.2.1:
+ resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==}
- minipass-collect@2.0.1:
- resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==}
- engines: {node: '>=16 || 14 >=14.17'}
+ mdn-data@2.0.28:
+ resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
- minipass-fetch@5.0.2:
- resolution: {integrity: sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==}
- engines: {node: ^20.17.0 || >=22.9.0}
-
- minipass-flush@1.0.7:
- resolution: {integrity: sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==}
- engines: {node: '>= 8'}
+ mdn-data@2.27.1:
+ resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==}
- minipass-pipeline@1.2.4:
- resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==}
- engines: {node: '>=8'}
+ micromark-util-character@2.1.1:
+ resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
- minipass-sized@2.0.0:
- resolution: {integrity: sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==}
- engines: {node: '>=8'}
+ micromark-util-encode@2.0.1:
+ resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
- minipass@3.3.6:
- resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
- engines: {node: '>=8'}
+ micromark-util-sanitize-uri@2.0.1:
+ resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
- minipass@7.1.3:
- resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==}
- engines: {node: '>=16 || 14 >=14.17'}
+ micromark-util-symbol@2.0.1:
+ resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
- minizlib@3.1.0:
- resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==}
- engines: {node: '>= 18'}
+ micromark-util-types@2.0.2:
+ resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==}
mrmime@2.0.1:
resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
engines: {node: '>=10'}
- ms@2.1.3:
- resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
-
- msgpackr-extract@3.0.4:
- resolution: {integrity: sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==}
- hasBin: true
-
- msgpackr@1.12.1:
- resolution: {integrity: sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ==}
-
- mute-stream@3.0.0:
- resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ muggle-string@0.4.1:
+ resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
- nanoid@3.3.13:
- resolution: {integrity: sha512-sPdqC6ByMVVGvF1ynvvMo0/o+oD1VX7DaHhijt1bFgjvBkHBib4t49GoNDhf2NDta4oeUNlaGbSt5K7qjZ955Q==}
+ nanoid@3.3.19:
+ resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
- negotiator@1.0.0:
- resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==}
- engines: {node: '>= 0.6'}
-
- node-addon-api@6.1.0:
- resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==}
-
- node-addon-api@7.1.1:
- resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
-
- node-gyp-build-optional-packages@5.2.2:
- resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==}
- hasBin: true
-
- node-gyp@12.4.0:
- resolution: {integrity: sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==}
- engines: {node: ^20.17.0 || >=22.9.0}
- hasBin: true
-
- node-releases@2.0.48:
- resolution: {integrity: sha512-1uz8041X6LoI6ZSdZacM9lVY28vuzDlSKitnpbSNK0RfKoIJkX29NBPVEFXhnuSuEOA9Ww0xnPJ+ILWbGAv8DA==}
- engines: {node: '>=18'}
-
- nopt@9.0.0:
- resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==}
- engines: {node: ^20.17.0 || >=22.9.0}
- hasBin: true
-
- npm-bundled@5.0.0:
- resolution: {integrity: sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==}
- engines: {node: ^20.17.0 || >=22.9.0}
-
- npm-install-checks@8.0.0:
- resolution: {integrity: sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==}
- engines: {node: ^20.17.0 || >=22.9.0}
-
- npm-normalize-package-bin@5.0.0:
- resolution: {integrity: sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ neotraverse@1.0.1:
+ resolution: {integrity: sha512-WmmLty1YWwJl9yZi77v2dVIV6X2kuYV8YYBI/G3LWGKdGHmHUvL1z7FW0iDvEvGAwNEoc5x1tOOOyDnf5jJw/w==}
+ engines: {node: '>= 10'}
- npm-package-arg@13.0.2:
- resolution: {integrity: sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ nlcst-to-string@4.0.0:
+ resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==}
- npm-packlist@10.0.4:
- resolution: {integrity: sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ node-fetch-native@1.6.7:
+ resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==}
- npm-pick-manifest@11.0.3:
- resolution: {integrity: sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ node-mock-http@1.0.5:
+ resolution: {integrity: sha512-KQyt/wLjG3TAc7DOUhpqWzgd4ERxR80JOlTK5VE5R1S12IaPVN5qkj4klBce9HPG1Njuup4Sb5bljaT34lIyjw==}
- npm-registry-fetch@19.1.1:
- resolution: {integrity: sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
- object-assign@4.1.1:
- resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
- engines: {node: '>=0.10.0'}
+ obug@3.0.0:
+ resolution: {integrity: sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==}
+ engines: {node: '>=12.20.0'}
- object-inspect@1.13.4:
- resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
- engines: {node: '>= 0.4'}
+ ofetch@1.5.1:
+ resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==}
- obug@2.1.3:
- resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==}
- engines: {node: '>=12.20.0'}
+ ohash@2.0.12:
+ resolution: {integrity: sha512-65S/5gk9YSsaRjcyf7Nfa6h/d3E8/1gslpXfI4W7Dxn/oap8IKRuNT5VXkLQ1YFKIEg4apRY4Pj6aiwFzrDdmw==}
- on-finished@2.4.1:
- resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
- engines: {node: '>= 0.8'}
+ oniguruma-parser@0.12.2:
+ resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==}
- once@1.4.0:
- resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ oniguruma-to-es@4.3.6:
+ resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==}
- onetime@7.0.0:
- resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
- engines: {node: '>=18'}
+ p-limit@2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
- ora@9.4.0:
- resolution: {integrity: sha512-84cglkRILFxdtA8hAvLNdMrtBpPNBTrQ9/ulg0FA7xLMnD6mifv+enAIeRmvtv+WgdCE+LPGOfQmtJRrVaIVhQ==}
+ p-limit@7.3.3:
+ resolution: {integrity: sha512-SKgVvDU5TNIxQ4r30U75BNLC6a+6GOEjngrk/ysM5+Zu3oJuk1SC5ApzIzY/7PjCEjoVPMWJ0zho/4QUiEB7TQ==}
engines: {node: '>=20'}
- ordered-binary@1.6.1:
- resolution: {integrity: sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==}
-
- p-map@7.0.4:
- resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==}
- engines: {node: '>=18'}
+ p-locate@4.1.0:
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+ engines: {node: '>=8'}
- pacote@21.5.1:
- resolution: {integrity: sha512-KvcJ9iy3crysCsgqc4+PknH/w6jkrp8JN36mpZBPwNaDRwTfMZD37YzRazNstiZUOhuF5pno9f78n9mEJBavwg==}
- engines: {node: ^20.17.0 || >=22.9.0}
- hasBin: true
+ p-queue@9.3.3:
+ resolution: {integrity: sha512-NXAOdnEe5FsZJfT4oK84lE1Y5cFFdWlRuOo5tww8DyNMxyRXwn39fIkUtNLKppcPC+UYU/bXujNCUGDv01y7CA==}
+ engines: {node: '>=20'}
- parse5-html-rewriting-stream@8.0.1:
- resolution: {integrity: sha512-NaRku2aMpUN1Sh1Gyk1KWUh2A7EJx2c6qYzvwsPtqhoHoaURshdrceYK3LunVCm3WHhm6FS7Vcczbvdh3/UIVw==}
+ p-timeout@7.0.2:
+ resolution: {integrity: sha512-prbX4Z3YszrFNgH+MW5Zoeq3baXrMtP/MQnFeET90UB/GtGcGDQ5Usg9OCy6ETjTTntOw1SL2z9fMPUppN3Guw==}
+ engines: {node: '>=20'}
- parse5-sax-parser@8.0.0:
- resolution: {integrity: sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==}
+ p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
- parse5@8.0.1:
- resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==}
+ package-manager-detector@1.8.0:
+ resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==}
- parseurl@1.3.3:
- resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
- engines: {node: '>= 0.8'}
+ path-browserify@1.0.1:
+ resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
- path-key@3.1.1:
- resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
- path-scurry@2.0.2:
- resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==}
- engines: {node: 18 || 20 || >=22}
-
- path-to-regexp@8.4.2:
- resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==}
-
- pathe@2.0.3:
- resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+ piccolore@0.1.3:
+ resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==}
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
- picomatch@4.0.4:
- resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
+ picomatch@2.3.2:
+ resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
+ engines: {node: '>=8.6'}
+
+ picomatch@4.0.7:
+ resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==}
engines: {node: '>=12'}
- piscina@5.1.4:
- resolution: {integrity: sha512-7uU4ZnKeQq22t9AsmHGD2w4OYQGonwFnTypDypaWi7Qr2EvQIFVtG8J5D/3bE7W123Wdc9+v4CZDu5hJXVCtBg==}
- engines: {node: '>=20.x'}
+ pngjs@5.0.0:
+ resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==}
+ engines: {node: '>=10.13.0'}
- pkce-challenge@5.0.1:
- resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==}
- engines: {node: '>=16.20.0'}
+ postcss-selector-parser@6.0.10:
+ resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
+ engines: {node: '>=4'}
- postcss-media-query-parser@0.2.3:
- resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==}
+ postcss@8.5.28:
+ resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==}
+ engines: {node: ^10 || ^12 || >=14}
- postcss-safe-parser@7.0.1:
- resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==}
- engines: {node: '>=18.0'}
+ prettier-plugin-astro@1.1.0:
+ resolution: {integrity: sha512-ujJ1VX+iin4eYJPHVCEbmXHzrEVsi1SaVehHtbAteTZv8VTrZyBiZPmYc6Ud6+fkr/UBMXuEu3N3+d49h7YfKw==}
+ engines: {node: '>=22.12.0'}
peerDependencies:
- postcss: ^8.4.31
+ prettier: ^3.5.3
- postcss@8.5.15:
- resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==}
- engines: {node: ^10 || ^12 || >=14}
+ prettier-plugin-tailwindcss@0.8.1:
+ resolution: {integrity: sha512-iaFMYqDsE4ffdDkn5qup0j5f2aCEBFZrdrZnvu9QKTlWx/iGPeQ4HHu7b7fCPMxeo9nwQBiOAh2nSypdFYWJkw==}
+ engines: {node: '>=20.19'}
+ peerDependencies:
+ '@ianvs/prettier-plugin-sort-imports': '*'
+ '@prettier/plugin-hermes': '*'
+ '@prettier/plugin-oxc': '*'
+ '@prettier/plugin-pug': '*'
+ '@shopify/prettier-plugin-liquid': '*'
+ '@trivago/prettier-plugin-sort-imports': '*'
+ '@zackad/prettier-plugin-twig': '*'
+ prettier: ^3.0
+ prettier-plugin-astro: '*'
+ prettier-plugin-css-order: '*'
+ prettier-plugin-jsdoc: '*'
+ prettier-plugin-marko: '*'
+ prettier-plugin-multiline-arrays: '*'
+ prettier-plugin-organize-attributes: '*'
+ prettier-plugin-organize-imports: '*'
+ prettier-plugin-sort-imports: '*'
+ prettier-plugin-svelte: '*'
+ peerDependenciesMeta:
+ '@ianvs/prettier-plugin-sort-imports':
+ optional: true
+ '@prettier/plugin-hermes':
+ optional: true
+ '@prettier/plugin-oxc':
+ optional: true
+ '@prettier/plugin-pug':
+ optional: true
+ '@shopify/prettier-plugin-liquid':
+ optional: true
+ '@trivago/prettier-plugin-sort-imports':
+ optional: true
+ '@zackad/prettier-plugin-twig':
+ optional: true
+ prettier-plugin-astro:
+ optional: true
+ prettier-plugin-css-order:
+ optional: true
+ prettier-plugin-jsdoc:
+ optional: true
+ prettier-plugin-marko:
+ optional: true
+ prettier-plugin-multiline-arrays:
+ optional: true
+ prettier-plugin-organize-attributes:
+ optional: true
+ prettier-plugin-organize-imports:
+ optional: true
+ prettier-plugin-sort-imports:
+ optional: true
+ prettier-plugin-svelte:
+ optional: true
- prettier@3.8.4:
- resolution: {integrity: sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==}
+ prettier@3.9.9:
+ resolution: {integrity: sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==}
engines: {node: '>=14'}
hasBin: true
- proc-log@6.1.0:
- resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==}
- engines: {node: ^20.17.0 || >=22.9.0}
-
- proxy-addr@2.0.7:
- resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
- engines: {node: '>= 0.10'}
-
- punycode@2.3.1:
- resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ prismjs@1.30.0:
+ resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
engines: {node: '>=6'}
- qs@6.15.2:
- resolution: {integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==}
- engines: {node: '>=0.6'}
+ process-ancestry@0.1.0:
+ resolution: {integrity: sha512-tGqJW/UnclpYASFcM6Xh8D8l/BMtaQ9+CSG0vlJSJTcdMM4lDRv4c6H0Pdcsfted+bVczdYSfk2fdukg2gQkZg==}
+ engines: {node: '>=18.0.0'}
+
+ property-information@7.2.0:
+ resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==}
- range-parser@1.2.1:
- resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
- engines: {node: '>= 0.6'}
+ qrcode@1.5.4:
+ resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
- raw-body@3.0.2:
- resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==}
- engines: {node: '>= 0.10'}
+ radix3@1.1.2:
+ resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==}
readdirp@4.1.2:
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
engines: {node: '>= 14.18.0'}
- readdirp@5.0.0:
- resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==}
+ readdirp@5.1.1:
+ resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==}
engines: {node: '>= 20.19.0'}
- reflect-metadata@0.2.2:
- resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==}
+ regex-recursion@6.0.2:
+ resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==}
- require-from-string@2.0.2:
- resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
- engines: {node: '>=0.10.0'}
+ regex-utilities@2.3.0:
+ resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==}
- restore-cursor@5.1.0:
- resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
- engines: {node: '>=18'}
+ regex@6.1.0:
+ resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==}
- rfdc@1.4.1:
- resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+ request-light@0.5.8:
+ resolution: {integrity: sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg==}
- rollup@4.60.2:
- resolution: {integrity: sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==}
- engines: {node: '>=18.0.0', npm: '>=8.0.0'}
- hasBin: true
+ request-light@0.7.0:
+ resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==}
- router@2.2.0:
- resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==}
- engines: {node: '>= 18'}
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
- rxjs@7.8.2:
- resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==}
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
- safer-buffer@2.1.2:
- resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+ require-main-filename@2.0.0:
+ resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
- sass@1.99.0:
- resolution: {integrity: sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==}
- engines: {node: '>=14.0.0'}
- hasBin: true
+ resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
- saxes@6.0.0:
- resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
- engines: {node: '>=v12.22.7'}
+ retext-smartypants@6.2.0:
+ resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==}
- semver@6.3.1:
- resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ rolldown@1.2.11:
+ resolution: {integrity: sha512-qpSwIyz0jHQq5qXBTNxFmE6664rJ7O+4TvPFOiOaBSrz8IOHc1koKKSqTM2H6u1UG1+TveuC6vaDHKXFOvb1Kw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
- semver@7.7.4:
- resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==}
- engines: {node: '>=10'}
- hasBin: true
+ s.color@0.0.15:
+ resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==}
- semver@7.8.4:
- resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==}
- engines: {node: '>=10'}
+ sass-formatter@0.8.0:
+ resolution: {integrity: sha512-Nf4eMGE2O5vnJG7KPCRyksWS9gVKSYoUWtPeMXRRxwZSPVQhSGtL602xVYS65LvMkHmkvKa7xpauF0+/5pPwrg==}
hasBin: true
- send@1.2.1:
- resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==}
- engines: {node: '>= 18'}
-
- serve-static@2.2.1:
- resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==}
- engines: {node: '>= 18'}
-
- setprototypeof@1.2.0:
- resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+ satteri@0.10.5:
+ resolution: {integrity: sha512-Ao1LKpAEa9Wdg0otgbVKViZHEq9ebdXe4DMrp3s9vQAU0HNIuHnFEuMuOcm0ZIXyV0Yzxj91NvhLpvXZJO/5ZQ==}
- shebang-command@2.0.0:
- resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
- engines: {node: '>=8'}
-
- shebang-regex@3.0.0:
- resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
- engines: {node: '>=8'}
-
- side-channel-list@1.0.1:
- resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==}
- engines: {node: '>= 0.4'}
-
- side-channel-map@1.0.1:
- resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
- engines: {node: '>= 0.4'}
-
- side-channel-weakmap@1.0.2:
- resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
- engines: {node: '>= 0.4'}
-
- side-channel@1.1.1:
- resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==}
- engines: {node: '>= 0.4'}
-
- siginfo@2.0.0:
- resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+ sax@1.6.1:
+ resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==}
+ engines: {node: '>=11.0.0'}
- signal-exit@4.1.0:
- resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
- engines: {node: '>=14'}
+ semver@7.8.5:
+ resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
+ engines: {node: '>=10'}
+ hasBin: true
- sigstore@4.1.1:
- resolution: {integrity: sha512-endqECJkfhozrXMK5ngu/UAA0xVcVEFdnHJCElGaExypjW+HK5i6zu3NteLoaX/iFbRUbC3+DjttQs0GARr+5w==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ set-blocking@2.0.0:
+ resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
- slice-ansi@7.1.2:
- resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==}
- engines: {node: '>=18'}
+ sharp@0.35.4:
+ resolution: {integrity: sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==}
+ engines: {node: '>=20.9.0'}
+ peerDependencies:
+ '@types/node': '*'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
- slice-ansi@8.0.0:
- resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==}
+ shiki@4.4.3:
+ resolution: {integrity: sha512-Mb/GvXPHBAXdgGIcnfU5L3ldpn1XcxrGkPHwqgRx17/I2XRfqlFKk2vGkHWINn1kdXvzJZeuO3is6I9KLPFm0g==}
engines: {node: '>=20'}
- smart-buffer@4.2.0:
- resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==}
- engines: {node: '>= 6.0.0', npm: '>= 3.0.0'}
+ sisteransi@1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
- socks-proxy-agent@8.0.5:
- resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==}
- engines: {node: '>= 14'}
+ sitemap@9.0.1:
+ resolution: {integrity: sha512-S6hzjGJSG3d6if0YoF5kTyeRJvia6FSTBroE5fQ0bu1QNxyJqhhinfUsXi9fH3MgtXODWvwo2BDyQSnhPQ88uQ==}
+ engines: {node: '>=20.19.5', npm: '>=10.8.2'}
+ hasBin: true
- socks@2.8.9:
- resolution: {integrity: sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==}
- engines: {node: '>= 10.0.0', npm: '>= 3.0.0'}
+ smol-toml@1.9.0:
+ resolution: {integrity: sha512-hpd+HLON7HdZXqYchMM/+LaTTbdK0AU3NngIJ4KVyWbY9bfQqdL9cD+4yf6dUoU2Ap4VsU0JkQi6FxAI1B2mXQ==}
+ engines: {node: '>= 18'}
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
- source-map-support@0.5.21:
- resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
-
- source-map@0.6.1:
- resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
- engines: {node: '>=0.10.0'}
-
- source-map@0.7.6:
- resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
- engines: {node: '>= 12'}
-
- spdx-exceptions@2.5.0:
- resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==}
-
- spdx-expression-parse@4.0.0:
- resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==}
-
- spdx-license-ids@3.0.23:
- resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==}
-
- ssri@13.0.1:
- resolution: {integrity: sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==}
- engines: {node: ^20.17.0 || >=22.9.0}
-
- stackback@0.0.2:
- resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
-
- statuses@2.0.2:
- resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==}
- engines: {node: '>= 0.8'}
-
- std-env@4.1.0:
- resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==}
+ space-separated-tokens@2.0.2:
+ resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
- stdin-discarder@0.3.2:
- resolution: {integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==}
- engines: {node: '>=18'}
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
string-width@7.2.0:
resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
engines: {node: '>=18'}
- string-width@8.2.1:
- resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==}
+ string-width@8.3.0:
+ resolution: {integrity: sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==}
engines: {node: '>=20'}
+ stringify-entities@4.0.4:
+ resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
strip-ansi@7.2.0:
resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==}
engines: {node: '>=12'}
- symbol-tree@3.2.4:
- resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
+ suf-log@2.5.3:
+ resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==}
+
+ svgo@4.1.0:
+ resolution: {integrity: sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q==}
+ engines: {node: '>=16'}
+ hasBin: true
- tailwindcss@4.3.1:
- resolution: {integrity: sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==}
+ tailwindcss@4.3.3:
+ resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==}
tapable@2.3.3:
resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
engines: {node: '>=6'}
- tar@7.5.16:
- resolution: {integrity: sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==}
- engines: {node: '>=18'}
+ tiny-inflate@1.0.3:
+ resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==}
- tinybench@2.9.0:
- resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+ tinyclip@1.0.3:
+ resolution: {integrity: sha512-nTv2raKFMzGG6JJp0lpNDsRPdfFE6UHlu2rVEjXo8vkx1ZS3LW2CVXqIaLu8xZlu+6tbFs9V58Qc/Jmk/Ii7wA==}
+ engines: {node: ^16.14.0 || >= 17.3.0}
- tinyexec@1.2.4:
- resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==}
+ tinyexec@1.3.1:
+ resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==}
engines: {node: '>=18'}
- tinyglobby@0.2.16:
- resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==}
- engines: {node: '>=12.0.0'}
-
tinyglobby@0.2.17:
resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
engines: {node: '>=12.0.0'}
- tinyrainbow@3.1.0:
- resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==}
- engines: {node: '>=14.0.0'}
+ trim-lines@3.0.1:
+ resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
- tldts-core@7.4.3:
- resolution: {integrity: sha512-27ep5H9PzdBrNd5OFM/j3WCU8F3kPwM9D0BOaOf7uYfxMJfyr0K5Tjj69Gri+sZlh2WXd5buIm47NuPF29CDiw==}
+ trough@2.2.0:
+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
- tldts@7.4.3:
- resolution: {integrity: sha512-A3BDQBeeukYPzB4QdQ1DtdlUmp4x2OCH8n5UVhEWbyANxNep8GavottKzd1xYKFJKjUgMyPT7EzOfnBO55s8Sg==}
- hasBin: true
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
- toidentifier@1.0.1:
- resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
- engines: {node: '>=0.6'}
+ typesafe-path@0.2.2:
+ resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==}
- tough-cookie@6.0.1:
- resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==}
- engines: {node: '>=16'}
-
- tr46@6.0.0:
- resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==}
- engines: {node: '>=20'}
-
- tslib@2.8.1:
- resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
-
- tuf-js@4.1.0:
- resolution: {integrity: sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==}
- engines: {node: ^20.17.0 || >=22.9.0}
-
- type-is@2.1.0:
- resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==}
- engines: {node: '>= 18'}
+ typescript-auto-import-cache@0.3.6:
+ resolution: {integrity: sha512-RpuHXrknHdVdK7wv/8ug3Fr0WNsNi5l5aB8MYYuXhq2UH5lnEB1htJ1smhtD5VeCsGr2p8mUDtd83LCQDFVgjQ==}
typescript@6.0.3:
resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==}
engines: {node: '>=14.17'}
hasBin: true
- undici-types@6.21.0:
- resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+ ufo@1.6.4:
+ resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==}
- undici@6.27.0:
- resolution: {integrity: sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==}
- engines: {node: '>=18.17'}
+ ultrahtml@1.7.0:
+ resolution: {integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==}
- undici@7.28.0:
- resolution: {integrity: sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==}
- engines: {node: '>=20.18.1'}
+ uncrypto@0.1.3:
+ resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
- unpipe@1.0.0:
- resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
- engines: {node: '>= 0.8'}
+ undici-types@7.18.2:
+ resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
- update-browserslist-db@1.2.3:
- resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==}
- hasBin: true
+ undici@8.11.2:
+ resolution: {integrity: sha512-u4UB2/IrKdU6lFxumHmmo1a3fCQO5tzQllRorfoRS63txhrB7xTpSn1PftwC4qEHkOaqP95fCWW4lJzwErwzhQ==}
+ engines: {node: '>=22.19.0'}
+
+ unified@11.0.5:
+ resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
+
+ unifont@0.7.5:
+ resolution: {integrity: sha512-ULe/Cs+ZIsq+dcFofNkhqielCrUJnb5mr+Yc4EBM2VlL+6OZR6+cjtI2mT1bJvRBrVncqHAbLURxmPLcCXzWMg==}
+
+ unist-util-is@6.0.1:
+ resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==}
+
+ unist-util-position@5.0.0:
+ resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+
+ unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+
+ unist-util-visit-parents@6.0.2:
+ resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==}
+
+ unist-util-visit@5.1.0:
+ resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==}
+
+ unstorage@1.17.5:
+ resolution: {integrity: sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg==}
peerDependencies:
- browserslist: '>= 4.21.0'
+ '@azure/app-configuration': ^1.8.0
+ '@azure/cosmos': ^4.2.0
+ '@azure/data-tables': ^13.3.0
+ '@azure/identity': ^4.6.0
+ '@azure/keyvault-secrets': ^4.9.0
+ '@azure/storage-blob': ^12.26.0
+ '@capacitor/preferences': ^6 || ^7 || ^8
+ '@deno/kv': '>=0.9.0'
+ '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0
+ '@planetscale/database': ^1.19.0
+ '@upstash/redis': ^1.34.3
+ '@vercel/blob': '>=0.27.1'
+ '@vercel/functions': ^2.2.12 || ^3.0.0
+ '@vercel/kv': ^1 || ^2 || ^3
+ aws4fetch: ^1.0.20
+ db0: '>=0.2.1'
+ idb-keyval: ^6.2.1
+ ioredis: ^5.4.2
+ uploadthing: ^7.4.4
+ peerDependenciesMeta:
+ '@azure/app-configuration':
+ optional: true
+ '@azure/cosmos':
+ optional: true
+ '@azure/data-tables':
+ optional: true
+ '@azure/identity':
+ optional: true
+ '@azure/keyvault-secrets':
+ optional: true
+ '@azure/storage-blob':
+ optional: true
+ '@capacitor/preferences':
+ optional: true
+ '@deno/kv':
+ optional: true
+ '@netlify/blobs':
+ optional: true
+ '@planetscale/database':
+ optional: true
+ '@upstash/redis':
+ optional: true
+ '@vercel/blob':
+ optional: true
+ '@vercel/functions':
+ optional: true
+ '@vercel/kv':
+ optional: true
+ aws4fetch:
+ optional: true
+ db0:
+ optional: true
+ idb-keyval:
+ optional: true
+ ioredis:
+ optional: true
+ uploadthing:
+ optional: true
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
- validate-npm-package-name@7.0.2:
- resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==}
- engines: {node: ^20.17.0 || >=22.9.0}
+ verkit@0.4.1:
+ resolution: {integrity: sha512-mMVzj0TXExtVdlDEq+Mzp0eyOuyznNpFobNM3uAqe3HVm/Ps2c+u17BligMkZjZCA6EiXpoon8iRTer3iu40SQ==}
+ engines: {node: '>=18.12.0'}
- vary@1.1.2:
- resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
- engines: {node: '>= 0.8'}
+ vfile-message@4.0.3:
+ resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==}
- vite@7.3.5:
- resolution: {integrity: sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==}
+ vfile@6.0.3:
+ resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
+
+ vite@8.3.1:
+ resolution: {integrity: sha512-/bvH9E9tmCXRGp2uXY3WbOldqpTwFkbha/8ANaEQ6VkxhH60KyqLwgZq6lG2y+4uT55x9+9eUHMpQ7uGnOCKjA==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
'@types/node': ^20.19.0 || >=22.12.0
+ '@vitejs/devtools': ^0.7.1
+ esbuild: ^0.27.0 || ^0.28.0
jiti: '>=1.21.0'
less: ^4.0.0
- lightningcss: ^1.21.0
sass: ^1.70.0
sass-embedded: ^1.70.0
stylus: '>=0.54.8'
@@ -2835,12 +2064,14 @@ packages:
peerDependenciesMeta:
'@types/node':
optional: true
+ '@vitejs/devtools':
+ optional: true
+ esbuild:
+ optional: true
jiti:
optional: true
less:
optional: true
- lightningcss:
- optional: true
sass:
optional: true
sass-embedded:
@@ -2856,1576 +2087,1106 @@ packages:
yaml:
optional: true
- vitest@4.1.9:
- resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==}
- engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
- hasBin: true
+ vitefu@1.1.3:
+ resolution: {integrity: sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==}
peerDependencies:
- '@edge-runtime/vm': '*'
- '@opentelemetry/api': ^1.9.0
- '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0
- '@vitest/browser-playwright': 4.1.9
- '@vitest/browser-preview': 4.1.9
- '@vitest/browser-webdriverio': 4.1.9
- '@vitest/coverage-istanbul': 4.1.9
- '@vitest/coverage-v8': 4.1.9
- '@vitest/ui': 4.1.9
- happy-dom: '*'
- jsdom: '*'
- vite: ^6.0.0 || ^7.0.0 || ^8.0.0
+ vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
peerDependenciesMeta:
- '@edge-runtime/vm':
- optional: true
- '@opentelemetry/api':
- optional: true
- '@types/node':
+ vite:
optional: true
- '@vitest/browser-playwright':
+
+ volar-service-css@0.0.71:
+ resolution: {integrity: sha512-wRRFt9BpjMKCazcgOh67MSjUjiWUCAh99DyYSDIOTuxaRjEtDC7PpB0k1Y1wbJIW/pVtMUSVbpPo3UGSm0Byxw==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
optional: true
- '@vitest/browser-preview':
+
+ volar-service-emmet@0.0.71:
+ resolution: {integrity: sha512-zqjzt6bN95e3CUstBm0PBFAJnrfz0ZAARka87fart46/gNCLLuP3Vujy8V/J8HEziTFLnfkgIASLFYPUhonJcA==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
optional: true
- '@vitest/browser-webdriverio':
+
+ volar-service-html@0.0.71:
+ resolution: {integrity: sha512-e8tHPhgQ7ooLfudAEIku+kgd9pWkq3SSz8RbnQDI1+Eb8wbenkLGHqoirLqz5ORLV6wIMr2Iv08RWBG5eOcgpw==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
optional: true
- '@vitest/coverage-istanbul':
+
+ volar-service-prettier@0.0.71:
+ resolution: {integrity: sha512-Rz7JVH3qD108UCdmIEiZvOBNljMt2nLFdbN8AXcDfn7xD9F5I2aCIsDVqBbXw21PsnxG0b7MfwtNF+zPS/NKUg==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ prettier: ^2.2 || ^3.0
+ peerDependenciesMeta:
+ '@volar/language-service':
optional: true
- '@vitest/coverage-v8':
+ prettier:
optional: true
- '@vitest/ui':
+
+ volar-service-typescript-twoslash-queries@0.0.71:
+ resolution: {integrity: sha512-9K2k72s4n7rV9s4bX0MyjbX9iBribvKZbBJKuEmTCZfeWJXs6Yh7bGpY4eoc7UufAjvpheBqwyZCOIPBvxCv0A==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
optional: true
- happy-dom:
+
+ volar-service-typescript@0.0.71:
+ resolution: {integrity: sha512-yTtM/BVT6hoyEYnDtaCyAtNhdNeS/mhTTABlBOdw3NNiRBUin3IznFJpgfjer4c6RYopiPjjQjc9VFhxVl1mLw==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
optional: true
- jsdom:
+
+ volar-service-yaml@0.0.71:
+ resolution: {integrity: sha512-qYGWGuVpUTnZGu5P/CR4KLK4aIR8RrcVnmfZ2eRcj9q/I8VZCoC5yy9FtEvfNvnDp4MU17yhdJcvpQPIqhJS2Q==}
+ peerDependencies:
+ '@volar/language-service': ~2.4.0
+ peerDependenciesMeta:
+ '@volar/language-service':
optional: true
- w3c-xmlserializer@5.0.0:
- resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
- engines: {node: '>=18'}
+ vscode-css-languageservice@6.3.10:
+ resolution: {integrity: sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==}
- watchpack@2.5.1:
- resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==}
- engines: {node: '>=10.13.0'}
+ vscode-html-languageservice@5.6.2:
+ resolution: {integrity: sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==}
- weak-lru-cache@1.2.2:
- resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==}
+ vscode-json-languageservice@4.1.8:
+ resolution: {integrity: sha512-0vSpg6Xd9hfV+eZAaYN63xVVMOTmJ4GgHxXnkLCh+9RsQBkWKIghzLhW2B9ebfG+LQQg8uLtsQ2aUKjTgE+QOg==}
+ engines: {npm: '>=7.0.0'}
- webidl-conversions@8.0.1:
- resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==}
- engines: {node: '>=20'}
+ vscode-jsonrpc@8.2.0:
+ resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==}
+ engines: {node: '>=14.0.0'}
- whatwg-mimetype@5.0.0:
- resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==}
- engines: {node: '>=20'}
+ vscode-jsonrpc@9.0.3:
+ resolution: {integrity: sha512-qETYf9PCl1lVfwR+oBmMfc4vP2nqLNA35ABxorw3j06+xlKRgDVxbLgKm4Y/xPL0YWdeDjLoI4ImICIT3nB0zQ==}
+ engines: {node: '>=14.0.0'}
- whatwg-url@16.0.1:
- resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==}
- engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
+ vscode-languageserver-protocol@3.17.5:
+ resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==}
- which@2.0.2:
- resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
- engines: {node: '>= 8'}
- hasBin: true
+ vscode-languageserver-protocol@3.18.4:
+ resolution: {integrity: sha512-CCXbyr99dafRJzJH/0Ryk7ly5T8XPmSR0//OuF2w4m+9JiOin7zcAT5iET8GRE7Z9taFBejb3GbM0a0mbjdbrg==}
- which@6.0.1:
- resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==}
- engines: {node: ^20.17.0 || >=22.9.0}
- hasBin: true
+ vscode-languageserver-textdocument@1.0.15:
+ resolution: {integrity: sha512-Gsfr9S8LU3S6885cS+NaleasJ0n3V5y/SOTqHCifQiXWFw3G9w9/YItDfwHrlCz+dSZWWZ8ilYVMcJe7Sz7Sxw==}
- why-is-node-running@2.3.0:
- resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
- engines: {node: '>=8'}
+ vscode-languageserver-types@3.17.5:
+ resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==}
+
+ vscode-languageserver-types@3.18.4:
+ resolution: {integrity: sha512-nQsacoiijvl0fRf2q28uFDrAVwRhdCa3QveiF7/CX0r18mLR5FU/1WskSsCKOjmEbtteKUnY8x8Yzxop+k0zwg==}
+
+ vscode-languageserver@9.0.1:
+ resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==}
hasBin: true
- wrap-ansi@10.0.0:
- resolution: {integrity: sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==}
- engines: {node: '>=20'}
+ vscode-nls@5.2.0:
+ resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==}
- wrap-ansi@9.0.2:
- resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
- engines: {node: '>=18'}
+ vscode-uri@3.2.0:
+ resolution: {integrity: sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==}
- wrappy@1.0.2:
- resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ which-module@2.0.1:
+ resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
- xhr2@0.2.1:
- resolution: {integrity: sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==}
- engines: {node: '>= 6'}
+ wrap-ansi@6.2.0:
+ resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+ engines: {node: '>=8'}
- xml-name-validator@5.0.0:
- resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
+ wrap-ansi@9.0.2:
+ resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==}
engines: {node: '>=18'}
- xmlchars@2.2.0:
- resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
+ xxhash-wasm@1.1.0:
+ resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==}
+
+ y18n@4.0.3:
+ resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
- yallist@3.1.1:
- resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+ yaml-language-server@1.23.0:
+ resolution: {integrity: sha512-3qVyCOexLCWw06PQa5kRPwvMWMZ/eZeCRWUvgD6a0OkqL/4iCnxy2WumbWifa937Uo5xhyWJ0uxlU39ljhNh7A==}
+ hasBin: true
- yallist@4.0.0:
- resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+ yaml@2.8.3:
+ resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
- yallist@5.0.0:
- resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
- engines: {node: '>=18'}
+ yaml@2.9.1:
+ resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
+
+ yargs-parser@18.1.3:
+ resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}
+ engines: {node: '>=6'}
yargs-parser@22.0.0:
resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==}
engines: {node: ^20.19.0 || ^22.12.0 || >=23}
- yargs@18.0.0:
- resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==}
- engines: {node: ^20.19.0 || ^22.12.0 || >=23}
+ yargs@15.4.1:
+ resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==}
+ engines: {node: '>=8'}
- yoctocolors@2.1.2:
- resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==}
- engines: {node: '>=18'}
+ yargs@18.2.0:
+ resolution: {integrity: sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==}
+ engines: {node: ^20.19.0 || ^22.12.0 || >=23}
- zod-to-json-schema@3.25.2:
- resolution: {integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==}
- peerDependencies:
- zod: ^3.25.28 || ^4
+ yocto-queue@1.2.2:
+ resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==}
+ engines: {node: '>=12.20'}
- zod@4.4.2:
- resolution: {integrity: sha512-IynmDyxsEsb9RKzO3J9+4SxXnl2FTFSzNBaKKaMV6tsSk0rw9gYw9gs+JFCq/qk2LCZ78KDwyj+Z289TijSkUw==}
+ zod@4.6.5:
+ resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==}
- zod@4.4.3:
- resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==}
+ zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
snapshots:
- '@acemir/cssom@0.9.31': {}
-
- '@algolia/abtesting@1.18.0':
- dependencies:
- '@algolia/client-common': 5.52.0
- '@algolia/requester-browser-xhr': 5.52.0
- '@algolia/requester-fetch': 5.52.0
- '@algolia/requester-node-http': 5.52.0
-
- '@algolia/client-abtesting@5.52.0':
- dependencies:
- '@algolia/client-common': 5.52.0
- '@algolia/requester-browser-xhr': 5.52.0
- '@algolia/requester-fetch': 5.52.0
- '@algolia/requester-node-http': 5.52.0
-
- '@algolia/client-analytics@5.52.0':
- dependencies:
- '@algolia/client-common': 5.52.0
- '@algolia/requester-browser-xhr': 5.52.0
- '@algolia/requester-fetch': 5.52.0
- '@algolia/requester-node-http': 5.52.0
-
- '@algolia/client-common@5.52.0': {}
-
- '@algolia/client-insights@5.52.0':
- dependencies:
- '@algolia/client-common': 5.52.0
- '@algolia/requester-browser-xhr': 5.52.0
- '@algolia/requester-fetch': 5.52.0
- '@algolia/requester-node-http': 5.52.0
-
- '@algolia/client-personalization@5.52.0':
- dependencies:
- '@algolia/client-common': 5.52.0
- '@algolia/requester-browser-xhr': 5.52.0
- '@algolia/requester-fetch': 5.52.0
- '@algolia/requester-node-http': 5.52.0
-
- '@algolia/client-query-suggestions@5.52.0':
- dependencies:
- '@algolia/client-common': 5.52.0
- '@algolia/requester-browser-xhr': 5.52.0
- '@algolia/requester-fetch': 5.52.0
- '@algolia/requester-node-http': 5.52.0
-
- '@algolia/client-search@5.52.0':
- dependencies:
- '@algolia/client-common': 5.52.0
- '@algolia/requester-browser-xhr': 5.52.0
- '@algolia/requester-fetch': 5.52.0
- '@algolia/requester-node-http': 5.52.0
-
- '@algolia/ingestion@1.52.0':
- dependencies:
- '@algolia/client-common': 5.52.0
- '@algolia/requester-browser-xhr': 5.52.0
- '@algolia/requester-fetch': 5.52.0
- '@algolia/requester-node-http': 5.52.0
-
- '@algolia/monitoring@1.52.0':
- dependencies:
- '@algolia/client-common': 5.52.0
- '@algolia/requester-browser-xhr': 5.52.0
- '@algolia/requester-fetch': 5.52.0
- '@algolia/requester-node-http': 5.52.0
-
- '@algolia/recommend@5.52.0':
- dependencies:
- '@algolia/client-common': 5.52.0
- '@algolia/requester-browser-xhr': 5.52.0
- '@algolia/requester-fetch': 5.52.0
- '@algolia/requester-node-http': 5.52.0
-
- '@algolia/requester-browser-xhr@5.52.0':
- dependencies:
- '@algolia/client-common': 5.52.0
-
- '@algolia/requester-fetch@5.52.0':
- dependencies:
- '@algolia/client-common': 5.52.0
-
- '@algolia/requester-node-http@5.52.0':
+ '@astrojs/astro2tsx@0.1.1(@emnapi/runtime@1.11.3)':
dependencies:
- '@algolia/client-common': 5.52.0
-
- '@alloc/quick-lru@5.2.0': {}
-
- '@ampproject/remapping@2.3.0':
- dependencies:
- '@jridgewell/gen-mapping': 0.3.13
- '@jridgewell/trace-mapping': 0.3.31
-
- '@angular-devkit/architect@0.2200.3(chokidar@5.0.0)':
- dependencies:
- '@angular-devkit/core': 22.0.3(chokidar@5.0.0)
- rxjs: 7.8.2
- transitivePeerDependencies:
- - chokidar
-
- '@angular-devkit/core@22.0.3(chokidar@5.0.0)':
- dependencies:
- ajv: 8.20.0
- ajv-formats: 3.0.1(ajv@8.20.0)
- jsonc-parser: 3.3.1
- picomatch: 4.0.4
- rxjs: 7.8.2
- source-map: 0.7.6
- optionalDependencies:
- chokidar: 5.0.0
-
- '@angular-devkit/schematics@22.0.3(chokidar@5.0.0)':
- dependencies:
- '@angular-devkit/core': 22.0.3(chokidar@5.0.0)
- jsonc-parser: 3.3.1
- magic-string: 0.30.21
- ora: 9.4.0
- rxjs: 7.8.2
- transitivePeerDependencies:
- - chokidar
-
- '@angular/build@22.0.3(5ce02b17d3abbea08b56e311955e9b52)':
- dependencies:
- '@ampproject/remapping': 2.3.0
- '@angular-devkit/architect': 0.2200.3(chokidar@5.0.0)
- '@angular/compiler': 22.0.2
- '@angular/compiler-cli': 22.0.2(@angular/compiler@22.0.2)(typescript@6.0.3)
- '@babel/core': 7.29.0
- '@babel/helper-annotate-as-pure': 7.27.3
- '@babel/helper-split-export-declaration': 7.24.7
- '@inquirer/confirm': 6.0.12(@types/node@20.19.43)
- '@vitejs/plugin-basic-ssl': 2.3.0(vite@7.3.5(@types/node@20.19.43)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0))
- beasties: 0.4.2
- browserslist: 4.28.2
- esbuild: 0.28.1
- https-proxy-agent: 9.0.0
- jsonc-parser: 3.3.1
- listr2: 10.2.1
- magic-string: 0.30.21
- mrmime: 2.0.1
- parse5-html-rewriting-stream: 8.0.1
- picomatch: 4.0.4
- piscina: 5.1.4
- rollup: 4.60.2
- sass: 1.99.0
- semver: 7.7.4
- source-map-support: 0.5.21
- tinyglobby: 0.2.16
- tslib: 2.8.1
- typescript: 6.0.3
- vite: 7.3.5(@types/node@20.19.43)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0)
- watchpack: 2.5.1
- optionalDependencies:
- '@angular/core': 22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)
- '@angular/platform-browser': 22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))
- '@angular/platform-server': 22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@22.0.2)(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)))(rxjs@7.8.2)
- '@angular/ssr': 22.0.3(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(@angular/platform-server@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@22.0.2)(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/router@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)))(rxjs@7.8.2))
- lmdb: 3.5.4
- postcss: 8.5.15
- tailwindcss: 4.3.1
- vitest: 4.1.9(@types/node@20.19.43)(jsdom@28.1.0)(vite@7.3.5(@types/node@20.19.43)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0))
+ '@emnapi/core': 1.11.3
+ '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)
transitivePeerDependencies:
- - '@types/node'
- - chokidar
- - jiti
- - lightningcss
- - sass-embedded
- - stylus
- - sugarss
- - supports-color
- - terser
- - tsx
- - yaml
-
- '@angular/cli@22.0.3(@types/node@20.19.43)(chokidar@5.0.0)':
- dependencies:
- '@angular-devkit/architect': 0.2200.3(chokidar@5.0.0)
- '@angular-devkit/core': 22.0.3(chokidar@5.0.0)
- '@angular-devkit/schematics': 22.0.3(chokidar@5.0.0)
- '@inquirer/prompts': 8.4.2(@types/node@20.19.43)
- '@listr2/prompt-adapter-inquirer': 4.2.3(@inquirer/prompts@8.4.2(@types/node@20.19.43))(@types/node@20.19.43)(listr2@10.2.1)
- '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.2)
- '@schematics/angular': 22.0.3(chokidar@5.0.0)
- '@yarnpkg/lockfile': 1.1.0
- algoliasearch: 5.52.0
- ini: 6.0.0
- jsonc-parser: 3.3.1
- listr2: 10.2.1
- npm-package-arg: 13.0.2
- pacote: 21.5.1
- parse5-html-rewriting-stream: 8.0.1
- semver: 7.7.4
- yargs: 18.0.0
- zod: 4.4.2
- transitivePeerDependencies:
- - '@cfworker/json-schema'
- - '@types/node'
- - chokidar
- - supports-color
-
- '@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2)':
- dependencies:
- '@angular/core': 22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)
- rxjs: 7.8.2
- tslib: 2.8.1
+ - '@emnapi/runtime'
- '@angular/compiler-cli@22.0.2(@angular/compiler@22.0.2)(typescript@6.0.3)':
+ '@astrojs/check@0.9.10(@emnapi/runtime@1.11.3)(prettier-plugin-astro@1.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(prettier@3.9.9))(prettier@3.9.9)(typescript@6.0.3)':
dependencies:
- '@angular/compiler': 22.0.2
- '@babel/core': 7.29.0
- '@jridgewell/sourcemap-codec': 1.5.5
- chokidar: 5.0.0
- convert-source-map: 1.9.0
- reflect-metadata: 0.2.2
- semver: 7.8.4
- tslib: 2.8.1
- yargs: 18.0.0
- optionalDependencies:
+ '@astrojs/language-server': 2.17.1(@emnapi/runtime@1.11.3)(prettier-plugin-astro@1.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(prettier@3.9.9))(prettier@3.9.9)(typescript@6.0.3)
+ chokidar: 4.0.3
+ kleur: 4.1.5
typescript: 6.0.3
+ yargs: 18.2.0
transitivePeerDependencies:
- - supports-color
-
- '@angular/compiler@22.0.2':
- dependencies:
- tslib: 2.8.1
-
- '@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)':
- dependencies:
- rxjs: 7.8.2
- tslib: 2.8.1
- optionalDependencies:
- '@angular/compiler': 22.0.2
-
- '@angular/forms@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)))(rxjs@7.8.2)':
- dependencies:
- '@angular/common': 22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2)
- '@angular/core': 22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)
- '@angular/platform-browser': 22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))
- '@standard-schema/spec': 1.1.0
- rxjs: 7.8.2
- tslib: 2.8.1
- zod: 4.4.3
-
- '@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))':
- dependencies:
- '@angular/common': 22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2)
- '@angular/core': 22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)
- tslib: 2.8.1
-
- '@angular/platform-server@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@22.0.2)(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)))(rxjs@7.8.2)':
- dependencies:
- '@angular/common': 22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2)
- '@angular/compiler': 22.0.2
- '@angular/core': 22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)
- '@angular/platform-browser': 22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))
- rxjs: 7.8.2
- tslib: 2.8.1
- xhr2: 0.2.1
-
- '@angular/router@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)))(rxjs@7.8.2)':
- dependencies:
- '@angular/common': 22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2)
- '@angular/core': 22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)
- '@angular/platform-browser': 22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))
- rxjs: 7.8.2
- tslib: 2.8.1
-
- '@angular/ssr@22.0.3(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(@angular/platform-server@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@22.0.2)(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)))(rxjs@7.8.2))(@angular/router@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)))(rxjs@7.8.2))':
- dependencies:
- '@angular/common': 22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2)
- '@angular/core': 22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)
- '@angular/router': 22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)))(rxjs@7.8.2)
- tslib: 2.8.1
- optionalDependencies:
- '@angular/platform-server': 22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@22.0.2)(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(@angular/platform-browser@22.0.2(@angular/common@22.0.2(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.0.2(@angular/compiler@22.0.2)(rxjs@7.8.2)))(rxjs@7.8.2)
-
- '@asamuzakjp/css-color@5.1.11':
- dependencies:
- '@asamuzakjp/generational-cache': 1.0.1
- '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
- '@csstools/css-color-parser': 4.1.7(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
- '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
- '@csstools/css-tokenizer': 4.0.0
-
- '@asamuzakjp/dom-selector@6.8.1':
- dependencies:
- '@asamuzakjp/nwsapi': 2.3.9
- bidi-js: 1.0.3
- css-tree: 3.2.1
- is-potential-custom-element-name: 1.0.1
- lru-cache: 11.5.1
-
- '@asamuzakjp/generational-cache@1.0.1': {}
-
- '@asamuzakjp/nwsapi@2.3.9': {}
-
- '@babel/code-frame@7.29.7':
- dependencies:
- '@babel/helper-validator-identifier': 7.29.7
- js-tokens: 4.0.0
- picocolors: 1.1.1
-
- '@babel/compat-data@7.29.7': {}
-
- '@babel/core@7.29.0':
- dependencies:
- '@babel/code-frame': 7.29.7
- '@babel/generator': 7.29.7
- '@babel/helper-compilation-targets': 7.29.7
- '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.0)
- '@babel/helpers': 7.29.7
- '@babel/parser': 7.29.7
- '@babel/template': 7.29.7
- '@babel/traverse': 7.29.7
- '@babel/types': 7.29.7
- '@jridgewell/remapping': 2.3.5
- convert-source-map: 2.0.0
- debug: 4.4.3
- gensync: 1.0.0-beta.2
- json5: 2.2.3
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
-
- '@babel/generator@7.29.7':
- dependencies:
- '@babel/parser': 7.29.7
- '@babel/types': 7.29.7
- '@jridgewell/gen-mapping': 0.3.13
- '@jridgewell/trace-mapping': 0.3.31
- jsesc: 3.1.0
-
- '@babel/helper-annotate-as-pure@7.27.3':
- dependencies:
- '@babel/types': 7.29.7
-
- '@babel/helper-compilation-targets@7.29.7':
- dependencies:
- '@babel/compat-data': 7.29.7
- '@babel/helper-validator-option': 7.29.7
- browserslist: 4.28.2
- lru-cache: 5.1.1
- semver: 6.3.1
-
- '@babel/helper-globals@7.29.7': {}
-
- '@babel/helper-module-imports@7.29.7':
- dependencies:
- '@babel/traverse': 7.29.7
- '@babel/types': 7.29.7
- transitivePeerDependencies:
- - supports-color
-
- '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.0)':
- dependencies:
- '@babel/core': 7.29.0
- '@babel/helper-module-imports': 7.29.7
- '@babel/helper-validator-identifier': 7.29.7
- '@babel/traverse': 7.29.7
- transitivePeerDependencies:
- - supports-color
-
- '@babel/helper-split-export-declaration@7.24.7':
- dependencies:
- '@babel/types': 7.29.7
-
- '@babel/helper-string-parser@7.29.7': {}
-
- '@babel/helper-validator-identifier@7.29.7': {}
-
- '@babel/helper-validator-option@7.29.7': {}
-
- '@babel/helpers@7.29.7':
- dependencies:
- '@babel/template': 7.29.7
- '@babel/types': 7.29.7
-
- '@babel/parser@7.29.7':
- dependencies:
- '@babel/types': 7.29.7
-
- '@babel/template@7.29.7':
- dependencies:
- '@babel/code-frame': 7.29.7
- '@babel/parser': 7.29.7
- '@babel/types': 7.29.7
-
- '@babel/traverse@7.29.7':
- dependencies:
- '@babel/code-frame': 7.29.7
- '@babel/generator': 7.29.7
- '@babel/helper-globals': 7.29.7
- '@babel/parser': 7.29.7
- '@babel/template': 7.29.7
- '@babel/types': 7.29.7
- debug: 4.4.3
- transitivePeerDependencies:
- - supports-color
-
- '@babel/types@7.29.7':
- dependencies:
- '@babel/helper-string-parser': 7.29.7
- '@babel/helper-validator-identifier': 7.29.7
-
- '@bramus/specificity@2.4.2':
- dependencies:
- css-tree: 3.2.1
-
- '@csstools/color-helpers@6.0.2': {}
-
- '@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)':
- dependencies:
- '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
- '@csstools/css-tokenizer': 4.0.0
-
- '@csstools/css-color-parser@4.1.7(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)':
- dependencies:
- '@csstools/color-helpers': 6.0.2
- '@csstools/css-calc': 3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)
- '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
- '@csstools/css-tokenizer': 4.0.0
-
- '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)':
- dependencies:
- '@csstools/css-tokenizer': 4.0.0
-
- '@csstools/css-syntax-patches-for-csstree@1.1.5(css-tree@3.2.1)':
- optionalDependencies:
- css-tree: 3.2.1
-
- '@csstools/css-tokenizer@4.0.0': {}
-
- '@esbuild/aix-ppc64@0.27.7':
- optional: true
-
- '@esbuild/aix-ppc64@0.28.1':
- optional: true
-
- '@esbuild/android-arm64@0.27.7':
- optional: true
-
- '@esbuild/android-arm64@0.28.1':
- optional: true
-
- '@esbuild/android-arm@0.27.7':
- optional: true
-
- '@esbuild/android-arm@0.28.1':
- optional: true
-
- '@esbuild/android-x64@0.27.7':
- optional: true
-
- '@esbuild/android-x64@0.28.1':
- optional: true
-
- '@esbuild/darwin-arm64@0.27.7':
- optional: true
-
- '@esbuild/darwin-arm64@0.28.1':
- optional: true
-
- '@esbuild/darwin-x64@0.27.7':
- optional: true
-
- '@esbuild/darwin-x64@0.28.1':
- optional: true
+ - '@emnapi/runtime'
+ - prettier
+ - prettier-plugin-astro
- '@esbuild/freebsd-arm64@0.27.7':
+ '@astrojs/compiler-binding-android-arm64@0.4.1':
optional: true
- '@esbuild/freebsd-arm64@0.28.1':
+ '@astrojs/compiler-binding-android-arm64@0.5.0':
optional: true
- '@esbuild/freebsd-x64@0.27.7':
+ '@astrojs/compiler-binding-darwin-arm64@0.4.1':
optional: true
- '@esbuild/freebsd-x64@0.28.1':
+ '@astrojs/compiler-binding-darwin-arm64@0.5.0':
optional: true
- '@esbuild/linux-arm64@0.27.7':
+ '@astrojs/compiler-binding-darwin-x64@0.4.1':
optional: true
- '@esbuild/linux-arm64@0.28.1':
+ '@astrojs/compiler-binding-darwin-x64@0.5.0':
optional: true
- '@esbuild/linux-arm@0.27.7':
+ '@astrojs/compiler-binding-linux-arm64-gnu@0.4.1':
optional: true
- '@esbuild/linux-arm@0.28.1':
+ '@astrojs/compiler-binding-linux-arm64-gnu@0.5.0':
optional: true
- '@esbuild/linux-ia32@0.27.7':
+ '@astrojs/compiler-binding-linux-arm64-musl@0.4.1':
optional: true
- '@esbuild/linux-ia32@0.28.1':
+ '@astrojs/compiler-binding-linux-arm64-musl@0.5.0':
optional: true
- '@esbuild/linux-loong64@0.27.7':
+ '@astrojs/compiler-binding-linux-x64-gnu@0.4.1':
optional: true
- '@esbuild/linux-loong64@0.28.1':
+ '@astrojs/compiler-binding-linux-x64-gnu@0.5.0':
optional: true
- '@esbuild/linux-mips64el@0.27.7':
+ '@astrojs/compiler-binding-linux-x64-musl@0.4.1':
optional: true
- '@esbuild/linux-mips64el@0.28.1':
+ '@astrojs/compiler-binding-linux-x64-musl@0.5.0':
optional: true
- '@esbuild/linux-ppc64@0.27.7':
+ '@astrojs/compiler-binding-wasm32-wasi@0.4.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)':
+ dependencies:
+ '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)
+ transitivePeerDependencies:
+ - '@emnapi/core'
+ - '@emnapi/runtime'
optional: true
- '@esbuild/linux-ppc64@0.28.1':
+ '@astrojs/compiler-binding-wasm32-wasi@0.5.0':
+ dependencies:
+ '@emnapi/core': 1.11.3
+ '@emnapi/runtime': 1.11.3
+ '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)
optional: true
- '@esbuild/linux-riscv64@0.27.7':
+ '@astrojs/compiler-binding-win32-arm64-msvc@0.4.1':
optional: true
- '@esbuild/linux-riscv64@0.28.1':
+ '@astrojs/compiler-binding-win32-arm64-msvc@0.5.0':
optional: true
- '@esbuild/linux-s390x@0.27.7':
+ '@astrojs/compiler-binding-win32-x64-msvc@0.4.1':
optional: true
- '@esbuild/linux-s390x@0.28.1':
+ '@astrojs/compiler-binding-win32-x64-msvc@0.5.0':
optional: true
- '@esbuild/linux-x64@0.27.7':
- optional: true
+ '@astrojs/compiler-binding@0.4.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)':
+ optionalDependencies:
+ '@astrojs/compiler-binding-android-arm64': 0.4.1
+ '@astrojs/compiler-binding-darwin-arm64': 0.4.1
+ '@astrojs/compiler-binding-darwin-x64': 0.4.1
+ '@astrojs/compiler-binding-linux-arm64-gnu': 0.4.1
+ '@astrojs/compiler-binding-linux-arm64-musl': 0.4.1
+ '@astrojs/compiler-binding-linux-x64-gnu': 0.4.1
+ '@astrojs/compiler-binding-linux-x64-musl': 0.4.1
+ '@astrojs/compiler-binding-wasm32-wasi': 0.4.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)
+ '@astrojs/compiler-binding-win32-arm64-msvc': 0.4.1
+ '@astrojs/compiler-binding-win32-x64-msvc': 0.4.1
+ transitivePeerDependencies:
+ - '@emnapi/core'
+ - '@emnapi/runtime'
- '@esbuild/linux-x64@0.28.1':
- optional: true
+ '@astrojs/compiler-binding@0.5.0':
+ optionalDependencies:
+ '@astrojs/compiler-binding-android-arm64': 0.5.0
+ '@astrojs/compiler-binding-darwin-arm64': 0.5.0
+ '@astrojs/compiler-binding-darwin-x64': 0.5.0
+ '@astrojs/compiler-binding-linux-arm64-gnu': 0.5.0
+ '@astrojs/compiler-binding-linux-arm64-musl': 0.5.0
+ '@astrojs/compiler-binding-linux-x64-gnu': 0.5.0
+ '@astrojs/compiler-binding-linux-x64-musl': 0.5.0
+ '@astrojs/compiler-binding-wasm32-wasi': 0.5.0
+ '@astrojs/compiler-binding-win32-arm64-msvc': 0.5.0
+ '@astrojs/compiler-binding-win32-x64-msvc': 0.5.0
+
+ '@astrojs/compiler-rs@0.4.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)':
+ dependencies:
+ '@astrojs/compiler-binding': 0.4.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)
+ transitivePeerDependencies:
+ - '@emnapi/core'
+ - '@emnapi/runtime'
- '@esbuild/netbsd-arm64@0.27.7':
- optional: true
+ '@astrojs/compiler-rs@0.5.0':
+ dependencies:
+ '@astrojs/compiler-binding': 0.5.0
- '@esbuild/netbsd-arm64@0.28.1':
- optional: true
+ '@astrojs/internal-helpers@0.11.0':
+ dependencies:
+ '@types/hast': 3.0.5
+ '@types/mdast': 4.0.4
+ js-yaml: 4.3.2
+ picomatch: 4.0.7
+ retext-smartypants: 6.2.0
+ shiki: 4.4.3
+ smol-toml: 1.9.0
+ unified: 11.0.5
- '@esbuild/netbsd-x64@0.27.7':
- optional: true
+ '@astrojs/language-server@2.17.1(@emnapi/runtime@1.11.3)(prettier-plugin-astro@1.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(prettier@3.9.9))(prettier@3.9.9)(typescript@6.0.3)':
+ dependencies:
+ '@astrojs/astro2tsx': 0.1.1(@emnapi/runtime@1.11.3)
+ '@astrojs/yaml2ts': 0.2.4
+ '@volar/kit': 2.4.28(typescript@6.0.3)
+ '@volar/language-core': 2.4.28
+ '@volar/language-server': 2.4.28
+ '@volar/language-service': 2.4.28
+ muggle-string: 0.4.1
+ tinyglobby: 0.2.17
+ volar-service-css: 0.0.71(@volar/language-service@2.4.28)
+ volar-service-emmet: 0.0.71(@volar/language-service@2.4.28)
+ volar-service-html: 0.0.71(@volar/language-service@2.4.28)
+ volar-service-prettier: 0.0.71(@volar/language-service@2.4.28)(prettier@3.9.9)
+ volar-service-typescript: 0.0.71(@volar/language-service@2.4.28)
+ volar-service-typescript-twoslash-queries: 0.0.71(@volar/language-service@2.4.28)
+ volar-service-yaml: 0.0.71(@volar/language-service@2.4.28)
+ vscode-html-languageservice: 5.6.2
+ vscode-uri: 3.2.0
+ optionalDependencies:
+ prettier: 3.9.9
+ prettier-plugin-astro: 1.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(prettier@3.9.9)
+ transitivePeerDependencies:
+ - '@emnapi/runtime'
+ - typescript
- '@esbuild/netbsd-x64@0.28.1':
- optional: true
+ '@astrojs/markdown-satteri@0.4.2':
+ dependencies:
+ '@astrojs/internal-helpers': 0.11.0
+ '@astrojs/prism': 4.0.2
+ github-slugger: 2.0.0
+ satteri: 0.10.5
- '@esbuild/openbsd-arm64@0.27.7':
- optional: true
+ '@astrojs/mdx@8.0.2(@astrojs/markdown-satteri@0.4.2)(astro@7.3.5(@types/node@24.13.6)(jiti@2.7.0)(yaml@2.9.1))':
+ dependencies:
+ '@astrojs/internal-helpers': 0.11.0
+ '@astrojs/markdown-satteri': 0.4.2
+ astro: 7.3.5(@types/node@24.13.6)(jiti@2.7.0)(yaml@2.9.1)
+ es-module-lexer: 2.3.2
- '@esbuild/openbsd-arm64@0.28.1':
- optional: true
+ '@astrojs/prism@4.0.2':
+ dependencies:
+ prismjs: 1.30.0
- '@esbuild/openbsd-x64@0.27.7':
- optional: true
+ '@astrojs/sitemap@3.7.4':
+ dependencies:
+ sitemap: 9.0.1
+ zod: 4.6.5
- '@esbuild/openbsd-x64@0.28.1':
- optional: true
+ '@astrojs/telemetry@3.3.3':
+ dependencies:
+ ci-info: 4.4.0
+ dset: 3.1.4
+ is-docker: 4.0.0
+ package-manager-detector: 1.8.0
- '@esbuild/openharmony-arm64@0.27.7':
- optional: true
+ '@astrojs/yaml2ts@0.2.4':
+ dependencies:
+ yaml: 2.9.1
- '@esbuild/openharmony-arm64@0.28.1':
- optional: true
+ '@babel/helper-string-parser@7.29.7': {}
- '@esbuild/sunos-x64@0.27.7':
- optional: true
+ '@babel/helper-validator-identifier@7.29.7': {}
- '@esbuild/sunos-x64@0.28.1':
- optional: true
+ '@babel/parser@7.29.9':
+ dependencies:
+ '@babel/types': 7.29.8
- '@esbuild/win32-arm64@0.27.7':
- optional: true
+ '@babel/types@7.29.8':
+ dependencies:
+ '@babel/helper-string-parser': 7.29.7
+ '@babel/helper-validator-identifier': 7.29.7
- '@esbuild/win32-arm64@0.28.1':
+ '@bruits/satteri-darwin-arm64@0.10.5':
optional: true
- '@esbuild/win32-ia32@0.27.7':
+ '@bruits/satteri-darwin-x64@0.10.5':
optional: true
- '@esbuild/win32-ia32@0.28.1':
+ '@bruits/satteri-linux-arm64-gnu@0.10.5':
optional: true
- '@esbuild/win32-x64@0.27.7':
+ '@bruits/satteri-linux-arm64-musl@0.10.5':
optional: true
- '@esbuild/win32-x64@0.28.1':
+ '@bruits/satteri-linux-x64-gnu@0.10.5':
optional: true
- '@exodus/bytes@1.15.1': {}
-
- '@gar/promise-retry@1.0.3': {}
-
- '@harperfast/extended-iterable@1.0.3':
+ '@bruits/satteri-linux-x64-musl@0.10.5':
optional: true
- '@hono/node-server@1.19.14(hono@4.12.26)':
- dependencies:
- hono: 4.12.26
-
- '@inquirer/ansi@2.0.7': {}
-
- '@inquirer/checkbox@5.2.1(@types/node@20.19.43)':
+ '@bruits/satteri-wasm32-wasi@0.10.5':
dependencies:
- '@inquirer/ansi': 2.0.7
- '@inquirer/core': 11.2.1(@types/node@20.19.43)
- '@inquirer/figures': 2.0.7
- '@inquirer/type': 4.0.7(@types/node@20.19.43)
- optionalDependencies:
- '@types/node': 20.19.43
+ '@emnapi/core': 1.11.1
+ '@emnapi/runtime': 1.11.1
+ '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)
+ optional: true
- '@inquirer/confirm@6.0.12(@types/node@20.19.43)':
- dependencies:
- '@inquirer/core': 11.2.1(@types/node@20.19.43)
- '@inquirer/type': 4.0.7(@types/node@20.19.43)
- optionalDependencies:
- '@types/node': 20.19.43
+ '@bruits/satteri-win32-arm64-msvc@0.10.5':
+ optional: true
+
+ '@bruits/satteri-win32-x64-msvc@0.10.5':
+ optional: true
- '@inquirer/confirm@6.1.1(@types/node@20.19.43)':
+ '@capsizecss/unpack@4.0.1':
dependencies:
- '@inquirer/core': 11.2.1(@types/node@20.19.43)
- '@inquirer/type': 4.0.7(@types/node@20.19.43)
- optionalDependencies:
- '@types/node': 20.19.43
+ fontkitten: 1.0.3
- '@inquirer/core@11.2.1(@types/node@20.19.43)':
+ '@clack/core@1.5.1':
dependencies:
- '@inquirer/ansi': 2.0.7
- '@inquirer/figures': 2.0.7
- '@inquirer/type': 4.0.7(@types/node@20.19.43)
- cli-width: 4.1.0
fast-wrap-ansi: 0.2.2
- mute-stream: 3.0.0
- signal-exit: 4.1.0
- optionalDependencies:
- '@types/node': 20.19.43
+ sisteransi: 1.0.5
- '@inquirer/editor@5.2.2(@types/node@20.19.43)':
+ '@clack/prompts@1.8.1':
dependencies:
- '@inquirer/core': 11.2.1(@types/node@20.19.43)
- '@inquirer/external-editor': 3.0.3(@types/node@20.19.43)
- '@inquirer/type': 4.0.7(@types/node@20.19.43)
- optionalDependencies:
- '@types/node': 20.19.43
+ '@clack/core': 1.5.1
+ fast-string-width: 3.0.2
+ fast-wrap-ansi: 0.2.2
+ sisteransi: 1.0.5
- '@inquirer/expand@5.1.1(@types/node@20.19.43)':
+ '@emmetio/abbreviation@2.3.3':
dependencies:
- '@inquirer/core': 11.2.1(@types/node@20.19.43)
- '@inquirer/type': 4.0.7(@types/node@20.19.43)
- optionalDependencies:
- '@types/node': 20.19.43
+ '@emmetio/scanner': 1.0.4
- '@inquirer/external-editor@3.0.3(@types/node@20.19.43)':
+ '@emmetio/css-abbreviation@2.1.8':
dependencies:
- chardet: 2.1.1
- iconv-lite: 0.7.2
- optionalDependencies:
- '@types/node': 20.19.43
+ '@emmetio/scanner': 1.0.4
- '@inquirer/figures@2.0.7': {}
-
- '@inquirer/input@5.1.2(@types/node@20.19.43)':
+ '@emmetio/css-parser@0.4.1':
dependencies:
- '@inquirer/core': 11.2.1(@types/node@20.19.43)
- '@inquirer/type': 4.0.7(@types/node@20.19.43)
- optionalDependencies:
- '@types/node': 20.19.43
+ '@emmetio/stream-reader': 2.2.0
+ '@emmetio/stream-reader-utils': 0.1.0
- '@inquirer/number@4.1.1(@types/node@20.19.43)':
+ '@emmetio/html-matcher@1.3.0':
dependencies:
- '@inquirer/core': 11.2.1(@types/node@20.19.43)
- '@inquirer/type': 4.0.7(@types/node@20.19.43)
- optionalDependencies:
- '@types/node': 20.19.43
+ '@emmetio/scanner': 1.0.4
- '@inquirer/password@5.1.1(@types/node@20.19.43)':
- dependencies:
- '@inquirer/ansi': 2.0.7
- '@inquirer/core': 11.2.1(@types/node@20.19.43)
- '@inquirer/type': 4.0.7(@types/node@20.19.43)
- optionalDependencies:
- '@types/node': 20.19.43
-
- '@inquirer/prompts@8.4.2(@types/node@20.19.43)':
- dependencies:
- '@inquirer/checkbox': 5.2.1(@types/node@20.19.43)
- '@inquirer/confirm': 6.1.1(@types/node@20.19.43)
- '@inquirer/editor': 5.2.2(@types/node@20.19.43)
- '@inquirer/expand': 5.1.1(@types/node@20.19.43)
- '@inquirer/input': 5.1.2(@types/node@20.19.43)
- '@inquirer/number': 4.1.1(@types/node@20.19.43)
- '@inquirer/password': 5.1.1(@types/node@20.19.43)
- '@inquirer/rawlist': 5.3.1(@types/node@20.19.43)
- '@inquirer/search': 4.2.1(@types/node@20.19.43)
- '@inquirer/select': 5.2.1(@types/node@20.19.43)
- optionalDependencies:
- '@types/node': 20.19.43
+ '@emmetio/scanner@1.0.4': {}
- '@inquirer/rawlist@5.3.1(@types/node@20.19.43)':
- dependencies:
- '@inquirer/core': 11.2.1(@types/node@20.19.43)
- '@inquirer/type': 4.0.7(@types/node@20.19.43)
- optionalDependencies:
- '@types/node': 20.19.43
+ '@emmetio/stream-reader-utils@0.1.0': {}
- '@inquirer/search@4.2.1(@types/node@20.19.43)':
- dependencies:
- '@inquirer/core': 11.2.1(@types/node@20.19.43)
- '@inquirer/figures': 2.0.7
- '@inquirer/type': 4.0.7(@types/node@20.19.43)
- optionalDependencies:
- '@types/node': 20.19.43
+ '@emmetio/stream-reader@2.2.0': {}
- '@inquirer/select@5.2.1(@types/node@20.19.43)':
+ '@emnapi/core@1.11.1':
dependencies:
- '@inquirer/ansi': 2.0.7
- '@inquirer/core': 11.2.1(@types/node@20.19.43)
- '@inquirer/figures': 2.0.7
- '@inquirer/type': 4.0.7(@types/node@20.19.43)
- optionalDependencies:
- '@types/node': 20.19.43
-
- '@inquirer/type@4.0.7(@types/node@20.19.43)':
- optionalDependencies:
- '@types/node': 20.19.43
+ '@emnapi/wasi-threads': 1.2.2
+ tslib: 2.8.1
+ optional: true
- '@isaacs/fs-minipass@4.0.1':
+ '@emnapi/core@1.11.3':
dependencies:
- minipass: 7.1.3
+ '@emnapi/wasi-threads': 1.2.3
+ tslib: 2.8.1
- '@jridgewell/gen-mapping@0.3.13':
+ '@emnapi/runtime@1.11.1':
dependencies:
- '@jridgewell/sourcemap-codec': 1.5.5
- '@jridgewell/trace-mapping': 0.3.31
+ tslib: 2.8.1
+ optional: true
- '@jridgewell/remapping@2.3.5':
+ '@emnapi/runtime@1.11.3':
dependencies:
- '@jridgewell/gen-mapping': 0.3.13
- '@jridgewell/trace-mapping': 0.3.31
-
- '@jridgewell/resolve-uri@3.1.2': {}
-
- '@jridgewell/sourcemap-codec@1.5.5': {}
+ tslib: 2.8.1
- '@jridgewell/trace-mapping@0.3.31':
+ '@emnapi/wasi-threads@1.2.2':
dependencies:
- '@jridgewell/resolve-uri': 3.1.2
- '@jridgewell/sourcemap-codec': 1.5.5
+ tslib: 2.8.1
+ optional: true
- '@listr2/prompt-adapter-inquirer@4.2.3(@inquirer/prompts@8.4.2(@types/node@20.19.43))(@types/node@20.19.43)(listr2@10.2.1)':
+ '@emnapi/wasi-threads@1.2.3':
dependencies:
- '@inquirer/prompts': 8.4.2(@types/node@20.19.43)
- '@inquirer/type': 4.0.7(@types/node@20.19.43)
- listr2: 10.2.1
- transitivePeerDependencies:
- - '@types/node'
+ tslib: 2.8.1
- '@lmdb/lmdb-darwin-arm64@3.5.4':
+ '@esbuild/aix-ppc64@0.28.2':
optional: true
- '@lmdb/lmdb-darwin-x64@3.5.4':
+ '@esbuild/android-arm64@0.28.2':
optional: true
- '@lmdb/lmdb-linux-arm64@3.5.4':
+ '@esbuild/android-arm@0.28.2':
optional: true
- '@lmdb/lmdb-linux-arm@3.5.4':
+ '@esbuild/android-x64@0.28.2':
optional: true
- '@lmdb/lmdb-linux-x64@3.5.4':
+ '@esbuild/darwin-arm64@0.28.2':
optional: true
- '@lmdb/lmdb-win32-arm64@3.5.4':
+ '@esbuild/darwin-x64@0.28.2':
optional: true
- '@lmdb/lmdb-win32-x64@3.5.4':
+ '@esbuild/freebsd-arm64@0.28.2':
optional: true
- '@modelcontextprotocol/sdk@1.29.0(zod@4.4.2)':
- dependencies:
- '@hono/node-server': 1.19.14(hono@4.12.26)
- ajv: 8.20.0
- ajv-formats: 3.0.1(ajv@8.20.0)
- content-type: 1.0.5
- cors: 2.8.6
- cross-spawn: 7.0.6
- eventsource: 3.0.7
- eventsource-parser: 3.1.0
- express: 5.2.1
- express-rate-limit: 8.5.2(express@5.2.1)
- hono: 4.12.26
- jose: 6.2.3
- json-schema-typed: 8.0.2
- pkce-challenge: 5.0.1
- raw-body: 3.0.2
- zod: 4.4.2
- zod-to-json-schema: 3.25.2(zod@4.4.2)
- transitivePeerDependencies:
- - supports-color
-
- '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4':
+ '@esbuild/freebsd-x64@0.28.2':
optional: true
- '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4':
+ '@esbuild/linux-arm64@0.28.2':
optional: true
- '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4':
+ '@esbuild/linux-arm@0.28.2':
optional: true
- '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4':
+ '@esbuild/linux-ia32@0.28.2':
optional: true
- '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4':
+ '@esbuild/linux-loong64@0.28.2':
optional: true
- '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4':
+ '@esbuild/linux-mips64el@0.28.2':
optional: true
- '@napi-rs/nice-android-arm-eabi@1.1.1':
+ '@esbuild/linux-ppc64@0.28.2':
optional: true
- '@napi-rs/nice-android-arm64@1.1.1':
+ '@esbuild/linux-riscv64@0.28.2':
optional: true
- '@napi-rs/nice-darwin-arm64@1.1.1':
+ '@esbuild/linux-s390x@0.28.2':
optional: true
- '@napi-rs/nice-darwin-x64@1.1.1':
+ '@esbuild/linux-x64@0.28.2':
optional: true
- '@napi-rs/nice-freebsd-x64@1.1.1':
+ '@esbuild/netbsd-arm64@0.28.2':
optional: true
- '@napi-rs/nice-linux-arm-gnueabihf@1.1.1':
+ '@esbuild/netbsd-x64@0.28.2':
optional: true
- '@napi-rs/nice-linux-arm64-gnu@1.1.1':
+ '@esbuild/openbsd-arm64@0.28.2':
optional: true
- '@napi-rs/nice-linux-arm64-musl@1.1.1':
+ '@esbuild/openbsd-x64@0.28.2':
optional: true
- '@napi-rs/nice-linux-ppc64-gnu@1.1.1':
+ '@esbuild/openharmony-arm64@0.28.2':
optional: true
- '@napi-rs/nice-linux-riscv64-gnu@1.1.1':
+ '@esbuild/sunos-x64@0.28.2':
optional: true
- '@napi-rs/nice-linux-s390x-gnu@1.1.1':
+ '@esbuild/win32-arm64@0.28.2':
optional: true
- '@napi-rs/nice-linux-x64-gnu@1.1.1':
+ '@esbuild/win32-ia32@0.28.2':
optional: true
- '@napi-rs/nice-linux-x64-musl@1.1.1':
+ '@esbuild/win32-x64@0.28.2':
optional: true
- '@napi-rs/nice-openharmony-arm64@1.1.1':
- optional: true
+ '@fontsource/be-vietnam-pro@5.3.0': {}
- '@napi-rs/nice-win32-arm64-msvc@1.1.1':
- optional: true
+ '@fontsource/plus-jakarta-sans@5.3.0': {}
- '@napi-rs/nice-win32-ia32-msvc@1.1.1':
- optional: true
+ '@img/colour@1.1.0': {}
- '@napi-rs/nice-win32-x64-msvc@1.1.1':
+ '@img/sharp-darwin-arm64@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.3.3
optional: true
- '@napi-rs/nice@1.1.1':
+ '@img/sharp-darwin-x64@0.35.4':
optionalDependencies:
- '@napi-rs/nice-android-arm-eabi': 1.1.1
- '@napi-rs/nice-android-arm64': 1.1.1
- '@napi-rs/nice-darwin-arm64': 1.1.1
- '@napi-rs/nice-darwin-x64': 1.1.1
- '@napi-rs/nice-freebsd-x64': 1.1.1
- '@napi-rs/nice-linux-arm-gnueabihf': 1.1.1
- '@napi-rs/nice-linux-arm64-gnu': 1.1.1
- '@napi-rs/nice-linux-arm64-musl': 1.1.1
- '@napi-rs/nice-linux-ppc64-gnu': 1.1.1
- '@napi-rs/nice-linux-riscv64-gnu': 1.1.1
- '@napi-rs/nice-linux-s390x-gnu': 1.1.1
- '@napi-rs/nice-linux-x64-gnu': 1.1.1
- '@napi-rs/nice-linux-x64-musl': 1.1.1
- '@napi-rs/nice-openharmony-arm64': 1.1.1
- '@napi-rs/nice-win32-arm64-msvc': 1.1.1
- '@napi-rs/nice-win32-ia32-msvc': 1.1.1
- '@napi-rs/nice-win32-x64-msvc': 1.1.1
- optional: true
-
- '@npmcli/agent@4.0.2':
- dependencies:
- agent-base: 7.1.4
- http-proxy-agent: 7.0.2
- https-proxy-agent: 7.0.6
- lru-cache: 11.5.1
- socks-proxy-agent: 8.0.5
- transitivePeerDependencies:
- - supports-color
-
- '@npmcli/fs@5.0.0':
- dependencies:
- semver: 7.7.4
-
- '@npmcli/git@7.0.2':
- dependencies:
- '@gar/promise-retry': 1.0.3
- '@npmcli/promise-spawn': 9.0.1
- ini: 6.0.0
- lru-cache: 11.5.1
- npm-pick-manifest: 11.0.3
- proc-log: 6.1.0
- semver: 7.7.4
- which: 6.0.1
-
- '@npmcli/installed-package-contents@4.0.0':
- dependencies:
- npm-bundled: 5.0.0
- npm-normalize-package-bin: 5.0.0
-
- '@npmcli/node-gyp@5.0.0': {}
-
- '@npmcli/package-json@7.0.5':
- dependencies:
- '@npmcli/git': 7.0.2
- glob: 13.0.6
- hosted-git-info: 9.0.3
- json-parse-even-better-errors: 5.0.0
- proc-log: 6.1.0
- semver: 7.7.4
- spdx-expression-parse: 4.0.0
-
- '@npmcli/promise-spawn@9.0.1':
- dependencies:
- which: 6.0.1
-
- '@npmcli/redact@4.0.0': {}
+ '@img/sharp-libvips-darwin-x64': 1.3.3
+ optional: true
- '@npmcli/run-script@10.0.4':
+ '@img/sharp-freebsd-wasm32@0.35.4':
dependencies:
- '@npmcli/node-gyp': 5.0.0
- '@npmcli/package-json': 7.0.5
- '@npmcli/promise-spawn': 9.0.1
- node-gyp: 12.4.0
- proc-log: 6.1.0
+ '@img/sharp-wasm32': 0.35.4
+ optional: true
- '@parcel/watcher-android-arm64@2.5.6':
+ '@img/sharp-libvips-darwin-arm64@1.3.3':
optional: true
- '@parcel/watcher-darwin-arm64@2.5.6':
+ '@img/sharp-libvips-darwin-x64@1.3.3':
optional: true
- '@parcel/watcher-darwin-x64@2.5.6':
+ '@img/sharp-libvips-linux-arm64@1.3.3':
optional: true
- '@parcel/watcher-freebsd-x64@2.5.6':
+ '@img/sharp-libvips-linux-arm@1.3.3':
optional: true
- '@parcel/watcher-linux-arm-glibc@2.5.6':
+ '@img/sharp-libvips-linux-ppc64@1.3.3':
optional: true
- '@parcel/watcher-linux-arm-musl@2.5.6':
+ '@img/sharp-libvips-linux-riscv64@1.3.3':
optional: true
- '@parcel/watcher-linux-arm64-glibc@2.5.6':
+ '@img/sharp-libvips-linux-s390x@1.3.3':
optional: true
- '@parcel/watcher-linux-arm64-musl@2.5.6':
+ '@img/sharp-libvips-linux-x64@1.3.3':
optional: true
- '@parcel/watcher-linux-x64-glibc@2.5.6':
+ '@img/sharp-libvips-linuxmusl-arm64@1.3.3':
optional: true
- '@parcel/watcher-linux-x64-musl@2.5.6':
+ '@img/sharp-libvips-linuxmusl-x64@1.3.3':
optional: true
- '@parcel/watcher-win32-arm64@2.5.6':
+ '@img/sharp-linux-arm64@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.3.3
optional: true
- '@parcel/watcher-win32-ia32@2.5.6':
+ '@img/sharp-linux-arm@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.3.3
optional: true
- '@parcel/watcher-win32-x64@2.5.6':
+ '@img/sharp-linux-ppc64@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-ppc64': 1.3.3
optional: true
- '@parcel/watcher@2.5.6':
- dependencies:
- detect-libc: 2.1.2
- is-glob: 4.0.3
- node-addon-api: 7.1.1
- picomatch: 4.0.4
+ '@img/sharp-linux-riscv64@0.35.4':
optionalDependencies:
- '@parcel/watcher-android-arm64': 2.5.6
- '@parcel/watcher-darwin-arm64': 2.5.6
- '@parcel/watcher-darwin-x64': 2.5.6
- '@parcel/watcher-freebsd-x64': 2.5.6
- '@parcel/watcher-linux-arm-glibc': 2.5.6
- '@parcel/watcher-linux-arm-musl': 2.5.6
- '@parcel/watcher-linux-arm64-glibc': 2.5.6
- '@parcel/watcher-linux-arm64-musl': 2.5.6
- '@parcel/watcher-linux-x64-glibc': 2.5.6
- '@parcel/watcher-linux-x64-musl': 2.5.6
- '@parcel/watcher-win32-arm64': 2.5.6
- '@parcel/watcher-win32-ia32': 2.5.6
- '@parcel/watcher-win32-x64': 2.5.6
+ '@img/sharp-libvips-linux-riscv64': 1.3.3
optional: true
- '@rollup/rollup-android-arm-eabi@4.60.2':
+ '@img/sharp-linux-s390x@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.3.3
optional: true
- '@rollup/rollup-android-arm64@4.60.2':
+ '@img/sharp-linux-x64@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.3.3
optional: true
- '@rollup/rollup-darwin-arm64@4.60.2':
+ '@img/sharp-linuxmusl-arm64@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.3.3
optional: true
- '@rollup/rollup-darwin-x64@4.60.2':
+ '@img/sharp-linuxmusl-x64@0.35.4':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.3.3
optional: true
- '@rollup/rollup-freebsd-arm64@4.60.2':
+ '@img/sharp-wasm32@0.35.4':
+ dependencies:
+ '@emnapi/runtime': 1.11.3
optional: true
- '@rollup/rollup-freebsd-x64@4.60.2':
+ '@img/sharp-webcontainers-wasm32@0.35.4':
+ dependencies:
+ '@img/sharp-wasm32': 0.35.4
optional: true
- '@rollup/rollup-linux-arm-gnueabihf@4.60.2':
+ '@img/sharp-win32-arm64@0.35.4':
optional: true
- '@rollup/rollup-linux-arm-musleabihf@4.60.2':
+ '@img/sharp-win32-ia32@0.35.4':
optional: true
- '@rollup/rollup-linux-arm64-gnu@4.60.2':
+ '@img/sharp-win32-x64@0.35.4':
optional: true
- '@rollup/rollup-linux-arm64-musl@4.60.2':
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.6.0
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/sourcemap-codec@1.6.0': {}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.6.0
+
+ '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)':
+ dependencies:
+ '@emnapi/core': 1.11.1
+ '@emnapi/runtime': 1.11.1
+ '@tybys/wasm-util': 0.10.4
optional: true
- '@rollup/rollup-linux-loong64-gnu@4.60.2':
+ '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)':
+ dependencies:
+ '@emnapi/core': 1.11.3
+ '@emnapi/runtime': 1.11.3
+ '@tybys/wasm-util': 0.10.4
+
+ '@oslojs/encoding@1.1.0': {}
+
+ '@oxc-project/types@0.151.0': {}
+
+ '@prettier/parse-srcset@3.1.0': {}
+
+ '@rolldown/binding-android-arm-eabi@1.2.11':
optional: true
- '@rollup/rollup-linux-loong64-musl@4.60.2':
+ '@rolldown/binding-android-arm64@1.2.11':
optional: true
- '@rollup/rollup-linux-ppc64-gnu@4.60.2':
+ '@rolldown/binding-darwin-arm64@1.2.11':
optional: true
- '@rollup/rollup-linux-ppc64-musl@4.60.2':
+ '@rolldown/binding-darwin-x64@1.2.11':
optional: true
- '@rollup/rollup-linux-riscv64-gnu@4.60.2':
+ '@rolldown/binding-freebsd-x64@1.2.11':
optional: true
- '@rollup/rollup-linux-riscv64-musl@4.60.2':
+ '@rolldown/binding-linux-arm-gnueabihf@1.2.11':
optional: true
- '@rollup/rollup-linux-s390x-gnu@4.60.2':
+ '@rolldown/binding-linux-arm64-gnu@1.2.11':
optional: true
- '@rollup/rollup-linux-x64-gnu@4.60.2':
+ '@rolldown/binding-linux-arm64-musl@1.2.11':
optional: true
- '@rollup/rollup-linux-x64-musl@4.60.2':
+ '@rolldown/binding-linux-ppc64-gnu@1.2.11':
optional: true
- '@rollup/rollup-openbsd-x64@4.60.2':
+ '@rolldown/binding-linux-s390x-gnu@1.2.11':
optional: true
- '@rollup/rollup-openharmony-arm64@4.60.2':
+ '@rolldown/binding-linux-x64-gnu@1.2.11':
optional: true
- '@rollup/rollup-win32-arm64-msvc@4.60.2':
+ '@rolldown/binding-linux-x64-musl@1.2.11':
optional: true
- '@rollup/rollup-win32-ia32-msvc@4.60.2':
+ '@rolldown/binding-openharmony-arm64@1.2.11':
optional: true
- '@rollup/rollup-win32-x64-gnu@4.60.2':
+ '@rolldown/binding-win32-arm64-msvc@1.2.11':
optional: true
- '@rollup/rollup-win32-x64-msvc@4.60.2':
+ '@rolldown/binding-win32-x64-msvc@1.2.11':
optional: true
- '@schematics/angular@22.0.3(chokidar@5.0.0)':
+ '@rolldown/pluginutils@1.0.1': {}
+
+ '@shikijs/core@4.4.3':
dependencies:
- '@angular-devkit/core': 22.0.3(chokidar@5.0.0)
- '@angular-devkit/schematics': 22.0.3(chokidar@5.0.0)
- jsonc-parser: 3.3.1
- typescript: 6.0.3
- transitivePeerDependencies:
- - chokidar
+ '@shikijs/primitive': 4.4.3
+ '@shikijs/types': 4.4.3
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.5
+ hast-util-to-html: 9.0.5
- '@sigstore/bundle@4.0.0':
+ '@shikijs/engine-javascript@4.4.3':
dependencies:
- '@sigstore/protobuf-specs': 0.5.1
+ '@shikijs/types': 4.4.3
+ '@shikijs/vscode-textmate': 10.0.2
+ oniguruma-to-es: 4.3.6
- '@sigstore/core@3.2.1': {}
+ '@shikijs/engine-oniguruma@4.4.3':
+ dependencies:
+ '@shikijs/types': 4.4.3
+ '@shikijs/vscode-textmate': 10.0.2
- '@sigstore/protobuf-specs@0.5.1': {}
+ '@shikijs/langs@4.4.3':
+ dependencies:
+ '@shikijs/types': 4.4.3
- '@sigstore/sign@4.1.1':
+ '@shikijs/primitive@4.4.3':
dependencies:
- '@gar/promise-retry': 1.0.3
- '@sigstore/bundle': 4.0.0
- '@sigstore/core': 3.2.1
- '@sigstore/protobuf-specs': 0.5.1
- make-fetch-happen: 15.0.6
- proc-log: 6.1.0
- transitivePeerDependencies:
- - supports-color
+ '@shikijs/types': 4.4.3
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.5
- '@sigstore/tuf@4.0.2':
+ '@shikijs/themes@4.4.3':
dependencies:
- '@sigstore/protobuf-specs': 0.5.1
- tuf-js: 4.1.0
- transitivePeerDependencies:
- - supports-color
+ '@shikijs/types': 4.4.3
- '@sigstore/verify@3.1.1':
+ '@shikijs/types@4.4.3':
dependencies:
- '@sigstore/bundle': 4.0.0
- '@sigstore/core': 3.2.1
- '@sigstore/protobuf-specs': 0.5.1
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.5
- '@standard-schema/spec@1.1.0': {}
+ '@shikijs/vscode-textmate@10.0.2': {}
- '@tailwindcss/node@4.3.1':
+ '@tailwindcss/node@4.3.3':
dependencies:
'@jridgewell/remapping': 2.3.5
- enhanced-resolve: 5.21.6
+ enhanced-resolve: 5.25.1
jiti: 2.7.0
lightningcss: 1.32.0
magic-string: 0.30.21
source-map-js: 1.2.1
- tailwindcss: 4.3.1
+ tailwindcss: 4.3.3
- '@tailwindcss/oxide-android-arm64@4.3.1':
+ '@tailwindcss/oxide-android-arm64@4.3.3':
optional: true
- '@tailwindcss/oxide-darwin-arm64@4.3.1':
+ '@tailwindcss/oxide-darwin-arm64@4.3.3':
optional: true
- '@tailwindcss/oxide-darwin-x64@4.3.1':
+ '@tailwindcss/oxide-darwin-x64@4.3.3':
optional: true
- '@tailwindcss/oxide-freebsd-x64@4.3.1':
+ '@tailwindcss/oxide-freebsd-x64@4.3.3':
optional: true
- '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1':
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3':
optional: true
- '@tailwindcss/oxide-linux-arm64-gnu@4.3.1':
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.3':
optional: true
- '@tailwindcss/oxide-linux-arm64-musl@4.3.1':
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.3':
optional: true
- '@tailwindcss/oxide-linux-x64-gnu@4.3.1':
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.3':
optional: true
- '@tailwindcss/oxide-linux-x64-musl@4.3.1':
+ '@tailwindcss/oxide-linux-x64-musl@4.3.3':
optional: true
- '@tailwindcss/oxide-wasm32-wasi@4.3.1':
+ '@tailwindcss/oxide-wasm32-wasi@4.3.3':
optional: true
- '@tailwindcss/oxide-win32-arm64-msvc@4.3.1':
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.3':
optional: true
- '@tailwindcss/oxide-win32-x64-msvc@4.3.1':
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.3':
optional: true
- '@tailwindcss/oxide@4.3.1':
+ '@tailwindcss/oxide@4.3.3':
optionalDependencies:
- '@tailwindcss/oxide-android-arm64': 4.3.1
- '@tailwindcss/oxide-darwin-arm64': 4.3.1
- '@tailwindcss/oxide-darwin-x64': 4.3.1
- '@tailwindcss/oxide-freebsd-x64': 4.3.1
- '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.1
- '@tailwindcss/oxide-linux-arm64-gnu': 4.3.1
- '@tailwindcss/oxide-linux-arm64-musl': 4.3.1
- '@tailwindcss/oxide-linux-x64-gnu': 4.3.1
- '@tailwindcss/oxide-linux-x64-musl': 4.3.1
- '@tailwindcss/oxide-wasm32-wasi': 4.3.1
- '@tailwindcss/oxide-win32-arm64-msvc': 4.3.1
- '@tailwindcss/oxide-win32-x64-msvc': 4.3.1
+ '@tailwindcss/oxide-android-arm64': 4.3.3
+ '@tailwindcss/oxide-darwin-arm64': 4.3.3
+ '@tailwindcss/oxide-darwin-x64': 4.3.3
+ '@tailwindcss/oxide-freebsd-x64': 4.3.3
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3
+ '@tailwindcss/oxide-linux-arm64-musl': 4.3.3
+ '@tailwindcss/oxide-linux-x64-gnu': 4.3.3
+ '@tailwindcss/oxide-linux-x64-musl': 4.3.3
+ '@tailwindcss/oxide-wasm32-wasi': 4.3.3
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3
+ '@tailwindcss/oxide-win32-x64-msvc': 4.3.3
- '@tailwindcss/postcss@4.3.1':
+ '@tailwindcss/typography@0.5.20(tailwindcss@4.3.3)':
dependencies:
- '@alloc/quick-lru': 5.2.0
- '@tailwindcss/node': 4.3.1
- '@tailwindcss/oxide': 4.3.1
- postcss: 8.5.15
- tailwindcss: 4.3.1
+ postcss-selector-parser: 6.0.10
+ tailwindcss: 4.3.3
- '@tufjs/canonical-json@2.0.0': {}
-
- '@tufjs/models@4.1.0':
- dependencies:
- '@tufjs/canonical-json': 2.0.0
- minimatch: 10.2.5
-
- '@types/body-parser@1.19.6':
+ '@tailwindcss/vite@4.3.3(vite@8.3.1(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))':
dependencies:
- '@types/connect': 3.4.38
- '@types/node': 20.19.43
+ '@tailwindcss/node': 4.3.3
+ '@tailwindcss/oxide': 4.3.3
+ tailwindcss: 4.3.3
+ vite: 8.3.1(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)
- '@types/chai@5.2.3':
+ '@tybys/wasm-util@0.10.4':
dependencies:
- '@types/deep-eql': 4.0.2
- assertion-error: 2.0.1
+ tslib: 2.8.1
- '@types/connect@3.4.38':
+ '@types/estree-jsx@1.0.5':
dependencies:
- '@types/node': 20.19.43
-
- '@types/deep-eql@4.0.2': {}
-
- '@types/estree@1.0.8': {}
+ '@types/estree': 1.0.9
'@types/estree@1.0.9': {}
- '@types/express-serve-static-core@5.1.1':
+ '@types/hast@3.0.5':
dependencies:
- '@types/node': 20.19.43
- '@types/qs': 6.15.1
- '@types/range-parser': 1.2.7
- '@types/send': 1.2.1
+ '@types/unist': 3.0.3
- '@types/express@5.0.6':
+ '@types/mdast@4.0.4':
dependencies:
- '@types/body-parser': 1.19.6
- '@types/express-serve-static-core': 5.1.1
- '@types/serve-static': 2.2.0
-
- '@types/http-errors@2.0.5': {}
+ '@types/unist': 3.0.3
- '@types/node@20.19.43':
+ '@types/nlcst@2.0.3':
dependencies:
- undici-types: 6.21.0
+ '@types/unist': 3.0.3
- '@types/qs@6.15.1': {}
-
- '@types/range-parser@1.2.7': {}
-
- '@types/send@1.2.1':
+ '@types/node@24.13.6':
dependencies:
- '@types/node': 20.19.43
+ undici-types: 7.18.2
- '@types/serve-static@2.2.0':
+ '@types/qrcode@1.5.6':
dependencies:
- '@types/http-errors': 2.0.5
- '@types/node': 20.19.43
+ '@types/node': 24.13.6
- '@vitejs/plugin-basic-ssl@2.3.0(vite@7.3.5(@types/node@20.19.43)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0))':
+ '@types/sax@1.2.7':
dependencies:
- vite: 7.3.5(@types/node@20.19.43)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0)
+ '@types/node': 24.13.6
- '@vitest/expect@4.1.9':
- dependencies:
- '@standard-schema/spec': 1.1.0
- '@types/chai': 5.2.3
- '@vitest/spy': 4.1.9
- '@vitest/utils': 4.1.9
- chai: 6.2.2
- tinyrainbow: 3.1.0
+ '@types/unist@3.0.3': {}
- '@vitest/mocker@4.1.9(vite@7.3.5(@types/node@20.19.43)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0))':
- dependencies:
- '@vitest/spy': 4.1.9
- estree-walker: 3.0.3
- magic-string: 0.30.21
- optionalDependencies:
- vite: 7.3.5(@types/node@20.19.43)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0)
+ '@ungap/structured-clone@1.4.0': {}
- '@vitest/pretty-format@4.1.9':
+ '@volar/kit@2.4.28(typescript@6.0.3)':
dependencies:
- tinyrainbow: 3.1.0
+ '@volar/language-service': 2.4.28
+ '@volar/typescript': 2.4.28
+ typesafe-path: 0.2.2
+ typescript: 6.0.3
+ vscode-languageserver-textdocument: 1.0.15
+ vscode-uri: 3.2.0
- '@vitest/runner@4.1.9':
+ '@volar/language-core@2.4.28':
dependencies:
- '@vitest/utils': 4.1.9
- pathe: 2.0.3
+ '@volar/source-map': 2.4.28
- '@vitest/snapshot@4.1.9':
+ '@volar/language-server@2.4.28':
dependencies:
- '@vitest/pretty-format': 4.1.9
- '@vitest/utils': 4.1.9
- magic-string: 0.30.21
- pathe: 2.0.3
+ '@volar/language-core': 2.4.28
+ '@volar/language-service': 2.4.28
+ '@volar/typescript': 2.4.28
+ path-browserify: 1.0.1
+ request-light: 0.7.0
+ vscode-languageserver: 9.0.1
+ vscode-languageserver-protocol: 3.18.4
+ vscode-languageserver-textdocument: 1.0.15
+ vscode-uri: 3.2.0
- '@vitest/spy@4.1.9': {}
-
- '@vitest/utils@4.1.9':
+ '@volar/language-service@2.4.28':
dependencies:
- '@vitest/pretty-format': 4.1.9
- convert-source-map: 2.0.0
- tinyrainbow: 3.1.0
-
- '@yarnpkg/lockfile@1.1.0': {}
+ '@volar/language-core': 2.4.28
+ vscode-languageserver-protocol: 3.18.4
+ vscode-languageserver-textdocument: 1.0.15
+ vscode-uri: 3.2.0
- abbrev@4.0.0: {}
+ '@volar/source-map@2.4.28': {}
- accepts@2.0.0:
+ '@volar/typescript@2.4.28':
dependencies:
- mime-types: 3.0.2
- negotiator: 1.0.0
+ '@volar/language-core': 2.4.28
+ path-browserify: 1.0.1
+ vscode-uri: 3.2.0
- agent-base@7.1.4: {}
+ '@vscode/emmet-helper@2.11.0':
+ dependencies:
+ emmet: 2.4.11
+ jsonc-parser: 2.3.1
+ vscode-languageserver-textdocument: 1.0.15
+ vscode-languageserver-types: 3.18.4
+ vscode-uri: 3.2.0
- agent-base@9.0.0: {}
+ '@vscode/l10n@0.0.18': {}
- ajv-formats@3.0.1(ajv@8.20.0):
+ ajv-draft-04@1.0.0(ajv@8.20.0):
optionalDependencies:
ajv: 8.20.0
+ ajv-i18n@4.2.0(ajv@8.20.0):
+ dependencies:
+ ajv: 8.20.0
+
ajv@8.20.0:
dependencies:
fast-deep-equal: 3.1.3
- fast-uri: 3.1.2
+ fast-uri: 3.1.8
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
- algoliasearch@5.52.0:
- dependencies:
- '@algolia/abtesting': 1.18.0
- '@algolia/client-abtesting': 5.52.0
- '@algolia/client-analytics': 5.52.0
- '@algolia/client-common': 5.52.0
- '@algolia/client-insights': 5.52.0
- '@algolia/client-personalization': 5.52.0
- '@algolia/client-query-suggestions': 5.52.0
- '@algolia/client-search': 5.52.0
- '@algolia/ingestion': 1.52.0
- '@algolia/monitoring': 1.52.0
- '@algolia/recommend': 5.52.0
- '@algolia/requester-browser-xhr': 5.52.0
- '@algolia/requester-fetch': 5.52.0
- '@algolia/requester-node-http': 5.52.0
-
- ansi-escapes@7.3.0:
+ am-i-vibing@0.4.0:
dependencies:
- environment: 1.1.0
+ process-ancestry: 0.1.0
- ansi-regex@6.2.2: {}
+ ansi-regex@5.0.1: {}
- ansi-styles@6.2.3: {}
-
- assertion-error@2.0.1: {}
-
- balanced-match@4.0.4: {}
-
- baseline-browser-mapping@2.10.38: {}
+ ansi-regex@6.3.0: {}
- beasties@0.4.2:
+ ansi-styles@4.3.0:
dependencies:
- css-select: 6.0.0
- css-what: 7.0.0
- dom-serializer: 2.0.0
- domhandler: 5.0.3
- htmlparser2: 10.1.0
- picocolors: 1.1.1
- postcss: 8.5.15
- postcss-media-query-parser: 0.2.3
- postcss-safe-parser: 7.0.1(postcss@8.5.15)
+ color-convert: 2.0.1
- bidi-js@1.0.3:
- dependencies:
- require-from-string: 2.0.2
+ ansi-styles@6.2.3: {}
- body-parser@2.3.0:
- dependencies:
- bytes: 3.1.2
- content-type: 2.0.0
- debug: 4.4.3
- http-errors: 2.0.1
- iconv-lite: 0.7.2
- on-finished: 2.4.1
- qs: 6.15.2
- raw-body: 3.0.2
- type-is: 2.1.0
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.2
+
+ arg@5.0.2: {}
+
+ argparse@2.0.1: {}
+
+ aria-query@5.3.2: {}
+
+ astro@7.3.5(@types/node@24.13.6)(jiti@2.7.0)(yaml@2.9.1):
+ dependencies:
+ '@astrojs/compiler-rs': 0.5.0
+ '@astrojs/internal-helpers': 0.11.0
+ '@astrojs/markdown-satteri': 0.4.2
+ '@astrojs/telemetry': 3.3.3
+ '@capsizecss/unpack': 4.0.1
+ '@clack/prompts': 1.8.1
+ '@oslojs/encoding': 1.1.0
+ am-i-vibing: 0.4.0
+ aria-query: 5.3.2
+ axobject-query: 4.1.0
+ ci-info: 4.4.0
+ clsx: 2.1.1
+ common-ancestor-path: 2.0.0
+ cookie: 2.0.1
+ devalue: 5.9.4
+ diff: 9.0.0
+ dset: 3.1.4
+ es-module-lexer: 2.3.2
+ esbuild: 0.28.2
+ find-proc: 0.2.0
+ flattie: 1.1.1
+ fontace: 0.4.1
+ get-tsconfig: 5.0.0-beta.4
+ github-slugger: 2.0.0
+ html-escaper: 3.0.3
+ http-cache-semantics: 4.2.0
+ js-yaml: 4.3.2
+ jsonc-parser: 3.3.1
+ magic-string: 1.4.2
+ magicast: 0.5.5
+ mrmime: 2.0.1
+ neotraverse: 1.0.1
+ obug: 3.0.0
+ p-limit: 7.3.3
+ p-queue: 9.3.3
+ package-manager-detector: 1.8.0
+ piccolore: 0.1.3
+ picomatch: 4.0.7
+ shiki: 4.4.3
+ smol-toml: 1.9.0
+ svgo: 4.1.0
+ tinyclip: 1.0.3
+ tinyexec: 1.3.1
+ tinyglobby: 0.2.17
+ ultrahtml: 1.7.0
+ unifont: 0.7.5
+ unstorage: 1.17.5
+ verkit: 0.4.1
+ vite: 8.3.1(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)
+ vitefu: 1.1.3(vite@8.3.1(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1))
+ xxhash-wasm: 1.1.0
+ yargs-parser: 22.0.0
+ zod: 4.6.5
+ optionalDependencies:
+ sharp: 0.35.4(@types/node@24.13.6)
transitivePeerDependencies:
- - supports-color
-
- boolbase@1.0.0: {}
-
- brace-expansion@5.0.6:
- dependencies:
- balanced-match: 4.0.4
-
- browserslist@4.28.2:
- dependencies:
- baseline-browser-mapping: 2.10.38
- caniuse-lite: 1.0.30001799
- electron-to-chromium: 1.5.376
- node-releases: 2.0.48
- update-browserslist-db: 1.2.3(browserslist@4.28.2)
-
- buffer-from@1.1.2: {}
-
- bytes@3.1.2: {}
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@types/node'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/functions'
+ - '@vercel/kv'
+ - '@vitejs/devtools'
+ - aws4fetch
+ - db0
+ - idb-keyval
+ - ioredis
+ - jiti
+ - less
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - terser
+ - tsx
+ - uploadthing
+ - yaml
- cacache@20.0.4:
- dependencies:
- '@npmcli/fs': 5.0.0
- fs-minipass: 3.0.3
- glob: 13.0.6
- lru-cache: 11.5.1
- minipass: 7.1.3
- minipass-collect: 2.0.1
- minipass-flush: 1.0.7
- minipass-pipeline: 1.2.4
- p-map: 7.0.4
- ssri: 13.0.1
+ axobject-query@4.1.0: {}
- call-bind-apply-helpers@1.0.2:
- dependencies:
- es-errors: 1.3.0
- function-bind: 1.1.2
+ bail@2.0.2: {}
- call-bound@1.0.4:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- get-intrinsic: 1.3.0
+ boolbase@1.0.0: {}
- caniuse-lite@1.0.30001799: {}
+ camelcase@5.3.1: {}
- chai@6.2.2: {}
+ ccount@2.0.1: {}
- chalk@5.6.2: {}
+ character-entities-html4@2.1.0: {}
- chardet@2.1.1: {}
+ character-entities-legacy@3.0.0: {}
chokidar@4.0.3:
dependencies:
@@ -4433,22 +3194,15 @@ snapshots:
chokidar@5.0.0:
dependencies:
- readdirp: 5.0.0
-
- chownr@3.0.0: {}
-
- cli-cursor@5.0.0:
- dependencies:
- restore-cursor: 5.1.0
+ readdirp: 5.1.1
- cli-spinners@3.4.0: {}
+ ci-info@4.4.0: {}
- cli-truncate@5.2.0:
+ cliui@6.0.0:
dependencies:
- slice-ansi: 8.0.0
- string-width: 8.2.1
-
- cli-width@4.1.0: {}
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 6.2.0
cliui@9.0.1:
dependencies:
@@ -4456,30 +3210,27 @@ snapshots:
strip-ansi: 7.2.0
wrap-ansi: 9.0.2
- content-disposition@1.1.0: {}
+ clsx@2.1.1: {}
- content-type@1.0.5: {}
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
- content-type@2.0.0: {}
+ color-name@1.1.4: {}
- convert-source-map@1.9.0: {}
+ comma-separated-tokens@2.0.3: {}
- convert-source-map@2.0.0: {}
+ commander@11.1.0: {}
- cookie-signature@1.2.2: {}
+ common-ancestor-path@2.0.0: {}
- cookie@0.7.2: {}
+ cookie-es@1.2.3: {}
- cors@2.8.6:
- dependencies:
- object-assign: 4.1.1
- vary: 1.1.2
+ cookie@2.0.1: {}
- cross-spawn@7.0.6:
+ crossws@0.3.5:
dependencies:
- path-key: 3.1.1
- shebang-command: 2.0.0
- which: 2.0.2
+ uncrypto: 0.1.3
css-select@6.0.0:
dependencies:
@@ -4489,6 +3240,11 @@ snapshots:
domutils: 3.2.2
nth-check: 2.1.1
+ css-tree@2.2.1:
+ dependencies:
+ mdn-data: 2.0.28
+ source-map-js: 1.2.1
+
css-tree@3.2.1:
dependencies:
mdn-data: 2.27.1
@@ -4496,30 +3252,32 @@ snapshots:
css-what@7.0.0: {}
- cssstyle@6.2.0:
- dependencies:
- '@asamuzakjp/css-color': 5.1.11
- '@csstools/css-syntax-patches-for-csstree': 1.1.5(css-tree@3.2.1)
- css-tree: 3.2.1
- lru-cache: 11.5.1
+ cssesc@3.0.0: {}
- data-urls@7.0.0:
+ csso@5.0.5:
dependencies:
- whatwg-mimetype: 5.0.0
- whatwg-url: 16.0.1
- transitivePeerDependencies:
- - '@noble/hashes'
+ css-tree: 2.2.1
- debug@4.4.3:
- dependencies:
- ms: 2.1.3
+ decamelize@1.2.0: {}
+
+ defu@6.1.7: {}
- decimal.js@10.6.0: {}
+ dequal@2.0.3: {}
- depd@2.0.0: {}
+ destr@2.0.5: {}
detect-libc@2.1.2: {}
+ devalue@5.9.4: {}
+
+ devlop@1.1.0:
+ dependencies:
+ dequal: 2.0.3
+
+ diff@9.0.0: {}
+
+ dijkstrajs@1.0.3: {}
+
dom-serializer@2.0.0:
dependencies:
domelementtype: 2.3.0
@@ -4538,419 +3296,235 @@ snapshots:
domelementtype: 2.3.0
domhandler: 5.0.3
- dunder-proto@1.0.1:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- es-errors: 1.3.0
- gopd: 1.2.0
-
- ee-first@1.1.1: {}
+ dset@3.1.4: {}
- electron-to-chromium@1.5.376: {}
+ emmet@2.4.11:
+ dependencies:
+ '@emmetio/abbreviation': 2.3.3
+ '@emmetio/css-abbreviation': 2.1.8
emoji-regex@10.6.0: {}
- encodeurl@2.0.0: {}
+ emoji-regex@8.0.0: {}
- enhanced-resolve@5.21.6:
+ enhanced-resolve@5.25.1:
dependencies:
graceful-fs: 4.2.11
tapable: 2.3.3
entities@4.5.0: {}
- entities@7.0.1: {}
-
- entities@8.0.0: {}
-
- env-paths@2.2.1: {}
-
- environment@1.1.0: {}
-
- es-define-property@1.0.1: {}
-
- es-errors@1.3.0: {}
-
- es-module-lexer@2.1.0: {}
-
- es-object-atoms@1.1.2:
- dependencies:
- es-errors: 1.3.0
-
- esbuild@0.27.7:
- optionalDependencies:
- '@esbuild/aix-ppc64': 0.27.7
- '@esbuild/android-arm': 0.27.7
- '@esbuild/android-arm64': 0.27.7
- '@esbuild/android-x64': 0.27.7
- '@esbuild/darwin-arm64': 0.27.7
- '@esbuild/darwin-x64': 0.27.7
- '@esbuild/freebsd-arm64': 0.27.7
- '@esbuild/freebsd-x64': 0.27.7
- '@esbuild/linux-arm': 0.27.7
- '@esbuild/linux-arm64': 0.27.7
- '@esbuild/linux-ia32': 0.27.7
- '@esbuild/linux-loong64': 0.27.7
- '@esbuild/linux-mips64el': 0.27.7
- '@esbuild/linux-ppc64': 0.27.7
- '@esbuild/linux-riscv64': 0.27.7
- '@esbuild/linux-s390x': 0.27.7
- '@esbuild/linux-x64': 0.27.7
- '@esbuild/netbsd-arm64': 0.27.7
- '@esbuild/netbsd-x64': 0.27.7
- '@esbuild/openbsd-arm64': 0.27.7
- '@esbuild/openbsd-x64': 0.27.7
- '@esbuild/openharmony-arm64': 0.27.7
- '@esbuild/sunos-x64': 0.27.7
- '@esbuild/win32-arm64': 0.27.7
- '@esbuild/win32-ia32': 0.27.7
- '@esbuild/win32-x64': 0.27.7
-
- esbuild@0.28.1:
- optionalDependencies:
- '@esbuild/aix-ppc64': 0.28.1
- '@esbuild/android-arm': 0.28.1
- '@esbuild/android-arm64': 0.28.1
- '@esbuild/android-x64': 0.28.1
- '@esbuild/darwin-arm64': 0.28.1
- '@esbuild/darwin-x64': 0.28.1
- '@esbuild/freebsd-arm64': 0.28.1
- '@esbuild/freebsd-x64': 0.28.1
- '@esbuild/linux-arm': 0.28.1
- '@esbuild/linux-arm64': 0.28.1
- '@esbuild/linux-ia32': 0.28.1
- '@esbuild/linux-loong64': 0.28.1
- '@esbuild/linux-mips64el': 0.28.1
- '@esbuild/linux-ppc64': 0.28.1
- '@esbuild/linux-riscv64': 0.28.1
- '@esbuild/linux-s390x': 0.28.1
- '@esbuild/linux-x64': 0.28.1
- '@esbuild/netbsd-arm64': 0.28.1
- '@esbuild/netbsd-x64': 0.28.1
- '@esbuild/openbsd-arm64': 0.28.1
- '@esbuild/openbsd-x64': 0.28.1
- '@esbuild/openharmony-arm64': 0.28.1
- '@esbuild/sunos-x64': 0.28.1
- '@esbuild/win32-arm64': 0.28.1
- '@esbuild/win32-ia32': 0.28.1
- '@esbuild/win32-x64': 0.28.1
-
- escalade@3.2.0: {}
-
- escape-html@1.0.3: {}
-
- estree-walker@3.0.3:
- dependencies:
- '@types/estree': 1.0.9
-
- etag@1.8.1: {}
-
- eventemitter3@5.0.4: {}
-
- eventsource-parser@3.1.0: {}
-
- eventsource@3.0.7:
- dependencies:
- eventsource-parser: 3.1.0
-
- expect-type@1.3.0: {}
-
- exponential-backoff@3.1.3: {}
-
- express-rate-limit@8.5.2(express@5.2.1):
- dependencies:
- express: 5.2.1
- ip-address: 10.2.0
-
- express@5.2.1:
- dependencies:
- accepts: 2.0.0
- body-parser: 2.3.0
- content-disposition: 1.1.0
- content-type: 1.0.5
- cookie: 0.7.2
- cookie-signature: 1.2.2
- debug: 4.4.3
- depd: 2.0.0
- encodeurl: 2.0.0
- escape-html: 1.0.3
- etag: 1.8.1
- finalhandler: 2.1.1
- fresh: 2.0.0
- http-errors: 2.0.1
- merge-descriptors: 2.0.0
- mime-types: 3.0.2
- on-finished: 2.4.1
- once: 1.4.0
- parseurl: 1.3.3
- proxy-addr: 2.0.7
- qs: 6.15.2
- range-parser: 1.2.1
- router: 2.2.0
- send: 1.2.1
- serve-static: 2.2.1
- statuses: 2.0.2
- type-is: 2.1.0
- vary: 1.1.2
- transitivePeerDependencies:
- - supports-color
-
- fast-deep-equal@3.1.3: {}
-
- fast-string-truncated-width@3.0.3: {}
-
- fast-string-width@3.0.2:
- dependencies:
- fast-string-truncated-width: 3.0.3
-
- fast-uri@3.1.2: {}
-
- fast-wrap-ansi@0.2.2:
- dependencies:
- fast-string-width: 3.0.2
-
- fdir@6.5.0(picomatch@4.0.4):
- optionalDependencies:
- picomatch: 4.0.4
-
- finalhandler@2.1.1:
- dependencies:
- debug: 4.4.3
- encodeurl: 2.0.0
- escape-html: 1.0.3
- on-finished: 2.4.1
- parseurl: 1.3.3
- statuses: 2.0.2
- transitivePeerDependencies:
- - supports-color
-
- forwarded@0.2.0: {}
-
- fresh@2.0.0: {}
-
- fs-minipass@3.0.3:
- dependencies:
- minipass: 7.1.3
-
- fsevents@2.3.3:
- optional: true
-
- function-bind@1.1.2: {}
-
- gensync@1.0.0-beta.2: {}
-
- get-caller-file@2.0.5: {}
-
- get-east-asian-width@1.6.0: {}
-
- get-intrinsic@1.3.0:
- dependencies:
- call-bind-apply-helpers: 1.0.2
- es-define-property: 1.0.1
- es-errors: 1.3.0
- es-object-atoms: 1.1.2
- function-bind: 1.1.2
- get-proto: 1.0.1
- gopd: 1.2.0
- has-symbols: 1.1.0
- hasown: 2.0.4
- math-intrinsics: 1.1.0
-
- get-proto@1.0.1:
- dependencies:
- dunder-proto: 1.0.1
- es-object-atoms: 1.1.2
-
- glob-to-regexp@0.4.1: {}
-
- glob@13.0.6:
- dependencies:
- minimatch: 10.2.5
- minipass: 7.1.3
- path-scurry: 2.0.2
-
- gopd@1.2.0: {}
+ es-module-lexer@2.3.2: {}
- graceful-fs@4.2.11: {}
+ esbuild@0.28.2:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.28.2
+ '@esbuild/android-arm': 0.28.2
+ '@esbuild/android-arm64': 0.28.2
+ '@esbuild/android-x64': 0.28.2
+ '@esbuild/darwin-arm64': 0.28.2
+ '@esbuild/darwin-x64': 0.28.2
+ '@esbuild/freebsd-arm64': 0.28.2
+ '@esbuild/freebsd-x64': 0.28.2
+ '@esbuild/linux-arm': 0.28.2
+ '@esbuild/linux-arm64': 0.28.2
+ '@esbuild/linux-ia32': 0.28.2
+ '@esbuild/linux-loong64': 0.28.2
+ '@esbuild/linux-mips64el': 0.28.2
+ '@esbuild/linux-ppc64': 0.28.2
+ '@esbuild/linux-riscv64': 0.28.2
+ '@esbuild/linux-s390x': 0.28.2
+ '@esbuild/linux-x64': 0.28.2
+ '@esbuild/netbsd-arm64': 0.28.2
+ '@esbuild/netbsd-x64': 0.28.2
+ '@esbuild/openbsd-arm64': 0.28.2
+ '@esbuild/openbsd-x64': 0.28.2
+ '@esbuild/openharmony-arm64': 0.28.2
+ '@esbuild/sunos-x64': 0.28.2
+ '@esbuild/win32-arm64': 0.28.2
+ '@esbuild/win32-ia32': 0.28.2
+ '@esbuild/win32-x64': 0.28.2
- has-symbols@1.1.0: {}
+ escalade@3.2.0: {}
- hasown@2.0.4:
- dependencies:
- function-bind: 1.1.2
+ eventemitter3@5.0.4: {}
- hono@4.12.26: {}
+ extend@3.0.2: {}
- hosted-git-info@9.0.3:
- dependencies:
- lru-cache: 11.5.1
+ fast-deep-equal@3.1.3: {}
- html-encoding-sniffer@6.0.0:
- dependencies:
- '@exodus/bytes': 1.15.1
- transitivePeerDependencies:
- - '@noble/hashes'
+ fast-string-truncated-width@3.0.3: {}
- htmlparser2@10.1.0:
+ fast-string-width@3.0.2:
dependencies:
- domelementtype: 2.3.0
- domhandler: 5.0.3
- domutils: 3.2.2
- entities: 7.0.1
+ fast-string-truncated-width: 3.0.3
- http-cache-semantics@4.2.0: {}
+ fast-uri@3.1.8: {}
- http-errors@2.0.1:
+ fast-wrap-ansi@0.2.2:
dependencies:
- depd: 2.0.0
- inherits: 2.0.4
- setprototypeof: 1.2.0
- statuses: 2.0.2
- toidentifier: 1.0.1
+ fast-string-width: 3.0.2
- http-proxy-agent@7.0.2:
- dependencies:
- agent-base: 7.1.4
- debug: 4.4.3
- transitivePeerDependencies:
- - supports-color
+ fdir@6.5.0(picomatch@4.0.7):
+ optionalDependencies:
+ picomatch: 4.0.7
- https-proxy-agent@7.0.6:
- dependencies:
- agent-base: 7.1.4
- debug: 4.4.3
- transitivePeerDependencies:
- - supports-color
+ find-proc@0.2.0: {}
- https-proxy-agent@9.0.0:
+ find-up@4.1.0:
dependencies:
- agent-base: 9.0.0
- debug: 4.4.3
- transitivePeerDependencies:
- - supports-color
+ locate-path: 5.0.0
+ path-exists: 4.0.0
- iconv-lite@0.7.2:
+ flattie@1.1.1: {}
+
+ fontace@0.4.1:
dependencies:
- safer-buffer: 2.1.2
+ fontkitten: 1.0.3
- ignore-walk@8.0.0:
+ fontkitten@1.0.3:
dependencies:
- minimatch: 10.2.5
+ tiny-inflate: 1.0.3
- immutable@5.1.6: {}
+ fsevents@2.3.3:
+ optional: true
- inherits@2.0.4: {}
+ get-caller-file@2.0.5: {}
- ini@6.0.0: {}
+ get-east-asian-width@1.7.0: {}
- ip-address@10.2.0: {}
+ get-tsconfig@5.0.0-beta.4:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
- ipaddr.js@1.9.1: {}
+ github-slugger@2.0.0: {}
- is-extglob@2.1.1:
- optional: true
+ graceful-fs@4.2.11: {}
- is-fullwidth-code-point@5.1.0:
+ h3@1.15.11:
dependencies:
- get-east-asian-width: 1.6.0
+ cookie-es: 1.2.3
+ crossws: 0.3.5
+ defu: 6.1.7
+ destr: 2.0.5
+ iron-webcrypto: 1.2.1
+ node-mock-http: 1.0.5
+ radix3: 1.1.2
+ ufo: 1.6.4
+ uncrypto: 0.1.3
- is-glob@4.0.3:
+ hast-util-to-html@9.0.5:
dependencies:
- is-extglob: 2.1.1
- optional: true
+ '@types/hast': 3.0.5
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ comma-separated-tokens: 2.0.3
+ hast-util-whitespace: 3.0.0
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.1
+ property-information: 7.2.0
+ space-separated-tokens: 2.0.2
+ stringify-entities: 4.0.4
+ zwitch: 2.0.4
- is-interactive@2.0.0: {}
+ hast-util-whitespace@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.5
- is-potential-custom-element-name@1.0.1: {}
+ html-escaper@3.0.3: {}
- is-promise@4.0.0: {}
+ html-void-elements@3.0.0: {}
- is-unicode-supported@2.1.0: {}
+ http-cache-semantics@4.2.0: {}
- isexe@2.0.0: {}
+ iron-webcrypto@1.2.1: {}
- isexe@4.0.0: {}
+ is-docker@4.0.0: {}
- jiti@2.7.0: {}
+ is-fullwidth-code-point@3.0.0: {}
- jose@6.2.3: {}
-
- js-tokens@4.0.0: {}
-
- jsdom@28.1.0:
- dependencies:
- '@acemir/cssom': 0.9.31
- '@asamuzakjp/dom-selector': 6.8.1
- '@bramus/specificity': 2.4.2
- '@exodus/bytes': 1.15.1
- cssstyle: 6.2.0
- data-urls: 7.0.0
- decimal.js: 10.6.0
- html-encoding-sniffer: 6.0.0
- http-proxy-agent: 7.0.2
- https-proxy-agent: 7.0.6
- is-potential-custom-element-name: 1.0.1
- parse5: 8.0.1
- saxes: 6.0.0
- symbol-tree: 3.2.4
- tough-cookie: 6.0.1
- undici: 7.28.0
- w3c-xmlserializer: 5.0.0
- webidl-conversions: 8.0.1
- whatwg-mimetype: 5.0.0
- whatwg-url: 16.0.1
- xml-name-validator: 5.0.0
- transitivePeerDependencies:
- - '@noble/hashes'
- - supports-color
+ is-plain-obj@4.1.0: {}
- jsesc@3.1.0: {}
+ jiti@2.7.0: {}
- json-parse-even-better-errors@5.0.0: {}
+ js-yaml@4.3.2:
+ dependencies:
+ argparse: 2.0.1
json-schema-traverse@1.0.0: {}
- json-schema-typed@8.0.2: {}
-
- json5@2.2.3: {}
+ jsonc-parser@2.3.1: {}
jsonc-parser@3.3.1: {}
- jsonparse@1.3.1: {}
+ kleur@4.1.5: {}
lightningcss-android-arm64@1.32.0:
optional: true
+ lightningcss-android-arm64@1.33.0:
+ optional: true
+
lightningcss-darwin-arm64@1.32.0:
optional: true
+ lightningcss-darwin-arm64@1.33.0:
+ optional: true
+
lightningcss-darwin-x64@1.32.0:
optional: true
+ lightningcss-darwin-x64@1.33.0:
+ optional: true
+
lightningcss-freebsd-x64@1.32.0:
optional: true
+ lightningcss-freebsd-x64@1.33.0:
+ optional: true
+
lightningcss-linux-arm-gnueabihf@1.32.0:
optional: true
+ lightningcss-linux-arm-gnueabihf@1.33.0:
+ optional: true
+
lightningcss-linux-arm64-gnu@1.32.0:
optional: true
+ lightningcss-linux-arm64-gnu@1.33.0:
+ optional: true
+
lightningcss-linux-arm64-musl@1.32.0:
optional: true
+ lightningcss-linux-arm64-musl@1.33.0:
+ optional: true
+
lightningcss-linux-x64-gnu@1.32.0:
optional: true
+ lightningcss-linux-x64-gnu@1.33.0:
+ optional: true
+
lightningcss-linux-x64-musl@1.32.0:
optional: true
+ lightningcss-linux-x64-musl@1.33.0:
+ optional: true
+
lightningcss-win32-arm64-msvc@1.32.0:
optional: true
+ lightningcss-win32-arm64-msvc@1.33.0:
+ optional: true
+
lightningcss-win32-x64-msvc@1.32.0:
optional: true
+ lightningcss-win32-x64-msvc@1.33.0:
+ optional: true
+
lightningcss@1.32.0:
dependencies:
detect-libc: 2.1.2
@@ -4967,753 +3541,614 @@ snapshots:
lightningcss-win32-arm64-msvc: 1.32.0
lightningcss-win32-x64-msvc: 1.32.0
- listr2@10.2.1:
+ lightningcss@1.33.0:
dependencies:
- cli-truncate: 5.2.0
- eventemitter3: 5.0.4
- log-update: 6.1.0
- rfdc: 1.4.1
- wrap-ansi: 10.0.0
-
- lmdb@3.5.4:
- dependencies:
- '@harperfast/extended-iterable': 1.0.3
- msgpackr: 1.12.1
- node-addon-api: 6.1.0
- node-gyp-build-optional-packages: 5.2.2
- ordered-binary: 1.6.1
- weak-lru-cache: 1.2.2
+ detect-libc: 2.1.2
optionalDependencies:
- '@lmdb/lmdb-darwin-arm64': 3.5.4
- '@lmdb/lmdb-darwin-x64': 3.5.4
- '@lmdb/lmdb-linux-arm': 3.5.4
- '@lmdb/lmdb-linux-arm64': 3.5.4
- '@lmdb/lmdb-linux-x64': 3.5.4
- '@lmdb/lmdb-win32-arm64': 3.5.4
- '@lmdb/lmdb-win32-x64': 3.5.4
- optional: true
+ lightningcss-android-arm64: 1.33.0
+ lightningcss-darwin-arm64: 1.33.0
+ lightningcss-darwin-x64: 1.33.0
+ lightningcss-freebsd-x64: 1.33.0
+ lightningcss-linux-arm-gnueabihf: 1.33.0
+ lightningcss-linux-arm64-gnu: 1.33.0
+ lightningcss-linux-arm64-musl: 1.33.0
+ lightningcss-linux-x64-gnu: 1.33.0
+ lightningcss-linux-x64-musl: 1.33.0
+ lightningcss-win32-arm64-msvc: 1.33.0
+ lightningcss-win32-x64-msvc: 1.33.0
- log-symbols@7.0.1:
+ locate-path@5.0.0:
dependencies:
- is-unicode-supported: 2.1.0
- yoctocolors: 2.1.2
+ p-locate: 4.1.0
- log-update@6.1.0:
- dependencies:
- ansi-escapes: 7.3.0
- cli-cursor: 5.0.0
- slice-ansi: 7.1.2
- strip-ansi: 7.2.0
- wrap-ansi: 9.0.2
-
- lru-cache@11.5.1: {}
-
- lru-cache@5.1.1:
- dependencies:
- yallist: 3.1.1
+ lru-cache@11.5.3: {}
magic-string@0.30.21:
dependencies:
- '@jridgewell/sourcemap-codec': 1.5.5
-
- make-fetch-happen@15.0.6:
- dependencies:
- '@gar/promise-retry': 1.0.3
- '@npmcli/agent': 4.0.2
- '@npmcli/redact': 4.0.0
- cacache: 20.0.4
- http-cache-semantics: 4.2.0
- minipass: 7.1.3
- minipass-fetch: 5.0.2
- minipass-flush: 1.0.7
- minipass-pipeline: 1.2.4
- negotiator: 1.0.0
- proc-log: 6.1.0
- ssri: 13.0.1
- transitivePeerDependencies:
- - supports-color
-
- math-intrinsics@1.1.0: {}
-
- mdn-data@2.27.1: {}
-
- media-typer@1.1.0: {}
-
- merge-descriptors@2.0.0: {}
-
- mime-db@1.54.0: {}
+ '@jridgewell/sourcemap-codec': 1.6.0
- mime-types@3.0.2:
+ magic-string@1.4.2:
dependencies:
- mime-db: 1.54.0
+ '@jridgewell/sourcemap-codec': 1.6.0
- mimic-function@5.0.1: {}
-
- minimatch@10.2.5:
+ magicast@0.5.5:
dependencies:
- brace-expansion: 5.0.6
+ '@babel/parser': 7.29.9
+ '@babel/types': 7.29.8
+ source-map-js: 1.2.1
- minipass-collect@2.0.1:
+ mdast-util-to-hast@13.2.1:
dependencies:
- minipass: 7.1.3
+ '@types/hast': 3.0.5
+ '@types/mdast': 4.0.4
+ '@ungap/structured-clone': 1.4.0
+ devlop: 1.1.0
+ micromark-util-sanitize-uri: 2.0.1
+ trim-lines: 3.0.1
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
- minipass-fetch@5.0.2:
- dependencies:
- minipass: 7.1.3
- minipass-sized: 2.0.0
- minizlib: 3.1.0
- optionalDependencies:
- iconv-lite: 0.7.2
+ mdn-data@2.0.28: {}
- minipass-flush@1.0.7:
- dependencies:
- minipass: 3.3.6
+ mdn-data@2.27.1: {}
- minipass-pipeline@1.2.4:
+ micromark-util-character@2.1.1:
dependencies:
- minipass: 3.3.6
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
- minipass-sized@2.0.0:
- dependencies:
- minipass: 7.1.3
+ micromark-util-encode@2.0.1: {}
- minipass@3.3.6:
+ micromark-util-sanitize-uri@2.0.1:
dependencies:
- yallist: 4.0.0
+ micromark-util-character: 2.1.1
+ micromark-util-encode: 2.0.1
+ micromark-util-symbol: 2.0.1
- minipass@7.1.3: {}
+ micromark-util-symbol@2.0.1: {}
- minizlib@3.1.0:
- dependencies:
- minipass: 7.1.3
+ micromark-util-types@2.0.2: {}
mrmime@2.0.1: {}
- ms@2.1.3: {}
+ muggle-string@0.4.1: {}
- msgpackr-extract@3.0.4:
- dependencies:
- node-gyp-build-optional-packages: 5.2.2
- optionalDependencies:
- '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.4
- '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.4
- '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.4
- '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.4
- '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.4
- '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.4
- optional: true
-
- msgpackr@1.12.1:
- optionalDependencies:
- msgpackr-extract: 3.0.4
- optional: true
+ nanoid@3.3.19: {}
- mute-stream@3.0.0: {}
+ neotraverse@1.0.1: {}
- nanoid@3.3.13: {}
-
- negotiator@1.0.0: {}
+ nlcst-to-string@4.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
- node-addon-api@6.1.0:
- optional: true
+ node-fetch-native@1.6.7: {}
- node-addon-api@7.1.1:
- optional: true
+ node-mock-http@1.0.5: {}
- node-gyp-build-optional-packages@5.2.2:
- dependencies:
- detect-libc: 2.1.2
- optional: true
+ normalize-path@3.0.0: {}
- node-gyp@12.4.0:
+ nth-check@2.1.1:
dependencies:
- env-paths: 2.2.1
- exponential-backoff: 3.1.3
- graceful-fs: 4.2.11
- nopt: 9.0.0
- proc-log: 6.1.0
- semver: 7.7.4
- tar: 7.5.16
- tinyglobby: 0.2.17
- undici: 6.27.0
- which: 6.0.1
-
- node-releases@2.0.48: {}
+ boolbase: 1.0.0
- nopt@9.0.0:
- dependencies:
- abbrev: 4.0.0
+ obug@3.0.0: {}
- npm-bundled@5.0.0:
+ ofetch@1.5.1:
dependencies:
- npm-normalize-package-bin: 5.0.0
+ destr: 2.0.5
+ node-fetch-native: 1.6.7
+ ufo: 1.6.4
- npm-install-checks@8.0.0:
- dependencies:
- semver: 7.7.4
+ ohash@2.0.12: {}
- npm-normalize-package-bin@5.0.0: {}
+ oniguruma-parser@0.12.2: {}
- npm-package-arg@13.0.2:
+ oniguruma-to-es@4.3.6:
dependencies:
- hosted-git-info: 9.0.3
- proc-log: 6.1.0
- semver: 7.7.4
- validate-npm-package-name: 7.0.2
+ oniguruma-parser: 0.12.2
+ regex: 6.1.0
+ regex-recursion: 6.0.2
- npm-packlist@10.0.4:
+ p-limit@2.3.0:
dependencies:
- ignore-walk: 8.0.0
- proc-log: 6.1.0
+ p-try: 2.2.0
- npm-pick-manifest@11.0.3:
+ p-limit@7.3.3:
dependencies:
- npm-install-checks: 8.0.0
- npm-normalize-package-bin: 5.0.0
- npm-package-arg: 13.0.2
- semver: 7.7.4
+ yocto-queue: 1.2.2
- npm-registry-fetch@19.1.1:
+ p-locate@4.1.0:
dependencies:
- '@npmcli/redact': 4.0.0
- jsonparse: 1.3.1
- make-fetch-happen: 15.0.6
- minipass: 7.1.3
- minipass-fetch: 5.0.2
- minizlib: 3.1.0
- npm-package-arg: 13.0.2
- proc-log: 6.1.0
- transitivePeerDependencies:
- - supports-color
+ p-limit: 2.3.0
- nth-check@2.1.1:
+ p-queue@9.3.3:
dependencies:
- boolbase: 1.0.0
+ eventemitter3: 5.0.4
+ p-timeout: 7.0.2
- object-assign@4.1.1: {}
+ p-timeout@7.0.2: {}
- object-inspect@1.13.4: {}
+ p-try@2.2.0: {}
- obug@2.1.3: {}
+ package-manager-detector@1.8.0: {}
- on-finished@2.4.1:
- dependencies:
- ee-first: 1.1.1
+ path-browserify@1.0.1: {}
- once@1.4.0:
- dependencies:
- wrappy: 1.0.2
+ path-exists@4.0.0: {}
- onetime@7.0.0:
- dependencies:
- mimic-function: 5.0.1
+ piccolore@0.1.3: {}
- ora@9.4.0:
- dependencies:
- chalk: 5.6.2
- cli-cursor: 5.0.0
- cli-spinners: 3.4.0
- is-interactive: 2.0.0
- is-unicode-supported: 2.1.0
- log-symbols: 7.0.1
- stdin-discarder: 0.3.2
- string-width: 8.2.1
+ picocolors@1.1.1: {}
- ordered-binary@1.6.1:
- optional: true
+ picomatch@2.3.2: {}
- p-map@7.0.4: {}
+ picomatch@4.0.7: {}
- pacote@21.5.1:
- dependencies:
- '@gar/promise-retry': 1.0.3
- '@npmcli/git': 7.0.2
- '@npmcli/installed-package-contents': 4.0.0
- '@npmcli/package-json': 7.0.5
- '@npmcli/promise-spawn': 9.0.1
- '@npmcli/run-script': 10.0.4
- cacache: 20.0.4
- fs-minipass: 3.0.3
- minipass: 7.1.3
- npm-package-arg: 13.0.2
- npm-packlist: 10.0.4
- npm-pick-manifest: 11.0.3
- npm-registry-fetch: 19.1.1
- proc-log: 6.1.0
- sigstore: 4.1.1
- ssri: 13.0.1
- tar: 7.5.16
- transitivePeerDependencies:
- - supports-color
+ pngjs@5.0.0: {}
- parse5-html-rewriting-stream@8.0.1:
+ postcss-selector-parser@6.0.10:
dependencies:
- entities: 8.0.0
- parse5: 8.0.1
- parse5-sax-parser: 8.0.0
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
- parse5-sax-parser@8.0.0:
+ postcss@8.5.28:
dependencies:
- parse5: 8.0.1
+ nanoid: 3.3.19
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
- parse5@8.0.1:
+ prettier-plugin-astro@1.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(prettier@3.9.9):
dependencies:
- entities: 8.0.0
-
- parseurl@1.3.3: {}
-
- path-key@3.1.1: {}
+ '@astrojs/compiler-rs': 0.4.1(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)
+ '@prettier/parse-srcset': 3.1.0
+ prettier: 3.9.9
+ sass-formatter: 0.8.0
+ transitivePeerDependencies:
+ - '@emnapi/core'
+ - '@emnapi/runtime'
- path-scurry@2.0.2:
+ prettier-plugin-tailwindcss@0.8.1(prettier-plugin-astro@1.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(prettier@3.9.9))(prettier@3.9.9):
dependencies:
- lru-cache: 11.5.1
- minipass: 7.1.3
-
- path-to-regexp@8.4.2: {}
-
- pathe@2.0.3: {}
-
- picocolors@1.1.1: {}
+ prettier: 3.9.9
+ optionalDependencies:
+ prettier-plugin-astro: 1.1.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(prettier@3.9.9)
- picomatch@4.0.4: {}
+ prettier@3.9.9: {}
- piscina@5.1.4:
- optionalDependencies:
- '@napi-rs/nice': 1.1.1
+ prismjs@1.30.0: {}
- pkce-challenge@5.0.1: {}
+ process-ancestry@0.1.0: {}
- postcss-media-query-parser@0.2.3: {}
+ property-information@7.2.0: {}
- postcss-safe-parser@7.0.1(postcss@8.5.15):
+ qrcode@1.5.4:
dependencies:
- postcss: 8.5.15
+ dijkstrajs: 1.0.3
+ pngjs: 5.0.0
+ yargs: 15.4.1
- postcss@8.5.15:
- dependencies:
- nanoid: 3.3.13
- picocolors: 1.1.1
- source-map-js: 1.2.1
+ radix3@1.1.2: {}
- prettier@3.8.4: {}
+ readdirp@4.1.2: {}
- proc-log@6.1.0: {}
+ readdirp@5.1.1: {}
- proxy-addr@2.0.7:
+ regex-recursion@6.0.2:
dependencies:
- forwarded: 0.2.0
- ipaddr.js: 1.9.1
+ regex-utilities: 2.3.0
- punycode@2.3.1: {}
+ regex-utilities@2.3.0: {}
- qs@6.15.2:
+ regex@6.1.0:
dependencies:
- side-channel: 1.1.1
+ regex-utilities: 2.3.0
- range-parser@1.2.1: {}
+ request-light@0.5.8: {}
- raw-body@3.0.2:
- dependencies:
- bytes: 3.1.2
- http-errors: 2.0.1
- iconv-lite: 0.7.2
- unpipe: 1.0.0
+ request-light@0.7.0: {}
- readdirp@4.1.2: {}
+ require-directory@2.1.1: {}
- readdirp@5.0.0: {}
+ require-from-string@2.0.2: {}
- reflect-metadata@0.2.2: {}
+ require-main-filename@2.0.0: {}
- require-from-string@2.0.2: {}
+ resolve-pkg-maps@1.0.0: {}
- restore-cursor@5.1.0:
+ retext-smartypants@6.2.0:
dependencies:
- onetime: 7.0.0
- signal-exit: 4.1.0
-
- rfdc@1.4.1: {}
+ '@types/nlcst': 2.0.3
+ nlcst-to-string: 4.0.0
+ unist-util-visit: 5.1.0
- rollup@4.60.2:
+ rolldown@1.2.11:
dependencies:
- '@types/estree': 1.0.8
+ '@oxc-project/types': 0.151.0
+ '@rolldown/pluginutils': 1.0.1
optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.60.2
- '@rollup/rollup-android-arm64': 4.60.2
- '@rollup/rollup-darwin-arm64': 4.60.2
- '@rollup/rollup-darwin-x64': 4.60.2
- '@rollup/rollup-freebsd-arm64': 4.60.2
- '@rollup/rollup-freebsd-x64': 4.60.2
- '@rollup/rollup-linux-arm-gnueabihf': 4.60.2
- '@rollup/rollup-linux-arm-musleabihf': 4.60.2
- '@rollup/rollup-linux-arm64-gnu': 4.60.2
- '@rollup/rollup-linux-arm64-musl': 4.60.2
- '@rollup/rollup-linux-loong64-gnu': 4.60.2
- '@rollup/rollup-linux-loong64-musl': 4.60.2
- '@rollup/rollup-linux-ppc64-gnu': 4.60.2
- '@rollup/rollup-linux-ppc64-musl': 4.60.2
- '@rollup/rollup-linux-riscv64-gnu': 4.60.2
- '@rollup/rollup-linux-riscv64-musl': 4.60.2
- '@rollup/rollup-linux-s390x-gnu': 4.60.2
- '@rollup/rollup-linux-x64-gnu': 4.60.2
- '@rollup/rollup-linux-x64-musl': 4.60.2
- '@rollup/rollup-openbsd-x64': 4.60.2
- '@rollup/rollup-openharmony-arm64': 4.60.2
- '@rollup/rollup-win32-arm64-msvc': 4.60.2
- '@rollup/rollup-win32-ia32-msvc': 4.60.2
- '@rollup/rollup-win32-x64-gnu': 4.60.2
- '@rollup/rollup-win32-x64-msvc': 4.60.2
- fsevents: 2.3.3
+ '@rolldown/binding-android-arm-eabi': 1.2.11
+ '@rolldown/binding-android-arm64': 1.2.11
+ '@rolldown/binding-darwin-arm64': 1.2.11
+ '@rolldown/binding-darwin-x64': 1.2.11
+ '@rolldown/binding-freebsd-x64': 1.2.11
+ '@rolldown/binding-linux-arm-gnueabihf': 1.2.11
+ '@rolldown/binding-linux-arm64-gnu': 1.2.11
+ '@rolldown/binding-linux-arm64-musl': 1.2.11
+ '@rolldown/binding-linux-ppc64-gnu': 1.2.11
+ '@rolldown/binding-linux-s390x-gnu': 1.2.11
+ '@rolldown/binding-linux-x64-gnu': 1.2.11
+ '@rolldown/binding-linux-x64-musl': 1.2.11
+ '@rolldown/binding-openharmony-arm64': 1.2.11
+ '@rolldown/binding-win32-arm64-msvc': 1.2.11
+ '@rolldown/binding-win32-x64-msvc': 1.2.11
+
+ s.color@0.0.15: {}
+
+ sass-formatter@0.8.0:
+ dependencies:
+ suf-log: 2.5.3
+
+ satteri@0.10.5:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.5
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ optionalDependencies:
+ '@bruits/satteri-darwin-arm64': 0.10.5
+ '@bruits/satteri-darwin-x64': 0.10.5
+ '@bruits/satteri-linux-arm64-gnu': 0.10.5
+ '@bruits/satteri-linux-arm64-musl': 0.10.5
+ '@bruits/satteri-linux-x64-gnu': 0.10.5
+ '@bruits/satteri-linux-x64-musl': 0.10.5
+ '@bruits/satteri-wasm32-wasi': 0.10.5
+ '@bruits/satteri-win32-arm64-msvc': 0.10.5
+ '@bruits/satteri-win32-x64-msvc': 0.10.5
- router@2.2.0:
- dependencies:
- debug: 4.4.3
- depd: 2.0.0
- is-promise: 4.0.0
- parseurl: 1.3.3
- path-to-regexp: 8.4.2
- transitivePeerDependencies:
- - supports-color
+ sax@1.6.1: {}
- rxjs@7.8.2:
- dependencies:
- tslib: 2.8.1
+ semver@7.8.5: {}
- safer-buffer@2.1.2: {}
+ set-blocking@2.0.0: {}
- sass@1.99.0:
+ sharp@0.35.4(@types/node@24.13.6):
dependencies:
- chokidar: 4.0.3
- immutable: 5.1.6
- source-map-js: 1.2.1
+ '@img/colour': 1.1.0
+ detect-libc: 2.1.2
+ semver: 7.8.5
optionalDependencies:
- '@parcel/watcher': 2.5.6
-
- saxes@6.0.0:
- dependencies:
- xmlchars: 2.2.0
-
- semver@6.3.1: {}
+ '@img/sharp-darwin-arm64': 0.35.4
+ '@img/sharp-darwin-x64': 0.35.4
+ '@img/sharp-freebsd-wasm32': 0.35.4
+ '@img/sharp-libvips-darwin-arm64': 1.3.3
+ '@img/sharp-libvips-darwin-x64': 1.3.3
+ '@img/sharp-libvips-linux-arm': 1.3.3
+ '@img/sharp-libvips-linux-arm64': 1.3.3
+ '@img/sharp-libvips-linux-ppc64': 1.3.3
+ '@img/sharp-libvips-linux-riscv64': 1.3.3
+ '@img/sharp-libvips-linux-s390x': 1.3.3
+ '@img/sharp-libvips-linux-x64': 1.3.3
+ '@img/sharp-libvips-linuxmusl-arm64': 1.3.3
+ '@img/sharp-libvips-linuxmusl-x64': 1.3.3
+ '@img/sharp-linux-arm': 0.35.4
+ '@img/sharp-linux-arm64': 0.35.4
+ '@img/sharp-linux-ppc64': 0.35.4
+ '@img/sharp-linux-riscv64': 0.35.4
+ '@img/sharp-linux-s390x': 0.35.4
+ '@img/sharp-linux-x64': 0.35.4
+ '@img/sharp-linuxmusl-arm64': 0.35.4
+ '@img/sharp-linuxmusl-x64': 0.35.4
+ '@img/sharp-webcontainers-wasm32': 0.35.4
+ '@img/sharp-win32-arm64': 0.35.4
+ '@img/sharp-win32-ia32': 0.35.4
+ '@img/sharp-win32-x64': 0.35.4
+ '@types/node': 24.13.6
+
+ shiki@4.4.3:
+ dependencies:
+ '@shikijs/core': 4.4.3
+ '@shikijs/engine-javascript': 4.4.3
+ '@shikijs/engine-oniguruma': 4.4.3
+ '@shikijs/langs': 4.4.3
+ '@shikijs/themes': 4.4.3
+ '@shikijs/types': 4.4.3
+ '@shikijs/vscode-textmate': 10.0.2
+ '@types/hast': 3.0.5
+
+ sisteransi@1.0.5: {}
+
+ sitemap@9.0.1:
+ dependencies:
+ '@types/node': 24.13.6
+ '@types/sax': 1.2.7
+ arg: 5.0.2
+ sax: 1.6.1
+
+ smol-toml@1.9.0: {}
- semver@7.7.4: {}
-
- semver@7.8.4: {}
+ source-map-js@1.2.1: {}
- send@1.2.1:
- dependencies:
- debug: 4.4.3
- encodeurl: 2.0.0
- escape-html: 1.0.3
- etag: 1.8.1
- fresh: 2.0.0
- http-errors: 2.0.1
- mime-types: 3.0.2
- ms: 2.1.3
- on-finished: 2.4.1
- range-parser: 1.2.1
- statuses: 2.0.2
- transitivePeerDependencies:
- - supports-color
+ space-separated-tokens@2.0.2: {}
- serve-static@2.2.1:
+ string-width@4.2.3:
dependencies:
- encodeurl: 2.0.0
- escape-html: 1.0.3
- parseurl: 1.3.3
- send: 1.2.1
- transitivePeerDependencies:
- - supports-color
-
- setprototypeof@1.2.0: {}
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
- shebang-command@2.0.0:
+ string-width@7.2.0:
dependencies:
- shebang-regex: 3.0.0
-
- shebang-regex@3.0.0: {}
+ emoji-regex: 10.6.0
+ get-east-asian-width: 1.7.0
+ strip-ansi: 7.2.0
- side-channel-list@1.0.1:
+ string-width@8.3.0:
dependencies:
- es-errors: 1.3.0
- object-inspect: 1.13.4
+ get-east-asian-width: 1.7.0
+ strip-ansi: 7.2.0
- side-channel-map@1.0.1:
+ stringify-entities@4.0.4:
dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- object-inspect: 1.13.4
+ character-entities-html4: 2.1.0
+ character-entities-legacy: 3.0.0
- side-channel-weakmap@1.0.2:
+ strip-ansi@6.0.1:
dependencies:
- call-bound: 1.0.4
- es-errors: 1.3.0
- get-intrinsic: 1.3.0
- object-inspect: 1.13.4
- side-channel-map: 1.0.1
+ ansi-regex: 5.0.1
- side-channel@1.1.1:
+ strip-ansi@7.2.0:
dependencies:
- es-errors: 1.3.0
- object-inspect: 1.13.4
- side-channel-list: 1.0.1
- side-channel-map: 1.0.1
- side-channel-weakmap: 1.0.2
-
- siginfo@2.0.0: {}
-
- signal-exit@4.1.0: {}
+ ansi-regex: 6.3.0
- sigstore@4.1.1:
+ suf-log@2.5.3:
dependencies:
- '@sigstore/bundle': 4.0.0
- '@sigstore/core': 3.2.1
- '@sigstore/protobuf-specs': 0.5.1
- '@sigstore/sign': 4.1.1
- '@sigstore/tuf': 4.0.2
- '@sigstore/verify': 3.1.1
- transitivePeerDependencies:
- - supports-color
+ s.color: 0.0.15
- slice-ansi@7.1.2:
+ svgo@4.1.0:
dependencies:
- ansi-styles: 6.2.3
- is-fullwidth-code-point: 5.1.0
+ commander: 11.1.0
+ css-select: 6.0.0
+ css-tree: 3.2.1
+ css-what: 7.0.0
+ csso: 5.0.5
+ picocolors: 1.1.1
+ sax: 1.6.1
- slice-ansi@8.0.0:
- dependencies:
- ansi-styles: 6.2.3
- is-fullwidth-code-point: 5.1.0
+ tailwindcss@4.3.3: {}
- smart-buffer@4.2.0: {}
+ tapable@2.3.3: {}
- socks-proxy-agent@8.0.5:
- dependencies:
- agent-base: 7.1.4
- debug: 4.4.3
- socks: 2.8.9
- transitivePeerDependencies:
- - supports-color
+ tiny-inflate@1.0.3: {}
- socks@2.8.9:
- dependencies:
- ip-address: 10.2.0
- smart-buffer: 4.2.0
+ tinyclip@1.0.3: {}
- source-map-js@1.2.1: {}
+ tinyexec@1.3.1: {}
- source-map-support@0.5.21:
+ tinyglobby@0.2.17:
dependencies:
- buffer-from: 1.1.2
- source-map: 0.6.1
+ fdir: 6.5.0(picomatch@4.0.7)
+ picomatch: 4.0.7
- source-map@0.6.1: {}
+ trim-lines@3.0.1: {}
- source-map@0.7.6: {}
+ trough@2.2.0: {}
+
+ tslib@2.8.1: {}
- spdx-exceptions@2.5.0: {}
+ typesafe-path@0.2.2: {}
- spdx-expression-parse@4.0.0:
+ typescript-auto-import-cache@0.3.6:
dependencies:
- spdx-exceptions: 2.5.0
- spdx-license-ids: 3.0.23
+ semver: 7.8.5
- spdx-license-ids@3.0.23: {}
+ typescript@6.0.3: {}
- ssri@13.0.1:
- dependencies:
- minipass: 7.1.3
+ ufo@1.6.4: {}
- stackback@0.0.2: {}
+ ultrahtml@1.7.0: {}
- statuses@2.0.2: {}
+ uncrypto@0.1.3: {}
- std-env@4.1.0: {}
+ undici-types@7.18.2: {}
- stdin-discarder@0.3.2: {}
+ undici@8.11.2: {}
- string-width@7.2.0:
+ unified@11.0.5:
dependencies:
- emoji-regex: 10.6.0
- get-east-asian-width: 1.6.0
- strip-ansi: 7.2.0
+ '@types/unist': 3.0.3
+ bail: 2.0.2
+ devlop: 1.1.0
+ extend: 3.0.2
+ is-plain-obj: 4.1.0
+ trough: 2.2.0
+ vfile: 6.0.3
- string-width@8.2.1:
+ unifont@0.7.5:
dependencies:
- get-east-asian-width: 1.6.0
- strip-ansi: 7.2.0
+ css-tree: 3.2.1
+ ohash: 2.0.12
+ undici: 8.11.2
- strip-ansi@7.2.0:
+ unist-util-is@6.0.1:
dependencies:
- ansi-regex: 6.2.2
+ '@types/unist': 3.0.3
- symbol-tree@3.2.4: {}
-
- tailwindcss@4.3.1: {}
-
- tapable@2.3.3: {}
-
- tar@7.5.16:
+ unist-util-position@5.0.0:
dependencies:
- '@isaacs/fs-minipass': 4.0.1
- chownr: 3.0.0
- minipass: 7.1.3
- minizlib: 3.1.0
- yallist: 5.0.0
+ '@types/unist': 3.0.3
- tinybench@2.9.0: {}
+ unist-util-stringify-position@4.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
- tinyexec@1.2.4: {}
+ unist-util-visit-parents@6.0.2:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
- tinyglobby@0.2.16:
+ unist-util-visit@5.1.0:
dependencies:
- fdir: 6.5.0(picomatch@4.0.4)
- picomatch: 4.0.4
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.1
+ unist-util-visit-parents: 6.0.2
- tinyglobby@0.2.17:
+ unstorage@1.17.5:
dependencies:
- fdir: 6.5.0(picomatch@4.0.4)
- picomatch: 4.0.4
+ anymatch: 3.1.3
+ chokidar: 5.0.0
+ destr: 2.0.5
+ h3: 1.15.11
+ lru-cache: 11.5.3
+ node-fetch-native: 1.6.7
+ ofetch: 1.5.1
+ ufo: 1.6.4
- tinyrainbow@3.1.0: {}
+ util-deprecate@1.0.2: {}
- tldts-core@7.4.3: {}
+ verkit@0.4.1: {}
- tldts@7.4.3:
+ vfile-message@4.0.3:
dependencies:
- tldts-core: 7.4.3
+ '@types/unist': 3.0.3
+ unist-util-stringify-position: 4.0.0
- toidentifier@1.0.1: {}
-
- tough-cookie@6.0.1:
+ vfile@6.0.3:
dependencies:
- tldts: 7.4.3
+ '@types/unist': 3.0.3
+ vfile-message: 4.0.3
- tr46@6.0.0:
+ vite@8.3.1(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1):
dependencies:
- punycode: 2.3.1
+ lightningcss: 1.33.0
+ picomatch: 4.0.7
+ postcss: 8.5.28
+ rolldown: 1.2.11
+ tinyglobby: 0.2.17
+ optionalDependencies:
+ '@types/node': 24.13.6
+ esbuild: 0.28.2
+ fsevents: 2.3.3
+ jiti: 2.7.0
+ yaml: 2.9.1
- tslib@2.8.1: {}
+ vitefu@1.1.3(vite@8.3.1(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)):
+ optionalDependencies:
+ vite: 8.3.1(@types/node@24.13.6)(esbuild@0.28.2)(jiti@2.7.0)(yaml@2.9.1)
- tuf-js@4.1.0:
+ volar-service-css@0.0.71(@volar/language-service@2.4.28):
dependencies:
- '@tufjs/models': 4.1.0
- debug: 4.4.3
- make-fetch-happen: 15.0.6
- transitivePeerDependencies:
- - supports-color
+ vscode-css-languageservice: 6.3.10
+ vscode-languageserver-textdocument: 1.0.15
+ vscode-uri: 3.2.0
+ optionalDependencies:
+ '@volar/language-service': 2.4.28
- type-is@2.1.0:
+ volar-service-emmet@0.0.71(@volar/language-service@2.4.28):
dependencies:
- content-type: 2.0.0
- media-typer: 1.1.0
- mime-types: 3.0.2
-
- typescript@6.0.3: {}
-
- undici-types@6.21.0: {}
-
- undici@6.27.0: {}
-
- undici@7.28.0: {}
-
- unpipe@1.0.0: {}
+ '@emmetio/css-parser': 0.4.1
+ '@emmetio/html-matcher': 1.3.0
+ '@vscode/emmet-helper': 2.11.0
+ vscode-uri: 3.2.0
+ optionalDependencies:
+ '@volar/language-service': 2.4.28
- update-browserslist-db@1.2.3(browserslist@4.28.2):
+ volar-service-html@0.0.71(@volar/language-service@2.4.28):
dependencies:
- browserslist: 4.28.2
- escalade: 3.2.0
- picocolors: 1.1.1
+ vscode-html-languageservice: 5.6.2
+ vscode-languageserver-textdocument: 1.0.15
+ vscode-uri: 3.2.0
+ optionalDependencies:
+ '@volar/language-service': 2.4.28
- validate-npm-package-name@7.0.2: {}
+ volar-service-prettier@0.0.71(@volar/language-service@2.4.28)(prettier@3.9.9):
+ dependencies:
+ vscode-uri: 3.2.0
+ optionalDependencies:
+ '@volar/language-service': 2.4.28
+ prettier: 3.9.9
- vary@1.1.2: {}
+ volar-service-typescript-twoslash-queries@0.0.71(@volar/language-service@2.4.28):
+ dependencies:
+ vscode-uri: 3.2.0
+ optionalDependencies:
+ '@volar/language-service': 2.4.28
- vite@7.3.5(@types/node@20.19.43)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0):
+ volar-service-typescript@0.0.71(@volar/language-service@2.4.28):
dependencies:
- esbuild: 0.27.7
- fdir: 6.5.0(picomatch@4.0.4)
- picomatch: 4.0.4
- postcss: 8.5.15
- rollup: 4.60.2
- tinyglobby: 0.2.16
+ path-browserify: 1.0.1
+ semver: 7.8.5
+ typescript-auto-import-cache: 0.3.6
+ vscode-languageserver-textdocument: 1.0.15
+ vscode-nls: 5.2.0
+ vscode-uri: 3.2.0
optionalDependencies:
- '@types/node': 20.19.43
- fsevents: 2.3.3
- jiti: 2.7.0
- lightningcss: 1.32.0
- sass: 1.99.0
-
- vitest@4.1.9(@types/node@20.19.43)(jsdom@28.1.0)(vite@7.3.5(@types/node@20.19.43)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0)):
- dependencies:
- '@vitest/expect': 4.1.9
- '@vitest/mocker': 4.1.9(vite@7.3.5(@types/node@20.19.43)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0))
- '@vitest/pretty-format': 4.1.9
- '@vitest/runner': 4.1.9
- '@vitest/snapshot': 4.1.9
- '@vitest/spy': 4.1.9
- '@vitest/utils': 4.1.9
- es-module-lexer: 2.1.0
- expect-type: 1.3.0
- magic-string: 0.30.21
- obug: 2.1.3
- pathe: 2.0.3
- picomatch: 4.0.4
- std-env: 4.1.0
- tinybench: 2.9.0
- tinyexec: 1.2.4
- tinyglobby: 0.2.17
- tinyrainbow: 3.1.0
- vite: 7.3.5(@types/node@20.19.43)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0)
- why-is-node-running: 2.3.0
+ '@volar/language-service': 2.4.28
+
+ volar-service-yaml@0.0.71(@volar/language-service@2.4.28):
+ dependencies:
+ vscode-uri: 3.2.0
+ yaml-language-server: 1.23.0
optionalDependencies:
- '@types/node': 20.19.43
- jsdom: 28.1.0
- transitivePeerDependencies:
- - msw
+ '@volar/language-service': 2.4.28
- w3c-xmlserializer@5.0.0:
+ vscode-css-languageservice@6.3.10:
dependencies:
- xml-name-validator: 5.0.0
+ '@vscode/l10n': 0.0.18
+ vscode-languageserver-textdocument: 1.0.15
+ vscode-languageserver-types: 3.17.5
+ vscode-uri: 3.2.0
- watchpack@2.5.1:
+ vscode-html-languageservice@5.6.2:
dependencies:
- glob-to-regexp: 0.4.1
- graceful-fs: 4.2.11
+ '@vscode/l10n': 0.0.18
+ vscode-languageserver-textdocument: 1.0.15
+ vscode-languageserver-types: 3.18.4
+ vscode-uri: 3.2.0
- weak-lru-cache@1.2.2:
- optional: true
+ vscode-json-languageservice@4.1.8:
+ dependencies:
+ jsonc-parser: 3.3.1
+ vscode-languageserver-textdocument: 1.0.15
+ vscode-languageserver-types: 3.18.4
+ vscode-nls: 5.2.0
+ vscode-uri: 3.2.0
- webidl-conversions@8.0.1: {}
+ vscode-jsonrpc@8.2.0: {}
- whatwg-mimetype@5.0.0: {}
+ vscode-jsonrpc@9.0.3: {}
- whatwg-url@16.0.1:
+ vscode-languageserver-protocol@3.17.5:
dependencies:
- '@exodus/bytes': 1.15.1
- tr46: 6.0.0
- webidl-conversions: 8.0.1
- transitivePeerDependencies:
- - '@noble/hashes'
+ vscode-jsonrpc: 8.2.0
+ vscode-languageserver-types: 3.17.5
- which@2.0.2:
+ vscode-languageserver-protocol@3.18.4:
dependencies:
- isexe: 2.0.0
+ vscode-jsonrpc: 9.0.3
+ vscode-languageserver-types: 3.18.4
- which@6.0.1:
- dependencies:
- isexe: 4.0.0
+ vscode-languageserver-textdocument@1.0.15: {}
+
+ vscode-languageserver-types@3.17.5: {}
- why-is-node-running@2.3.0:
+ vscode-languageserver-types@3.18.4: {}
+
+ vscode-languageserver@9.0.1:
dependencies:
- siginfo: 2.0.0
- stackback: 0.0.2
+ vscode-languageserver-protocol: 3.17.5
+
+ vscode-nls@5.2.0: {}
- wrap-ansi@10.0.0:
+ vscode-uri@3.2.0: {}
+
+ which-module@2.0.1: {}
+
+ wrap-ansi@6.2.0:
dependencies:
- ansi-styles: 6.2.3
- string-width: 8.2.1
- strip-ansi: 7.2.0
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
wrap-ansi@9.0.2:
dependencies:
@@ -5721,39 +4156,63 @@ snapshots:
string-width: 7.2.0
strip-ansi: 7.2.0
- wrappy@1.0.2: {}
+ xxhash-wasm@1.1.0: {}
- xhr2@0.2.1: {}
-
- xml-name-validator@5.0.0: {}
-
- xmlchars@2.2.0: {}
+ y18n@4.0.3: {}
y18n@5.0.8: {}
- yallist@3.1.1: {}
+ yaml-language-server@1.23.0:
+ dependencies:
+ '@vscode/l10n': 0.0.18
+ ajv: 8.20.0
+ ajv-draft-04: 1.0.0(ajv@8.20.0)
+ ajv-i18n: 4.2.0(ajv@8.20.0)
+ prettier: 3.9.9
+ request-light: 0.5.8
+ vscode-json-languageservice: 4.1.8
+ vscode-languageserver: 9.0.1
+ vscode-languageserver-textdocument: 1.0.15
+ vscode-languageserver-types: 3.18.4
+ vscode-uri: 3.2.0
+ yaml: 2.8.3
+
+ yaml@2.8.3: {}
- yallist@4.0.0: {}
+ yaml@2.9.1: {}
- yallist@5.0.0: {}
+ yargs-parser@18.1.3:
+ dependencies:
+ camelcase: 5.3.1
+ decamelize: 1.2.0
yargs-parser@22.0.0: {}
- yargs@18.0.0:
+ yargs@15.4.1:
+ dependencies:
+ cliui: 6.0.0
+ decamelize: 1.2.0
+ find-up: 4.1.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ require-main-filename: 2.0.0
+ set-blocking: 2.0.0
+ string-width: 4.2.3
+ which-module: 2.0.1
+ y18n: 4.0.3
+ yargs-parser: 18.1.3
+
+ yargs@18.2.0:
dependencies:
cliui: 9.0.1
escalade: 3.2.0
get-caller-file: 2.0.5
- string-width: 7.2.0
+ string-width: 8.3.0
y18n: 5.0.8
yargs-parser: 22.0.0
- yoctocolors@2.1.2: {}
-
- zod-to-json-schema@3.25.2(zod@4.4.2):
- dependencies:
- zod: 4.4.2
+ yocto-queue@1.2.2: {}
- zod@4.4.2: {}
+ zod@4.6.5: {}
- zod@4.4.3: {}
+ zwitch@2.0.4: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index dc8c1bc..dbb26c8 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,5 +1,3 @@
allowBuilds:
- '@parcel/watcher': true
esbuild: true
- lmdb: true
- msgpackr-extract: true
+ sharp: true
diff --git a/public/brand/horizontal-lockup-gradient.png b/public/brand/horizontal-lockup-gradient.png
new file mode 100644
index 0000000..2018860
Binary files /dev/null and b/public/brand/horizontal-lockup-gradient.png differ
diff --git a/public/llms.txt b/public/llms.txt
index 4d0dba4..5719ce4 100644
--- a/public/llms.txt
+++ b/public/llms.txt
@@ -25,10 +25,24 @@ Funput runs on:
- Lightweight, privacy-focused, free and open source (MIT)
- Built with Rust
+## Official app pages
+
+- [Funput for macOS](https://funput.app/macos/): Vietnamese input method for macOS 26+, Apple Silicon and Intel; .pkg or .app.zip.
+- [Funput for Windows](https://funput.app/windows/): Vietnamese input method for Windows 10 version 1809+ and Windows 11; portable x86-64 .exe.
+- [Funput for Linux](https://funput.app/linux/): Vietnamese input method for Fcitx5 and IBus; Ubuntu, Debian, Fedora, openSUSE and Arch on x86-64.
+- [Funput for iOS](https://funput.app/ios/): Vietnamese keyboard for iPhone and iPad; App Store ID 6788829996.
+- [Funput for Android](https://funput.app/android/): Vietnamese keyboard for phones and tablets; Google Play package app.funput.funput.
+- [Introducing Funput](https://funput.app/blog/funput-la-gi/): Vietnamese introduction to Funput, Telex/VNI, supported devices and official downloads.
+- [Telex, VNI and advanced Telex](https://funput.app/blog/telex-vni-va-telex-nang-cao/): Vietnamese typing guide with key mappings, examples and Funput advanced Telex shortcuts.
+- [Set up Funput on iPhone and iPad](https://funput.app/blog/cach-bat-ban-phim-funput-iphone-ipad/): Illustrated keyboard setup, Full Access explanation and troubleshooting.
+- [Install Funput on Windows](https://funput.app/blog/cai-funput-windows-10-11/): Windows 10/11 portable setup, typing methods, system tray, troubleshooting and updates.
+- [Blog](https://funput.app/blog/): Published updates from Funput.
+- [Sitemap](https://funput.app/sitemap-index.xml): Index of public website pages.
+
## Links
- Website: https://funput.app
-- Privacy: https://funput.app/privacy
+- Privacy: https://funput.app/privacy/
- Documentation: https://docs.funput.app/
- Download (desktop): https://github.com/Funput/Funput/releases
- App Store (iOS): https://apps.apple.com/vn/app/id6788829996
diff --git a/public/robots.txt b/public/robots.txt
index f297294..aad48f5 100644
--- a/public/robots.txt
+++ b/public/robots.txt
@@ -4,4 +4,4 @@ Allow: /
# LLM / AI crawlers — plain-text product summary
# https://funput.app/llms.txt
-Sitemap: https://funput.app/sitemap.xml
+Sitemap: https://funput.app/sitemap-index.xml
diff --git a/public/sitemap.xml b/public/sitemap.xml
deleted file mode 100644
index c253e65..0000000
--- a/public/sitemap.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- https://funput.app/
- 2026-09-08
- weekly
- 1.0
-
-
- https://funput.app/privacy
- 2026-08-29
- yearly
- 0.4
-
-
- https://docs.funput.app/
- 2026-08-29
- weekly
- 0.9
-
-
diff --git a/scripts/check_seo.py b/scripts/check_seo.py
new file mode 100644
index 0000000..acd9642
--- /dev/null
+++ b/scripts/check_seo.py
@@ -0,0 +1,165 @@
+"""Validate the generated site, not just the source templates. No dependencies."""
+import json
+from html.parser import HTMLParser
+from pathlib import Path
+from urllib.parse import unquote, urlsplit
+import xml.etree.ElementTree as ET
+
+ROOT = Path(__file__).resolve().parents[1]
+DIST = ROOT / "dist"
+SITE = "https://funput.app"
+
+
+class Page(HTMLParser):
+ def __init__(self, path):
+ super().__init__()
+ self.path = path
+ self.meta = {}
+ self.canonicals = []
+ self.links = []
+ self.ids = set()
+ self.h1 = 0
+ self.titles = []
+ self.schemas = []
+ self.lang = None
+ self.capture = None
+ self.buffer = ""
+ self.feed(path.read_text())
+
+ def handle_starttag(self, tag, attrs):
+ attrs = dict(attrs)
+ if "id" in attrs:
+ self.ids.add(attrs["id"])
+ if tag == "html":
+ self.lang = attrs.get("lang")
+ if tag == "h1":
+ self.h1 += 1
+ if tag == "meta":
+ key = attrs.get("name", attrs.get("property"))
+ if key:
+ assert key not in self.meta, f"Duplicate meta {key}: {self.path}"
+ self.meta[key] = attrs.get("content", "")
+ if tag == "link" and attrs.get("rel") == "canonical":
+ self.canonicals.append(attrs.get("href"))
+ if tag == "a" and attrs.get("href"):
+ self.links.append(attrs["href"])
+ if tag == "title" or (tag == "script" and attrs.get("type") == "application/ld+json"):
+ self.capture = tag
+ self.buffer = ""
+
+ def handle_data(self, data):
+ if self.capture:
+ self.buffer += data
+
+ def handle_endtag(self, tag):
+ if tag == self.capture:
+ if tag == "title":
+ self.titles.append(self.buffer)
+ else:
+ self.schemas.extend(json.loads(self.buffer)["@graph"])
+ self.capture = None
+
+
+assert DIST.exists(), "Run pnpm build first"
+pages = {}
+for path in DIST.rglob("*.html"):
+ relative = path.relative_to(DIST).as_posix()
+ route = "/" + relative.removesuffix("index.html") if relative.endswith("index.html") else "/" + relative
+ pages[route] = Page(path)
+
+index = ET.parse(DIST / "sitemap-index.xml")
+ns = {"s": "http://www.sitemaps.org/schemas/sitemap/0.9"}
+sitemap_urls = set()
+for loc in index.findall(".//s:loc", ns):
+ tree = ET.parse(DIST / urlsplit(loc.text).path.lstrip("/"))
+ sitemap_urls.update(item.text for item in tree.findall(".//s:loc", ns))
+
+titles = set()
+for route, page in pages.items():
+ assert page.lang == "vi", f"Missing Vietnamese lang: {route}"
+ assert page.h1 == 1, f"Expected one h1: {route}"
+ assert len(page.titles) == 1 and page.titles[0], f"Missing/duplicate title: {route}"
+ assert page.titles[0] not in titles, f"Duplicate title across pages: {route}"
+ titles.add(page.titles[0])
+ assert page.meta.get("description"), f"Missing description: {route}"
+ if route == "/404.html":
+ assert "noindex" in page.meta["robots"]
+ assert not page.canonicals
+ assert SITE + route not in sitemap_urls
+ continue
+ expected = SITE + route
+ assert page.canonicals == [expected], f"Canonical mismatch: {route} {page.canonicals}"
+ assert expected in sitemap_urls, f"Not in sitemap: {route}"
+ assert "noindex" not in page.meta["robots"], f"Accidental noindex: {route}"
+ assert page.meta["og:url"] == expected
+ assert page.meta["og:title"] == page.titles[0]
+ assert page.meta["twitter:card"] == "summary_large_image"
+ assert page.meta.get("og:image:alt") and page.meta.get("twitter:image:alt")
+ image = urlsplit(page.meta["og:image"])
+ if image.netloc == "funput.app":
+ assert (DIST / image.path.lstrip("/")).is_file(), f"Missing OG image: {route}"
+ assert any(node["@type"] in ("WebPage", "CollectionPage") for node in page.schemas)
+ for href in page.links:
+ url = urlsplit(href)
+ if url.scheme in ("mailto", "tel") or (url.netloc and url.netloc != "funput.app"):
+ continue
+ target = url.path or route
+ # Public navigation uses root-relative paths.
+ assert target.startswith("/"), f"Unexpected relative link: {route} {href}"
+ target = target if target in pages else target.rstrip("/") + "/"
+ assert target in pages, f"Broken internal link: {route} -> {href}"
+ if url.fragment:
+ assert unquote(url.fragment) in pages[target].ids, f"Broken anchor: {route} -> {href}"
+
+# Published articles must be discoverable and have complete article metadata.
+for route, page in pages.items():
+ if route.startswith("/blog/") and route != "/blog/":
+ article = next(node for node in page.schemas if node["@type"] == "BlogPosting")
+ assert article["mainEntityOfPage"]["@id"] == SITE + route + "#webpage"
+ assert article["datePublished"] == page.meta["article:published_time"]
+ assert article["headline"] and article["author"]["name"] == "Funput"
+ assert page.meta["og:type"] == "article"
+ assert route in pages["/blog/"].links
+
+assert sitemap_urls == {SITE + route for route in pages if route != "/404.html"}
+robots = (DIST / "robots.txt").read_text()
+assert "User-agent: *\nAllow: /" in robots
+assert f"Sitemap: {SITE}/sitemap-index.xml" in robots
+assert "Disallow: /" not in robots
+stores = {"ios": "https://apps.apple.com/vn/app/id6788829996", "android": "https://play.google.com/store/apps/details?id=app.funput.funput"}
+for platform, store in stores.items():
+ page = pages[f"/{platform}/"]
+ app = next(node for node in page.schemas if node["@type"] == "MobileApplication")
+ assert app["downloadUrl"] == app["installUrl"] == store
+ assert app["offers"]["url"] == store
+ assert store in page.links
+ assert app["@id"] == f"{SITE}/{platform}/#app"
+ home_app = next(node for node in pages["/"].schemas if node.get("@id") == app["@id"])
+ assert home_app == app, f"App identity differs across pages: {platform}"
+ assert f"/{platform}/" in pages["/"].links
+ assert f"{SITE}/{platform}/" in (DIST / "llms.txt").read_text()
+for platform in ("macos", "windows", "linux", "ios", "android"):
+ page = pages[f"/{platform}/"]
+ app_id = f"{SITE}/{platform}/#app"
+ app = next(node for node in page.schemas if node.get("@id") == app_id)
+ assert app == next(node for node in pages["/"].schemas if node.get("@id") == app_id)
+ webpage = next(node for node in page.schemas if node["@type"] == "WebPage")
+ assert webpage["mainEntity"]["@id"] == app_id
+ assert app["url"] == SITE + f"/{platform}/"
+ assert (DIST / urlsplit(app["screenshot"]).path.lstrip("/")).is_file()
+ assert f"/{platform}/" in pages["/"].links
+ assert f"{SITE}/{platform}/" in (DIST / "llms.txt").read_text()
+ for other in ("macos", "windows", "linux", "ios", "android"):
+ if other != platform:
+ assert f"/{other}/" in page.links
+ if platform not in stores:
+ assert app["@type"] == "SoftwareApplication"
+ assert app["softwareRequirements"] and app["operatingSystem"]
+ assert app["installUrl"] in page.links
+ assert app["downloadUrl"] in page.links
+ assert app["offers"]["price"] == "0"
+assert len({pages[f"/{p}/"].meta["description"] for p in ("macos", "windows", "linux", "ios", "android")}) == 5
+assert pages["/ios/"].meta["apple-itunes-app"] == "app-id=6788829996"
+assert not any(node["@type"] == "FAQPage" for page in pages.values() for node in page.schemas)
+assert not any("welcome" in url or "design-verification" in url for url in sitemap_urls)
+print(f"SEO OK: {len(pages)} HTML pages, {len(sitemap_urls)} sitemap URLs; canonical, metadata, JSON-LD, internal links, app stores and robots verified.")
diff --git a/src/app/app.config.server.ts b/src/app/app.config.server.ts
deleted file mode 100644
index 41031f1..0000000
--- a/src/app/app.config.server.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { mergeApplicationConfig, ApplicationConfig } from '@angular/core';
-import { provideServerRendering, withRoutes } from '@angular/ssr';
-import { appConfig } from './app.config';
-import { serverRoutes } from './app.routes.server';
-
-const serverConfig: ApplicationConfig = {
- providers: [
- provideServerRendering(withRoutes(serverRoutes))
- ]
-};
-
-export const config = mergeApplicationConfig(appConfig, serverConfig);
diff --git a/src/app/app.config.ts b/src/app/app.config.ts
deleted file mode 100644
index c4b0bdb..0000000
--- a/src/app/app.config.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { ApplicationConfig, provideBrowserGlobalErrorListeners } from '@angular/core';
-import { provideRouter } from '@angular/router';
-
-import { routes } from './app.routes';
-import { provideClientHydration } from '@angular/platform-browser';
-
-export const appConfig: ApplicationConfig = {
- providers: [
- provideBrowserGlobalErrorListeners(),
- provideRouter(routes),
- provideClientHydration(),
- ],
-};
diff --git a/src/app/app.html b/src/app/app.html
deleted file mode 100644
index dfe301d..0000000
--- a/src/app/app.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
diff --git a/src/app/app.routes.server.ts b/src/app/app.routes.server.ts
deleted file mode 100644
index ffd37b1..0000000
--- a/src/app/app.routes.server.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { RenderMode, ServerRoute } from '@angular/ssr';
-
-export const serverRoutes: ServerRoute[] = [
- {
- path: '**',
- renderMode: RenderMode.Prerender
- }
-];
diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts
deleted file mode 100644
index c35be21..0000000
--- a/src/app/app.routes.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { Routes } from '@angular/router';
-
-export const routes: Routes = [
- {
- path: '',
- loadComponent: () => import('./components/home/home').then((m) => m.HomeComponent),
- title: 'Funput — Bộ gõ tiếng Việt cho iOS, Android, macOS, Windows và Linux',
- },
- {
- path: 'privacy',
- loadComponent: () =>
- import('./components/privacy/privacy').then((m) => m.PrivacyComponent),
- title: 'Chính sách quyền riêng tư | Funput',
- },
- {
- path: '**',
- redirectTo: '',
- },
-];
diff --git a/src/app/app.spec.ts b/src/app/app.spec.ts
deleted file mode 100644
index 7694444..0000000
--- a/src/app/app.spec.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import { TestBed } from '@angular/core/testing';
-import { provideRouter } from '@angular/router';
-import { App } from './app';
-import { routes } from './app.routes';
-
-describe('App', () => {
- beforeEach(async () => {
- await TestBed.configureTestingModule({
- imports: [App],
- providers: [provideRouter(routes)],
- }).compileComponents();
- });
-
- it('should create the app', () => {
- const fixture = TestBed.createComponent(App);
- const app = fixture.componentInstance;
- expect(app).toBeTruthy();
- });
-});
diff --git a/src/app/app.ts b/src/app/app.ts
deleted file mode 100644
index 1b889c0..0000000
--- a/src/app/app.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Component } from '@angular/core';
-import { RouterOutlet } from '@angular/router';
-import { HeaderComponent } from './components/header/header';
-import { FooterComponent } from './components/footer/footer';
-import { MobileNavComponent } from './components/mobile-nav/mobile-nav';
-
-@Component({
- selector: 'app-root',
- imports: [RouterOutlet, HeaderComponent, FooterComponent, MobileNavComponent],
- templateUrl: './app.html',
-})
-export class App {}
diff --git a/src/app/components/footer/footer.css b/src/app/components/footer/footer.css
deleted file mode 100644
index e69de29..0000000
diff --git a/src/app/components/footer/footer.html b/src/app/components/footer/footer.html
deleted file mode 100644
index 3bf8bde..0000000
--- a/src/app/components/footer/footer.html
+++ /dev/null
@@ -1,94 +0,0 @@
-
-
-
-
-
-
-
-
-
- Bộ gõ tiếng Việt mã nguồn mở cho máy tính và điện thoại. Nhẹ, miễn phí, dùng được trên iOS, Android, macOS, Windows và Linux.
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/app/components/footer/footer.ts b/src/app/components/footer/footer.ts
deleted file mode 100644
index 003577e..0000000
--- a/src/app/components/footer/footer.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-import { NgOptimizedImage } from '@angular/common';
-import { Component } from '@angular/core';
-import { RouterLink } from '@angular/router';
-import { FUNPUT_CONSTANTS } from '../../constants';
-
-interface FooterLink {
- label: string;
- href?: string;
- external?: boolean;
- routerLink?: string;
-}
-
-@Component({
- selector: 'app-footer',
- imports: [NgOptimizedImage, RouterLink],
- templateUrl: './footer.html',
-})
-export class FooterComponent {
- protected readonly constants = FUNPUT_CONSTANTS;
- protected readonly contactEmail = FUNPUT_CONSTANTS.CONTACT_EMAIL;
- protected readonly contactMailto = `mailto:${FUNPUT_CONSTANTS.CONTACT_EMAIL}`;
- protected readonly currentYear = new Date().getFullYear();
-
- protected readonly productLinks: FooterLink[] = [
- { label: 'Nền tảng', href: '/#platforms' },
- { label: 'Tải xuống', href: FUNPUT_CONSTANTS.RELEASES_URL, external: true },
- { label: 'Tài liệu', href: FUNPUT_CONSTANTS.DOCS_URL, external: true },
- {
- label: 'Hướng dẫn cài đặt',
- href: FUNPUT_CONSTANTS.INSTALL_DOCS_URL,
- external: true,
- },
- ];
-
- protected readonly communityLinks: FooterLink[] = [
- { label: 'GitHub', href: FUNPUT_CONSTANTS.GITHUB_URL, external: true },
- { label: 'Facebook', href: FUNPUT_CONSTANTS.FACEBOOK_URL, external: true },
- { label: 'Liên hệ', href: `mailto:${FUNPUT_CONSTANTS.CONTACT_EMAIL}` },
- ];
-
- protected readonly legalLinks: FooterLink[] = [
- { label: 'Quyền riêng tư', routerLink: '/privacy' },
- {
- label: 'Giấy phép MIT',
- href: `${FUNPUT_CONSTANTS.GITHUB_URL}/blob/main/LICENSE`,
- external: true,
- },
- ];
-}
diff --git a/src/app/components/header/header.css b/src/app/components/header/header.css
deleted file mode 100644
index e69de29..0000000
diff --git a/src/app/components/header/header.html b/src/app/components/header/header.html
deleted file mode 100644
index d092625..0000000
--- a/src/app/components/header/header.html
+++ /dev/null
@@ -1,39 +0,0 @@
-
diff --git a/src/app/components/header/header.ts b/src/app/components/header/header.ts
deleted file mode 100644
index 916ed4d..0000000
--- a/src/app/components/header/header.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { NgOptimizedImage } from '@angular/common';
-import { Component } from '@angular/core';
-import { RouterLink } from '@angular/router';
-import { FUNPUT_CONSTANTS } from '../../constants';
-
-interface HeaderLink {
- label: string;
- href: string;
- external?: boolean;
-}
-
-@Component({
- selector: 'app-header',
- imports: [NgOptimizedImage, RouterLink],
- templateUrl: './header.html',
-})
-export class HeaderComponent {
- protected readonly constants = FUNPUT_CONSTANTS;
-
- protected readonly navLinks: HeaderLink[] = [
- { label: 'Nền tảng', href: '/#platforms' },
- { label: 'Tài liệu', href: FUNPUT_CONSTANTS.DOCS_URL, external: true },
- { label: 'GitHub', href: FUNPUT_CONSTANTS.GITHUB_URL, external: true },
- ];
-}
diff --git a/src/app/components/hero/hero.css b/src/app/components/hero/hero.css
deleted file mode 100644
index 1a7d666..0000000
--- a/src/app/components/hero/hero.css
+++ /dev/null
@@ -1,388 +0,0 @@
-.logo-prism {
- container-type: inline-size;
- perspective: 1100px;
- perspective-origin: 50% 42%;
-}
-
-.prism-scene {
- position: relative;
- width: 100%;
- height: 100%;
- transform-style: preserve-3d;
-}
-
-.prism-ambient {
- animation: prism-ambient-pulse 5s ease-in-out infinite;
-}
-
-.prism-floor {
- position: absolute;
- bottom: 6%;
- left: 8%;
- right: 8%;
- height: 42%;
- transform: rotateX(78deg);
- transform-origin: bottom center;
- background:
- linear-gradient(to bottom, transparent, rgba(249, 115, 22, 0.07)),
- repeating-linear-gradient(
- 90deg,
- rgba(255, 255, 255, 0.03) 0,
- rgba(255, 255, 255, 0.03) 1px,
- transparent 1px,
- transparent 36px
- ),
- repeating-linear-gradient(
- 0deg,
- rgba(255, 255, 255, 0.025) 0,
- rgba(255, 255, 255, 0.025) 1px,
- transparent 1px,
- transparent 36px
- );
- mask-image: radial-gradient(ellipse 70% 55% at 50% 100%, black 15%, transparent 72%);
- -webkit-mask-image: radial-gradient(ellipse 70% 55% at 50% 100%, black 15%, transparent 72%);
- opacity: 0.7;
- pointer-events: none;
-}
-
-.prism-orbit {
- position: absolute;
- border-radius: 50%;
- border: 1px solid;
- transform-style: preserve-3d;
- pointer-events: none;
-}
-
-.prism-orbit--1 {
- inset: 10%;
- border-color: rgba(249, 115, 22, 0.4);
- box-shadow: 0 0 24px rgba(249, 115, 22, 0.12);
- transform: rotateX(74deg);
- animation: prism-orbit-spin-1 14s linear infinite;
-}
-
-.prism-orbit--2 {
- inset: 4%;
- border-color: rgba(236, 72, 153, 0.28);
- box-shadow: 0 0 20px rgba(236, 72, 153, 0.1);
- transform: rotateX(68deg) rotateY(38deg);
- animation: prism-orbit-spin-2 18s linear infinite reverse;
-}
-
-.prism-orbit--3 {
- inset: 16%;
- border-color: rgba(56, 189, 248, 0.22);
- box-shadow: 0 0 16px rgba(56, 189, 248, 0.08);
- transform: rotateY(76deg) rotateX(18deg);
- animation: prism-orbit-spin-3 22s linear infinite;
-}
-
-.prism-rig {
- position: absolute;
- inset: 0;
- transform-style: preserve-3d;
- animation: prism-rig-float 9s ease-in-out infinite;
-}
-
-.prism-tilt {
- position: absolute;
- inset: 0;
- transform-style: preserve-3d;
- transition: transform 0.45s cubic-bezier(0.22, 1, 0.36, 1);
-}
-
-.prism-shadow {
- position: absolute;
- inset: 0;
- transform: translateZ(-48px) translateY(28px) scale(0.94);
- opacity: 0.45;
- filter: blur(18px) brightness(0.35);
- pointer-events: none;
-}
-
-.prism-logo {
- position: relative;
- z-index: 2;
- transform: translateZ(36px);
- filter:
- drop-shadow(0 28px 42px rgba(249, 115, 22, 0.22))
- drop-shadow(0 12px 28px rgba(168, 85, 247, 0.18))
- drop-shadow(0 4px 12px rgba(0, 0, 0, 0.45));
-}
-
-.prism-shimmer {
- mix-blend-mode: soft-light;
- animation: prism-shimmer-sweep 4.5s ease-in-out infinite;
-}
-
-.spine-glow {
- animation: spine-energy-pulse 3.2s ease-in-out infinite;
-}
-
-.ribbon-glow--top {
- animation: ribbon-breathe-top 5.5s ease-in-out infinite;
-}
-
-.ribbon-glow--middle {
- animation: ribbon-breathe-middle 6.2s ease-in-out infinite;
-}
-
-.ribbon-glow--bottom {
- animation: ribbon-breathe-bottom 5.8s ease-in-out infinite;
-}
-
-.prism-particles {
- position: absolute;
- inset: 0;
- transform-style: preserve-3d;
- pointer-events: none;
-}
-
-.prism-particle {
- --orbit-radius: min(42cqi, 190px);
- position: absolute;
- top: 46%;
- left: 50%;
- width: 5px;
- height: 5px;
- margin: -2.5px 0 0 -2.5px;
- border-radius: 50%;
- transform-style: preserve-3d;
- animation: prism-particle-orbit 11s linear infinite;
- animation-delay: calc(var(--i) * -1.375s);
-}
-
-.prism-particle:nth-child(odd) {
- background: radial-gradient(circle, #ffa43f 0%, transparent 70%);
- box-shadow: 0 0 10px rgba(255, 164, 63, 0.8);
-}
-
-.prism-particle:nth-child(even) {
- background: radial-gradient(circle, #d92bff 0%, transparent 70%);
- box-shadow: 0 0 10px rgba(217, 43, 255, 0.7);
-}
-
-.prism-particle:nth-child(3n) {
- width: 4px;
- height: 4px;
- margin: -2px 0 0 -2px;
- background: radial-gradient(circle, #38bdf8 0%, transparent 70%);
- box-shadow: 0 0 8px rgba(56, 189, 248, 0.75);
-}
-
-@keyframes prism-ambient-pulse {
- 0%,
- 100% {
- opacity: 0.5;
- transform: scale(0.96);
- }
- 50% {
- opacity: 0.9;
- transform: scale(1.04);
- }
-}
-
-@keyframes prism-orbit-spin-1 {
- from {
- transform: rotateX(74deg) rotateZ(0deg);
- }
- to {
- transform: rotateX(74deg) rotateZ(360deg);
- }
-}
-
-@keyframes prism-orbit-spin-2 {
- from {
- transform: rotateX(68deg) rotateY(38deg) rotateZ(0deg);
- }
- to {
- transform: rotateX(68deg) rotateY(38deg) rotateZ(360deg);
- }
-}
-
-@keyframes prism-orbit-spin-3 {
- from {
- transform: rotateY(76deg) rotateX(18deg) rotateZ(0deg);
- }
- to {
- transform: rotateY(76deg) rotateX(18deg) rotateZ(360deg);
- }
-}
-
-@keyframes prism-rig-float {
- 0%,
- 100% {
- transform: translateY(0) rotateX(5deg) rotateY(-7deg);
- }
- 50% {
- transform: translateY(-14px) rotateX(-4deg) rotateY(9deg);
- }
-}
-
-@keyframes prism-shimmer-sweep {
- 0%,
- 100% {
- transform: translateX(-120%) skewX(-12deg);
- opacity: 0;
- }
- 15% {
- opacity: 0.7;
- }
- 50% {
- transform: translateX(120%) skewX(-12deg);
- opacity: 0.85;
- }
- 85% {
- opacity: 0;
- }
-}
-
-@keyframes spine-energy-pulse {
- 0%,
- 100% {
- opacity: 0.25;
- stroke-width: 6;
- }
- 50% {
- opacity: 0.85;
- stroke-width: 10;
- }
-}
-
-@keyframes ribbon-breathe-top {
- 0%,
- 100% {
- opacity: 0;
- transform: translate(0, 0);
- }
- 50% {
- opacity: 0.35;
- transform: translate(4px, -3px);
- }
-}
-
-@keyframes ribbon-breathe-middle {
- 0%,
- 100% {
- opacity: 0;
- transform: translate(0, 0);
- }
- 50% {
- opacity: 0.3;
- transform: translate(6px, 0);
- }
-}
-
-@keyframes ribbon-breathe-bottom {
- 0%,
- 100% {
- opacity: 0;
- transform: translate(0, 0);
- }
- 50% {
- opacity: 0.28;
- transform: translate(3px, 4px);
- }
-}
-
-@keyframes prism-particle-orbit {
- 0% {
- transform: rotateY(0deg) translateZ(var(--orbit-radius)) rotateY(0deg) scale(1);
- opacity: 0.2;
- }
- 25% {
- opacity: 1;
- }
- 50% {
- transform: rotateY(180deg) translateZ(var(--orbit-radius)) rotateY(-180deg) scale(0.6);
- opacity: 0.35;
- }
- 75% {
- opacity: 0.9;
- }
- 100% {
- transform: rotateY(360deg) translateZ(var(--orbit-radius)) rotateY(-360deg) scale(1);
- opacity: 0.2;
- }
-}
-
-/* Mobile / narrow viewports: drop GPU-heavy layers; keep a static branded mark. */
-@media (max-width: 1023px) {
- .logo-prism {
- perspective: none;
- }
-
- .prism-scene,
- .prism-rig,
- .prism-tilt {
- transform-style: flat;
- }
-
- .prism-floor,
- .prism-orbit,
- .prism-particles,
- .prism-shadow,
- .ribbon-glow,
- .spine-glow,
- .prism-shimmer {
- display: none !important;
- }
-
- .prism-ambient,
- .prism-orbit,
- .prism-rig,
- .prism-shimmer,
- .spine-glow,
- .ribbon-glow--top,
- .ribbon-glow--middle,
- .ribbon-glow--bottom,
- .prism-particle {
- animation: none !important;
- }
-
- .prism-ambient {
- opacity: 0.65;
- filter: blur(40px);
- }
-
- .prism-tilt {
- transition: none;
- transform: none !important;
- }
-
- .prism-rig {
- transform: none;
- }
-
- .prism-logo {
- transform: none;
- filter: drop-shadow(0 16px 28px rgba(249, 115, 22, 0.2))
- drop-shadow(0 6px 16px rgba(168, 85, 247, 0.14));
- }
-}
-
-@media (prefers-reduced-motion: reduce) {
- .prism-ambient,
- .prism-orbit,
- .prism-rig,
- .prism-shimmer,
- .spine-glow,
- .ribbon-glow--top,
- .ribbon-glow--middle,
- .ribbon-glow--bottom,
- .prism-particle {
- animation: none !important;
- }
-
- .prism-tilt {
- transition: none;
- }
-
- .prism-rig {
- transform: rotateX(4deg) rotateY(-5deg);
- }
-
- .spine-glow {
- opacity: 0.5;
- }
-}
diff --git a/src/app/components/hero/hero.html b/src/app/components/hero/hero.html
deleted file mode 100644
index c0f9b47..0000000
--- a/src/app/components/hero/hero.html
+++ /dev/null
@@ -1,208 +0,0 @@
-
-
-
-
-
-
-
-
-
- Bộ gõ tiếng Việt mã nguồn mở — nhẹ, an toàn, thiết kế riêng cho từng hệ điều hành. Gõ Telex hoặc VNI trên máy Mac, Windows, Linux, iPhone, iPad và Android.
-
-
-
-
-
-
-
-
-
-
-
-
-
- @if (showEffects()) {
-
-
-
-
-
-
-
- @for (i of particles; track i) {
-
- }
-
-
-
-
-
-
-
-
-
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- @if (showEffects()) {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- }
-
-
- @if (showEffects()) {
-
-
-
-
- }
-
-
-
-
-
-
-
- @if (showEffects()) {
-
-
-
-
-
- }
-
-
-
-
-
-
-
-
diff --git a/src/app/components/hero/hero.ts b/src/app/components/hero/hero.ts
deleted file mode 100644
index 0fcbd29..0000000
--- a/src/app/components/hero/hero.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-import { NgOptimizedImage } from '@angular/common';
-import { afterNextRender, Component, DestroyRef, inject, signal } from '@angular/core';
-import { FUNPUT_CONSTANTS } from '../../constants';
-
-@Component({
- selector: 'app-hero',
- imports: [NgOptimizedImage],
- templateUrl: './hero.html',
- styleUrl: './hero.css',
-})
-export class HeroComponent {
- private readonly destroyRef = inject(DestroyRef);
-
- protected readonly constants = FUNPUT_CONSTANTS;
- protected readonly particles = [0, 1, 2, 3, 4, 5, 6, 7];
-
- /** Full prism effects mount only on capable desktop viewports. */
- protected readonly showEffects = signal(false);
- private readonly tiltEnabled = signal(false);
- protected readonly tilt = signal({ x: 0, y: 0 });
-
- constructor() {
- afterNextRender(() => {
- const effectsQuery = window.matchMedia(
- '(min-width: 1024px) and (prefers-reduced-motion: no-preference)',
- );
- const tiltQuery = window.matchMedia('(hover: hover) and (pointer: fine)');
-
- const syncCapabilities = () => {
- const effectsOn = effectsQuery.matches;
- this.showEffects.set(effectsOn);
- this.tiltEnabled.set(effectsOn && tiltQuery.matches);
- if (!this.tiltEnabled()) {
- this.tilt.set({ x: 0, y: 0 });
- }
- };
-
- syncCapabilities();
- effectsQuery.addEventListener('change', syncCapabilities);
- tiltQuery.addEventListener('change', syncCapabilities);
-
- this.destroyRef.onDestroy(() => {
- effectsQuery.removeEventListener('change', syncCapabilities);
- tiltQuery.removeEventListener('change', syncCapabilities);
- });
- });
- }
-
- protected onPointerMove(event: PointerEvent): void {
- if (!this.tiltEnabled()) {
- return;
- }
-
- const target = event.currentTarget as HTMLElement;
- const rect = target.getBoundingClientRect();
- const px = (event.clientX - rect.left) / rect.width - 0.5;
- const py = (event.clientY - rect.top) / rect.height - 0.5;
- this.tilt.set({ x: py * -14, y: px * 16 });
- }
-
- protected onPointerLeave(): void {
- this.tilt.set({ x: 0, y: 0 });
- }
-
- protected rigTransform(): string {
- const { x, y } = this.tilt();
- return `rotateX(${x}deg) rotateY(${y}deg)`;
- }
-}
diff --git a/src/app/components/home/home.css b/src/app/components/home/home.css
deleted file mode 100644
index e69de29..0000000
diff --git a/src/app/components/home/home.html b/src/app/components/home/home.html
deleted file mode 100644
index 3d79e87..0000000
--- a/src/app/components/home/home.html
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/src/app/components/home/home.ts b/src/app/components/home/home.ts
deleted file mode 100644
index 734f4f1..0000000
--- a/src/app/components/home/home.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { Component } from '@angular/core';
-import { HeroComponent } from '../hero/hero';
-import { PlatformsComponent } from '../platforms/platforms';
-
-@Component({
- selector: 'app-home',
- imports: [HeroComponent, PlatformsComponent],
- templateUrl: './home.html',
- styleUrl: './home.css',
-})
-export class HomeComponent {}
diff --git a/src/app/components/mobile-nav/mobile-nav.css b/src/app/components/mobile-nav/mobile-nav.css
deleted file mode 100644
index d03eee9..0000000
--- a/src/app/components/mobile-nav/mobile-nav.css
+++ /dev/null
@@ -1,71 +0,0 @@
-.mobile-nav {
- padding-bottom: env(safe-area-inset-bottom, 0px);
- pointer-events: none;
-}
-
-.mobile-nav__bar {
- pointer-events: auto;
- min-height: 3.75rem;
- border-top: 1px solid color-mix(in oklab, var(--color-brand-dark-800) 90%, white 10%);
- background: color-mix(in oklab, var(--color-brand-dark-950) 88%, transparent);
- backdrop-filter: blur(16px);
- -webkit-backdrop-filter: blur(16px);
- box-shadow: 0 -8px 24px rgb(0 0 0 / 0.28);
-}
-
-.mobile-nav__item {
- display: flex;
- min-width: 0;
- flex: 1;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- gap: 0.2rem;
- padding: 0.55rem 0.35rem 0.45rem;
- color: #a1a1aa;
- text-decoration: none;
- transition:
- color 160ms ease,
- transform 160ms ease;
- -webkit-tap-highlight-color: transparent;
-}
-
-.mobile-nav__item:hover,
-.mobile-nav__item:focus-visible {
- color: #fff;
- outline: none;
-}
-
-.mobile-nav__item:focus-visible {
- box-shadow: inset 0 0 0 2px color-mix(in oklab, var(--color-brand-orange-500) 70%, transparent);
-}
-
-.mobile-nav__item:active {
- transform: scale(0.96);
-}
-
-.mobile-nav__item--primary {
- color: var(--color-brand-orange-500);
-}
-
-.mobile-nav__item--primary:hover,
-.mobile-nav__item--primary:focus-visible {
- color: #fdba74;
-}
-
-.mobile-nav__icon {
- width: 1.35rem;
- height: 1.35rem;
- flex-shrink: 0;
-}
-
-.mobile-nav__label {
- max-width: 100%;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- font-size: 0.6875rem;
- font-weight: 600;
- letter-spacing: 0.01em;
- line-height: 1.1;
-}
diff --git a/src/app/components/mobile-nav/mobile-nav.html b/src/app/components/mobile-nav/mobile-nav.html
deleted file mode 100644
index e383f6a..0000000
--- a/src/app/components/mobile-nav/mobile-nav.html
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
diff --git a/src/app/components/mobile-nav/mobile-nav.ts b/src/app/components/mobile-nav/mobile-nav.ts
deleted file mode 100644
index 1732460..0000000
--- a/src/app/components/mobile-nav/mobile-nav.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import { Component } from '@angular/core';
-import { FUNPUT_CONSTANTS } from '../../constants';
-
-interface MobileNavItem {
- label: string;
- href: string;
- external?: boolean;
- /** Highlights the primary download action. */
- primary?: boolean;
- icon: 'platforms' | 'download' | 'install' | 'github';
-}
-
-@Component({
- selector: 'app-mobile-nav',
- templateUrl: './mobile-nav.html',
- styleUrl: './mobile-nav.css',
-})
-export class MobileNavComponent {
- /** Platforms + hero CTAs + GitHub (avoids overlapping docs entries). */
- protected readonly items: MobileNavItem[] = [
- { label: 'Nền tảng', href: '/#platforms', icon: 'platforms' },
- {
- label: 'Tải xuống',
- href: FUNPUT_CONSTANTS.RELEASES_URL,
- external: true,
- primary: true,
- icon: 'download',
- },
- {
- label: 'Cài đặt',
- href: FUNPUT_CONSTANTS.INSTALL_DOCS_URL,
- external: true,
- icon: 'install',
- },
- {
- label: 'GitHub',
- href: FUNPUT_CONSTANTS.GITHUB_URL,
- external: true,
- icon: 'github',
- },
- ];
-}
diff --git a/src/app/components/platforms/platforms.css b/src/app/components/platforms/platforms.css
deleted file mode 100644
index e69de29..0000000
diff --git a/src/app/components/platforms/platforms.html b/src/app/components/platforms/platforms.html
deleted file mode 100644
index 3d78026..0000000
--- a/src/app/components/platforms/platforms.html
+++ /dev/null
@@ -1,300 +0,0 @@
-
diff --git a/src/app/components/platforms/platforms.ts b/src/app/components/platforms/platforms.ts
deleted file mode 100644
index 801ef4a..0000000
--- a/src/app/components/platforms/platforms.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { NgOptimizedImage } from '@angular/common';
-import { Component } from '@angular/core';
-import { FUNPUT_CONSTANTS } from '../../constants';
-
-@Component({
- selector: 'app-platforms',
- imports: [NgOptimizedImage],
- templateUrl: './platforms.html',
-})
-export class PlatformsComponent {
- protected readonly constants = FUNPUT_CONSTANTS;
-}
diff --git a/src/app/components/privacy/privacy.css b/src/app/components/privacy/privacy.css
deleted file mode 100644
index e69de29..0000000
diff --git a/src/app/components/privacy/privacy.html b/src/app/components/privacy/privacy.html
deleted file mode 100644
index 25aead9..0000000
--- a/src/app/components/privacy/privacy.html
+++ /dev/null
@@ -1,185 +0,0 @@
-
-
- Pháp lý
-
-
- Cập nhật lần cuối: {{ lastUpdated }}
-
-
- Chính sách này giải thích cách Funput xử lý thông tin khi bạn sử dụng ứng dụng bộ gõ
- Funput và website
- funput.app .
- Funput là phần mềm mã nguồn mở; chúng tôi ưu tiên minh bạch và quyền riêng tư theo thiết kế.
-
-
-
-
-
- 1. Ai chịu trách nhiệm
-
- Funput là bên cung cấp sản phẩm được mô tả trong chính sách này.
- Nếu bạn có câu hỏi về quyền riêng tư, hãy liên hệ
- {{ contactEmail }} .
-
-
-
-
- 2. Phạm vi áp dụng
- Chính sách này áp dụng cho:
-
- Ứng dụng Funput trên macOS, Windows, Linux, Android và iOS
- Website funput.app và các trang liên quan do Funput vận hành trên miền này
-
-
- Tài liệu tại
- docs.funput.app
- và kho mã nguồn trên GitHub có thể có điều khoản riêng của nền tảng lưu trữ tương ứng.
-
-
-
-
- 3. Nguyên tắc quyền riêng tư
-
-
- Mã nguồn mở:
- Funput được phát hành công khai dưới
- giấy phép MIT .
- Bạn có thể tự kiểm tra cách sản phẩm xử lý dữ liệu.
-
-
- Quyền riêng tư theo thiết kế:
- đường xử lý nhập liệu được thiết kế để không gửi nội dung bạn gõ lên máy chủ của Funput.
-
-
- Tối thiểu hóa dữ liệu:
- chúng tôi chỉ xử lý thông tin cần thiết cho mục đích đã nêu trong chính sách này.
-
-
-
-
-
- 4. Những gì Funput không thu thập
- Trong ứng dụng Funput, chúng tôi không:
-
- Thu thập, ghi lại hay gửi nội dung bạn gõ (keylogging)
- Bán dữ liệu người dùng
- Dùng quảng cáo theo dõi trong ứng dụng
- Tích hợp analytics hoặc crash reporting trong ứng dụng
-
-
-
-
- 5. Dữ liệu lưu trên thiết bị
-
- Funput có thể lưu các tùy chọn cấu hình trên thiết bị của bạn (ví dụ kiểu gõ, giao diện,
- hoặc trạng thái thiết lập) để ứng dụng hoạt động đúng như bạn mong muốn.
- Dữ liệu này được lưu cục bộ và không được Funput thu thập về máy chủ của chúng tôi.
-
-
-
-
- 6. Website và Google Analytics
-
- Website funput.app sử dụng Google Analytics để hiểu mức độ sử dụng trang
- (ví dụ số lượt xem, thiết bị, nguồn truy cập ở dạng tổng hợp).
- Google Analytics có thể dùng cookie hoặc mã nhận dạng tương tự do Google cung cấp.
-
-
- Thông tin này giúp chúng tôi cải thiện nội dung và trải nghiệm website.
- Ứng dụng bộ gõ Funput không dùng Google Analytics.
-
-
- Bạn có thể hạn chế cookie qua cài đặt trình duyệt, hoặc dùng các công cụ kiểm soát
- quảng cáo/đo lường do Google và trình duyệt hỗ trợ (nếu có).
-
-
-
-
- 7. Email liên hệ
-
- Nếu bạn gửi email tới
- {{ contactEmail }}
- (ví dụ để hỏi hỗ trợ),
- chúng tôi nhận địa chỉ email và nội dung bạn gửi để phản hồi yêu cầu đó.
-
-
- Chúng tôi không dùng email này cho mục đích quảng cáo bên thứ ba.
- Bạn có thể yêu cầu chúng tôi xóa thông tin liên hệ bằng cách gửi email tới cùng địa chỉ trên.
-
-
-
-
- 8. Dịch vụ bên thứ ba
- Tùy cách bạn dùng Funput, một số nền tảng bên thứ ba có thể xử lý dữ liệu theo chính sách riêng của họ, ví dụ:
-
- Google Analytics trên website funput.app
- GitHub (mã nguồn, bản phát hành, tương tác với kho lưu trữ)
- Apple App Store hoặc Google Play khi bạn tải ứng dụng Funput
- Nhà cung cấp dịch vụ email khi bạn gửi thư tới {{ contactEmail }}
-
- Funput không kiểm soát chính sách quyền riêng tư của các bên thứ ba này.
-
-
-
- 9. Quyền của bạn
- Tùy khu vực của bạn, bạn có thể có quyền yêu cầu:
-
- Được biết chúng tôi xử lý những thông tin nào liên quan đến bạn
- Yêu cầu chỉnh sửa hoặc xóa thông tin liên hệ bạn đã gửi cho chúng tôi
- Rút lại sự đồng ý đối với việc nhận liên hệ tiếp theo (nếu đang áp dụng)
-
-
- Để thực hiện yêu cầu, hãy gửi email tới
- {{ contactEmail }} .
-
-
-
-
- 10. Trẻ em
-
- Funput không hướng tới việc thu thập dữ liệu từ trẻ em một cách có chủ đích.
- Nếu bạn cho rằng chúng tôi đã nhận thông tin liên hệ của trẻ em qua email,
- hãy báo cho chúng tôi để được xem xét và xử lý.
-
-
-
-
- 11. Thay đổi chính sách
-
- Chúng tôi có thể cập nhật chính sách này khi sản phẩm hoặc cách vận hành thay đổi.
- Ngày “Cập nhật lần cuối” ở đầu trang sẽ được điều chỉnh tương ứng.
- Việc tiếp tục sử dụng Funput hoặc website sau khi chính sách được cập nhật
- đồng nghĩa với việc bạn chấp nhận phiên bản mới, trong phạm vi pháp luật cho phép.
-
-
-
-
- 12. Liên hệ
-
- Mọi câu hỏi về chính sách quyền riêng tư, vui lòng gửi tới
- {{ contactEmail }} .
-
-
-
-
-
-
diff --git a/src/app/components/privacy/privacy.ts b/src/app/components/privacy/privacy.ts
deleted file mode 100644
index 3824269..0000000
--- a/src/app/components/privacy/privacy.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import { Component } from '@angular/core';
-import { RouterLink } from '@angular/router';
-import { FUNPUT_CONSTANTS } from '../../constants';
-
-@Component({
- selector: 'app-privacy',
- imports: [RouterLink],
- templateUrl: './privacy.html',
- styleUrl: './privacy.css',
-})
-export class PrivacyComponent {
- protected readonly constants = FUNPUT_CONSTANTS;
- protected readonly contactEmail = FUNPUT_CONSTANTS.CONTACT_EMAIL;
- protected readonly contactMailto = `mailto:${FUNPUT_CONSTANTS.CONTACT_EMAIL}`;
- protected readonly lastUpdated = '19 tháng 7 năm 2026';
-}
diff --git a/src/app/utils/typing-engine.ts b/src/app/utils/typing-engine.ts
deleted file mode 100644
index 584c7bc..0000000
--- a/src/app/utils/typing-engine.ts
+++ /dev/null
@@ -1,296 +0,0 @@
-const VOWELS_MAP: Record = {
- 'a': { 0: 'a', 1: 'á', 2: 'à', 3: 'ả', 4: 'ã', 5: 'ạ' },
- 'ă': { 0: 'ă', 1: 'ắ', 2: 'ằ', 3: 'ẳ', 4: 'ẵ', 5: 'ặ' },
- 'â': { 0: 'â', 1: 'ấ', 2: 'ầ', 3: 'ẩ', 4: 'ẫ', 5: 'ậ' },
- 'e': { 0: 'e', 1: 'é', 2: 'è', 3: 'ẻ', 4: 'ẽ', 5: 'ẹ' },
- 'ê': { 0: 'ê', 1: 'ế', 2: 'ề', 3: 'ể', 4: 'ễ', 5: 'ệ' },
- 'i': { 0: 'i', 1: 'í', 2: 'ì', 3: 'ỉ', 4: 'ĩ', 5: 'ị' },
- 'o': { 0: 'o', 1: 'ó', 2: 'ò', 3: 'ỏ', 4: 'õ', 5: 'ọ' },
- 'ô': { 0: 'ô', 1: 'ố', 2: 'ồ', 3: 'ổ', 4: 'ỗ', 5: 'ộ' },
- 'ơ': { 0: 'ơ', 1: 'ớ', 2: 'ờ', 3: 'ở', 4: 'ỡ', 5: 'ợ' },
- 'u': { 0: 'u', 1: 'ú', 2: 'ù', 3: 'ủ', 4: 'ũ', 5: 'ụ' },
- 'ư': { 0: 'ư', 1: 'ứ', 2: 'ừ', 3: 'ử', 4: 'ữ', 5: 'ự' },
- 'y': { 0: 'y', 1: 'ý', 2: 'ỳ', 3: 'ỷ', 4: 'ỹ', 5: 'ỵ' },
- 'A': { 0: 'A', 1: 'Á', 2: 'À', 3: 'Ả', 4: 'Ã', 5: 'Ạ' },
- 'Ă': { 0: 'Ă', 1: 'Ắ', 2: 'Ằ', 3: 'Ẳ', 4: 'Ẵ', 5: 'Ặ' },
- 'Â': { 0: 'Â', 1: 'Ấ', 2: 'Ầ', 3: 'Ẩ', 4: 'Ẫ', 5: 'Ậ' },
- 'E': { 0: 'E', 1: 'É', 2: 'È', 3: 'Ẻ', 4: 'Ẽ', 5: 'Ẹ' },
- 'Ê': { 0: 'Ê', 1: 'Ế', 2: 'Ề', 3: 'Ể', 4: 'Ễ', 5: 'Ệ' },
- 'I': { 0: 'I', 1: 'Í', 2: 'Ì', 3: 'Ỉ', 4: 'Ĩ', 5: 'Ị' },
- 'O': { 0: 'O', 1: 'Ó', 2: 'Ò', 3: 'Ỏ', 4: 'Õ', 5: 'Ọ' },
- 'Ô': { 0: 'Ô', 1: 'Ố', 2: 'Ồ', 3: 'Ổ', 4: 'Ỗ', 5: 'Ộ' },
- 'Ơ': { 0: 'Ơ', 1: 'Ớ', 2: 'Ờ', 3: 'Ở', 4: 'Ỡ', 5: 'Ợ' },
- 'U': { 0: 'U', 1: 'Ú', 2: 'Ù', 3: 'Ủ', 4: 'Ũ', 5: 'Ụ' },
- 'Ư': { 0: 'Ư', 1: 'Ứ', 2: 'Ừ', 3: 'Ử', 4: 'Ữ', 5: 'Ự' },
- 'Y': { 0: 'Y', 1: 'Ý', 2: 'Ỳ', 3: 'Ỷ', 4: 'Ỹ', 5: 'Ỵ' }
-};
-
-const TONE_REVERSE_MAP: Record = {};
-for (const [base, tones] of Object.entries(VOWELS_MAP)) {
- for (const [toneStr, tonedChar] of Object.entries(tones)) {
- const tone = parseInt(toneStr, 10);
- if (tone > 0) {
- TONE_REVERSE_MAP[tonedChar] = { base, tone };
- }
- }
-}
-
-// Helper to check if a character is a vowel
-function isVowel(char: string): boolean {
- const normalized = char.toLowerCase();
- return normalized in VOWELS_MAP || normalized in TONE_REVERSE_MAP;
-}
-
-// Helper to strip tone from a character, returning the tone-free character and the tone number
-function stripToneChar(char: string): { base: string, tone: number } {
- if (char in TONE_REVERSE_MAP) {
- return TONE_REVERSE_MAP[char];
- }
- return { base: char, tone: 0 };
-}
-
-// Apply tone to a specific character
-function applyToneToChar(char: string, tone: number): string {
- const { base } = stripToneChar(char);
- const tones = VOWELS_MAP[base];
- if (tones && tones[tone] !== undefined) {
- return tones[tone];
- }
- return char;
-}
-
-// Find the index of the vowel that should receive the tone mark in Vietnamese spelling rules
-function findToneVowelIndex(chars: string[]): number {
- const vowelIndices: number[] = [];
- for (let i = 0; i < chars.length; i++) {
- if (isVowel(chars[i])) {
- vowelIndices.push(i);
- }
- }
-
- if (vowelIndices.length === 0) return -1;
- if (vowelIndices.length === 1) return vowelIndices[0];
-
- // Join vowels to analyze
- const vowelStr = vowelIndices.map(idx => stripToneChar(chars[idx]).base.toLowerCase()).join('');
-
- // Rules for double vowels
- if (vowelIndices.length === 2) {
- // ua, ia, ya -> tone on first vowel
- if (vowelStr === 'ua' || vowelStr === 'ia' || vowelStr === 'ya') {
- return vowelIndices[0];
- }
- // uy -> tone on second vowel (y)
- if (vowelStr === 'uy') {
- return vowelIndices[1];
- }
-
- // If there's a consonant after the vowels, tone goes to the second vowel
- const lastVowelIdx = vowelIndices[1];
- if (lastVowelIdx < chars.length - 1 && !isVowel(chars[lastVowelIdx + 1])) {
- return vowelIndices[1];
- }
-
- // Default for double vowels: tone on second vowel
- return vowelIndices[1];
- }
-
- // Rules for triple vowels (e.g., iêu, oai, oay, uây, ươi, uyê)
- if (vowelIndices.length === 3) {
- // uyê -> tone on ê (index 2)
- if (vowelStr === 'uye') {
- return vowelIndices[2];
- }
- // Default for triple vowels: tone on the middle vowel
- return vowelIndices[1];
- }
-
- return vowelIndices[0];
-}
-
-export function translateWord(word: string, mode: 'telex' | 'vni'): string {
- if (!word) return '';
-
- let chars = word.split('');
- let tone = 0;
- let hasManualTone = false;
-
- // For Telex, we can process sequentially
- if (mode === 'telex') {
- const output: string[] = [];
- for (let i = 0; i < chars.length; i++) {
- const char = chars[i];
- const lowerChar = char.toLowerCase();
- const prev = output[output.length - 1];
- const prevLower = prev ? prev.toLowerCase() : '';
-
- // 1. Double character modifiers
- if (lowerChar === 'a' && prevLower === 'a') {
- output[output.length - 1] = prev === 'A' ? 'Â' : 'â';
- } else if (lowerChar === 'e' && prevLower === 'e') {
- output[output.length - 1] = prev === 'E' ? 'Ê' : 'ê';
- } else if (lowerChar === 'o' && prevLower === 'o') {
- output[output.length - 1] = prev === 'O' ? 'Ô' : 'ô';
- } else if (lowerChar === 'd' && prevLower === 'd') {
- output[output.length - 1] = prev === 'D' ? 'Đ' : 'đ';
- }
- // 2. 'w' modifier
- else if (lowerChar === 'w') {
- if (prevLower === 'a') {
- output[output.length - 1] = prev === 'A' ? 'Ă' : 'ă';
- } else if (prevLower === 'o') {
- output[output.length - 1] = prev === 'O' ? 'Ơ' : 'ơ';
- } else if (prevLower === 'u') {
- output[output.length - 1] = prev === 'U' ? 'Ư' : 'ư';
- } else {
- // 'w' typed independently. In Telex, typing 'w' can turn 'u' -> 'ư' and 'o' -> 'ơ' in the word
- let modified = false;
- for (let j = 0; j < output.length; j++) {
- const { base, tone: t } = stripToneChar(output[j]);
- const baseLower = base.toLowerCase();
- if (baseLower === 'u') {
- output[j] = applyToneToChar(output[j] === 'U' ? 'Ư' : 'ư', t);
- modified = true;
- } else if (baseLower === 'o') {
- output[j] = applyToneToChar(output[j] === 'O' ? 'Ơ' : 'ơ', t);
- modified = true;
- }
- }
- if (!modified) {
- output.push(char); // Keep literal 'w' if no u/o found
- }
- }
- }
- // 3. Tone keys: s (sắc), f (huyền), r (hỏi), x (ngã), j (nặng), z (xóa dấu)
- else if (['s', 'f', 'r', 'x', 'j', 'z'].includes(lowerChar) && output.some(c => isVowel(c))) {
- hasManualTone = true;
- if (lowerChar === 's') tone = 1;
- else if (lowerChar === 'f') tone = 2;
- else if (lowerChar === 'r') tone = 3;
- else if (lowerChar === 'x') tone = 4;
- else if (lowerChar === 'j') tone = 5;
- else if (lowerChar === 'z') tone = 0;
- }
- // 4. Normal characters
- else {
- output.push(char);
- }
- }
-
- // Apply the tone to the correct vowel if a tone key was pressed
- if (hasManualTone) {
- // First, strip existing tones from all characters in the output
- for (let i = 0; i < output.length; i++) {
- const { base } = stripToneChar(output[i]);
- output[i] = base;
- }
-
- if (tone > 0) {
- const toneIdx = findToneVowelIndex(output);
- if (toneIdx !== -1) {
- output[toneIdx] = applyToneToChar(output[toneIdx], tone);
- }
- }
- }
-
- return output.join('');
- }
-
- // For VNI
- else {
- const output: string[] = [];
- for (let i = 0; i < chars.length; i++) {
- const char = chars[i];
- const prev = output[output.length - 1];
- const prevLower = prev ? prev.toLowerCase() : '';
-
- // VNI Modifiers and Tones
- if (['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'].includes(char)) {
- if (char === '6') {
- if (prevLower === 'a') output[output.length - 1] = prev === 'A' ? 'Â' : 'â';
- else if (prevLower === 'e') output[output.length - 1] = prev === 'E' ? 'Ê' : 'ê';
- else if (prevLower === 'o') output[output.length - 1] = prev === 'O' ? 'Ô' : 'ô';
- else output.push(char);
- } else if (char === '7') {
- if (prevLower === 'o') output[output.length - 1] = prev === 'O' ? 'Ơ' : 'ơ';
- else if (prevLower === 'u') output[output.length - 1] = prev === 'U' ? 'Ư' : 'ư';
- else {
- // Check if we can modify u and o in the word
- let modified = false;
- for (let j = 0; j < output.length; j++) {
- const { base, tone: t } = stripToneChar(output[j]);
- const baseLower = base.toLowerCase();
- if (baseLower === 'u') {
- output[j] = applyToneToChar(output[j] === 'U' ? 'Ư' : 'ư', t);
- modified = true;
- } else if (baseLower === 'o') {
- output[j] = applyToneToChar(output[j] === 'O' ? 'Ơ' : 'ơ', t);
- modified = true;
- }
- }
- if (!modified) output.push(char);
- }
- } else if (char === '8') {
- if (prevLower === 'a') output[output.length - 1] = prev === 'A' ? 'Ă' : 'ă';
- else output.push(char);
- } else if (char === '9') {
- if (prevLower === 'd') output[output.length - 1] = prev === 'D' ? 'Đ' : 'đ';
- else output.push(char);
- } else if (output.some(c => isVowel(c))) {
- // It's a tone mark: 1, 2, 3, 4, 5, 0
- hasManualTone = true;
- if (char === '1') tone = 1;
- else if (char === '2') tone = 2;
- else if (char === '3') tone = 3;
- else if (char === '4') tone = 4;
- else if (char === '5') tone = 5;
- else if (char === '0') tone = 0;
- } else {
- output.push(char);
- }
- } else {
- output.push(char);
- }
- }
-
- // Apply the tone to the correct vowel if a tone key was pressed
- if (hasManualTone) {
- // First, strip existing tones from all characters in the output
- for (let i = 0; i < output.length; i++) {
- const { base } = stripToneChar(output[i]);
- output[i] = base;
- }
-
- if (tone > 0) {
- const toneIdx = findToneVowelIndex(output);
- if (toneIdx !== -1) {
- output[toneIdx] = applyToneToChar(output[toneIdx], tone);
- }
- }
- }
-
- return output.join('');
- }
-}
-
-export function translateSentence(text: string, mode: 'telex' | 'vni'): string {
- if (!text) return '';
-
- // Simple word-by-word translation preserving spaces and punctuation
- const wordsAndPunct = text.split(/(\s+)/);
- return wordsAndPunct.map(part => {
- if (/^\s+$/.test(part)) {
- return part; // Return spaces as-is
- }
-
- // If the word contains punctuation at the end, separate it
- const match = part.match(/^([a-zA-Z0-9]+)([^a-zA-Z0-9]*)$/);
- if (match) {
- const word = match[1];
- const punct = match[2];
- return translateWord(word, mode) + punct;
- }
-
- return part;
- }).join('');
-}
diff --git a/src/assets/blog/ios-install-access.png b/src/assets/blog/ios-install-access.png
new file mode 100644
index 0000000..a28bba1
Binary files /dev/null and b/src/assets/blog/ios-install-access.png differ
diff --git a/src/assets/blog/ios-install-add.png b/src/assets/blog/ios-install-add.png
new file mode 100644
index 0000000..1b8de2a
Binary files /dev/null and b/src/assets/blog/ios-install-add.png differ
diff --git a/src/assets/blog/ios-install-switch.png b/src/assets/blog/ios-install-switch.png
new file mode 100644
index 0000000..1db822f
Binary files /dev/null and b/src/assets/blog/ios-install-switch.png differ
diff --git a/src/components/DesktopPlatform.astro b/src/components/DesktopPlatform.astro
new file mode 100644
index 0000000..12f4190
--- /dev/null
+++ b/src/components/DesktopPlatform.astro
@@ -0,0 +1,348 @@
+---
+import BaseLayout from '../layouts/BaseLayout.astro';
+import PlatformLinks from './PlatformLinks.astro';
+import { PLATFORMS } from '../lib/platforms';
+import { DESKTOP } from '../lib/desktop';
+import { platformPageJsonLd } from '../lib/seo';
+import { FUNPUT_CONSTANTS as links } from '../lib/constants';
+interface Props {
+ id: keyof typeof DESKTOP;
+}
+const { id } = Astro.props;
+const content = DESKTOP[id];
+const platform = PLATFORMS.find((p) => p.id === id)!;
+const docs = `${links.INSTALL_DOCS_URL}${id}/`;
+---
+
+
+
+
+ ← Tất cả nền tảng
+
+
+
+
FUNPUT / {platform.name}
+
+ {content.headline}
+
+ {content.accent}
+ Bộ gõ tiếng Việt cho {platform.name}
+
+
{content.lead}
+
+ {platform.ctaLabel}
+ ↗
+
+
Miễn phí · Mã nguồn mở · Telex & VNI
+
+
+
+
GÕ LÀ FUN, INPUT LÀ CHUẨN
+
+
+
+ Thiết kế riêng cho {platform.name}. Quen ngay từ lần gõ đầu.
+
+
+
+ DÀNH CHO MÁY CỦA BẠN
+
+
{content.os}
+
{content.requirements}
+
+
+
+ {content.features.map(([title, body], i) => (
+
+
0{i + 1}
+
{title}
+
{body}
+
+ ))}
+
+
+
+
+ {content.steps.map(([title, body]) => (
+
+ {title}
+ {body}
+
+ ))}
+
+
+
+ {id === 'windows' && (
+
+
+ Đọc hướng dẫn cài Funput trên Windows 10/11 và xử lý lỗi thường gặp →
+
+
+ )}
+
+
+
+
diff --git a/src/components/HomeExperience.astro b/src/components/HomeExperience.astro
new file mode 100644
index 0000000..29d6c08
--- /dev/null
+++ b/src/components/HomeExperience.astro
@@ -0,0 +1,1170 @@
+---
+import { FUNPUT_CONSTANTS as links } from '../lib/constants';
+import { PLATFORMS } from '../lib/platforms';
+const accents = [
+ { name: 'Ngang', mark: 'a', letter: 'a', word: 'ma' },
+ { name: 'Sắc', mark: '´', letter: 'á', word: 'má' },
+ { name: 'Huyền', mark: '`', letter: 'à', word: 'mà' },
+ { name: 'Hỏi', mark: '̉', letter: 'ả', word: 'mả' },
+ { name: 'Ngã', mark: '~', letter: 'ã', word: 'mã' },
+ { name: 'Nặng', mark: '.', letter: 'ạ', word: 'mạ' },
+];
+---
+
+
+
+
+
+ FUNPUT · BỘ GÕ TIẾNG VIỆT MÃ NGUỒN MỞ
+
+
+ Gõ là Fun,
+
+ Input là chuẩn
+
+
+ Gõ vui theo cách của bạn. Tiếng Việt trọn từng dấu.
+
+ Telex hay VNI, Funput đồng hành cùng bạn
+ từ máy tính đến điện thoại.
+
+
+
+ Telex & VNI
+
+ Riêng tư từ thiết kế
+
+ 100% miễn phí
+
+
+
+
+
+
VI / 01
+
+ ~
+
+
+ ^
+
+
+ funput
+ ấ
+ GÕ VUI. CHUẨN TIẾNG VIỆT.
+
+
+ ´
+
+
+ made for
+ tiếng Việt
+ ♥
+
+
+ ↖ Vui từng phím. Chuẩn từng dấu.
+
+
+
+
+
+
+
+
+
+
01 / NHỎ MÀ CÓ VÕ
+
+
+ Một dấu nhỏ.
+
+ Một nghĩa khác.
+
+
+ Tiếng Việt đẹp từ những điều rất nhỏ.
+
+ Chạm vào một dấu, xem điều gì xảy ra.
+
+
+
+
+
+ a
+ CHỮ QUEN. CẢM HỨNG MỚI.
+
+
+
THỬ THÊM MỘT CHÚT CÁ TÍNH
+
+ {accents.map((accent, index) => (
+
+ {accent.mark}
+ {accent.name}
+
+ ))}
+
+
+ ma → ma
+
+
+ Sáu thanh điệu. Vô vàn điều muốn nói.
+
+ Funput đồng hành cùng từng phím gõ của bạn.
+
+
Minh họa dấu tiếng Việt · không phải bộ gõ trực tuyến
+
+
+
+
+
+
+
+
02 / CỨ GÕ. CỨ LÀ BẠN.
+
+ Ý tưởng của bạn.
+
+ Tiếng nói của bạn.
+
+ Dữ liệu cũng vậy.
+
+
+ Khám phá mã nguồn ↗
+
+
+
+
+ 01
+
+
Riêng tư là mặc định.
+
Nhập liệu được xử lý trên thiết bị. Những gì bạn gõ thuộc về bạn.
+
+ ↗
+
+
+ 02
+
+
Quen tay, ngay từ đầu.
+
+ Telex hay VNI, chọn cách bạn vẫn gõ. Giữ nguyên thói quen, tiếp tục dòng suy nghĩ.
+
+
+ ↗
+
+
+ 03
+
+
Mở mã nguồn. Mở khả năng.
+
Tự do tìm hiểu, kiểm tra và đóng góp. Một bộ gõ được xây dựng cùng cộng đồng.
+
+ ↗
+
+
+
+
+
+
+
+
+
+
THÊM DẤU CHO CHỮ. THÊM VUI CHO NGÀY.
+
+ Gõ điều bạn muốn.
+
+ ✳
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/MobilePlatform.astro b/src/components/MobilePlatform.astro
new file mode 100644
index 0000000..86f1132
--- /dev/null
+++ b/src/components/MobilePlatform.astro
@@ -0,0 +1,348 @@
+---
+import BaseLayout from '../layouts/BaseLayout.astro';
+import QRCode from 'qrcode';
+import { PLATFORMS } from '../lib/platforms';
+import { FUNPUT_CONSTANTS as links } from '../lib/constants';
+import { platformPageJsonLd } from '../lib/seo';
+import PlatformLinks from './PlatformLinks.astro';
+interface Props {
+ id: 'ios' | 'android';
+}
+const { id } = Astro.props;
+const ios = id === 'ios';
+const platform = PLATFORMS.find((platform) => platform.id === id)!;
+// Generate at build time from the same URL as the download button.
+const storeName = ios ? 'App Store' : 'Google Play';
+const qrCode = await QRCode.toDataURL(platform.ctaHref, {
+ errorCorrectionLevel: 'M',
+ margin: 4,
+ scale: 8,
+ color: { dark: '#000000', light: '#ffffff' },
+});
+const title = ios
+ ? 'Funput cho iPhone & iPad — Bàn phím tiếng Việt iOS'
+ : 'Funput cho Android — Bàn phím tiếng Việt Telex & VNI';
+const description = ios
+ ? 'Tải Funput cho iPhone và iPad trên App Store. Bàn phím tiếng Việt miễn phí, mã nguồn mở, hỗ trợ Telex và VNI. Yêu cầu iOS/iPadOS 18.6 trở lên.'
+ : 'Tải Funput cho Android trên Google Play. Bàn phím tiếng Việt miễn phí, mã nguồn mở, hỗ trợ Telex và VNI cho điện thoại, máy tính bảng Android 8.0 trở lên.';
+const features = ios
+ ? [
+ [
+ 'Quen tay với Telex & VNI',
+ 'Gõ tiếng Việt trên iPhone và iPad bằng kiểu gõ bạn quen thuộc.',
+ ],
+ [
+ 'Giao diện cho thiết bị Apple',
+ 'Liquid Glass trên iOS 26; vẫn sử dụng được từ iOS và iPadOS 18.6.',
+ ],
+ [
+ 'Nhập liệu trên thiết bị',
+ 'Đường xử lý nhập liệu được thiết kế để không gửi nội dung bạn gõ lên máy chủ Funput.',
+ ],
+ ]
+ : [
+ [
+ 'Telex & VNI trên Android',
+ 'Hai kiểu gõ tiếng Việt quen thuộc trên điện thoại và máy tính bảng.',
+ ],
+ [
+ 'Giao diện dành cho Android',
+ 'Bàn phím được thiết kế riêng cho Android, hỗ trợ từ Android 8.0 (API 26).',
+ ],
+ [
+ 'Mã nguồn mở, dễ tìm hiểu',
+ 'Funput phát hành theo giấy phép MIT. Bạn có thể xem mã nguồn và đóng góp trên GitHub.',
+ ],
+ ];
+---
+
+
+
+
+ ← Tất cả nền tảng
+
+
+
+
FUNPUT / {platform.name}
+
+ Bàn phím tiếng Việt
+
+ cho {ios ? 'iPhone & iPad.' : 'Android.'}
+
+
+ {ios
+ ? 'Mang niềm vui gõ tiếng Việt vào iPhone và iPad của bạn. Funput hỗ trợ Telex, VNI và giao diện dành riêng cho thiết bị Apple.'
+ : 'Gõ tiếng Việt theo cách bạn quen. Funput mang Telex và VNI đến điện thoại, máy tính bảng Android của bạn.'}
+
+
+
+
MỘT CHẠM, BẮT ĐẦU GÕ.
+
Tải Funput miễn phí
+
+ Mở {storeName} hoặc quét mã
+
+ bằng camera điện thoại.
+
+
+ {platform.ctaLabel} ↗
+
+
+
+
+
+ QUÉT ĐỂ TẢI ↗
+
+
+
+
+ {ios ? 'iOS / iPadOS 18.6 trở lên' : 'Android 8.0 (API 26) trở lên'} · Mã nguồn mở
+
+
+
+
+ Funput trên {ios ? 'iOS' : 'Android'}
+
+
+
+ {features.map(([heading, body], index) => (
+
+
0{index + 1}
+
{heading}
+
{body}
+
+ ))}
+
+
+
+
BẮT ĐẦU GÕ CÙNG FUNPUT
+
+ Tải đúng ứng dụng.
+
+ Gõ theo cách của bạn.
+
+
+
+
+
+
+
+
diff --git a/src/components/PlatformLinks.astro b/src/components/PlatformLinks.astro
new file mode 100644
index 0000000..532f38e
--- /dev/null
+++ b/src/components/PlatformLinks.astro
@@ -0,0 +1,72 @@
+---
+import { PLATFORMS, type PlatformId } from '../lib/platforms';
+interface Props {
+ current: PlatformId;
+}
+const { current } = Astro.props;
+---
+
+
+
+
MỘT FUNPUT. MỌI THIẾT BỊ.
+
Bạn còn dùng thiết bị nào?
+
+
+
+
diff --git a/src/components/layout/Footer.astro b/src/components/layout/Footer.astro
new file mode 100644
index 0000000..0d01abc
--- /dev/null
+++ b/src/components/layout/Footer.astro
@@ -0,0 +1,85 @@
+---
+import { FUNPUT_CONSTANTS as links } from '../../lib/constants';
+---
+
+
+
diff --git a/src/components/layout/Header.astro b/src/components/layout/Header.astro
new file mode 100644
index 0000000..3b6f230
--- /dev/null
+++ b/src/components/layout/Header.astro
@@ -0,0 +1,173 @@
+---
+import { FUNPUT_CONSTANTS as links } from '../../lib/constants';
+const isBlog = Astro.url.pathname.startsWith('/blog');
+---
+
+
+ Đến nội dung chính
+
+
+
+
diff --git a/src/components/seo/SeoHead.astro b/src/components/seo/SeoHead.astro
new file mode 100644
index 0000000..a9a6879
--- /dev/null
+++ b/src/components/seo/SeoHead.astro
@@ -0,0 +1,61 @@
+---
+import type { SeoInput } from '../../lib/seo';
+import { buildSeo } from '../../lib/seo';
+
+interface Props extends SeoInput {
+ jsonLd?: Record | null;
+}
+
+const props = Astro.props;
+const seo = buildSeo(props);
+const jsonLd = props.jsonLd ?? null;
+---
+
+
+
+
+
+{!seo.noindex && }
+
+
+
+
+
+
+
+
+
+
+{!props.ogImage && (
+ <>
+
+
+
+ >
+)}
+{seo.iosBanner && }
+{seo.publishedTime && }
+{seo.modifiedTime && }
+
+
+
+
+
+
+
+
+{jsonLd && (
+
+)}
diff --git a/src/app/app.css b/src/components/ui/.gitkeep
similarity index 100%
rename from src/app/app.css
rename to src/components/ui/.gitkeep
diff --git a/src/content.config.ts b/src/content.config.ts
new file mode 100644
index 0000000..8b07175
--- /dev/null
+++ b/src/content.config.ts
@@ -0,0 +1,18 @@
+import { defineCollection } from 'astro:content';
+import { glob } from 'astro/loaders';
+import { z } from 'astro/zod';
+
+const blog = defineCollection({
+ loader: glob({ base: './src/content/blog', pattern: '**/*.{md,mdx}' }),
+ schema: z.object({
+ title: z.string(),
+ seoTitle: z.string().optional(),
+ description: z.string(),
+ pubDate: z.coerce.date(),
+ updatedDate: z.coerce.date().optional(),
+ draft: z.boolean().default(false),
+ tags: z.array(z.string()).default([]),
+ }),
+});
+
+export const collections = { blog };
diff --git a/src/content/blog/cach-bat-ban-phim-funput-iphone-ipad.md b/src/content/blog/cach-bat-ban-phim-funput-iphone-ipad.md
new file mode 100644
index 0000000..5020a1e
--- /dev/null
+++ b/src/content/blog/cach-bat-ban-phim-funput-iphone-ipad.md
@@ -0,0 +1,123 @@
+---
+title: 'Cách bật bàn phím Funput trên iPhone và iPad'
+seoTitle: 'Cách cài và bật bàn phím tiếng Việt Funput trên iPhone, iPad'
+description: 'Hướng dẫn cài Funput từ App Store, thêm bàn phím trên iPhone và iPad, chọn Telex/VNI và hiểu quyền truy cập đầy đủ. Có ảnh từng bước và cách xử lý lỗi thường gặp.'
+pubDate: 2026-09-27T07:25:00Z
+draft: false
+tags:
+ - huong-dan
+ - ios
+ - ipad
+---
+
+Bạn đã tải Funput nhưng khi mở Tin nhắn vẫn thấy bàn phím cũ? Đây thường là do iOS chưa được thiết lập để dùng bàn phím mới. **Cài ứng dụng và bật bàn phím là hai bước riêng**: sau khi tải Funput, bạn cần thêm nó trong Cài đặt rồi chuyển sang Funput tại ô nhập văn bản.
+
+Bài này hướng dẫn từ lúc tải ứng dụng đến khi gõ được câu tiếng Việt đầu tiên. Ảnh minh họa lấy từ tài liệu Funput trên iPhone với giao diện tiếng Anh; bên dưới có tên mục tương ứng bằng tiếng Việt. Trên iPad hoặc phiên bản hệ điều hành khác, bố cục có thể khác đôi chút.
+
+## Trước khi bắt đầu
+
+Funput hỗ trợ **iPhone chạy iOS 18.6 trở lên** và **iPad chạy iPadOS 18.6 trở lên**. Bạn có thể xem phiên bản tại **Cài đặt → Cài đặt chung → Giới thiệu**.
+
+Tải ứng dụng từ [Funput trên App Store](https://apps.apple.com/vn/app/id6788829996). Nếu đang đọc bằng máy tính, mở [trang Funput cho iOS](/ios/) và quét mã QR để đến đúng ứng dụng trên điện thoại.
+
+Bạn không cần đổi ngôn ngữ toàn bộ iPhone sang tiếng Việt. Thêm Funput chỉ bổ sung một lựa chọn bàn phím, và bạn vẫn có thể chuyển lại bàn phím hệ thống khi cần.
+
+## Bước 1: Mở Funput sau khi tải
+
+Sau khi cài từ App Store, mở **Funput** từ Màn hình chính hoặc Thư viện ứng dụng. Trong tab **Cài đặt**, tìm thẻ **Hoàn tất thiết lập Funput**.
+
+Thẻ này giúp bạn theo dõi các bước thiết lập. Bạn có thể chạm **Mở Cài đặt** để đến phần cài đặt liên quan, hoặc làm thủ công theo đường dẫn ở bước tiếp theo.
+
+Đừng chỉ mở rồi đóng ứng dụng: lúc này iOS vẫn có thể đang dùng bàn phím trước đó.
+
+## Bước 2: Thêm Funput vào danh sách bàn phím
+
+Trong ứng dụng **Cài đặt** của iPhone hoặc iPad, đi theo đường dẫn:
+
+**Cài đặt → Cài đặt chung → Bàn phím → Các bàn phím → Thêm bàn phím mới… → Funput**
+
+Nếu máy đang dùng tiếng Anh, đường dẫn tương ứng là:
+
+**Settings → General → Keyboard → Keyboards → Add New Keyboard… → Funput**
+
+Chọn **Funput** trong nhóm bàn phím bên thứ ba. Nếu bạn đã thấy Funput trong danh sách các bàn phím đang dùng, có thể chuyển sang bước 3.
+
+
+
+_Chọn Funput trong nhóm bàn phím bên thứ ba; mục Vietnamese ở nhóm gợi ý là lựa chọn khác._
+
+## Bước 3: Hiểu và bật quyền truy cập đầy đủ
+
+Trong phần **Các bàn phím**, chọn **Funput**, sau đó bật **Cho phép truy cập đầy đủ** — **Allow Full Access** nếu dùng tiếng Anh. Đọc thông báo của iOS rồi xác nhận nếu bạn đồng ý cấp quyền.
+
+
+
+_Ảnh minh họa trạng thái Funput và Allow Full Access đã bật._
+
+### Quyền này dùng để làm gì?
+
+iOS tách ứng dụng Funput và tiện ích bàn phím thành hai phần. Theo [tài liệu cài đặt Funput](https://docs.funput.app/docs/install/ios/), quyền truy cập đầy đủ giúp hai phần chia sẻ các thiết lập như kiểu gõ, giao diện và gợi ý từ cá nhân; đồng thời hỗ trợ các tùy chọn rung, âm thanh.
+
+Nếu không bật, bàn phím có thể không nhận đúng các lựa chọn bạn đã đặt trong ứng dụng. Đây là lý do bước này nằm trong hướng dẫn thiết lập Funput.
+
+### Vì sao iOS hiện cảnh báo về dữ liệu nhập?
+
+Đây là quyền có phạm vi rộng. Theo [tài liệu Apple về bàn phím tùy chỉnh](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/CustomKeyboard.html), quyền mở rộng có thể cho phép bàn phím truy cập mạng và vùng dữ liệu dùng chung với ứng dụng. Vì vậy, không nên hiểu rằng quyền này chỉ có tác dụng đổi giao diện.
+
+Còn với Funput, [chính sách quyền riêng tư](/privacy/) nêu rằng đường xử lý nhập liệu được thiết kế để không gửi nội dung bạn gõ lên máy chủ Funput, và các tùy chọn cấu hình được lưu trên thiết bị. Bạn có thể đọc chính sách và [mã nguồn Funput](https://github.com/Funput/Funput) trước khi quyết định cấp quyền.
+
+## Bước 4: Chuyển sang Funput và gõ thử
+
+Thêm bàn phím chưa có nghĩa ứng dụng đang nhập văn bản đã chuyển sang dùng nó. Hãy thử ở một ô nhập thông thường:
+
+1. Mở **Ghi chú** và tạo một ghi chú mới.
+2. Chạm vào vùng nhập để bàn phím xuất hiện.
+3. **Chạm và giữ biểu tượng quả địa cầu** ở khu vực bàn phím.
+4. Chọn **Funput** trong danh sách.
+5. Gõ một câu ngắn, chẳng hạn “xin chào”.
+
+
+
+_Ảnh minh họa menu chuyển bàn phím tại ô tìm kiếm trên iPhone. Bạn có thể thực hiện tương tự trong Ghi chú._
+
+Chạm nhanh biểu tượng quả địa cầu có thể chuyển qua một bàn phím khác ngay lập tức. Nếu có nhiều bàn phím, thao tác **chạm giữ rồi chọn tên** sẽ giúp bạn chọn đúng Funput.
+
+Sau khi đã mở bàn phím Funput ít nhất một lần, quay lại ứng dụng Funput. Khi bàn phím xác nhận quyền, thẻ thiết lập sẽ chuyển sang **Funput đã sẵn sàng**.
+
+## Bước 5: Chọn Telex, VNI hoặc Telex nâng cao
+
+Mở **Funput → Cài đặt → Bàn phím → Kiểu gõ** và chọn cách bạn quen dùng. Tên hoặc vị trí mục có thể thay đổi giữa các phiên bản ứng dụng.
+
+- **Telex:** dùng các chữ cái để tạo dấu. Ví dụ `xin chaof` → “xin chào”.
+- **VNI:** dùng các phím số để tạo dấu. Ví dụ `xin chao2` → “xin chào”.
+- **Telex nâng cao / Telex+:** giữ cách gõ Telex và thêm các phím tắt như `w`, `[` và `]`, với quy tắc riêng theo ngữ cảnh.
+
+Nếu chưa biết chọn kiểu nào, xem [bảng phím và ví dụ Telex, VNI, Telex nâng cao](/blog/telex-vni-va-telex-nang-cao/). Không cần học tất cả cùng lúc: chọn kiểu gõ quen thuộc trước rồi thử một vài câu trong Ghi chú.
+
+## Nếu Funput chưa xuất hiện hoặc chưa gõ được dấu
+
+### Không thấy Funput trong menu quả địa cầu
+
+Kiểm tra Funput đã có trong **Cài đặt → Cài đặt chung → Bàn phím → Các bàn phím**. Nếu chưa có, thêm lại theo bước 2. Sau đó đóng và mở lại ứng dụng đang nhập, chạm giữ quả địa cầu và chọn Funput.
+
+### Đổi kiểu gõ trong ứng dụng nhưng bàn phím chưa đổi
+
+Kiểm tra **Cho phép truy cập đầy đủ**, sau đó mở bàn phím Funput trong một ô nhập để nó nhận trạng thái thiết lập. Đồng thời kiểm tra kiểu gõ đang chọn có khớp chuỗi phím bạn dùng không: `chaof` là Telex, còn `chao2` là VNI.
+
+### Bàn phím tự đổi khi nhập mật khẩu
+
+Theo [Apple](https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/CustomKeyboard.html), các ô nhập bảo mật sử dụng bàn phím hệ thống thay cho bàn phím bên thứ ba. Một số ứng dụng cũng có thể không cho phép bàn phím tùy chỉnh. Vì vậy, hãy kiểm tra Funput trong Ghi chú trước khi kết luận ứng dụng bị lỗi.
+
+### Funput vẫn báo chưa hoàn tất thiết lập
+
+Sau khi bật quyền, mở bàn phím Funput ít nhất một lần rồi quay lại ứng dụng. Nếu vấn đề vẫn còn, ghi lại phiên bản iOS/iPadOS, phiên bản Funput và bước đang vướng để [gửi hỗ trợ](mailto:hello@funput.app). Dùng nội dung mẫu khi mô tả lỗi; không cần gửi mật khẩu hay đoạn văn bản riêng tư.
+
+## Muốn chuyển lại bàn phím cũ thì sao?
+
+Chạm giữ biểu tượng quả địa cầu và chọn bàn phím bạn muốn dùng. Bạn không cần gỡ Funput để chuyển tạm thời.
+
+Nếu muốn bỏ Funput khỏi danh sách bàn phím, vào **Cài đặt → Cài đặt chung → Bàn phím → Các bàn phím → Sửa** và xóa Funput khỏi danh sách. Việc này khác với xóa ứng dụng khỏi thiết bị.
+
+Bạn đã sẵn sàng khi có thể chọn Funput, gõ thử đúng kiểu Telex hoặc VNI và thấy dấu tiếng Việt xuất hiện. Từ đó, hãy dùng trong những cuộc trò chuyện và ghi chú hằng ngày.
+
+**[Tải Funput cho iPhone và iPad](/ios/)** · [Tìm hiểu Funput](/blog/funput-la-gi/) · [Tài liệu cài đặt iOS](https://docs.funput.app/docs/install/ios/)
diff --git a/src/content/blog/cai-funput-windows-10-11.md b/src/content/blog/cai-funput-windows-10-11.md
new file mode 100644
index 0000000..48e8d90
--- /dev/null
+++ b/src/content/blog/cai-funput-windows-10-11.md
@@ -0,0 +1,120 @@
+---
+title: 'Cài Funput trên Windows 10 và Windows 11: mở lên, bắt đầu gõ'
+seoTitle: 'Cách cài Funput trên Windows 10, Windows 11 và gõ tiếng Việt'
+description: 'Hướng dẫn tải Funput cho Windows, chạy bản .exe portable, chọn Telex, VNI hoặc Telex+ và xử lý khi chưa gõ được tiếng Việt. Có hướng dẫn cập nhật và khởi động cùng máy.'
+pubDate: 2026-09-27T07:30:00Z
+draft: false
+tags:
+ - huong-dan
+ - windows
+ - cai-dat
+---
+
+Bạn muốn dùng Funput để gõ tiếng Việt trên Windows? Bản Windows được phát hành dưới dạng **một tệp `.exe` portable**: tải về, đặt vào thư mục bạn muốn giữ ứng dụng và mở lên. Bạn không cần thêm nguồn nhập như trên Mac, cũng không cần tìm bộ cài MSI.
+
+Bài này hướng dẫn từ lúc chọn tệp tải đến khi gõ được câu đầu tiên, cùng những điều cần biết về khay hệ thống, cập nhật và các trường hợp chưa gõ được dấu.
+
+## Kiểm tra máy trước khi tải
+
+Funput hỗ trợ **Windows 10 từ phiên bản 1809 (build 17763) trở lên** và **Windows 11**. Bản phát hành dành cho **x86-64**. Windows on ARM chạy qua mô phỏng; hiện chưa có bản ARM riêng.
+
+Bạn có thể nhấn `Windows + R`, nhập `winver` rồi nhấn Enter để xem phiên bản Windows. Bản Funput này không yêu cầu cài thêm .NET hay WebView2.
+
+Xem [trang Funput cho Windows](/windows/) để biết yêu cầu hệ thống và đường dẫn tải chính thức. Hướng dẫn dưới đây dành cho bản portable được mô tả trong [tài liệu cài đặt Windows của Funput](https://docs.funput.app/docs/install/windows/).
+
+## Bước 1: Tải đúng bản Funput cho Windows
+
+Mở [GitHub Releases chính thức của Funput](https://github.com/Funput/Funput/releases). Trong phần tệp đính kèm của bản phát hành, chọn **`Funput-.exe`**, trong đó `` là số phiên bản.
+
+Tệp `.exe.sha256` đi kèm dùng để kiểm tra tính toàn vẹn, không phải ứng dụng. Các tệp “Source code” là mã nguồn, không phải bản chạy dành cho người dùng Windows.
+
+Nếu muốn kiểm tra tệp vừa tải, mở PowerShell tại thư mục chứa tệp và chạy:
+
+```powershell
+Get-FileHash .\Funput-*.exe -Algorithm SHA256
+```
+
+So sánh giá trị `Hash` với nội dung tệp `.sha256` của đúng bản phát hành. Nếu không khớp, tải lại trước khi chạy. Checksum giúp phát hiện tệp sai hoặc hỏng; bạn vẫn cần lấy cả ứng dụng và checksum từ nguồn chính thức.
+
+## Bước 2: Đặt ứng dụng vào thư mục cố định
+
+Bạn có thể tạo thư mục **`%LOCALAPPDATA%\Programs\Funput\`** rồi chuyển tệp vừa tải vào đó. Để mở vị trí này, nhập `%LOCALAPPDATA%\Programs` vào thanh địa chỉ File Explorer; tạo thư mục `Programs` hoặc `Funput` nếu chưa có.
+
+Một thư mục ổn định giúp bạn dễ tìm ứng dụng và tránh xóa nhầm khi dọn Downloads. Funput thường lưu `settings.json` cạnh tệp chạy khi thư mục đó cho phép ghi, nên hãy giữ cả thư mục thay vì chỉ giữ riêng tệp `.exe`.
+
+Nếu thư mục chứa ứng dụng chỉ đọc, cấu hình có thể được lưu dự phòng trong **`%APPDATA%\Funput\settings.json`**. Với nhu cầu thông thường, vị trí trong `%LOCALAPPDATA%` giúp ứng dụng lưu thiết lập bằng quyền tài khoản hiện tại.
+
+## Bước 3: Mở Funput lần đầu
+
+Nhấp đúp tệp `.exe`. Lần đầu chạy, Funput hiển thị hướng dẫn thiết lập để bạn chọn kiểu gõ. Biểu tượng Funput xuất hiện ở **khay hệ thống**, khu vực gần đồng hồ trên thanh tác vụ.
+
+Có một chi tiết dễ khiến bạn bối rối: tệp **`Funput-.exe` sẽ được thay bằng `Funput.exe` trong cùng thư mục** ở lần chạy đầu. Ứng dụng khởi động lại từ tên cố định này và dọn tệp có số phiên bản. Đây là hành vi phục vụ khởi động cùng Windows và cập nhật. Từ lần sau, mở `Funput.exe`.
+
+### Nếu Windows hiện SmartScreen
+
+Theo tài liệu Funput hiện tại, bản Windows chưa ký Authenticode nên có thể gặp cảnh báo SmartScreen. Hãy kiểm tra nguồn tải và checksum trước khi quyết định chạy. Nếu đó là tệp bạn chủ động tải từ GitHub Releases chính thức và đã kiểm tra, hộp thoại có thể có lựa chọn **More info → Run anyway**.
+
+Không cần tắt SmartScreen hoặc phần mềm bảo vệ toàn hệ thống để dùng Funput. Nếu máy do công ty quản lý và chính sách không cho phép chạy, hãy liên hệ quản trị viên thay vì tìm cách vượt chính sách.
+
+## Bước 4: Chọn kiểu gõ và thử tiếng Việt
+
+Nhấp trái biểu tượng Funput ở khay hệ thống để mở **Control Center**, bật chế độ tiếng Việt và chọn **Telex**, **Telex+** hoặc **VNI**. Bạn cũng có thể nhấp phải biểu tượng, chọn **Cài đặt…** rồi mở **Cách gõ**.
+
+
+
+ Giao diện Funput dành cho Windows. Chọn kiểu gõ phù hợp với thói quen của bạn.
+
+
+Mở Notepad hoặc ứng dụng ghi chú và thử:
+
+| Kiểu gõ đang chọn | Chuỗi phím | Kết quả |
+| ----------------- | ----------- | -------- |
+| Telex | `xin chaof` | xin chào |
+| VNI | `xin chao2` | xin chào |
+| Telex+ | `tr][ngf` | trường |
+
+**Telex+ là Telex nâng cao.** Ngoài các quy tắc Telex quen thuộc, chế độ này bổ sung phím tắt `[` → ơ, `]` → ư và cách dùng `w` theo ngữ cảnh. Xem [bảng phím Telex, VNI và Telex nâng cao](/blog/telex-vni-va-telex-nang-cao/) nếu bạn muốn tra thêm ví dụ.
+
+Phím tắt chuyển tiếng Việt/tiếng Anh mặc định là **Ctrl + phím dấu huyền ngược (backtick, `` ` ``)**. Bạn có thể đổi trong **Cài đặt → Phím tắt**. Biểu tượng khay có màu biểu thị chế độ tiếng Việt; trạng thái trắng đen biểu thị chế độ tiếng Anh.
+
+## Dùng khay hệ thống và khởi động cùng Windows
+
+Bạn không cần giữ cửa sổ Cài đặt mở để gõ. Funput chạy nền ở khay hệ thống:
+
+- **Nhấp trái:** mở hoặc đóng Control Center để đổi nhanh chế độ và kiểu gõ.
+- **Nhấp phải:** mở menu Cài đặt, Chuyển mã, Kiểm tra cập nhật hoặc Thoát.
+- **Không thấy biểu tượng:** mở vùng biểu tượng ẩn bằng mũi tên trên thanh tác vụ.
+
+Nếu muốn Funput sẵn sàng mỗi lần bật máy, mở **Cài đặt → Tổng quan → Khởi động cùng Windows**. Nếu sau này chuyển `Funput.exe` sang thư mục khác, tắt rồi bật lại tùy chọn này để ứng dụng ghi nhận đường dẫn mới.
+
+## Đã mở Funput nhưng chưa gõ được tiếng Việt?
+
+### Gõ chữ hoặc số mà không ra dấu
+
+Kiểm tra chế độ tiếng Việt đang bật và kiểu gõ khớp với chuỗi phím bạn dùng. `chaof` là Telex; `chao2` là VNI. Thử trong Notepad trước để phân biệt vấn đề thiết lập với vấn đề của một ứng dụng cụ thể.
+
+Nếu đang mở một bộ gõ tiếng Việt khác, hãy tạm thoát bộ gõ đó rồi thử lại với Funput để tránh hai ứng dụng cùng xử lý phím.
+
+### Không thấy cửa sổ hoặc biểu tượng Funput
+
+Kiểm tra vùng biểu tượng ẩn gần đồng hồ. Có thể ứng dụng vẫn đang chạy nhưng Windows đã ẩn biểu tượng. Nếu mở `Funput.exe` lần nữa mà cửa sổ Cài đặt xuất hiện, đó cũng là dấu hiệu Funput đã chạy sẵn.
+
+### Gõ được trong Notepad nhưng không được ở ứng dụng quản trị
+
+Windows hạn chế ứng dụng quyền thường đưa phím vào cửa sổ đang chạy với quyền Administrator. Nếu ứng dụng đích không cần quyền quản trị, hãy mở nó ở quyền thường. Khi thực sự cần gõ trong cửa sổ quản trị, tài liệu Funput hướng dẫn thoát Funput rồi mở `Funput.exe` bằng **Run as administrator**. Không cần chạy với quyền cao cho công việc thông thường.
+
+### Giao diện Windows 10 khác ảnh Windows 11
+
+Cửa sổ Cài đặt trên Windows 10 dùng nền đục, còn hiệu ứng Mica dành cho Windows 11. Khác biệt này không có nghĩa ứng dụng cài sai hoặc thiếu thành phần.
+
+## Cập nhật và giữ lại cấu hình
+
+Để tìm bản mới, nhấp phải biểu tượng Funput → **Kiểm tra cập nhật…**, hoặc mở **Cài đặt → Giới thiệu**. Funput hiện **không tự kiểm tra cập nhật nền**, nên bạn cần chủ động chọn mục này.
+
+Nếu cập nhật thủ công, tải bản `.exe` mới từ GitHub Releases, thoát Funput rồi đặt tệp mới vào cùng thư mục với `Funput.exe` hiện tại và chạy tệp mới. Ứng dụng sẽ thay bản chạy và dọn tệp có số phiên bản theo hướng dẫn chính thức.
+
+Trước khi chuyển máy hoặc dọn thư mục ứng dụng, dùng **Cài đặt → Dữ liệu → Xuất cấu hình** nếu muốn giữ các thiết lập. Vì cấu hình thường nằm cùng ứng dụng, xóa cả thư mục có thể xóa luôn thiết lập của bạn.
+
+Bạn đã hoàn tất khi mở được Funput, chọn đúng kiểu gõ và nhập được câu tiếng Việt trong ứng dụng thường dùng. Nếu cần trợ giúp, gửi phiên bản Windows, phiên bản Funput và các bước tái hiện bằng nội dung mẫu qua [GitHub Issues](https://github.com/Funput/Funput/issues).
+
+**[Tải Funput cho Windows](/windows/)** · [Tìm hiểu Funput](/blog/funput-la-gi/) · [Cài bàn phím Funput trên iPhone và iPad](/blog/cach-bat-ban-phim-funput-iphone-ipad/)
diff --git a/src/content/blog/funput-la-gi.md b/src/content/blog/funput-la-gi.md
new file mode 100644
index 0000000..296d1af
--- /dev/null
+++ b/src/content/blog/funput-la-gi.md
@@ -0,0 +1,91 @@
+---
+title: 'Xin chào, Funput — Gõ tiếng Việt trên mọi thiết bị'
+seoTitle: 'Funput là gì? Bộ gõ tiếng Việt cho Windows, macOS, Linux, iOS và Android'
+description: 'Làm quen với Funput: bộ gõ tiếng Việt miễn phí, mã nguồn mở, hỗ trợ Telex và VNI trên năm nền tảng. Chọn bản phù hợp và bắt đầu gõ.'
+pubDate: 2026-09-27
+draft: false
+tags:
+ - funput
+ - tieng-viet
+ - huong-dan
+---
+
+**Gõ là Fun, Input là chuẩn.**
+
+Một tin nhắn cho người thân, một email công việc hay vài dòng ghi chú: tiếng Việt có mặt trong những việc nhỏ mỗi ngày. Bạn có thể viết trên máy tính buổi sáng, trả lời bằng điện thoại buổi trưa rồi tiếp tục trên một thiết bị khác. Điều bạn muốn giữ lại là cách gõ quen tay.
+
+Đó là trải nghiệm Funput hướng tới. Bài viết đầu tiên này giúp bạn làm quen với ứng dụng, biết thiết bị nào được hỗ trợ và tìm đúng nơi tải về.
+
+## Funput là gì?
+
+Funput là **bộ gõ tiếng Việt miễn phí, mã nguồn mở**, hỗ trợ Telex và VNI trên macOS, Windows, Linux, iOS và Android. Trên máy tính, Funput giúp bạn nhập tiếng Việt qua bộ gõ phù hợp với hệ điều hành. Trên điện thoại và máy tính bảng, Funput là bàn phím để bạn chọn khi nhập văn bản.
+
+Bạn không cần đổi thói quen chỉ để thử một bộ gõ mới. Nếu quen Telex, hãy tiếp tục dùng Telex; nếu quen VNI, bạn có thể chọn VNI trong cài đặt. Giao diện và cách kích hoạt sẽ khác nhau giữa các nền tảng, nhưng mục đích chung vẫn là giúp việc gõ tiếng Việt trở nên thuận tiện.
+
+
+
+
+ Funput trên macOS: các lựa chọn kiểu gõ nằm trong giao diện dành riêng cho Mac.
+
+
+
+## Một cách gõ quen, nhiều thiết bị
+
+Một bộ gõ là thứ bạn tương tác liên tục nhưng thường chỉ chú ý khi gặp trở ngại. Chuyển sang máy khác, tìm lại lựa chọn kiểu gõ hoặc bật bàn phím trên điện thoại đều có thể làm ngắt mạch viết.
+
+Funput chọn giữ Telex và VNI làm điểm chung, đồng thời có giao diện riêng cho từng hệ điều hành. Trên Mac, bạn thêm Funput vào nguồn nhập của hệ thống. Trên Windows, ứng dụng chạy ở khay hệ thống. Linux có lựa chọn Fcitx5 hoặc IBus; iPhone và Android có bàn phím riêng.
+
+Vì vậy, “trên mọi thiết bị” ở đây là sự hiện diện trên năm nền tảng được hỗ trợ. Bạn vẫn cần kiểm tra phiên bản hệ điều hành và cài đặt cho từng thiết bị. Các bản cũng có những tính năng và cách sử dụng riêng; đừng mặc định mọi tùy chọn trên máy tính đều có trên điện thoại.
+
+## Telex hay VNI: chọn cách bạn quen
+
+Telex dùng các chữ cái để tạo dấu và ký tự tiếng Việt. Chẳng hạn, với cách gõ thông dụng, `aa` tạo thành “â”, `dd` tạo thành “đ”, còn `s` thêm dấu sắc. VNI dùng các phím số: `a6` tạo thành “â”, `d9` tạo thành “đ” và `1` thêm dấu sắc.
+
+Nếu đã sử dụng một trong hai kiểu gõ, hãy chọn đúng kiểu đó trong Funput rồi thử vài câu ngắn. Bạn có thể mở một ứng dụng ghi chú để kiểm tra các từ như “tiếng Việt”, “cảm ơn” và “đường về”. Nếu mới bắt đầu, hãy chọn một kiểu và làm quen dần thay vì đổi liên tục.
+
+Funput còn có Telex nâng cao (Telex+) trên cả năm nền tảng. Bạn có thể xem [bảng phím và ví dụ so sánh Telex, VNI, Telex nâng cao](/blog/telex-vni-va-telex-nang-cao/) để chọn cách gõ phù hợp. Các bản máy tính còn có công cụ chuyển mã giữa Unicode, TCVN3 và VNI-Windows. **Kiểu gõ VNI và bảng mã VNI-Windows là hai lựa chọn khác nhau**: một bên là cách nhấn phím, bên còn lại là cách biểu diễn văn bản. Với nhu cầu viết hằng ngày trong ứng dụng hiện đại, bạn thường sẽ làm việc với Unicode.
+
+## Tải Funput cho thiết bị của bạn
+
+Bảng dưới đây giúp bạn chọn đúng phiên bản. Mỗi liên kết dẫn đến trang nền tảng chính thức, có ảnh ứng dụng, yêu cầu và đường dẫn tải hoặc cài đặt.
+
+| Nền tảng | Yêu cầu chính | Bắt đầu ở đây |
+| ------------ | ------------------------------------------------------------- | ------------------------------- |
+| macOS | macOS 26 (Tahoe) trở lên; Apple Silicon hoặc Intel | [Funput cho macOS](/macos/) |
+| Windows | Windows 10 phiên bản 1809 trở lên hoặc Windows 11; bản x86-64 | [Funput cho Windows](/windows/) |
+| Linux | x86-64; Fcitx5 hoặc IBus | [Funput cho Linux](/linux/) |
+| iPhone, iPad | iOS hoặc iPadOS 18.6 trở lên | [Funput cho iOS](/ios/) |
+| Android | Android 8.0 (API 26) trở lên | [Funput cho Android](/android/) |
+
+Trên macOS, gói `.pkg` cần quyền admin; bản `.app.zip` có thể cài cho tài khoản hiện tại theo hướng dẫn. Bản Windows là tệp `.exe` portable. Với Linux, hãy đọc hướng dẫn theo bản phân phối và phiên desktop trước khi chọn Fcitx5 hoặc IBus.
+
+Ứng dụng iPhone và iPad được phân phối qua [App Store](https://apps.apple.com/vn/app/id6788829996). Bản Android có trên [Google Play](https://play.google.com/store/apps/details?id=app.funput.funput). Nếu đang đọc bằng máy tính, bạn có thể mở trang iOS hoặc Android trên website rồi quét mã QR bằng điện thoại.
+
+## Cài xong, bắt đầu như thế nào?
+
+1. **Chọn đúng bản.** Kiểm tra bảng yêu cầu phía trên và vào trang tương ứng với thiết bị đang dùng.
+2. **Cài đặt theo hướng dẫn.** Với máy tính, xem [tài liệu cài đặt Funput](https://docs.funput.app/docs/install/). Với điện thoại, tải từ kho ứng dụng chính thức và làm theo hướng dẫn trong ứng dụng.
+3. **Bật Funput và chọn kiểu gõ.** Mac và Linux cần thêm hoặc chọn nguồn nhập; iOS và Android cần bật rồi chuyển sang bàn phím Funput. Trên Windows, mở ứng dụng và chọn Telex hoặc VNI.
+4. **Thử một đoạn ngắn.** Mở ứng dụng bạn thường dùng, nhập vài câu tiếng Việt và kiểm tra dấu. Nếu chưa gõ được, xem lại nguồn nhập hoặc bàn phím đang được chọn.
+
+Đừng bỏ qua bước kích hoạt: tải và cài ứng dụng chưa đồng nghĩa với việc hệ điều hành đã chuyển sang dùng Funput.
+
+## Miễn phí, mã nguồn mở và quyền riêng tư
+
+Funput được phát hành theo giấy phép MIT. Bạn có thể đọc [mã nguồn trên GitHub](https://github.com/Funput/Funput), theo dõi thay đổi và tìm hiểu cách ứng dụng hoạt động. Các bản tải chính thức được liên kết từ website để bạn dễ xác định đúng ứng dụng.
+
+Với một bộ gõ, cách xử lý dữ liệu nhập là điều đáng tìm hiểu. Funput thiết kế đường xử lý nhập liệu trên thiết bị. Bạn có thể đọc [chính sách quyền riêng tư](/privacy/) để hiểu phạm vi xử lý dữ liệu, thay vì suy đoán chỉ từ các quyền mà hệ điều hành hiển thị.
+
+## Cùng viết những dòng tiếp theo
+
+Nếu gặp vấn đề, thông tin hữu ích nhất là hệ điều hành, phiên bản Funput, ứng dụng đang gõ và các bước tái hiện bằng một đoạn văn bản mẫu không chứa dữ liệu riêng tư. Bạn có thể gửi góp ý qua [GitHub của Funput](https://github.com/Funput/Funput) hoặc [email liên hệ](mailto:hello@funput.app).
+
+Còn lúc này, hãy [chọn Funput cho thiết bị của bạn](/#platforms), mở một trang ghi chú và viết vài dòng. Một lời chào cũng là điểm bắt đầu tốt.
+
+**Xin chào từ Funput. Gõ vui nhé!**
diff --git a/src/content/blog/telex-vni-va-telex-nang-cao.md b/src/content/blog/telex-vni-va-telex-nang-cao.md
new file mode 100644
index 0000000..3b32dcc
--- /dev/null
+++ b/src/content/blog/telex-vni-va-telex-nang-cao.md
@@ -0,0 +1,123 @@
+---
+title: 'Telex, VNI và Telex nâng cao: chọn cách gõ hợp với bạn'
+seoTitle: 'Telex và VNI khác nhau thế nào? Cách dùng Telex nâng cao trong Funput'
+description: 'So sánh Telex, VNI và Telex nâng cao trong Funput: bảng phím dấu, ví dụ thực hành và lưu ý về phím w, dấu ngoặc vuông khi gõ tiếng Việt.'
+pubDate: 2026-09-27T07:00:00Z
+draft: false
+tags:
+ - huong-dan
+ - telex
+ - vni
+---
+
+Bạn quen gõ `tieengs Vieetj` hay `tie6ng1 Vie6t5` để viết “tiếng Việt”? Hai chuỗi phím khác nhau, nhưng đều đưa bạn đến cùng một câu chữ. Đó là khác biệt dễ thấy nhất giữa **Telex và VNI**: Telex dùng chữ cái để thêm dấu, còn VNI dùng các phím số.
+
+Funput hỗ trợ cả hai, cùng **Telex nâng cao**, còn được gọi là **Telex+** trong một số giao diện. Bài này giúp bạn chọn kiểu gõ phù hợp và thử từng cách bằng những ví dụ cụ thể.
+
+## Telex và VNI khác nhau thế nào?
+
+| Kiểu gõ | Cách tạo dấu | Phù hợp khi |
+| -------------- | --------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
+| Telex | Dùng chữ cái như `s`, `f`, `r`, `x`, `j`, `w` và các cặp `aa`, `ee`, `oo`, `dd` | Bạn quen gõ bằng các phím chữ |
+| VNI | Dùng phím số từ `1` đến `9` cho dấu thanh và dấu chữ | Bạn đã quen bảng phím VNI hoặc thích dùng số để tạo dấu |
+| Telex nâng cao | Giữ cách gõ Telex, thêm `[` → ơ, `]` → ư và cách dùng `w` khi âm tiết chưa có nguyên âm | Bạn muốn dùng thêm các phím tắt này và hiểu lúc nào chúng biến đổi chữ |
+
+Không có kiểu gõ nào nhanh nhất cho tất cả mọi người. Nếu đã quen VNI, bạn không cần học lại Telex chỉ để dùng Funput. Nếu mới bắt đầu, hãy chọn một kiểu và luyện bằng những câu thường viết. Sự quen tay có ý nghĩa hơn việc đổi kiểu gõ liên tục.
+
+## Bảng phím Telex và VNI
+
+Có hai nhóm cần nhớ: **dấu thanh** như sắc, huyền, hỏi, ngã, nặng; và **dấu chữ** để tạo â, ă, ê, ô, ơ, ư, đ.
+
+### Các phím dấu thanh
+
+| Dấu | Telex | VNI | Ví dụ |
+| ----- | ----- | --- | ------------------ |
+| Sắc | `s` | `1` | `as` hoặc `a1` → á |
+| Huyền | `f` | `2` | `af` hoặc `a2` → à |
+| Hỏi | `r` | `3` | `ar` hoặc `a3` → ả |
+| Ngã | `x` | `4` | `ax` hoặc `a4` → ã |
+| Nặng | `j` | `5` | `aj` hoặc `a5` → ạ |
+
+### Các phím tạo dấu chữ
+
+| Chữ cần gõ | Telex | VNI |
+| ---------- | ----- | ---- |
+| â | `aa` | `a6` |
+| ê | `ee` | `e6` |
+| ô | `oo` | `o6` |
+| ă | `aw` | `a8` |
+| ơ | `ow` | `o7` |
+| ư | `uw` | `u7` |
+| đ | `dd` | `d9` |
+
+Bạn có thể tạo dấu chữ rồi thêm dấu thanh. Chẳng hạn, `aas` trong Telex và `a61` trong VNI đều tạo “ấ”. Khi mới tập, đặt dấu thanh ở cuối âm tiết là một cách dễ nhớ: viết phần chữ trước, thêm dấu sau.
+
+**VNI là kiểu gõ, còn VNI-Windows là bảng mã.** Chọn kiểu gõ VNI không có nghĩa là phải dùng bảng mã VNI-Windows. Bạn vẫn có thể nhập văn bản Unicode bằng VNI; đây là điểm dễ nhầm khi làm việc với tài liệu cũ.
+
+## Telex nâng cao trong Funput có gì thêm?
+
+Telex nâng cao là một lựa chọn riêng, đã có trên macOS, Windows, Linux, iOS và Android. Nó giữ các quy tắc Telex quen thuộc, đồng thời mở rộng cách tạo **ơ** và **ư**.
+
+| Phím hoặc chuỗi phím | Kết quả | Điều cần nhớ |
+| -------------------- | ------- | ----------------------------------------------------- |
+| `[` | ơ | Ngoặc vuông mở tạo ơ |
+| `]` | ư | Ngoặc vuông đóng tạo ư |
+| `w` | ư | Khi âm tiết chưa có nguyên âm, có xét ngữ cảnh âm đầu |
+| `t]` | tư | Có thể dùng phím tắt sau phụ âm |
+| `m[` | mơ | Nguyên âm tạo ra vẫn nhận dấu thanh |
+| `wf` | ừ | `w` tạo ư, `f` thêm dấu huyền |
+| `tr][ngf` | trường | `][` tạo cặp ươ |
+| `ng][if` | người | Kết hợp phím tắt với chữ và dấu thanh |
+
+Cần nhớ đúng chiều trong Funput: **`[` là ơ, `]` là ư**. Hai phím ngoặc nhọn `{` và `}` không phải phím tắt tương ứng để tạo chữ hoa trong chế độ này.
+
+Telex nâng cao không buộc bạn dùng phím tắt. Bạn vẫn có thể gõ `uw`, `ow` theo cách quen thuộc. Tuy nhiên, vì `w` có thêm vai trò, một số thói quen đặt `w` trước nguyên âm sẽ cho kết quả khác Telex thường.
+
+### Phím w không chỉ dùng ở đầu từ
+
+Trong Telex nâng cao, `w` có thể tạo “ư” sau âm đầu khi âm tiết chưa có nguyên âm: `thw` → “thư”, `nhwng` → “nhưng”. Trường hợp âm đầu `gi` cũng được xử lý: `giwx` → “giữ”, `giwax` → “giữa”. Riêng sau `q`, Funput không áp dụng phím tắt tạo “ư” này.
+
+Đây là khác biệt cần chú ý nếu bạn đã quen gõ dấu trước nguyên âm:
+
+| Chuỗi phím | Telex thường trong Funput | Telex nâng cao | Cách gõ dễ nhớ thay thế |
+| ---------- | ------------------------- | -------------- | ------------------------------------ |
+| `cwon` | cơn | cươn | Gõ `cown` hoặc `c[n` để được “cơn” |
+| `giwof` | giờ | giuờ | Gõ `giowf` hoặc `gi[f` để được “giờ” |
+
+Bảng mô tả cách chuỗi phím được biến đổi trong lúc soạn. Các tùy chọn kiểm tra chính tả và khôi phục chữ có thể ảnh hưởng đến kết quả khi kết thúc từ. Với từ “thường”, cách gõ `thwongf` vẫn tạo đúng “thường” trong Telex nâng cao.
+
+## Thử gõ một vài câu
+
+Mở ứng dụng ghi chú, chọn đúng kiểu gõ trong Funput rồi thử từng dòng. Dấu cách trong các chuỗi dưới đây là dấu cách bạn gõ giữa các từ.
+
+| Muốn viết | Telex | VNI |
+| ---------- | ---------------- | ---------------- |
+| tiếng Việt | `tieengs Vieetj` | `tie6ng1 Vie6t5` |
+| cảm ơn | `carm own` | `cam3 o7n` |
+| xin chào | `xin chaof` | `xin chao2` |
+
+Sau đó chuyển sang **Telex nâng cao / Telex+** và thử `t]`, `m[`, `tr][ngf`, `ng][if` để lần lượt viết “tư”, “mơ”, “trường”, “người”. Những ví dụ này giúp bạn cảm nhận phím tắt có hợp tay mình không.
+
+Nếu kết quả khác mong đợi, hãy kiểm tra ba điều trước: Funput có đang được chọn làm bộ gõ hoặc bàn phím không, chế độ tiếng Việt có đang bật không và kiểu gõ hiện tại có đúng với bảng bạn đang dùng không.
+
+## Khi nào nên chọn Telex nâng cao?
+
+Bạn có thể thử Telex nâng cao nếu đã quen Telex và muốn dùng thêm `w`, `[` và `]` để nhập nguyên âm. Trên bàn phím có sẵn ngoặc vuông, các phím này có thể thuận tiện; trên điện thoại, việc chuyển sang lớp ký hiệu có thể khiến chúng kém tiện hơn cách gõ `uw`, `ow`.
+
+Nếu thường nhập tiếng Anh hoặc mã nguồn, hãy lưu ý `[` và `]` sẽ tham gia tạo chữ trong Telex nâng cao. Telex thường giữ hai ký tự này như dấu ngoặc. Khi cần nhập nguyên văn, bạn có thể chuyển sang chế độ tiếng Anh; Funput cũng có tính năng Flip để đổi phần đang soạn về chuỗi phím gốc. Xem cách thao tác trong giao diện và tài liệu của nền tảng bạn dùng.
+
+Tên “nâng cao” chỉ nói đến phạm vi phím tắt rộng hơn. Nó không có nghĩa mọi người cần chuyển sang, cũng không đồng nghĩa với tính năng dự đoán hay tự sửa từ.
+
+## Chọn kiểu gõ và bắt đầu với Funput
+
+Trong phần cài đặt kiểu gõ, chọn **Telex**, **Telex nâng cao / Telex+** hoặc **VNI**. Vị trí và tên hiển thị có thể khác giữa các nền tảng. Nếu chưa cài Funput, chọn trang dành cho thiết bị của bạn:
+
+- [Funput cho macOS](/macos/)
+- [Funput cho Windows](/windows/)
+- [Funput cho Linux](/linux/)
+- [Funput cho iPhone và iPad](/ios/)
+- [Funput cho Android](/android/)
+
+Bạn có thể đọc [bài giới thiệu Funput](/blog/funput-la-gi/) để tìm hiểu ứng dụng, hoặc xem [tài liệu Telex nâng cao](https://docs.funput.app/docs/input-methods/advanced-telex/) để tra các quy tắc chi tiết.
+
+Hãy bắt đầu bằng kiểu gõ bạn quen. Khi muốn thử cách mới, dùng vài dòng ghi chú để luyện trước rồi quay lại công việc. Gõ thoải mái, đúng dấu và ít phải sửa mới là điều quan trọng.
diff --git a/src/content/blog/welcome.md b/src/content/blog/welcome.md
new file mode 100644
index 0000000..6ffdcb3
--- /dev/null
+++ b/src/content/blog/welcome.md
@@ -0,0 +1,10 @@
+---
+title: 'Chào mừng đến blog Funput'
+description: 'Bài mẫu draft — sẽ không xuất hiện trên site cho đến khi bỏ draft.'
+pubDate: 2026-09-26
+draft: true
+tags:
+ - funput
+---
+
+Đây là bài mẫu trong Content Collection. Đặt `draft: false` khi sẵn sàng xuất bản.
diff --git a/src/content/privacy.md b/src/content/privacy.md
new file mode 100644
index 0000000..4d022a6
--- /dev/null
+++ b/src/content/privacy.md
@@ -0,0 +1,86 @@
+---
+title: Chính sách quyền riêng tư
+description: Chính sách quyền riêng tư của Funput — bộ gõ tiếng Việt mã nguồn mở.
+lastUpdated: '19 tháng 7 năm 2026'
+---
+
+Chính sách này giải thích cách Funput xử lý thông tin khi bạn sử dụng ứng dụng bộ gõ Funput và website [funput.app](https://funput.app/). Funput là phần mềm mã nguồn mở; chúng tôi ưu tiên minh bạch và quyền riêng tư theo thiết kế.
+
+## 1. Ai chịu trách nhiệm
+
+Funput là bên cung cấp sản phẩm được mô tả trong chính sách này. Nếu bạn có câu hỏi về quyền riêng tư, hãy liên hệ [hello@funput.app](mailto:hello@funput.app).
+
+## 2. Phạm vi áp dụng
+
+Chính sách này áp dụng cho:
+
+- Ứng dụng Funput trên macOS, Windows, Linux, Android và iOS
+- Website funput.app và các trang liên quan do Funput vận hành trên miền này
+
+Tài liệu tại [docs.funput.app](https://docs.funput.app/) và kho mã nguồn trên GitHub có thể có điều khoản riêng của nền tảng lưu trữ tương ứng.
+
+## 3. Nguyên tắc quyền riêng tư
+
+- **Mã nguồn mở:** Funput được phát hành công khai dưới [giấy phép MIT](https://github.com/Funput/Funput/blob/main/LICENSE). Bạn có thể tự kiểm tra cách sản phẩm xử lý dữ liệu.
+- **Quyền riêng tư theo thiết kế:** đường xử lý nhập liệu được thiết kế để không gửi nội dung bạn gõ lên máy chủ của Funput.
+- **Tối thiểu hóa dữ liệu:** chúng tôi chỉ xử lý thông tin cần thiết cho mục đích đã nêu trong chính sách này.
+
+## 4. Những gì Funput không thu thập
+
+Trong ứng dụng Funput, chúng tôi không:
+
+- Thu thập, ghi lại hay gửi nội dung bạn gõ (keylogging)
+- Bán dữ liệu người dùng
+- Dùng quảng cáo theo dõi trong ứng dụng
+- Tích hợp analytics hoặc crash reporting trong ứng dụng
+
+## 5. Dữ liệu lưu trên thiết bị
+
+Funput có thể lưu các tùy chọn cấu hình trên thiết bị của bạn (ví dụ kiểu gõ, giao diện, hoặc trạng thái thiết lập) để ứng dụng hoạt động đúng như bạn mong muốn. Dữ liệu này được lưu cục bộ và không được Funput thu thập về máy chủ của chúng tôi.
+
+## 6. Website và Google Analytics
+
+Website funput.app sử dụng Google Analytics để hiểu mức độ sử dụng trang (ví dụ số lượt xem, thiết bị, nguồn truy cập ở dạng tổng hợp). Google Analytics có thể dùng cookie hoặc mã nhận dạng tương tự do Google cung cấp.
+
+Thông tin này giúp chúng tôi cải thiện nội dung và trải nghiệm website. Ứng dụng bộ gõ Funput không dùng Google Analytics.
+
+Bạn có thể hạn chế cookie qua cài đặt trình duyệt, hoặc dùng các công cụ kiểm soát quảng cáo/đo lường do Google và trình duyệt hỗ trợ (nếu có).
+
+## 7. Email liên hệ
+
+Nếu bạn gửi email tới [hello@funput.app](mailto:hello@funput.app) (ví dụ để hỏi hỗ trợ), chúng tôi nhận địa chỉ email và nội dung bạn gửi để phản hồi yêu cầu đó.
+
+Chúng tôi không dùng email này cho mục đích quảng cáo bên thứ ba. Bạn có thể yêu cầu chúng tôi xóa thông tin liên hệ bằng cách gửi email tới cùng địa chỉ trên.
+
+## 8. Dịch vụ bên thứ ba
+
+Tùy cách bạn dùng Funput, một số nền tảng bên thứ ba có thể xử lý dữ liệu theo chính sách riêng của họ, ví dụ:
+
+- Google Analytics trên website funput.app
+- GitHub (mã nguồn, bản phát hành, tương tác với kho lưu trữ)
+- Apple App Store hoặc Google Play khi bạn tải ứng dụng Funput
+- Nhà cung cấp dịch vụ email khi bạn gửi thư tới hello@funput.app
+
+Funput không kiểm soát chính sách quyền riêng tư của các bên thứ ba này.
+
+## 9. Quyền của bạn
+
+Tùy khu vực của bạn, bạn có thể có quyền yêu cầu:
+
+- Được biết chúng tôi xử lý những thông tin nào liên quan đến bạn
+- Yêu cầu chỉnh sửa hoặc xóa thông tin liên hệ bạn đã gửi cho chúng tôi
+- Rút lại sự đồng ý đối với việc nhận liên hệ tiếp theo (nếu đang áp dụng)
+
+Để thực hiện yêu cầu, hãy gửi email tới [hello@funput.app](mailto:hello@funput.app).
+
+## 10. Trẻ em
+
+Funput không hướng tới việc thu thập dữ liệu từ trẻ em một cách có chủ đích. Nếu bạn cho rằng chúng tôi đã nhận thông tin liên hệ của trẻ em qua email, hãy báo cho chúng tôi để được xem xét và xử lý.
+
+## 11. Thay đổi chính sách
+
+Chúng tôi có thể cập nhật chính sách này khi sản phẩm hoặc cách vận hành thay đổi. Ngày “Cập nhật lần cuối” ở đầu trang sẽ được điều chỉnh tương ứng. Việc tiếp tục sử dụng Funput hoặc website sau khi chính sách được cập nhật đồng nghĩa với việc bạn chấp nhận phiên bản mới, trong phạm vi pháp luật cho phép.
+
+## 12. Liên hệ
+
+Mọi câu hỏi về chính sách quyền riêng tư, vui lòng gửi tới [hello@funput.app](mailto:hello@funput.app).
diff --git a/src/index.html b/src/index.html
deleted file mode 100644
index 35deb3a..0000000
--- a/src/index.html
+++ /dev/null
@@ -1,183 +0,0 @@
-
-
-
-
- Funput — Bộ gõ tiếng Việt cho iOS, Android, macOS, Windows và Linux
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro
new file mode 100644
index 0000000..5a04576
--- /dev/null
+++ b/src/layouts/BaseLayout.astro
@@ -0,0 +1,73 @@
+---
+import '../styles/global.css';
+import Header from '../components/layout/Header.astro';
+import Footer from '../components/layout/Footer.astro';
+import SeoHead from '../components/seo/SeoHead.astro';
+import { GA_MEASUREMENT_ID } from '../lib/analytics';
+import { DEFAULT_DESCRIPTION, pageJsonLd } from '../lib/seo';
+import type { SeoInput } from '../lib/seo';
+
+interface Props extends SeoInput {
+ jsonLd?: Record | null;
+}
+
+const {
+ title,
+ description = DEFAULT_DESCRIPTION,
+ canonicalPath = '/',
+ ogImage,
+ ogType,
+ jsonLd,
+ noindex = false,
+ publishedTime,
+ modifiedTime,
+ iosBanner = false,
+} = Astro.props;
+---
+
+
+
+
+
+
+
+
+
+
+
+ {title}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layouts/ReadingLayout.astro b/src/layouts/ReadingLayout.astro
new file mode 100644
index 0000000..634f8e7
--- /dev/null
+++ b/src/layouts/ReadingLayout.astro
@@ -0,0 +1,110 @@
+---
+import BaseLayout from './BaseLayout.astro';
+import { articleJsonLd } from '../lib/seo';
+import { FUNPUT_CONSTANTS } from '../lib/constants';
+interface Props {
+ title: string;
+ seoTitle: string;
+ description: string;
+ canonicalPath: string;
+ category: string;
+ headings: { depth: number; slug: string; text: string }[];
+ dateLabel: string;
+ dateTime?: string;
+ updatedLabel?: string;
+ updatedTime?: string;
+ tags?: string[];
+ article?: boolean;
+}
+const {
+ title,
+ seoTitle,
+ description,
+ canonicalPath,
+ category,
+ headings,
+ dateLabel,
+ dateTime,
+ updatedLabel,
+ updatedTime,
+ tags = [],
+ article = false,
+} = Astro.props;
+const contents = headings.filter((heading) => heading.depth === 2);
+---
+
+
+
+
+
+
+
diff --git a/src/lib/analytics.ts b/src/lib/analytics.ts
new file mode 100644
index 0000000..cc038c5
--- /dev/null
+++ b/src/lib/analytics.ts
@@ -0,0 +1,2 @@
+/** Public Google Analytics measurement ID used on funput.app (website only). */
+export const GA_MEASUREMENT_ID = 'G-9XL04DJJM7';
diff --git a/src/app/constants.ts b/src/lib/constants.ts
similarity index 61%
rename from src/app/constants.ts
rename to src/lib/constants.ts
index 72118e9..06e3a43 100644
--- a/src/app/constants.ts
+++ b/src/lib/constants.ts
@@ -1,4 +1,5 @@
export const FUNPUT_CONSTANTS = {
+ SITE_URL: 'https://funput.app',
GITHUB_URL: 'https://github.com/Funput/Funput',
DOCS_URL: 'https://docs.funput.app/',
INSTALL_DOCS_URL: 'https://docs.funput.app/docs/install/',
@@ -7,6 +8,9 @@ export const FUNPUT_CONSTANTS = {
CONTACT_EMAIL: 'hello@funput.app',
RELEASES_URL: 'https://github.com/Funput/Funput/releases',
IOS_APP_STORE_URL: 'https://apps.apple.com/vn/app/id6788829996',
- ANDROID_PLAY_STORE_URL:
- 'https://play.google.com/store/apps/details?id=app.funput.funput',
-};
+ ANDROID_PLAY_STORE_URL: 'https://play.google.com/store/apps/details?id=app.funput.funput',
+ OG_IMAGE_PATH: '/og-image.webp',
+ LICENSE_URL: 'https://github.com/Funput/Funput/blob/main/LICENSE',
+} as const;
+
+export type FunputConstants = typeof FUNPUT_CONSTANTS;
diff --git a/src/lib/desktop.ts b/src/lib/desktop.ts
new file mode 100644
index 0000000..088d3e7
--- /dev/null
+++ b/src/lib/desktop.ts
@@ -0,0 +1,149 @@
+export const DESKTOP = {
+ macos: {
+ title: 'Funput cho macOS — Bộ gõ tiếng Việt Telex & VNI trên Mac',
+ description:
+ 'Tải Funput cho Mac miễn phí. Bộ gõ tiếng Việt Telex, VNI cho macOS 26 trở lên, hỗ trợ Apple Silicon và Intel. Cài bằng .pkg hoặc .app.zip, mã nguồn mở.',
+ headline: 'Gõ tiếng Việt.',
+ accent: 'Rất Mac.',
+ lead: 'Một bộ gõ thân thuộc, trong một trải nghiệm rất Mac. Telex và VNI hòa vào nhịp làm việc hằng ngày của bạn.',
+ os: 'macOS 26 (Tahoe) trở lên',
+ requirements:
+ 'Apple Silicon hoặc Intel. Bản .pkg cần quyền admin; bản .app.zip có thể cài cho tài khoản hiện tại.',
+ features: [
+ [
+ 'Tích hợp vào macOS',
+ 'Chọn Funput trong nguồn nhập của hệ thống và chuyển bộ gõ bằng phím tắt quen thuộc.',
+ ],
+ [
+ 'Telex, Telex+ & VNI',
+ 'Chọn kiểu gõ bạn thích, gõ tiếng Việt và chuyển mã giữa Unicode, TCVN3 hoặc VNI-Windows.',
+ ],
+ [
+ 'Hai cách cài trên Mac',
+ 'Dùng gói .pkg cho máy có quyền admin hoặc .app.zip để cài riêng cho tài khoản của bạn.',
+ ],
+ ],
+ steps: [
+ [
+ 'Tải bản dành cho Mac',
+ 'Mở GitHub Releases, chọn tệp .pkg hoặc .app.zip của bản phát hành bạn muốn cài.',
+ ],
+ [
+ 'Cài và thêm nguồn nhập',
+ 'Làm theo tài liệu cài đặt, sau đó mở System Settings → Keyboard → Input Sources → Vietnamese và thêm Funput.',
+ ],
+ [
+ 'Chuyển sang Funput',
+ 'Chọn Funput trong menu nguồn nhập và chọn Telex hoặc VNI. Nếu chưa thấy Funput, đăng xuất rồi đăng nhập lại.',
+ ],
+ ],
+ questions: [
+ [
+ 'Funput có chạy trên Mac Intel không?',
+ 'Có. Bản macOS là universal binary cho cả Apple Silicon và Intel; yêu cầu macOS 26 (Tahoe) trở lên.',
+ ],
+ [
+ 'Cài Funput trên Mac có cần quyền admin không?',
+ 'Gói .pkg cần quyền admin. Nếu dùng tài khoản Standard, chọn .app.zip và làm theo hướng dẫn cài cho tài khoản hiện tại.',
+ ],
+ ],
+ },
+ windows: {
+ title: 'Funput cho Windows 10 & 11 — Bộ gõ tiếng Việt miễn phí',
+ description:
+ 'Tải Funput cho Windows 10 và Windows 11. Bộ gõ tiếng Việt Telex, VNI miễn phí, mã nguồn mở, bản .exe portable cho x86-64. Hỗ trợ Windows 10 từ phiên bản 1809.',
+ headline: 'Mở lên.',
+ accent: 'Gõ tiếng Việt.',
+ lead: 'Từ dòng tin nhắn đến trang tài liệu. Funput mang Telex và VNI đến Windows, gọn trong một ứng dụng ở khay hệ thống.',
+ os: 'Windows 10 phiên bản 1809 trở lên · Windows 11',
+ requirements:
+ 'Bản x86-64, một tệp .exe portable. Windows on ARM chạy qua mô phỏng; chưa có bản ARM riêng.',
+ features: [
+ [
+ 'Một tệp, bắt đầu ngay',
+ 'Bản .exe portable hoạt động từ khay hệ thống. Không cần thêm nguồn nhập vào Windows.',
+ ],
+ [
+ 'Kiểu gõ quen tay',
+ 'Hỗ trợ Telex, Telex+ và VNI; chuyển mã văn bản giữa Unicode, TCVN3 và VNI-Windows.',
+ ],
+ [
+ 'Theo nhịp làm việc',
+ 'Giao diện riêng cho Windows, với tùy chọn khởi động cùng máy để bộ gõ luôn sẵn sàng.',
+ ],
+ ],
+ steps: [
+ [
+ 'Tải Funput.exe',
+ 'Mở GitHub Releases và chọn tệp .exe dành cho Windows. Lưu vào thư mục bạn muốn giữ ứng dụng.',
+ ],
+ [
+ 'Mở ứng dụng',
+ 'Chạy Funput.exe. Funput xuất hiện ở khay hệ thống để bạn mở cài đặt và điều khiển bộ gõ.',
+ ],
+ [
+ 'Chọn kiểu gõ',
+ 'Chọn Telex hoặc VNI rồi thử gõ tiếng Việt. Bạn có thể bật khởi động cùng Windows trong cài đặt.',
+ ],
+ ],
+ questions: [
+ [
+ 'Funput hỗ trợ Windows nào?',
+ 'Funput hỗ trợ Windows 10 từ phiên bản 1809 (build 17763) và Windows 11. Bản phát hành dành cho x86-64.',
+ ],
+ [
+ 'Có cần cài đặt bằng MSI không?',
+ 'Không. Bản Windows hiện được phát hành dưới dạng .exe portable, chưa có bộ cài MSI.',
+ ],
+ ],
+ },
+ linux: {
+ title: 'Funput cho Linux — Bộ gõ tiếng Việt Fcitx5 & IBus',
+ description:
+ 'Cài Funput cho Linux: bộ gõ tiếng Việt Telex, VNI với Fcitx5 hoặc IBus. Hỗ trợ Ubuntu, Debian, Fedora, openSUSE và Arch trên x86-64. Miễn phí, mã nguồn mở.',
+ headline: 'Linux của bạn.',
+ accent: 'Tiếng Việt của bạn.',
+ lead: 'Dù bạn chọn Fcitx5 hay IBus, cách gõ vẫn quen thuộc. Funput đưa Telex và VNI vào môi trường Linux bạn yêu thích.',
+ os: 'Linux x86-64 · Fcitx5 hoặc IBus',
+ requirements:
+ 'Debian/Ubuntu (.deb), Fedora/openSUSE (.rpm) và Arch (pacman). Chọn framework phù hợp với phiên desktop của bạn.',
+ features: [
+ [
+ 'Fcitx5 hoặc IBus',
+ 'Fcitx5 là lựa chọn mặc định của trình cài. Bạn cũng có thể chọn IBus cho môi trường đã cấu hình sẵn.',
+ ],
+ [
+ 'Nhiều bản phân phối',
+ 'Có hướng dẫn và gói cài cho Ubuntu, Debian, Fedora, openSUSE và Arch trên x86-64.',
+ ],
+ [
+ 'Cùng một cách gõ',
+ 'Telex, Telex+ và VNI; hỗ trợ chuyển mã Unicode, TCVN3 và VNI-Windows trong giao diện cài đặt.',
+ ],
+ ],
+ steps: [
+ [
+ 'Chọn cách cài',
+ 'Mở tài liệu Linux để chọn gói theo bản phân phối và framework Fcitx5 hoặc IBus.',
+ ],
+ [
+ 'Cấu hình phiên desktop',
+ 'Làm theo hướng dẫn cho desktop và Wayland hoặc X11 đang dùng. Với Fcitx5 ngoài KDE, cần cấu hình môi trường cho phiên đăng nhập.',
+ ],
+ [
+ 'Thêm Funput',
+ 'Thêm Funput trong Fcitx5 Configuration hoặc Input Sources của IBus. Đăng xuất rồi đăng nhập lại theo hướng dẫn và chọn kiểu gõ.',
+ ],
+ ],
+ questions: [
+ [
+ 'Funput dùng được trên Ubuntu và Fedora không?',
+ 'Có. Tài liệu hướng dẫn các gói Debian/Ubuntu (.deb), Fedora/openSUSE (.rpm) và Arch (pacman), với bản phát hành x86-64.',
+ ],
+ [
+ 'Nên chọn Fcitx5 hay IBus?',
+ 'Fcitx5 là lựa chọn được khuyến nghị trong tài liệu Funput. IBus phù hợp nếu bạn muốn giữ framework đã được cấu hình trong GNOME/Ubuntu. Xem hướng dẫn theo desktop trước khi cài.',
+ ],
+ ],
+ },
+} as const;
diff --git a/src/lib/platforms.ts b/src/lib/platforms.ts
new file mode 100644
index 0000000..a7b4b85
--- /dev/null
+++ b/src/lib/platforms.ts
@@ -0,0 +1,121 @@
+import { FUNPUT_CONSTANTS } from './constants';
+
+export type PlatformId = 'macos' | 'windows' | 'linux' | 'ios' | 'android';
+
+export type Platform = {
+ id: PlatformId;
+ name: string;
+ blurb: string;
+ bullets: string[];
+ badge: string;
+ iconSrc: string;
+ iconAlt: string;
+ screenshotSrc: string;
+ screenshotAlt: string;
+ screenshotWidth: number;
+ screenshotHeight: number;
+ /** Narrow phone-style screenshot framing */
+ phoneFrame?: boolean;
+ ctaLabel: string;
+ ctaHref: string;
+};
+
+export const PLATFORMS: Platform[] = [
+ {
+ id: 'macos',
+ name: 'macOS',
+ blurb: 'Gắn vào hệ thống Mac như bộ gõ mặc định — gõ tiếng Việt trong mọi ứng dụng.',
+ bullets: [
+ 'Cần macOS 26 (Tahoe) trở lên',
+ 'Chạy trên Mac Apple Silicon và Intel',
+ 'Bản .app.zip không cần quyền admin',
+ ],
+ badge: 'Sẵn sàng',
+ iconSrc: '/apple.svg',
+ iconAlt: 'Apple',
+ screenshotSrc: '/brand/screenshots/macos.png',
+ screenshotAlt: 'Giao diện Funput trên macOS',
+ screenshotWidth: 960,
+ screenshotHeight: 756,
+ ctaLabel: 'Tải bản .pkg / .zip',
+ ctaHref: FUNPUT_CONSTANTS.RELEASES_URL,
+ },
+ {
+ id: 'windows',
+ name: 'Windows',
+ blurb: 'Nhẹ, ít tốn tài nguyên — mở lên là gõ tiếng Việt ngay.',
+ bullets: [
+ 'Cần Windows 10 phiên bản 1809 trở lên · Windows 11',
+ 'Dùng ít RAM',
+ 'Giao diện làm riêng cho Windows',
+ ],
+ badge: 'Sẵn sàng',
+ iconSrc: '/windows.svg',
+ iconAlt: 'Windows',
+ screenshotSrc: '/brand/screenshots/windows.png',
+ screenshotAlt: 'Giao diện Funput trên Windows',
+ screenshotWidth: 960,
+ screenshotHeight: 756,
+ ctaLabel: 'Tải bản .exe',
+ ctaHref: FUNPUT_CONSTANTS.RELEASES_URL,
+ },
+ {
+ id: 'linux',
+ name: 'Linux',
+ blurb: 'Dùng được với Fcitx5 hoặc IBus — cùng một cách gõ tiếng Việt quen thuộc.',
+ bullets: [
+ 'Tương thích Fcitx5 và IBus',
+ 'Bản phát hành cho máy x86-64',
+ 'Có gói cài riêng cho từng bộ gõ hệ thống',
+ ],
+ badge: 'Sẵn sàng',
+ iconSrc: '/linux.svg',
+ iconAlt: 'Linux',
+ screenshotSrc: '/brand/screenshots/linux.png',
+ screenshotAlt: 'Giao diện Funput trên Linux',
+ screenshotWidth: 960,
+ screenshotHeight: 878,
+ ctaLabel: 'Xem hướng dẫn cài đặt',
+ ctaHref: FUNPUT_CONSTANTS.LINUX_DOCS_URL,
+ },
+ {
+ id: 'ios',
+ name: 'iOS',
+ blurb: 'Bàn phím tiếng Việt cho iPhone và iPad.',
+ bullets: [
+ 'Gõ Telex và VNI',
+ 'Cần iOS 18.6 trở lên',
+ 'Liquid Glass trên iOS 26; vẫn dùng tốt từ iOS 18.6',
+ ],
+ badge: 'Sẵn sàng',
+ iconSrc: '/ios.svg',
+ iconAlt: 'iOS',
+ screenshotSrc: '/brand/screenshots/ios.png',
+ screenshotAlt: 'Bàn phím Funput trên iOS',
+ screenshotWidth: 420,
+ screenshotHeight: 884,
+ phoneFrame: true,
+ ctaLabel: 'Tải trên App Store',
+ ctaHref: FUNPUT_CONSTANTS.IOS_APP_STORE_URL,
+ },
+ {
+ id: 'android',
+ name: 'Android',
+ blurb: 'Bàn phím tiếng Việt cho điện thoại và máy tính bảng Android.',
+ bullets: [
+ 'Cần Android 8.0 (API 26) trở lên',
+ 'Gõ Telex và VNI',
+ 'Giao diện làm riêng cho Android',
+ ],
+ badge: 'Sẵn sàng',
+ iconSrc: '/android.svg',
+ iconAlt: 'Android',
+ screenshotSrc: '/brand/screenshots/android.png',
+ screenshotAlt: 'Bàn phím Funput trên Android',
+ screenshotWidth: 420,
+ screenshotHeight: 884,
+ phoneFrame: true,
+ ctaLabel: 'Tải trên Google Play',
+ ctaHref: FUNPUT_CONSTANTS.ANDROID_PLAY_STORE_URL,
+ },
+];
diff --git a/src/lib/seo.ts b/src/lib/seo.ts
new file mode 100644
index 0000000..ca01186
--- /dev/null
+++ b/src/lib/seo.ts
@@ -0,0 +1,232 @@
+import { FUNPUT_CONSTANTS as links } from './constants';
+import { PLATFORMS, type PlatformId } from './platforms';
+import { DESKTOP } from './desktop';
+
+export const DEFAULT_DESCRIPTION =
+ 'Funput là bộ gõ tiếng Việt miễn phí, mã nguồn mở. Gõ Telex và VNI trên iPhone, iPad, Android, macOS, Windows và Linux. Tải từ App Store, Google Play hoặc GitHub.';
+export const HOME_TITLE = 'Funput — Bộ gõ tiếng Việt cho iOS, Android, macOS, Windows và Linux';
+
+/** Page URLs match Astro's directory output and sitemap. Asset URLs are left intact. */
+export function absoluteUrl(path = '/'): string {
+ return new URL(path, `${links.SITE_URL}/`).href;
+}
+export function canonicalUrl(path = '/'): string {
+ const url = new URL(path, links.SITE_URL);
+ url.search = '';
+ url.hash = '';
+ url.pathname = `${url.pathname.replace(/\/+$/, '')}/`;
+ return url.href;
+}
+export function ogImageUrl(path: string = links.OG_IMAGE_PATH): string {
+ return absoluteUrl(path);
+}
+export type SeoInput = {
+ title: string;
+ description?: string;
+ canonicalPath?: string;
+ ogImage?: string;
+ ogType?: 'website' | 'article';
+ noindex?: boolean;
+ publishedTime?: string;
+ modifiedTime?: string;
+ iosBanner?: boolean;
+};
+export function buildSeo(input: SeoInput) {
+ const url = canonicalUrl(input.canonicalPath ?? '/');
+ return {
+ ...input,
+ description: input.description ?? DEFAULT_DESCRIPTION,
+ canonical: url,
+ ogType: input.ogType ?? 'website',
+ ogImage: ogImageUrl(input.ogImage),
+ url,
+ };
+}
+
+const organizationId = `${links.SITE_URL}/#organization`;
+const websiteId = `${links.SITE_URL}/#website`;
+const softwareId = `${links.SITE_URL}/#software`;
+const identity = () => [
+ {
+ '@type': 'Organization',
+ '@id': organizationId,
+ name: 'Funput',
+ url: canonicalUrl(),
+ logo: absoluteUrl('/brand/logo.png'),
+ email: links.CONTACT_EMAIL,
+ sameAs: [links.GITHUB_URL, links.FACEBOOK_URL],
+ },
+ {
+ '@type': 'WebSite',
+ '@id': websiteId,
+ name: 'Funput',
+ alternateName: 'Funput IME',
+ url: canonicalUrl(),
+ inLanguage: 'vi',
+ publisher: { '@id': organizationId },
+ },
+];
+export function pageJsonLd(input: SeoInput) {
+ const seo = buildSeo(input);
+ return {
+ '@context': 'https://schema.org',
+ '@graph': [
+ ...identity(),
+ {
+ '@type': input.canonicalPath === '/blog' ? 'CollectionPage' : 'WebPage',
+ '@id': `${seo.url}#webpage`,
+ url: seo.url,
+ name: seo.title,
+ description: seo.description,
+ inLanguage: 'vi',
+ isPartOf: { '@id': websiteId },
+ primaryImageOfPage: { '@type': 'ImageObject', url: seo.ogImage },
+ },
+ ],
+ };
+}
+export function mobileAppJsonLd(platform: 'ios' | 'android') {
+ const ios = platform === 'ios';
+ const storeUrl = ios ? links.IOS_APP_STORE_URL : links.ANDROID_PLAY_STORE_URL;
+ return {
+ '@type': 'MobileApplication',
+ '@id': `${canonicalUrl(`/${platform}`)}#app`,
+ name: 'Funput: Bàn phím tiếng Việt',
+ alternateName: `Funput ${ios ? 'iOS' : 'Android'}`,
+ url: canonicalUrl(`/${platform}`),
+ description: ios
+ ? 'Bàn phím tiếng Việt Funput cho iPhone và iPad, hỗ trợ Telex và VNI.'
+ : 'Bàn phím tiếng Việt Funput cho điện thoại và máy tính bảng Android, hỗ trợ Telex và VNI.',
+ applicationCategory: 'UtilitiesApplication',
+ applicationSubCategory: 'Vietnamese keyboard',
+ operatingSystem: ios ? 'iOS 18.6+, iPadOS 18.6+' : 'Android 8.0+',
+ identifier: ios ? '6788829996' : 'app.funput.funput',
+ installUrl: storeUrl,
+ downloadUrl: storeUrl,
+ sameAs: [storeUrl],
+ image: absoluteUrl('/brand/logo.png'),
+ screenshot: absoluteUrl(`/brand/screenshots/${platform}.png`),
+ featureList: ['Telex', 'VNI', 'Vietnamese keyboard'],
+ isAccessibleForFree: true,
+ license: links.LICENSE_URL,
+ publisher: { '@id': organizationId },
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD', url: storeUrl },
+ };
+}
+export function platformAppJsonLd(id: PlatformId) {
+ if (id === 'ios' || id === 'android') return mobileAppJsonLd(id);
+ const platform = PLATFORMS.find((p) => p.id === id)!;
+ const content = DESKTOP[id];
+ return {
+ '@type': 'SoftwareApplication',
+ '@id': `${canonicalUrl(`/${id}`)}#app`,
+ name: `Funput cho ${platform.name}`,
+ alternateName: `Funput Vietnamese Input Method for ${platform.name}`,
+ url: canonicalUrl(`/${id}`),
+ description: content.description,
+ applicationCategory: 'UtilitiesApplication',
+ applicationSubCategory: 'Vietnamese input method',
+ operatingSystem: content.os,
+ softwareRequirements: content.requirements,
+ downloadUrl: links.RELEASES_URL,
+ installUrl: `${links.INSTALL_DOCS_URL}${id}/`,
+ softwareHelp: { '@type': 'WebPage', url: `${links.INSTALL_DOCS_URL}${id}/` },
+ image: absoluteUrl('/brand/logo.png'),
+ screenshot: absoluteUrl(platform.screenshotSrc),
+ featureList: ['Telex', 'Telex+', 'VNI', ...content.features.map(([title]) => title)],
+ isAccessibleForFree: true,
+ license: links.LICENSE_URL,
+ publisher: { '@id': organizationId },
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD', url: links.RELEASES_URL },
+ };
+}
+export function homeJsonLd() {
+ const page = pageJsonLd({ title: HOME_TITLE, description: DEFAULT_DESCRIPTION });
+ return {
+ ...page,
+ '@graph': [
+ ...page['@graph'],
+ {
+ '@type': 'SoftwareApplication',
+ '@id': softwareId,
+ name: 'Funput',
+ alternateName: ['Funput IME', 'Bộ gõ Funput', 'Funput Vietnamese Input Method'],
+ url: canonicalUrl(),
+ description: DEFAULT_DESCRIPTION,
+ applicationCategory: 'UtilitiesApplication',
+ applicationSubCategory: 'Vietnamese input method',
+ operatingSystem: ['iOS', 'Android', 'macOS', 'Windows', 'Linux'],
+ featureList: ['Telex', 'VNI', 'Open source', 'On-device input processing'],
+ isAccessibleForFree: true,
+ license: links.LICENSE_URL,
+ image: absoluteUrl('/brand/logo.png'),
+ downloadUrl: links.RELEASES_URL,
+ softwareHelp: { '@type': 'WebPage', url: links.DOCS_URL },
+ publisher: { '@id': organizationId },
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD', url: links.RELEASES_URL },
+ },
+ ...PLATFORMS.map((p) => platformAppJsonLd(p.id)),
+ ],
+ };
+}
+export function platformPageJsonLd(platform: PlatformId, title: string, description: string) {
+ const page = pageJsonLd({ title, description, canonicalPath: `/${platform}` });
+ const url = canonicalUrl(`/${platform}`);
+ return {
+ ...page,
+ '@graph': [
+ ...page['@graph'].map((node) =>
+ node['@type'] === 'WebPage' ? { ...node, mainEntity: { '@id': `${url}#app` } } : node,
+ ),
+ platformAppJsonLd(platform),
+ {
+ '@type': 'BreadcrumbList',
+ itemListElement: [
+ { '@type': 'ListItem', position: 1, name: 'Funput', item: canonicalUrl() },
+ {
+ '@type': 'ListItem',
+ position: 2,
+ name: `Funput cho ${PLATFORMS.find((p) => p.id === platform)!.name}`,
+ item: url,
+ },
+ ],
+ },
+ ],
+ };
+}
+export function articleJsonLd(input: SeoInput & { publishedTime: string }) {
+ const page = pageJsonLd(input);
+ const seo = buildSeo(input);
+ return {
+ ...page,
+ '@graph': [
+ ...page['@graph'],
+ {
+ '@type': 'BlogPosting',
+ '@id': `${seo.url}#article`,
+ headline: input.title,
+ description: seo.description,
+ image: [seo.ogImage],
+ inLanguage: 'vi',
+ mainEntityOfPage: { '@id': `${seo.url}#webpage` },
+ datePublished: input.publishedTime,
+ dateModified: input.modifiedTime ?? input.publishedTime,
+ author: {
+ '@type': 'Organization',
+ '@id': organizationId,
+ name: 'Funput',
+ url: canonicalUrl(),
+ },
+ publisher: { '@id': organizationId },
+ },
+ {
+ '@type': 'BreadcrumbList',
+ itemListElement: [
+ { '@type': 'ListItem', position: 1, name: 'Funput', item: canonicalUrl() },
+ { '@type': 'ListItem', position: 2, name: 'Blog', item: canonicalUrl('/blog') },
+ { '@type': 'ListItem', position: 3, name: input.title, item: seo.url },
+ ],
+ },
+ ],
+ };
+}
diff --git a/src/main.server.ts b/src/main.server.ts
deleted file mode 100644
index 723e001..0000000
--- a/src/main.server.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import { BootstrapContext, bootstrapApplication } from '@angular/platform-browser';
-import { App } from './app/app';
-import { config } from './app/app.config.server';
-
-const bootstrap = (context: BootstrapContext) =>
- bootstrapApplication(App, config, context);
-
-export default bootstrap;
diff --git a/src/main.ts b/src/main.ts
deleted file mode 100644
index 5df75f9..0000000
--- a/src/main.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { bootstrapApplication } from '@angular/platform-browser';
-import { appConfig } from './app/app.config';
-import { App } from './app/app';
-
-bootstrapApplication(App, appConfig)
- .catch((err) => console.error(err));
diff --git a/src/pages/404.astro b/src/pages/404.astro
new file mode 100644
index 0000000..5950a43
--- /dev/null
+++ b/src/pages/404.astro
@@ -0,0 +1,35 @@
+---
+import BaseLayout from '../layouts/BaseLayout.astro';
+---
+
+
+
+ 404 / LẠC MỘT NHỊP
+
+ Trang này
+
+ chưa có chữ.
+
+ Liên kết có thể đã thay đổi hoặc trang không còn tồn tại.
+
+ Về trang chủ ↗
+
+
+
+
diff --git a/src/pages/[platform].astro b/src/pages/[platform].astro
new file mode 100644
index 0000000..4b5f5d2
--- /dev/null
+++ b/src/pages/[platform].astro
@@ -0,0 +1,11 @@
+---
+import MobilePlatform from '../components/MobilePlatform.astro';
+import DesktopPlatform from '../components/DesktopPlatform.astro';
+import { PLATFORMS, type PlatformId } from '../lib/platforms';
+export function getStaticPaths() {
+ return PLATFORMS.map(({ id }) => ({ params: { platform: id } }));
+}
+const id = Astro.params.platform as PlatformId;
+---
+
+{id === 'ios' || id === 'android' ? : }
diff --git a/src/pages/blog/[id].astro b/src/pages/blog/[id].astro
new file mode 100644
index 0000000..1db052a
--- /dev/null
+++ b/src/pages/blog/[id].astro
@@ -0,0 +1,39 @@
+---
+import { getCollection, render } from 'astro:content';
+import type { CollectionEntry } from 'astro:content';
+import ReadingLayout from '../../layouts/ReadingLayout.astro';
+
+export async function getStaticPaths() {
+ const posts = await getCollection('blog', ({ data }) => !data.draft);
+ return posts.map((post) => ({ params: { id: post.id }, props: { post } }));
+}
+interface Props {
+ post: CollectionEntry<'blog'>;
+}
+const { post } = Astro.props;
+const { Content, headings } = await render(post);
+const formatDate = (date: Date) =>
+ date.toLocaleDateString('vi-VN', {
+ year: 'numeric',
+ month: 'long',
+ day: 'numeric',
+ timeZone: 'UTC',
+ });
+---
+
+
+
+
diff --git a/src/pages/blog/index.astro b/src/pages/blog/index.astro
new file mode 100644
index 0000000..bcd2d92
--- /dev/null
+++ b/src/pages/blog/index.astro
@@ -0,0 +1,418 @@
+---
+import { getCollection } from 'astro:content';
+import BaseLayout from '../../layouts/BaseLayout.astro';
+import { FUNPUT_CONSTANTS as links } from '../../lib/constants';
+const posts = (await getCollection('blog'))
+ .filter((post) => !post.data.draft)
+ .sort((a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf());
+const formatDate = (date: Date) =>
+ date.toLocaleDateString('vi-VN', {
+ year: 'numeric',
+ month: 'long',
+ day: 'numeric',
+ timeZone: 'UTC',
+ });
+---
+
+
+
+
+
+
GHI CHÉP TỪ FUNPUT
+
+ Sau mỗi
+ phím gõ.
+
+
+ Những điều đang làm. Những điều học được.
+
+ Và những câu chuyện trên hành trình xây dựng Funput.
+
+
+
+
+
+
FUNPUT JOURNAL
+
+ Chuyện
+
+ con chữ.
+
+
+
GHI LẠI ĐỂ CÙNG ĐI XA HƠN ↗
+
+
✳
+
+
+
+
+
Bài viết mới nhất
+ {String(posts.length).padStart(2, '0')} BÀI VIẾT
+
+ {posts.length === 0 ? (
+
+
+ …
+
+
+
TRANG MỚI ĐANG ĐƯỢC VIẾT
+
Câu chuyện sắp bắt đầu.
+
+ Chưa có bài viết được xuất bản. Trong lúc chờ, bạn có thể xem những cập nhật mới nhất
+ của Funput trên GitHub.
+
+
+ Xem cập nhật trên GitHub ↗
+
+
+
+ ) : (
+
+ {posts.map((post, index) => (
+
+
+
+ {String(index + 1).padStart(2, '0')}
+ {index === 0 ? 'MỚI NHẤT' : 'GHI CHÉP'}
+
+
+
+ {formatDate(post.data.pubDate)}
+
+
+
{post.data.description}
+
+ {post.data.tags.map((tag) => (
+ #{tag}
+ ))}
+
+
+
+
+ ))}
+
+ )}
+
+
+
+
+
diff --git a/src/pages/index.astro b/src/pages/index.astro
new file mode 100644
index 0000000..4d66cdd
--- /dev/null
+++ b/src/pages/index.astro
@@ -0,0 +1,14 @@
+---
+import BaseLayout from '../layouts/BaseLayout.astro';
+import HomeExperience from '../components/HomeExperience.astro';
+import { DEFAULT_DESCRIPTION, HOME_TITLE, homeJsonLd } from '../lib/seo';
+---
+
+
+
+
diff --git a/src/pages/privacy.astro b/src/pages/privacy.astro
new file mode 100644
index 0000000..03a2e1d
--- /dev/null
+++ b/src/pages/privacy.astro
@@ -0,0 +1,16 @@
+---
+import ReadingLayout from '../layouts/ReadingLayout.astro';
+import { Content, frontmatter, getHeadings } from '../content/privacy.md';
+---
+
+
+
+
diff --git a/src/server.ts b/src/server.ts
deleted file mode 100644
index 4bf0631..0000000
--- a/src/server.ts
+++ /dev/null
@@ -1,68 +0,0 @@
-import {
- AngularNodeAppEngine,
- createNodeRequestHandler,
- isMainModule,
- writeResponseToNodeResponse,
-} from '@angular/ssr/node';
-import express from 'express';
-import { join } from 'node:path';
-
-const browserDistFolder = join(import.meta.dirname, '../browser');
-
-const app = express();
-const angularApp = new AngularNodeAppEngine();
-
-/**
- * Example Express Rest API endpoints can be defined here.
- * Uncomment and define endpoints as necessary.
- *
- * Example:
- * ```ts
- * app.get('/api/{*splat}', (req, res) => {
- * // Handle API request
- * });
- * ```
- */
-
-/**
- * Serve static files from /browser
- */
-app.use(
- express.static(browserDistFolder, {
- maxAge: '1y',
- index: false,
- redirect: false,
- }),
-);
-
-/**
- * Handle all other requests by rendering the Angular application.
- */
-app.use((req, res, next) => {
- angularApp
- .handle(req)
- .then((response) =>
- response ? writeResponseToNodeResponse(response, res) : next(),
- )
- .catch(next);
-});
-
-/**
- * Start the server if this module is the main entry point, or it is ran via PM2.
- * The server listens on the port defined by the `PORT` environment variable, or defaults to 4000.
- */
-if (isMainModule(import.meta.url) || process.env['pm_id']) {
- const port = process.env['PORT'] || 4000;
- app.listen(port, (error) => {
- if (error) {
- throw error;
- }
-
- console.log(`Node Express server listening on http://localhost:${port}`);
- });
-}
-
-/**
- * Request handler used by the Angular CLI (for dev-server and during build) or Firebase Cloud Functions.
- */
-export const reqHandler = createNodeRequestHandler(app);
diff --git a/src/styles.css b/src/styles.css
deleted file mode 100644
index df3eb7b..0000000
--- a/src/styles.css
+++ /dev/null
@@ -1,49 +0,0 @@
-@import "tailwindcss";
-
-@theme {
- --color-brand-orange-50: #fff7ed;
- --color-brand-orange-100: #ffedd5;
- --color-brand-orange-500: #f97316;
- --color-brand-orange-600: #ea580c;
- --color-brand-orange-700: #c2410c;
-
- --color-brand-dark-950: #09090b;
- --color-brand-dark-900: #121214;
- --color-brand-dark-800: #1a1a1e;
- --color-brand-dark-700: #26262b;
- --color-brand-dark-600: #3f3f46;
-
- --color-brand-purple-500: #a855f7;
- --color-brand-pink-500: #ec4899;
-}
-
-/* Custom global styles */
-html {
- scroll-behavior: smooth;
- background-color: var(--color-brand-dark-950);
- color: #f4f4f5;
- font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
-}
-
-/* Custom scrollbar */
-::-webkit-scrollbar {
- width: 8px;
-}
-
-::-webkit-scrollbar-track {
- background: var(--color-brand-dark-950);
-}
-
-::-webkit-scrollbar-thumb {
- background: var(--color-brand-dark-700);
- border-radius: 4px;
-}
-
-::-webkit-scrollbar-thumb:hover {
- background: var(--color-brand-dark-600);
-}
-
-::selection {
- background-color: rgba(249, 115, 22, 0.3);
- color: #ffffff;
-}
diff --git a/src/styles/global.css b/src/styles/global.css
new file mode 100644
index 0000000..4e4d2d4
--- /dev/null
+++ b/src/styles/global.css
@@ -0,0 +1,400 @@
+@import '@fontsource/plus-jakarta-sans/800.css';
+@import '@fontsource/be-vietnam-pro/400.css';
+@import '@fontsource/be-vietnam-pro/500.css';
+@import '@fontsource/be-vietnam-pro/600.css';
+@import '@fontsource/be-vietnam-pro/700.css';
+@import 'tailwindcss';
+@plugin '@tailwindcss/typography';
+
+@theme {
+ --font-sans: 'Be Vietnam Pro', ui-sans-serif, system-ui, sans-serif;
+ --font-display: 'Plus Jakarta Sans', 'Be Vietnam Pro', sans-serif;
+}
+:root {
+ --paper: #f7f5ef;
+ --ink: #24251f;
+ --orange: #e94e25;
+ --line: #deded4;
+ --muted: #676b5e;
+ --sage: #e8eddb;
+}
+@layer base {
+ html {
+ background: var(--paper);
+ color: var(--ink);
+ scroll-behavior: smooth;
+ }
+ body {
+ font-family: var(--font-sans);
+ min-height: 100dvh;
+ -webkit-font-smoothing: antialiased;
+ }
+ a,
+ button {
+ touch-action: manipulation;
+ }
+ :focus-visible {
+ outline: 2px solid var(--orange);
+ outline-offset: 5px;
+ }
+ ::selection {
+ background: #e94e2533;
+ color: var(--ink);
+ }
+ [id] {
+ scroll-margin-top: 28px;
+ }
+}
+.site-wrap {
+ max-width: 1320px;
+ margin-inline: auto;
+ padding-inline: 52px;
+}
+.site-brand {
+ display: inline-flex;
+ align-items: center;
+ gap: 10px;
+ font-family: var(--font-display);
+ font-size: 33px;
+ font-weight: 800;
+ letter-spacing: -2px;
+}
+.site-brand img {
+ display: block;
+ width: 174px;
+ height: auto;
+}
+.page-eyebrow {
+ display: flex;
+ align-items: center;
+ gap: 9px;
+ font-size: 10px;
+ font-weight: 600;
+ letter-spacing: 1.5px;
+ text-transform: uppercase;
+}
+.page-eyebrow::before {
+ content: '';
+ width: 7px;
+ height: 7px;
+ background: var(--orange);
+ border-radius: 50%;
+ flex-shrink: 0;
+}
+.page-title {
+ font-size: clamp(44px, 6vw, 80px);
+ font-weight: 600;
+ line-height: 1.2;
+ letter-spacing: -3.5px;
+ overflow-wrap: anywhere;
+}
+.page-title em {
+ color: var(--orange);
+ font-style: normal;
+}
+.page-lead {
+ font-size: 15px;
+ line-height: 1.95;
+ color: var(--muted);
+ max-width: 620px;
+}
+.site-button {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ gap: 25px;
+ padding: 16px 23px;
+ background: var(--orange);
+ color: white;
+ border-radius: 6px;
+ font-size: 13px;
+ font-weight: 500;
+ transition:
+ transform 180ms,
+ background 180ms;
+}
+.site-button:hover {
+ transform: translateY(-2px);
+ background: #cf3c18;
+}
+.editorial-hero {
+ padding-block: 70px 54px;
+ border-bottom: 1px solid var(--line);
+}
+.editorial-hero .page-title {
+ margin-top: 28px;
+ max-width: 960px;
+}
+.editorial-hero .page-lead {
+ margin-top: 25px;
+}
+.breadcrumb {
+ display: inline-flex;
+ align-items: center;
+ gap: 10px;
+ font-size: 12px;
+ color: var(--muted);
+ margin-bottom: 30px;
+}
+.breadcrumb:hover {
+ color: var(--orange);
+}
+.article-meta {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 12px 24px;
+ font-size: 11px;
+ color: var(--muted);
+ margin-top: 27px;
+}
+.reading-grid {
+ display: grid;
+ grid-template-columns: 240px minmax(0, 760px);
+ gap: 70px;
+ padding-block: 60px 90px;
+}
+.reading-sidebar > div {
+ position: sticky;
+ top: 30px;
+}
+.reading-sidebar h2 {
+ font-size: 10px;
+ letter-spacing: 1.4px;
+ font-weight: 600;
+ margin-bottom: 18px;
+ text-transform: uppercase;
+}
+.reading-sidebar nav {
+ display: grid;
+ gap: 3px;
+}
+.reading-sidebar nav a {
+ font-size: 11px;
+ line-height: 1.7;
+ color: var(--muted);
+ padding-block: 7px;
+}
+.reading-sidebar nav a:hover {
+ color: var(--orange);
+}
+.reading-sidebar .sidebar-note {
+ font-size: 12px;
+ line-height: 1.9;
+ padding: 20px;
+ background: var(--sage);
+ border-radius: 8px;
+ margin-top: 25px;
+}
+.sidebar-note a {
+ text-decoration: underline;
+ text-underline-offset: 3px;
+ overflow-wrap: anywhere;
+}
+.reading-content {
+ min-width: 0;
+}
+.article-prose {
+ font-size: 15px;
+ line-height: 1.95;
+ color: #505449;
+ overflow-wrap: anywhere;
+}
+.article-prose > :first-child {
+ margin-top: 0;
+}
+.article-prose p,
+.article-prose ul,
+.article-prose ol,
+.article-prose blockquote,
+.article-prose pre,
+.article-prose table {
+ margin-block: 22px;
+}
+.article-prose h2 {
+ font-size: 25px;
+ font-weight: 600;
+ letter-spacing: -0.7px;
+ line-height: 1.4;
+ color: var(--ink);
+ margin: 48px 0 18px;
+}
+.article-prose h3 {
+ font-size: 20px;
+ font-weight: 600;
+ line-height: 1.5;
+ color: var(--ink);
+ margin: 32px 0 14px;
+}
+.article-prose h4 {
+ font-weight: 600;
+ margin-top: 25px;
+}
+.article-prose ul {
+ list-style: disc;
+ padding-left: 24px;
+}
+.article-prose ol {
+ list-style: decimal;
+ padding-left: 24px;
+}
+.article-prose li {
+ padding-left: 5px;
+ margin-block: 9px;
+}
+.article-prose li::marker {
+ color: var(--orange);
+}
+.article-prose a {
+ color: #ba3919;
+ text-decoration: underline;
+ text-underline-offset: 3px;
+}
+.article-prose a:hover {
+ color: var(--ink);
+}
+.article-prose strong {
+ color: var(--ink);
+ font-weight: 600;
+}
+.article-prose blockquote {
+ border-left: 3px solid var(--orange);
+ padding: 5px 24px;
+ background: #eeeede;
+}
+.article-prose pre {
+ padding: 22px;
+ border-radius: 8px;
+ overflow-x: auto;
+ font-size: 13px;
+}
+.article-prose :not(pre) > code {
+ background: #e8e8de;
+ border-radius: 4px;
+ padding: 2px 5px;
+ font-size: 0.9em;
+}
+.article-prose img {
+ max-width: 100%;
+ height: auto;
+ border-radius: 9px;
+ margin-block: 28px;
+}
+.article-prose img[alt^='Hướng dẫn iOS:'] {
+ display: block;
+ width: 320px;
+ margin-inline: auto;
+}
+.article-prose figcaption {
+ color: var(--muted);
+ font-size: 12px;
+ line-height: 1.8;
+ margin-top: -14px;
+ margin-bottom: 28px;
+}
+.article-prose table {
+ display: block;
+ overflow-x: auto;
+ border-collapse: collapse;
+}
+.article-prose th,
+.article-prose td {
+ padding: 12px;
+ border: 1px solid var(--line);
+ text-align: left;
+}
+.article-prose th {
+ min-width: 130px;
+}
+.article-prose th:nth-child(2) {
+ min-width: 240px;
+}
+.article-prose hr {
+ border-color: var(--line);
+ margin-block: 40px;
+}
+.article-end {
+ margin-top: 50px;
+ padding-top: 25px;
+ border-top: 1px solid var(--line);
+ display: flex;
+ justify-content: space-between;
+ flex-wrap: wrap;
+ gap: 20px;
+ font-size: 12px;
+}
+.article-end a:hover {
+ color: var(--orange);
+}
+@media (max-width: 1050px) {
+ .site-wrap {
+ padding-inline: 32px;
+ }
+ .reading-grid {
+ grid-template-columns: 200px minmax(0, 1fr);
+ gap: 36px;
+ }
+}
+@media (max-width: 760px) {
+ .site-wrap {
+ padding-inline: 24px;
+ }
+ .site-brand {
+ font-size: 28px;
+ }
+ .site-brand img {
+ width: 138px;
+ height: auto;
+ }
+ .page-title {
+ font-size: 44px;
+ letter-spacing: -2px;
+ }
+ .page-lead {
+ font-size: 13px;
+ }
+ .editorial-hero {
+ padding-block: 45px 38px;
+ }
+ .reading-grid {
+ grid-template-columns: minmax(0, 1fr);
+ gap: 35px;
+ padding-block: 35px 55px;
+ }
+ .reading-sidebar > div {
+ position: static;
+ }
+ .reading-sidebar nav {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ column-gap: 20px;
+ }
+ .reading-sidebar .sidebar-note {
+ margin-top: 18px;
+ }
+ .article-prose {
+ font-size: 14px;
+ }
+ .article-prose h2 {
+ font-size: 23px;
+ margin-top: 36px;
+ }
+}
+@media (max-width: 370px) {
+ .site-wrap {
+ padding-inline: 18px;
+ }
+ .page-title {
+ font-size: 38px;
+ }
+}
+@media (prefers-reduced-motion: reduce) {
+ html {
+ scroll-behavior: auto;
+ }
+ *,
+ *::before,
+ *::after {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ }
+}
diff --git a/tsconfig.app.json b/tsconfig.app.json
deleted file mode 100644
index ef19921..0000000
--- a/tsconfig.app.json
+++ /dev/null
@@ -1,17 +0,0 @@
-/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
-/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
-{
- "extends": "./tsconfig.json",
- "compilerOptions": {
- "outDir": "./out-tsc/app",
- "types": [
- "node"
- ]
- },
- "include": [
- "src/**/*.ts"
- ],
- "exclude": [
- "src/**/*.spec.ts"
- ]
-}
diff --git a/tsconfig.json b/tsconfig.json
index d2fbb9c..8bf91d3 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,31 +1,5 @@
-/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
-/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
{
- "compileOnSave": false,
- "compilerOptions": {
- "noImplicitOverride": true,
- "noPropertyAccessFromIndexSignature": true,
- "noImplicitReturns": true,
- "noFallthroughCasesInSwitch": true,
- "skipLibCheck": true,
- "isolatedModules": true,
- "experimentalDecorators": true,
- "importHelpers": true,
- "target": "ES2022",
- "module": "preserve"
- },
- "angularCompilerOptions": {
- "enableI18nLegacyMessageIdFormat": false,
- "strictInjectionParameters": true,
- "strictInputAccessModifiers": true
- },
- "files": [],
- "references": [
- {
- "path": "./tsconfig.app.json"
- },
- {
- "path": "./tsconfig.spec.json"
- }
- ]
+ "extends": "astro/tsconfigs/strict",
+ "include": [".astro/types.d.ts", "**/*"],
+ "exclude": ["dist"]
}
diff --git a/tsconfig.spec.json b/tsconfig.spec.json
deleted file mode 100644
index d383706..0000000
--- a/tsconfig.spec.json
+++ /dev/null
@@ -1,15 +0,0 @@
-/* To learn more about Typescript configuration file: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html. */
-/* To learn more about Angular compiler options: https://angular.dev/reference/configs/angular-compiler-options. */
-{
- "extends": "./tsconfig.json",
- "compilerOptions": {
- "outDir": "./out-tsc/spec",
- "types": [
- "vitest/globals"
- ]
- },
- "include": [
- "src/**/*.d.ts",
- "src/**/*.spec.ts"
- ]
-}