diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..ff8253f --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [HuakunShen] \ No newline at end of file diff --git a/.github/workflows/ci-pack.yml b/.github/workflows/ci-pack.yml new file mode 100644 index 0000000..c7025d7 --- /dev/null +++ b/.github/workflows/ci-pack.yml @@ -0,0 +1,29 @@ +name: CI Build and Pack + +on: + push: + branches: ["main", "dev"] + pull_request: + branches: ["main"] + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [20.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v4 + with: + submodules: "true" + - uses: pnpm/action-setup@v4 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: "pnpm" + - run: npm run build:docker diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..5ad48d2 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,30 @@ +name: CI Build & Test + +on: + push: + branches: ["main", "dev"] + pull_request: + branches: ["main"] + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [20.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v4 + with: + submodules: "true" + - uses: pnpm/action-setup@v4 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v3 + with: + node-version: ${{ matrix.node-version }} + cache: "pnpm" + - run: pnpm i + - run: pnpm build diff --git a/.github/workflows/upload-extensions.yml b/.github/workflows/upload-extensions.yml new file mode 100644 index 0000000..c98ca31 --- /dev/null +++ b/.github/workflows/upload-extensions.yml @@ -0,0 +1,34 @@ +name: CI Build & Upload Extensions + +on: + push: + branches: ["main", "dev"] + workflow_dispatch: + +jobs: + upload-extensions: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: "true" + - uses: pnpm/action-setup@v4 + - name: Use Node.js 20.x + uses: actions/setup-node@v3 + with: + node-version: 20.x + cache: "pnpm" + - uses: oven-sh/setup-bun@v1 + with: + bun-version: 1.1.10 + - run: pnpm i + - name: Docker Build and Uplad Extensions + env: + SUPABASE_PROJECT_REF: ${{ secrets.SUPABASE_PROJECT_REF }} + SUPABASE_URL: ${{ secrets.SUPABASE_URL }} + SUPABASE_SERVICE_ROLE_KEY: ${{ secrets.SUPABASE_SERVICE_ROLE_KEY }} + S3_ENDPOINT: ${{ secrets.S3_ENDPOINT }} + S3_ACCESS_KEY_ID: ${{ secrets.S3_ACCESS_KEY_ID }} + S3_SECRET_ACCESS_KEY: ${{ secrets.S3_SECRET_ACCESS_KEY }} + run: | + pnpm --filter ci build-upload diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9b0ae45 --- /dev/null +++ b/.gitignore @@ -0,0 +1,177 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store +.turbo +.vscode \ No newline at end of file diff --git a/ci/.gitignore b/ci/.gitignore new file mode 100644 index 0000000..9b1ee42 --- /dev/null +++ b/ci/.gitignore @@ -0,0 +1,175 @@ +# Based on https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore + +# Logs + +logs +_.log +npm-debug.log_ +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Caches + +.cache + +# Diagnostic reports (https://nodejs.org/api/report.html) + +report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json + +# Runtime data + +pids +_.pid +_.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover + +lib-cov + +# Coverage directory used by tools like istanbul + +coverage +*.lcov + +# nyc test coverage + +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) + +.grunt + +# Bower dependency directory (https://bower.io/) + +bower_components + +# node-waf configuration + +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) + +build/Release + +# Dependency directories + +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) + +web_modules/ + +# TypeScript cache + +*.tsbuildinfo + +# Optional npm cache directory + +.npm + +# Optional eslint cache + +.eslintcache + +# Optional stylelint cache + +.stylelintcache + +# Microbundle cache + +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history + +.node_repl_history + +# Output of 'npm pack' + +*.tgz + +# Yarn Integrity file + +.yarn-integrity + +# dotenv environment variable files + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) + +.parcel-cache + +# Next.js build output + +.next +out + +# Nuxt.js build / generate output + +.nuxt +dist + +# Gatsby files + +# Comment in the public line in if your project uses Gatsby and not Next.js + +# https://nextjs.org/blog/next-9-1#public-directory-support + +# public + +# vuepress build output + +.vuepress/dist + +# vuepress v2.x temp and cache directory + +.temp + +# Docusaurus cache and generated files + +.docusaurus + +# Serverless directories + +.serverless/ + +# FuseBox cache + +.fusebox/ + +# DynamoDB Local files + +.dynamodb/ + +# TernJS port file + +.tern-port + +# Stores VSCode versions used for testing VSCode extensions + +.vscode-test + +# yarn v2 + +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# IntelliJ based IDEs +.idea + +# Finder (MacOS) folder config +.DS_Store diff --git a/ci/README.md b/ci/README.md new file mode 100644 index 0000000..1a7d04d --- /dev/null +++ b/ci/README.md @@ -0,0 +1,5 @@ +Generate Typescript types for Supabase + +```bash +pnpm dlx supabase gen types typescript --project-id "$SUPABASE_PROJECT_REF" --schema public > supabase/types/supabase.ts +``` diff --git a/ci/build-upload.ts b/ci/build-upload.ts new file mode 100644 index 0000000..80a14ef --- /dev/null +++ b/ci/build-upload.ts @@ -0,0 +1,201 @@ +import fs from "fs"; +import { join } from "path"; +import { + buildWithDockerAndValidate, + checkPackagesValidity, + parsePackageJson, + uploadImage, + uploadTarballToS3, + uploadTarballToSupabaseStorage, + type BuildResult, +} from "./src/utils"; +import { supabase } from "./src/supabase"; +import { type Tables } from "./supabase/types/supabase"; + +// type SupabaseExtensionTable = Tables<"extensions">; +// iterate over all files in extensions directory +const extensionsDir = join(__dirname, "..", "extensions"); +const extensionsCandidateFolders = fs + .readdirSync(extensionsDir) + .map((folder) => join(extensionsDir, folder)) // get full path + .filter((folder) => fs.statSync(folder).isDirectory()) // only directories + .filter((folder) => fs.existsSync(join(folder, "package.json"))); // only those with package.json + +checkPackagesValidity(extensionsCandidateFolders); + +/* -------------------------------------------------------------------------- */ +/* Filter Out Extensions that are Already in the Database */ +/* -------------------------------------------------------------------------- */ +let toBuildExt: string[] = []; +// const existingExtMap = new Map(); // store db existing extensions, later used for shasum validation +for (const extPath of extensionsCandidateFolders) { + const pkg = parsePackageJson(join(extPath, "package.json")); + const dbExt = await supabase + .from("ext_publish") + .select("*") + .eq("identifier", pkg.jarvis.identifier) + .eq("version", pkg.version); + if (dbExt.data && dbExt.data.length > 0) { + console.log( + `Extension ${pkg.jarvis.identifier}@${pkg.version} already exists in the database. Skip Building.`, + ); + // existingExtMap.set(extPath, dbExt.data[0]); + continue; + } else { + toBuildExt.push(extPath); // not in db, build it + } +} + +/* -------------------------------------------------------------------------- */ +/* Build All Extensions With Docker */ +/* -------------------------------------------------------------------------- */ +const PoolSize = 4; +// split toBuildExt into chunks of PoolSize, run multiple docker builds in parallel +const toBuildExtChunks = []; +for (let i = 0; i < toBuildExt.length; i += PoolSize) { + toBuildExtChunks.push(toBuildExt.slice(i, i + PoolSize)); +} + +const buildResults: BuildResult[] = []; +for (const chunk of toBuildExtChunks) { + const chunkBuildResults = await Promise.all( + chunk + // .slice(0, 1) // this line is commented out for dev, upload a single extension + .map((extPath) => buildWithDockerAndValidate(extPath)), + ); + buildResults.push(...chunkBuildResults); +} +// console.log(buildResults); + +/* -------------------------------------------------------------------------- */ +/* Get Existing Extensions from Supabase for Validation */ +/* -------------------------------------------------------------------------- */ +// ! this section is moved to run before build, otherwise it will take too long when there are many extensions +// ! Shasum validation can be done separately/periodically e.g. once a day for all extensions +// This set contains all the extensions that are already in the database +// let dbExtSet = new Set<{ identifier: string; version: string }>(); +// const resultsToUpload: BuildResult[] = []; +// for (const buildResult of buildResults) { +// const dbRes = await supabase +// .from("extensions") +// .select("*") +// .eq("identifier", buildResult.pkg.jarvis.identifier) +// .eq("version", buildResult.pkg.version); +// console.log("dbRes", dbRes); +// if (dbRes.data && dbRes.data.length > 0) { +// console.log("Extension already exists in the database"); +// // compare shasum +// const dbShasum = dbRes.data[0].shasum; +// if (dbShasum !== buildResult.shasum) { +// console.error( +// `Unexpected Error: Shasum mismatch: \n\tDB: ${dbShasum}\n\tNew: ${buildResult.shasum}` +// ); +// process.exit(1); +// } +// console.log("Skip Upload"); +// continue; +// } + +// if (dbRes.data && dbRes.data.length > 1) { +// console.error( +// "Unexpected Error: More than one extension with the same identifier and version" +// ); +// process.exit(1); +// } +// resultsToUpload.push(buildResult); +// dbExtSet.add({ +// identifier: buildResult.pkg.jarvis.identifier, +// version: buildResult.pkg.version, +// }); +// } + +/* -------------------------------------------------------------------------- */ +/* Upload Newly Built Extensions to File Storage and Supabase */ +/* -------------------------------------------------------------------------- */ +for (const buildResult of buildResults) { + const readmePath = join(buildResult.extPath, "README.md"); + const readme = fs.existsSync(readmePath) ? fs.readFileSync(readmePath, "utf-8") : null; + /* -------------- Create Extension in extensions if not exists -------------- */ + const extFetchDBResult = await supabase + .from("extensions") + .select("*") + .eq("identifier", buildResult.pkg.jarvis.identifier); + + if (!extFetchDBResult.data || extFetchDBResult.data.length === 0) { + await supabase + .from("extensions") + .insert([ + { + name: buildResult.pkg.name, + short_description: buildResult.pkg.jarvis.shortDescription, + long_description: buildResult.pkg.jarvis.longDescription, + identifier: buildResult.pkg.jarvis.identifier, + readme: readme, + downloads: 0, + }, + ]) + .select(); + } + + const demoImgPaths = buildResult.pkg.jarvis.demoImages + .map((p) => join(buildResult.extPath, p)) + .filter((p) => fs.existsSync(p)); + const demoImgsDBPaths = await Promise.all(demoImgPaths.map((p) => uploadImage(p))); // file storage paths + const pkgIcon = buildResult.pkg.jarvis.icon; + const iconClone = { ...pkgIcon }; + if (buildResult.pkg.jarvis.icon.type === "asset") { + const iconPath = join(buildResult.extPath, pkgIcon.value); + if (fs.existsSync(iconPath)) { + } else { + console.error(`Icon file not found: ${iconPath}`); + } + iconClone.value = await uploadImage(iconPath); + } + /* ---------- Update README, icon, description in extensions table ---------- */ + await supabase + .from("extensions") + .update({ + name: buildResult.pkg.jarvis.name, + short_description: buildResult.pkg.jarvis.shortDescription, + long_description: buildResult.pkg.jarvis.longDescription, + icon: iconClone, + readme, + }) + .eq("identifier", buildResult.pkg.jarvis.identifier) + .select(); + + /* ----------------------------- Upload Tarball ----------------------------- */ + const supabasePath = await uploadTarballToSupabaseStorage( + buildResult.tarballPath, + buildResult.pkg.jarvis.identifier, + buildResult.pkg.version, + buildResult.tarballFilename, + ); + const s3Path = await uploadTarballToS3( + buildResult.tarballPath, + buildResult.pkg.jarvis.identifier, + buildResult.pkg.version, + buildResult.tarballFilename, + ); + const cmdCount = buildResult.pkg.jarvis.uiCmds.length + buildResult.pkg.jarvis.inlineCmds.length; + const { data, error } = await supabase.from("ext_publish").insert([ + { + name: buildResult.pkg.name, + version: buildResult.pkg.version, + manifest: buildResult.pkg.jarvis, + shasum: buildResult.shasum, + size: fs.statSync(buildResult.tarballPath).size, + tarball_path: supabasePath, + cmd_count: cmdCount, + identifier: buildResult.pkg.jarvis.identifier, + downloads: 0, + demo_images: demoImgsDBPaths, + }, + ]); + if (error) { + console.error("Unexpected Error: Error inserting into database", error); + process.exit(1); + } + + console.log(`Inserted tarball into database: ${buildResult.tarballPath}`); +} diff --git a/ci/package.json b/ci/package.json new file mode 100644 index 0000000..10ebe92 --- /dev/null +++ b/ci/package.json @@ -0,0 +1,25 @@ +{ + "name": "ci", + "module": "index.ts", + "type": "module", + "scripts": { + "build-upload": "bun build-upload.ts", + "validate": "bun validate.ts", + "build-upload:watch": "bun --watch build-upload.ts", + "gen:supabase-types": "pnpm dlx supabase gen types typescript --project-id \"$SUPABASE_PROJECT_REF\" --schema public > supabase/types/supabase.ts" + }, + "devDependencies": { + "@types/bun": "latest", + "supabase": ">=1.8.1" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "dependencies": { + "@aws-sdk/client-s3": "^3.583.0", + "@supabase/supabase-js": "^2.43.4", + "jarvis-api": "0.0.2-alpha.8", + "sharp": "^0.33.4", + "zod": "^3.23.8" + } +} \ No newline at end of file diff --git a/ci/src/constant.ts b/ci/src/constant.ts new file mode 100644 index 0000000..4a9c157 --- /dev/null +++ b/ci/src/constant.ts @@ -0,0 +1,26 @@ +import fs from "fs"; +import path from "path"; + +export const REPO_ROOT = path.resolve(__dirname, "../../"); +export const DOCKER_BUILD_ENTRYPOINT = path.resolve( + REPO_ROOT, + "scripts", + "docker", + "entrypoint.sh", +); + +/* -------------------------------------------------------------------------- */ +/* Check Path Existence */ +/* -------------------------------------------------------------------------- */ + +if (!fs.existsSync(DOCKER_BUILD_ENTRYPOINT)) { + console.error( + `Docker build entrypoint not found: ${DOCKER_BUILD_ENTRYPOINT}`, + ); + process.exit(1); +} + +if (!fs.existsSync(REPO_ROOT)) { + console.error(`Repo root not found: ${REPO_ROOT}`); + process.exit(1); +} diff --git a/ci/src/supabase.ts b/ci/src/supabase.ts new file mode 100644 index 0000000..783325f --- /dev/null +++ b/ci/src/supabase.ts @@ -0,0 +1,8 @@ +import { z } from "zod"; +import { createClient } from "@supabase/supabase-js"; +import { type Database } from "../supabase/types/supabase"; + +export const supabase = createClient( + z.string().describe("Supabase URL").parse(process.env.SUPABASE_URL), + z.string().describe("Supabase Service Role Key").parse(process.env.SUPABASE_SERVICE_ROLE_KEY), +); diff --git a/ci/src/utils.ts b/ci/src/utils.ts new file mode 100644 index 0000000..4e926d5 --- /dev/null +++ b/ci/src/utils.ts @@ -0,0 +1,399 @@ +import fs from "fs"; +import { z } from "zod"; +import crypto from "crypto"; +import { + S3Client, + ListBucketsCommand, + GetObjectCommand, + PutObjectCommand, +} from "@aws-sdk/client-s3"; +import { ExtPackageJson } from "jarvis-api"; +import path, { join } from "path"; +import { DOCKER_BUILD_ENTRYPOINT, REPO_ROOT } from "./constant"; +import { spawn, exec } from "node:child_process"; +import { supabase } from "./supabase"; +import sharp from "sharp"; + +/** + * Package Name can be scoped or not + * Use regex to extract package name + * @param packageName + * @param version + */ +export function computeTarballName(packageName: string, version: string): string { + const scoped = packageName.startsWith("@"); + if (scoped) { + const [scope, name] = packageName.split("/"); + return `${scope.substring(1)}-${name}-${version}.tgz`; + } else { + return `${packageName}-${version}.tgz`; + } +} + +export function parsePackageJson(pkgJsonPath: string) { + + const parse = ExtPackageJson.safeParse(JSON.parse(fs.readFileSync(pkgJsonPath, "utf8"))); + if (parse.error) { + console.error(`Error parsing ${pkgJsonPath}: ${parse.error}`); + process.exit(1); + } + const pkgJson = parse.data; + return pkgJson; +} + +export function checkPackagesValidity(extPaths: string[]) { + /* ------------------- make sure package.json is parseable ------------------ */ + const pkgs = extPaths.map((ext) => parsePackageJson(join(ext, "package.json"))); + + /* --------------------- make sure identifier is unique --------------------- */ + const identifiers = pkgs.map((pkg) => pkg.jarvis.identifier); + const uniqueIdentifiers = new Set(identifiers); + if (identifiers.length !== uniqueIdentifiers.size) { + console.error("Identifiers are not unique"); + // find the duplicates + const duplicates = identifiers.filter((item, index) => identifiers.indexOf(item) !== index); + console.error("duplicates", duplicates); + process.exit(1); + } + + /* ------------------ Check Demo Images and files Existence ----------------- */ + for (const extPath of extPaths) { + const pkg = parsePackageJson(join(extPath, "package.json")); + for (const imgPath of pkg.jarvis.demoImages) { + const imgFullPath = join(extPath, imgPath); + if (!fs.existsSync(imgFullPath)) { + console.error(`Demo Image not found: ${imgFullPath} in ${extPath}`); + process.exit(1); + } + } + for (const file of pkg.files) { + const fileFullPath = join(extPath, file); + if (!fs.existsSync) { + console.error(`File not found: ${fileFullPath} in ${extPath}`); + process.exit(1); + } + } + } + + /* ------ make sure there is no tarball .tgz file in the each extension ----- */ + for (const extPath of extPaths) { + const files = fs.readdirSync(extPath); + const tgzFiles = files.filter((file) => file.endsWith(".tgz")); + if (tgzFiles.length > 0) { + console.error(`Extension ${extPath} contains tarball files: ${tgzFiles.join(", ")}`); + console.error( + "If you are developing, run scripts/clean.sh to remove all .tgz file in the top level of each extension", + ); + process.exit(1); + } + } +} + +export function computeFileHash(filePath: string, algorithm: string): Promise { + return new Promise((resolve, reject) => { + const hash = crypto.createHash(algorithm); + const stream = fs.createReadStream(filePath); + + stream.on("data", (data) => { + hash.update(data); + }); + + stream.on("end", () => { + const shasum = hash.digest("hex"); + resolve(shasum); + }); + + stream.on("error", (err) => { + reject(err); + }); + }); +} + +export function computeFileSha1(filePath: string): Promise { + return computeFileHash(filePath, "sha1"); +} + +export function computeFileSha512(filePath: string): Promise { + return computeFileHash(filePath, "sha512"); +} + +/** + * Docker is used to build each individual extension for safety + * Packages could potentially modify other extensions if they share environment. + * There is also a possibility of leaking environment variables. + * docker run -v $(pwd)/scripts/docker/entrypoint.sh:/entrypoint.sh \ + * -v $(pwd)/extensions/$ext:/workspace \ + * -w /workspace --rm \ + * --platform=linux/amd64 \ + * node:20 /entrypoint.sh + * @param extPath + * @returns shasum of the tarball parsed from stderr output + */ +export function buildWithDocker(extPath: string): Promise<{ + stderrShasum: string; + stderrTarballFilename: string; + pkg: ExtPackageJson; +}> { + console.log(`Building ${extPath}`); + return new Promise((resolve, reject) => { + const pkg = parsePackageJson(join(extPath, "package.json")); + // console.log(pkg); + // console.log(REPO_ROOT); + const dockerCmd = ` + run -v ${DOCKER_BUILD_ENTRYPOINT}:/entrypoint.sh -v ${extPath}:/workspace -w /workspace --rm --platform=linux/amd64 node:20 /entrypoint.sh`; + // console.log(dockerCmd); + const args = dockerCmd + .split(" ") + .filter((arg) => arg.length > 0) + .filter((arg) => arg !== "\n"); + const subprocess = spawn("docker", args); + let stderrShasum = ""; + let stderrTarballFilename = ""; + subprocess.stdout.on("data", (data) => { + console.log(`stdout: ${data}`); + }); + subprocess.stderr.on("data", (data) => { + const dataStr = data.toString(); + console.error(`stderr: ${dataStr}`); + // if (data instanceof String) { + if (dataStr.includes("npm notice shasum")) { + console.log("shasum found"); + const shasumMatch = dataStr.match(/npm notice shasum:\s+([a-f0-9]+)/); + + if (shasumMatch) { + stderrShasum = shasumMatch[1]; + console.log("Parsed shasum:", stderrShasum); + } + } + + if (dataStr.includes("npm notice filename:")) { + const tarballFilename = dataStr.match(/npm notice filename:\s+([^\s]+)/); + if (tarballFilename) { + stderrTarballFilename = tarballFilename[1]; + console.log("Parsed tarball:", stderrTarballFilename); + } + } else if (dataStr.includes("filename:")) { + const tarballFilename = dataStr.match(/filename:\s+([^\s]+)/); + if (tarballFilename) { + stderrTarballFilename = tarballFilename[1]; + console.log("Parsed tarball:", stderrTarballFilename); + } + } + // } else { + // console.error("data is not string"); + // } + }); + subprocess.on("close", (code) => { + console.log(`child process exited with code ${code}`); + if (stderrShasum.trim().length === 0 || stderrTarballFilename.trim().length === 0) { + return reject("shasum or tarball filename not found"); + } + if (code !== 0) { + return reject(`child process exited with code ${code}`); + } else { + return resolve({ stderrShasum, stderrTarballFilename, pkg }); + } + }); + }); +} + +export type BuildResult = { + shasum: string; + tarballFilename: string; + tarballPath: string; + extPath: string; + pkg: ExtPackageJson; +}; + +/** + * Use this function to build an extension with docker and validate the tarball + * If this passes, the tarball is ready to be inserted into the database + * @param extPath Extension Path + * @returns + */ +export function buildWithDockerAndValidate(extPath: string): Promise { + return buildWithDocker(extPath) + .then((res) => { + const parsedTarballPath = join(extPath, res.stderrTarballFilename); + if (!fs.existsSync(parsedTarballPath)) { + console.error(`Tarball not found: ${parsedTarballPath}`); + process.exit(1); + } + return computeFileSha1(parsedTarballPath).then((computedShasum) => { + if (computedShasum !== res.stderrShasum) { + console.error( + `Shasum mismatch: Computed(${computedShasum}) !== Output from docker(${res.stderrShasum})`, + ); + process.exit(1); + } else { + console.log("Shasum matches"); + } + return { + shasum: computedShasum, + tarballFilename: res.stderrTarballFilename, + tarballPath: parsedTarballPath, + extPath: extPath, + pkg: res.pkg, + }; + }); + }) + .catch((err) => { + console.error(err); + process.exit(1); + }); +} + +/** + * + * @param tarballPath + * @param identifier + * @param version + * @param tarballName + * @returns Path + */ +export function uploadTarballToS3( + tarballPath: string, + identifier: string, + version: string, + tarballName: string, +) { + const s3Client = new S3Client({ + endpoint: z.string().parse(process.env.S3_ENDPOINT), + region: "auto", + credentials: { + accessKeyId: z.string().parse(process.env.S3_ACCESS_KEY_ID), + secretAccessKey: z.string().parse(process.env.S3_SECRET_ACCESS_KEY), + }, + }); + const key = `extensions/${identifier}/${version}/${path.basename(tarballName)}`; + const tarball = fs.readFileSync(tarballPath); + return s3Client + .send( + new PutObjectCommand({ + Bucket: "jarvis-extensions", + Key: key, + Body: tarball, + ContentType: "application/gzip", + }), + ) + .then((res) => { + return key; + }) + .catch((err) => { + console.error("Failed to upload tarball"); + console.error(err); + process.exit(1); + }); +} + +/** + * + * @param tarballPath + * @param identifier + * @param version + * @param tarballName + * @returns path of the tarball in supabase storage, not url + */ +export async function uploadTarballToSupabaseStorage( + tarballPath: string, + identifier: string, + version: string, + tarballName: string, +) { + const key = `extensions/${identifier}/${version}/${path.basename(tarballName)}`; + const tarball = fs.readFileSync(tarballPath); + console.log("uploading to supabase storage"); + + const { data, error } = await supabase.storage.from("extensions").upload(key, tarball, { + cacheControl: "3600", + upsert: true, + }); + if (error) { + console.error("Failed to upload tarball to supabase storage"); + console.error(error); + process.exit(1); + } + console.log("Tarball uploaded to supabase storage"); + return data.path; +} + +export function computeHash(buffer: Buffer, algorithm: "sha1" | "sha256" | "sha512") { + const hash = crypto.createHash(algorithm); + hash.update(buffer); + return hash.digest("hex"); +} + +export async function uploadImage(imagePath: string) { + // make sure imagePath exists and is a file + if (!fs.existsSync(imagePath)) { + console.error(`Image not found: ${imagePath}`); + process.exit(1); + } + const imageSize = fs.statSync(imagePath).size; + const img = + imageSize > 200 * 1024 + ? await sharp(imagePath) + .resize({ + height: 720, + fit: sharp.fit.inside, + withoutEnlargement: true, + }) + .jpeg() + .toBuffer() + : await sharp(imagePath).jpeg().toBuffer(); + const imgSha512 = computeHash(img, "sha512"); + /* ----------------------- Check if image exists in db ---------------------- */ + const dbRes = await supabase.from("ext_images").select("*").eq("sha512", imgSha512); + const exists = dbRes.data && dbRes.data.length > 0; + if (exists) { + return dbRes.data[0].image_path; + } + + /* --------------------- Upload to supabase file storage -------------------- */ + const key = `ext-images/${imgSha512}.jpeg`; + + const { data, error } = await supabase.storage.from("extensions").upload(key, img, { + cacheControl: "3600", + upsert: true, + }); + if (error) { + console.error(error); + throw new Error("Failed to upload image to supabase storage."); + } + /* ------------------------------ Upload to S3 ------------------------------ */ + const s3Client = new S3Client({ + endpoint: z.string().parse(process.env.S3_ENDPOINT), + region: "auto", + credentials: { + accessKeyId: z.string().parse(process.env.S3_ACCESS_KEY_ID), + secretAccessKey: z.string().parse(process.env.S3_SECRET_ACCESS_KEY), + }, + }); + await s3Client + .send( + new PutObjectCommand({ + Bucket: "jarvis-extensions", + Key: key, + Body: img, + ContentType: "application/jpeg", + }), + ) + .then((res) => { + return key; + }) + .catch((err) => { + console.error("Failed to upload tarball"); + console.error(err); + }); + + /* ------------------------- Insert into database -------------------------- */ + const { data: insertData, error: insertError } = await supabase + .from("ext_images") + .insert([{ sha512: imgSha512, image_path: data.path }]); + if (insertError) { + console.error(insertError); + throw new Error("Failed to insert image into database"); + } + + return data?.path; +} diff --git a/ci/supabase/.gitignore b/ci/supabase/.gitignore new file mode 100644 index 0000000..a3ad880 --- /dev/null +++ b/ci/supabase/.gitignore @@ -0,0 +1,4 @@ +# Supabase +.branches +.temp +.env diff --git a/ci/supabase/config.toml b/ci/supabase/config.toml new file mode 100644 index 0000000..e3b62a9 --- /dev/null +++ b/ci/supabase/config.toml @@ -0,0 +1,171 @@ +# A string used to distinguish different Supabase projects on the same host. Defaults to the +# working directory name when running `supabase init`. +project_id = "ci" + +[api] +enabled = true +# Port to use for the API URL. +port = 54321 +# Schemas to expose in your API. Tables, views and stored procedures in this schema will get API +# endpoints. `public` is always included. +schemas = ["public", "graphql_public"] +# Extra schemas to add to the search_path of every request. `public` is always included. +extra_search_path = ["public", "extensions"] +# The maximum number of rows returns from a view, table, or stored procedure. Limits payload size +# for accidental or malicious requests. +max_rows = 1000 + +[db] +# Port to use for the local database URL. +port = 54322 +# Port used by db diff command to initialize the shadow database. +shadow_port = 54320 +# The database major version to use. This has to be the same as your remote database's. Run `SHOW +# server_version;` on the remote database to check. +major_version = 15 + +[db.pooler] +enabled = false +# Port to use for the local connection pooler. +port = 54329 +# Specifies when a server connection can be reused by other clients. +# Configure one of the supported pooler modes: `transaction`, `session`. +pool_mode = "transaction" +# How many server connections to allow per user/database pair. +default_pool_size = 20 +# Maximum number of client connections allowed. +max_client_conn = 100 + +[realtime] +enabled = true +# Bind realtime via either IPv4 or IPv6. (default: IPv4) +# ip_version = "IPv6" +# The maximum length in bytes of HTTP request headers. (default: 4096) +# max_header_length = 4096 + +[studio] +enabled = true +# Port to use for Supabase Studio. +port = 54323 +# External URL of the API server that frontend connects to. +api_url = "http://127.0.0.1" +# OpenAI API Key to use for Supabase AI in the Supabase Studio. +openai_api_key = "env(OPENAI_API_KEY)" + +# Email testing server. Emails sent with the local dev setup are not actually sent - rather, they +# are monitored, and you can view the emails that would have been sent from the web interface. +[inbucket] +enabled = true +# Port to use for the email testing server web interface. +port = 54324 +# Uncomment to expose additional ports for testing user applications that send emails. +# smtp_port = 54325 +# pop3_port = 54326 + +[storage] +enabled = true +# The maximum file size allowed (e.g. "5MB", "500KB"). +file_size_limit = "50MiB" + +[storage.image_transformation] +enabled = true + +[auth] +enabled = true +# The base URL of your website. Used as an allow-list for redirects and for constructing URLs used +# in emails. +site_url = "http://127.0.0.1:3000" +# A list of *exact* URLs that auth providers are permitted to redirect to post authentication. +additional_redirect_urls = ["https://127.0.0.1:3000"] +# How long tokens are valid for, in seconds. Defaults to 3600 (1 hour), maximum 604,800 (1 week). +jwt_expiry = 3600 +# If disabled, the refresh token will never expire. +enable_refresh_token_rotation = true +# Allows refresh tokens to be reused after expiry, up to the specified interval in seconds. +# Requires enable_refresh_token_rotation = true. +refresh_token_reuse_interval = 10 +# Allow/disallow new user signups to your project. +enable_signup = true +# Allow/disallow anonymous sign-ins to your project. +enable_anonymous_sign_ins = false +# Allow/disallow testing manual linking of accounts +enable_manual_linking = false + +[auth.email] +# Allow/disallow new user signups via email to your project. +enable_signup = true +# If enabled, a user will be required to confirm any email change on both the old, and new email +# addresses. If disabled, only the new email is required to confirm. +double_confirm_changes = true +# If enabled, users need to confirm their email address before signing in. +enable_confirmations = false +# Controls the minimum amount of time that must pass before sending another signup confirmation or password reset email. +max_frequency = "1s" + +# Uncomment to customize email template +# [auth.email.template.invite] +# subject = "You have been invited" +# content_path = "./supabase/templates/invite.html" + +[auth.sms] +# Allow/disallow new user signups via SMS to your project. +enable_signup = true +# If enabled, users need to confirm their phone number before signing in. +enable_confirmations = false +# Template for sending OTP to users +template = "Your code is {{ .Code }} ." +# Controls the minimum amount of time that must pass before sending another sms otp. +max_frequency = "5s" + +# Use pre-defined map of phone number to OTP for testing. +# [auth.sms.test_otp] +# 4152127777 = "123456" + +# This hook runs before a token is issued and allows you to add additional claims based on the authentication method used. +# [auth.hook.custom_access_token] +# enabled = true +# uri = "pg-functions:////" + +# Configure one of the supported SMS providers: `twilio`, `twilio_verify`, `messagebird`, `textlocal`, `vonage`. +[auth.sms.twilio] +enabled = false +account_sid = "" +message_service_sid = "" +# DO NOT commit your Twilio auth token to git. Use environment variable substitution instead: +auth_token = "env(SUPABASE_AUTH_SMS_TWILIO_AUTH_TOKEN)" + +# Use an external OAuth provider. The full list of providers are: `apple`, `azure`, `bitbucket`, +# `discord`, `facebook`, `github`, `gitlab`, `google`, `keycloak`, `linkedin_oidc`, `notion`, `twitch`, +# `twitter`, `slack`, `spotify`, `workos`, `zoom`. +[auth.external.apple] +enabled = false +client_id = "" +# DO NOT commit your OAuth provider secret to git. Use environment variable substitution instead: +secret = "env(SUPABASE_AUTH_EXTERNAL_APPLE_SECRET)" +# Overrides the default auth redirectUrl. +redirect_uri = "" +# Overrides the default auth provider URL. Used to support self-hosted gitlab, single-tenant Azure, +# or any other third-party OIDC providers. +url = "" +# If enabled, the nonce check will be skipped. Required for local sign in with Google auth. +skip_nonce_check = false + +[analytics] +enabled = false +port = 54327 +vector_port = 54328 +# Configure one of the supported backends: `postgres`, `bigquery`. +backend = "postgres" + +# Experimental features may be deprecated any time +[experimental] +# Configures Postgres storage engine to use OrioleDB (S3) +orioledb_version = "" +# Configures S3 bucket URL, eg. .s3-.amazonaws.com +s3_host = "env(S3_HOST)" +# Configures S3 bucket region, eg. us-east-1 +s3_region = "env(S3_REGION)" +# Configures AWS_ACCESS_KEY_ID for S3 bucket +s3_access_key = "env(S3_ACCESS_KEY)" +# Configures AWS_SECRET_ACCESS_KEY for S3 bucket +s3_secret_key = "env(S3_SECRET_KEY)" diff --git a/ci/supabase/seed.sql b/ci/supabase/seed.sql new file mode 100644 index 0000000..e69de29 diff --git a/ci/supabase/types/supabase.ts b/ci/supabase/types/supabase.ts new file mode 100644 index 0000000..787e5b9 --- /dev/null +++ b/ci/supabase/types/supabase.ts @@ -0,0 +1,212 @@ +export type Json = + | string + | number + | boolean + | null + | { [key: string]: Json | undefined } + | Json[] + +export type Database = { + public: { + Tables: { + ext_images: { + Row: { + created_at: string + image_path: string + sha512: string + } + Insert: { + created_at?: string + image_path: string + sha512: string + } + Update: { + created_at?: string + image_path?: string + sha512?: string + } + Relationships: [] + } + ext_publish: { + Row: { + cmd_count: number + created_at: string + demo_images: string[] + downloads: number + id: number + identifier: string + manifest: Json + name: string + shasum: string + size: number + tarball_path: string + version: string + } + Insert: { + cmd_count: number + created_at?: string + demo_images: string[] + downloads: number + id?: number + identifier: string + manifest: Json + name: string + shasum: string + size: number + tarball_path: string + version: string + } + Update: { + cmd_count?: number + created_at?: string + demo_images?: string[] + downloads?: number + id?: number + identifier?: string + manifest?: Json + name?: string + shasum?: string + size?: number + tarball_path?: string + version?: string + } + Relationships: [ + { + foreignKeyName: "ext_publish_identifier_fkey" + columns: ["identifier"] + isOneToOne: false + referencedRelation: "extensions" + referencedColumns: ["identifier"] + }, + ] + } + extensions: { + Row: { + created_at: string + downloads: number + icon: Json | null + identifier: string + long_description: string | null + name: string + readme: string | null + short_description: string + } + Insert: { + created_at?: string + downloads: number + icon?: Json | null + identifier: string + long_description?: string | null + name: string + readme?: string | null + short_description: string + } + Update: { + created_at?: string + downloads?: number + icon?: Json | null + identifier?: string + long_description?: string | null + name?: string + readme?: string | null + short_description?: string + } + Relationships: [] + } + } + Views: { + [_ in never]: never + } + Functions: { + [_ in never]: never + } + Enums: { + [_ in never]: never + } + CompositeTypes: { + [_ in never]: never + } + } +} + +type PublicSchema = Database[Extract] + +export type Tables< + PublicTableNameOrOptions extends + | keyof (PublicSchema["Tables"] & PublicSchema["Views"]) + | { schema: keyof Database }, + TableName extends PublicTableNameOrOptions extends { schema: keyof Database } + ? keyof (Database[PublicTableNameOrOptions["schema"]]["Tables"] & + Database[PublicTableNameOrOptions["schema"]]["Views"]) + : never = never, +> = PublicTableNameOrOptions extends { schema: keyof Database } + ? (Database[PublicTableNameOrOptions["schema"]]["Tables"] & + Database[PublicTableNameOrOptions["schema"]]["Views"])[TableName] extends { + Row: infer R + } + ? R + : never + : PublicTableNameOrOptions extends keyof (PublicSchema["Tables"] & + PublicSchema["Views"]) + ? (PublicSchema["Tables"] & + PublicSchema["Views"])[PublicTableNameOrOptions] extends { + Row: infer R + } + ? R + : never + : never + +export type TablesInsert< + PublicTableNameOrOptions extends + | keyof PublicSchema["Tables"] + | { schema: keyof Database }, + TableName extends PublicTableNameOrOptions extends { schema: keyof Database } + ? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"] + : never = never, +> = PublicTableNameOrOptions extends { schema: keyof Database } + ? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends { + Insert: infer I + } + ? I + : never + : PublicTableNameOrOptions extends keyof PublicSchema["Tables"] + ? PublicSchema["Tables"][PublicTableNameOrOptions] extends { + Insert: infer I + } + ? I + : never + : never + +export type TablesUpdate< + PublicTableNameOrOptions extends + | keyof PublicSchema["Tables"] + | { schema: keyof Database }, + TableName extends PublicTableNameOrOptions extends { schema: keyof Database } + ? keyof Database[PublicTableNameOrOptions["schema"]]["Tables"] + : never = never, +> = PublicTableNameOrOptions extends { schema: keyof Database } + ? Database[PublicTableNameOrOptions["schema"]]["Tables"][TableName] extends { + Update: infer U + } + ? U + : never + : PublicTableNameOrOptions extends keyof PublicSchema["Tables"] + ? PublicSchema["Tables"][PublicTableNameOrOptions] extends { + Update: infer U + } + ? U + : never + : never + +export type Enums< + PublicEnumNameOrOptions extends + | keyof PublicSchema["Enums"] + | { schema: keyof Database }, + EnumName extends PublicEnumNameOrOptions extends { schema: keyof Database } + ? keyof Database[PublicEnumNameOrOptions["schema"]]["Enums"] + : never = never, +> = PublicEnumNameOrOptions extends { schema: keyof Database } + ? Database[PublicEnumNameOrOptions["schema"]]["Enums"][EnumName] + : PublicEnumNameOrOptions extends keyof PublicSchema["Enums"] + ? PublicSchema["Enums"][PublicEnumNameOrOptions] + : never diff --git a/ci/tsconfig.json b/ci/tsconfig.json new file mode 100644 index 0000000..238655f --- /dev/null +++ b/ci/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, + + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } +} diff --git a/ci/validate.ts b/ci/validate.ts new file mode 100644 index 0000000..a6cbd6d --- /dev/null +++ b/ci/validate.ts @@ -0,0 +1,19 @@ +import fs from "fs"; +import { join } from "path"; +import { buildWithDockerAndValidate, checkPackagesValidity } from "./src/utils"; + +// type SupabaseExtensionTable = Tables<"extensions">; +// iterate over all files in extensions directory +const extensionsDir = join(__dirname, "..", "extensions"); +console.log(extensionsDir); + +const extensionsCandidateFolders = fs + .readdirSync(extensionsDir) + .map((folder) => join(extensionsDir, folder)) // get full path + .filter((folder) => fs.statSync(folder).isDirectory()) // only directories + .filter((folder) => fs.existsSync(join(folder, "package.json"))); // only those with package.json +console.log(extensionsCandidateFolders); + +checkPackagesValidity(extensionsCandidateFolders); + +// buildWithDockerAndValidate(join(extensionsDir, "jwt")); diff --git a/extension-templates/jarvis-ext-astro/.gitignore b/extension-templates/jarvis-ext-astro/.gitignore new file mode 100644 index 0000000..e290c44 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/.gitignore @@ -0,0 +1,25 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store + +# jetbrains setting folder +.idea/ +.vscode/ \ No newline at end of file diff --git a/extension-templates/jarvis-ext-astro/README.md b/extension-templates/jarvis-ext-astro/README.md new file mode 100644 index 0000000..e34a99b --- /dev/null +++ b/extension-templates/jarvis-ext-astro/README.md @@ -0,0 +1,47 @@ +# Astro Starter Kit: Minimal + +```sh +npm create astro@latest -- --template minimal +``` + +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/astro/tree/latest/examples/minimal) +[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/minimal) +[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/minimal/devcontainer.json) + +> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! + +## 🚀 Project Structure + +Inside of your Astro project, you'll see the following folders and files: + +```text +/ +├── public/ +├── src/ +│ └── pages/ +│ └── index.astro +└── package.json +``` + +Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name. + +There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components. + +Any static assets, like images, can be placed in the `public/` directory. + +## 🧞 Commands + +All commands are run from the root of the project, from a terminal: + +| Command | Action | +| :------------------------ | :----------------------------------------------- | +| `npm install` | Installs dependencies | +| `npm run dev` | Starts local dev server at `localhost:4321` | +| `npm run build` | Build your production site to `./dist/` | +| `npm run preview` | Preview your build locally, before deploying | +| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | +| `npm run astro -- --help` | Get help using the Astro CLI | + +## 👀 Want to learn more? + +Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat). diff --git a/extension-templates/jarvis-ext-astro/astro.config.mjs b/extension-templates/jarvis-ext-astro/astro.config.mjs new file mode 100644 index 0000000..b1316ce --- /dev/null +++ b/extension-templates/jarvis-ext-astro/astro.config.mjs @@ -0,0 +1,11 @@ +import { defineConfig } from 'astro/config'; +import vue from "@astrojs/vue"; + +import tailwind from "@astrojs/tailwind"; + +// https://astro.build/config +export default defineConfig({ + integrations: [vue(), tailwind({ + applyBaseStyles: false, + })] +}); \ No newline at end of file diff --git a/extension-templates/jarvis-ext-astro/components.json b/extension-templates/jarvis-ext-astro/components.json new file mode 100644 index 0000000..ffafb76 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/components.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://shadcn-vue.com/schema.json", + "style": "default", + "typescript": true, + "tailwind": { + "config": "tailwind.config.mjs", + "css": "src/styles/globals.css", + "baseColor": "slate", + "cssVariables": true + }, + "framework": "astro", + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} diff --git a/extension-templates/jarvis-ext-astro/package.json b/extension-templates/jarvis-ext-astro/package.json new file mode 100644 index 0000000..570a0a9 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/package.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://extensions.jarvis.huakun.tech/schema.json", + "name": "jarvis-ext-astro", + "type": "module", + "version": "0.0.1", + "jarvis": {}, + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro check && astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/check": "^0.6.0", + "@astrojs/tailwind": "^5.1.0", + "@astrojs/vue": "^4.2.0", + "@vueuse/core": "^10.9.0", + "astro": "^4.8.2", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "lucide-vue-next": "^0.378.0", + "radix-vue": "^1.7.4", + "tailwind-merge": "^2.3.0", + "tailwindcss": "^3.4.3", + "tailwindcss-animate": "^1.0.7", + "vue": "^3.4.27" + }, + "devDependencies": { + "@iconify-json/radix-icons": "^1.1.14", + "@iconify/vue": "^4.1.2", + "typescript": "^5.4.5" + } +} \ No newline at end of file diff --git a/extension-templates/jarvis-ext-astro/pnpm-lock.yaml b/extension-templates/jarvis-ext-astro/pnpm-lock.yaml new file mode 100644 index 0000000..b5a9350 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/pnpm-lock.yaml @@ -0,0 +1,7547 @@ +lockfileVersion: "9.0" + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + .: + dependencies: + "@astrojs/check": + specifier: ^0.6.0 + version: 0.6.0(typescript@5.4.5) + "@astrojs/tailwind": + specifier: ^5.1.0 + version: 5.1.0(astro@4.8.2(typescript@5.4.5))(tailwindcss@3.4.3) + "@astrojs/vue": + specifier: ^4.2.0 + version: 4.2.0(astro@4.8.2(typescript@5.4.5))(rollup@4.17.2)(vite@5.2.11)(vue@3.4.27(typescript@5.4.5)) + "@vueuse/core": + specifier: ^10.9.0 + version: 10.9.0(vue@3.4.27(typescript@5.4.5)) + astro: + specifier: ^4.8.2 + version: 4.8.2(typescript@5.4.5) + class-variance-authority: + specifier: ^0.7.0 + version: 0.7.0 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + lucide-vue-next: + specifier: ^0.378.0 + version: 0.378.0(vue@3.4.27(typescript@5.4.5)) + radix-vue: + specifier: ^1.7.4 + version: 1.7.4(vue@3.4.27(typescript@5.4.5)) + tailwind-merge: + specifier: ^2.3.0 + version: 2.3.0 + tailwindcss: + specifier: ^3.4.3 + version: 3.4.3 + tailwindcss-animate: + specifier: ^1.0.7 + version: 1.0.7(tailwindcss@3.4.3) + vue: + specifier: ^3.4.27 + version: 3.4.27(typescript@5.4.5) + devDependencies: + "@iconify-json/radix-icons": + specifier: ^1.1.14 + version: 1.1.14 + "@iconify/vue": + specifier: ^4.1.2 + version: 4.1.2(vue@3.4.27(typescript@5.4.5)) + typescript: + specifier: ^5.4.5 + version: 5.4.5 + +packages: + "@alloc/quick-lru@5.2.0": + resolution: + { + integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==, + } + engines: { node: ">=10" } + + "@ampproject/remapping@2.3.0": + resolution: + { + integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==, + } + engines: { node: ">=6.0.0" } + + "@antfu/utils@0.7.8": + resolution: + { + integrity: sha512-rWQkqXRESdjXtc+7NRfK9lASQjpXJu1ayp7qi1d23zZorY+wBHVLHHoVcMsEnkqEBWTFqbztO7/QdJFzyEcLTg==, + } + + "@astrojs/check@0.6.0": + resolution: + { + integrity: sha512-Q6fct7FvByTf0L5lvH2QwFelXtLViWhPNgMfOvrGq7spV5SPX9jQPoFxH+nRFh1oDhBBIWImRjkSpSyhX9fQHA==, + } + hasBin: true + peerDependencies: + typescript: ^5.0.0 + + "@astrojs/compiler@2.8.0": + resolution: + { + integrity: sha512-yrpD1WRGqsJwANaDIdtHo+YVjvIOFAjC83lu5qENIgrafwZcJgSXDuwVMXOgok4tFzpeKLsFQ6c3FoUdloLWBQ==, + } + + "@astrojs/internal-helpers@0.4.0": + resolution: + { + integrity: sha512-6B13lz5n6BrbTqCTwhXjJXuR1sqiX/H6rTxzlXx+lN1NnV4jgnq/KJldCQaUWJzPL5SiWahQyinxAbxQtwgPHA==, + } + + "@astrojs/language-server@2.9.0": + resolution: + { + integrity: sha512-Q3wtoDh3RRfjYNfE5c7GPncAmZ6RMo3AQQCHBExtH5G4UiXYSxg4mPmSBdq+97yIXZWlN63W5V77OxUReAwQYA==, + } + hasBin: true + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-astro: ">=0.11.0" + peerDependenciesMeta: + prettier: + optional: true + prettier-plugin-astro: + optional: true + + "@astrojs/markdown-remark@5.1.0": + resolution: + { + integrity: sha512-S6Z3K2hOB7MfjeDoHsotnP/q2UsnEDB8NlNAaCjMDsGBZfTUbWxyLW3CaphEWw08f6KLZi2ibK9yC3BaMhh2NQ==, + } + + "@astrojs/prism@3.1.0": + resolution: + { + integrity: sha512-Z9IYjuXSArkAUx3N6xj6+Bnvx8OdUSHA8YoOgyepp3+zJmtVYJIl/I18GozdJVW1p5u/CNpl3Km7/gwTJK85cw==, + } + engines: { node: ^18.17.1 || ^20.3.0 || >=21.0.0 } + + "@astrojs/tailwind@5.1.0": + resolution: + { + integrity: sha512-BJoCDKuWhU9FT2qYg+fr6Nfb3qP4ShtyjXGHKA/4mHN94z7BGcmauQK23iy+YH5qWvTnhqkd6mQPQ1yTZTe9Ig==, + } + peerDependencies: + astro: ^3.0.0 || ^4.0.0 + tailwindcss: ^3.0.24 + + "@astrojs/telemetry@3.1.0": + resolution: + { + integrity: sha512-/ca/+D8MIKEC8/A9cSaPUqQNZm+Es/ZinRv0ZAzvu2ios7POQSsVD+VOj7/hypWNsNM3T7RpfgNq7H2TU1KEHA==, + } + engines: { node: ^18.17.1 || ^20.3.0 || >=21.0.0 } + + "@astrojs/vue@4.2.0": + resolution: + { + integrity: sha512-cjgPCeZtD2hcqC6vlL1GBdfEQdXcw5nd68IF5NFSiZNdcGpkug1TRgn7QeO2sfjUxI683igy7EwDYvRBXqzZ+A==, + } + engines: { node: ^18.17.1 || ^20.3.0 || >=21.0.0 } + peerDependencies: + astro: ^4.0.0 + vue: ^3.2.30 + + "@babel/code-frame@7.24.2": + resolution: + { + integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/compat-data@7.24.4": + resolution: + { + integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/core@7.24.5": + resolution: + { + integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==, + } + engines: { node: ">=6.9.0" } + + "@babel/generator@7.24.5": + resolution: + { + integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-annotate-as-pure@7.22.5": + resolution: + { + integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-compilation-targets@7.23.6": + resolution: + { + integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-create-class-features-plugin@7.24.5": + resolution: + { + integrity: sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/helper-environment-visitor@7.22.20": + resolution: + { + integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-function-name@7.23.0": + resolution: + { + integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-hoist-variables@7.22.5": + resolution: + { + integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-member-expression-to-functions@7.24.5": + resolution: + { + integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-imports@7.22.15": + resolution: + { + integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-imports@7.24.3": + resolution: + { + integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-transforms@7.24.5": + resolution: + { + integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/helper-optimise-call-expression@7.22.5": + resolution: + { + integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-plugin-utils@7.24.5": + resolution: + { + integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-replace-supers@7.24.1": + resolution: + { + integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0 + + "@babel/helper-simple-access@7.24.5": + resolution: + { + integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-skip-transparent-expression-wrappers@7.22.5": + resolution: + { + integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-split-export-declaration@7.24.5": + resolution: + { + integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-string-parser@7.24.1": + resolution: + { + integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-identifier@7.24.5": + resolution: + { + integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==, + } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-option@7.23.5": + resolution: + { + integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==, + } + engines: { node: ">=6.9.0" } + + "@babel/helpers@7.24.5": + resolution: + { + integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==, + } + engines: { node: ">=6.9.0" } + + "@babel/highlight@7.24.5": + resolution: + { + integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==, + } + engines: { node: ">=6.9.0" } + + "@babel/parser@7.24.5": + resolution: + { + integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==, + } + engines: { node: ">=6.0.0" } + hasBin: true + + "@babel/plugin-proposal-decorators@7.24.1": + resolution: + { + integrity: sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-decorators@7.24.1": + resolution: + { + integrity: sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-import-attributes@7.24.1": + resolution: + { + integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-import-meta@7.10.4": + resolution: + { + integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-jsx@7.24.1": + resolution: + { + integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-syntax-typescript@7.24.1": + resolution: + { + integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-react-jsx@7.23.4": + resolution: + { + integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/plugin-transform-typescript@7.24.5": + resolution: + { + integrity: sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==, + } + engines: { node: ">=6.9.0" } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@babel/runtime@7.24.5": + resolution: + { + integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==, + } + engines: { node: ">=6.9.0" } + + "@babel/template@7.24.0": + resolution: + { + integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==, + } + engines: { node: ">=6.9.0" } + + "@babel/traverse@7.24.5": + resolution: + { + integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==, + } + engines: { node: ">=6.9.0" } + + "@babel/types@7.24.5": + resolution: + { + integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==, + } + engines: { node: ">=6.9.0" } + + "@emmetio/abbreviation@2.3.3": + resolution: + { + integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==, + } + + "@emmetio/css-abbreviation@2.1.8": + resolution: + { + integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==, + } + + "@emmetio/scanner@1.0.4": + resolution: + { + integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==, + } + + "@emnapi/runtime@1.1.1": + resolution: + { + integrity: sha512-3bfqkzuR1KLx57nZfjr2NLnFOobvyS0aTszaEGCGqmYMVDRaGvgIZbjGSV/MHSSmLgQ/b9JFHQ5xm5WRZYd+XQ==, + } + + "@esbuild/aix-ppc64@0.20.2": + resolution: + { + integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [aix] + + "@esbuild/aix-ppc64@0.21.1": + resolution: + { + integrity: sha512-O7yppwipkXvnEPjzkSXJRk2g4bS8sUx9p9oXHq9MU/U7lxUzZVsnFZMDTmeeX9bfQxrFcvOacl/ENgOh0WP9pA==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [aix] + + "@esbuild/android-arm64@0.20.2": + resolution: + { + integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + + "@esbuild/android-arm64@0.21.1": + resolution: + { + integrity: sha512-jXhccq6es+onw7x8MxoFnm820mz7sGa9J14kLADclmiEUH4fyj+FjR6t0M93RgtlI/awHWhtF0Wgfhqgf9gDZA==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [android] + + "@esbuild/android-arm@0.20.2": + resolution: + { + integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + + "@esbuild/android-arm@0.21.1": + resolution: + { + integrity: sha512-hh3jKWikdnTtHCglDAeVO3Oyh8MaH8xZUaWMiCCvJ9/c3NtPqZq+CACOlGTxhddypXhl+8B45SeceYBfB/e8Ow==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [android] + + "@esbuild/android-x64@0.20.2": + resolution: + { + integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [android] + + "@esbuild/android-x64@0.21.1": + resolution: + { + integrity: sha512-NPObtlBh4jQHE01gJeucqEhdoD/4ya2owSIS8lZYS58aR0x7oZo9lB2lVFxgTANSa5MGCBeoQtr+yA9oKCGPvA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [android] + + "@esbuild/darwin-arm64@0.20.2": + resolution: + { + integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + + "@esbuild/darwin-arm64@0.21.1": + resolution: + { + integrity: sha512-BLT7TDzqsVlQRmJfO/FirzKlzmDpBWwmCUlyggfzUwg1cAxVxeA4O6b1XkMInlxISdfPAOunV9zXjvh5x99Heg==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [darwin] + + "@esbuild/darwin-x64@0.20.2": + resolution: + { + integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + + "@esbuild/darwin-x64@0.21.1": + resolution: + { + integrity: sha512-D3h3wBQmeS/vp93O4B+SWsXB8HvRDwMyhTNhBd8yMbh5wN/2pPWRW5o/hM3EKgk9bdKd9594lMGoTCTiglQGRQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [darwin] + + "@esbuild/freebsd-arm64@0.20.2": + resolution: + { + integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + + "@esbuild/freebsd-arm64@0.21.1": + resolution: + { + integrity: sha512-/uVdqqpNKXIxT6TyS/oSK4XE4xWOqp6fh4B5tgAwozkyWdylcX+W4YF2v6SKsL4wCQ5h1bnaSNjWPXG/2hp8AQ==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [freebsd] + + "@esbuild/freebsd-x64@0.20.2": + resolution: + { + integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + + "@esbuild/freebsd-x64@0.21.1": + resolution: + { + integrity: sha512-paAkKN1n1jJitw+dAoR27TdCzxRl1FOEITx3h201R6NoXUojpMzgMLdkXVgCvaCSCqwYkeGLoe9UVNRDKSvQgw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [freebsd] + + "@esbuild/linux-arm64@0.20.2": + resolution: + { + integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + + "@esbuild/linux-arm64@0.21.1": + resolution: + { + integrity: sha512-G65d08YoH00TL7Xg4LaL3gLV21bpoAhQ+r31NUu013YB7KK0fyXIt05VbsJtpqh/6wWxoLJZOvQHYnodRrnbUQ==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [linux] + + "@esbuild/linux-arm@0.20.2": + resolution: + { + integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + + "@esbuild/linux-arm@0.21.1": + resolution: + { + integrity: sha512-tRHnxWJnvNnDpNVnsyDhr1DIQZUfCXlHSCDohbXFqmg9W4kKR7g8LmA3kzcwbuxbRMKeit8ladnCabU5f2traA==, + } + engines: { node: ">=12" } + cpu: [arm] + os: [linux] + + "@esbuild/linux-ia32@0.20.2": + resolution: + { + integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + + "@esbuild/linux-ia32@0.21.1": + resolution: + { + integrity: sha512-tt/54LqNNAqCz++QhxoqB9+XqdsaZOtFD/srEhHYwBd3ZUOepmR1Eeot8bS+Q7BiEvy9vvKbtpHf+r6q8hF5UA==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [linux] + + "@esbuild/linux-loong64@0.20.2": + resolution: + { + integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==, + } + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + + "@esbuild/linux-loong64@0.21.1": + resolution: + { + integrity: sha512-MhNalK6r0nZD0q8VzUBPwheHzXPr9wronqmZrewLfP7ui9Fv1tdPmg6e7A8lmg0ziQCziSDHxh3cyRt4YMhGnQ==, + } + engines: { node: ">=12" } + cpu: [loong64] + os: [linux] + + "@esbuild/linux-mips64el@0.20.2": + resolution: + { + integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==, + } + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + + "@esbuild/linux-mips64el@0.21.1": + resolution: + { + integrity: sha512-YCKVY7Zen5rwZV+nZczOhFmHaeIxR4Zn3jcmNH53LbgF6IKRwmrMywqDrg4SiSNApEefkAbPSIzN39FC8VsxPg==, + } + engines: { node: ">=12" } + cpu: [mips64el] + os: [linux] + + "@esbuild/linux-ppc64@0.20.2": + resolution: + { + integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + + "@esbuild/linux-ppc64@0.21.1": + resolution: + { + integrity: sha512-bw7bcQ+270IOzDV4mcsKAnDtAFqKO0jVv3IgRSd8iM0ac3L8amvCrujRVt1ajBTJcpDaFhIX+lCNRKteoDSLig==, + } + engines: { node: ">=12" } + cpu: [ppc64] + os: [linux] + + "@esbuild/linux-riscv64@0.20.2": + resolution: + { + integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==, + } + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + + "@esbuild/linux-riscv64@0.21.1": + resolution: + { + integrity: sha512-ARmDRNkcOGOm1AqUBSwRVDfDeD9hGYRfkudP2QdoonBz1ucWVnfBPfy7H4JPI14eYtZruRSczJxyu7SRYDVOcg==, + } + engines: { node: ">=12" } + cpu: [riscv64] + os: [linux] + + "@esbuild/linux-s390x@0.20.2": + resolution: + { + integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==, + } + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + + "@esbuild/linux-s390x@0.21.1": + resolution: + { + integrity: sha512-o73TcUNMuoTZlhwFdsgr8SfQtmMV58sbgq6gQq9G1xUiYnHMTmJbwq65RzMx89l0iya69lR4bxBgtWiiOyDQZA==, + } + engines: { node: ">=12" } + cpu: [s390x] + os: [linux] + + "@esbuild/linux-x64@0.20.2": + resolution: + { + integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + + "@esbuild/linux-x64@0.21.1": + resolution: + { + integrity: sha512-da4/1mBJwwgJkbj4fMH7SOXq2zapgTo0LKXX1VUZ0Dxr+e8N0WbS80nSZ5+zf3lvpf8qxrkZdqkOqFfm57gXwA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [linux] + + "@esbuild/netbsd-x64@0.20.2": + resolution: + { + integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + + "@esbuild/netbsd-x64@0.21.1": + resolution: + { + integrity: sha512-CPWs0HTFe5woTJN5eKPvgraUoRHrCtzlYIAv9wBC+FAyagBSaf+UdZrjwYyTGnwPGkThV4OCI7XibZOnPvONVw==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [netbsd] + + "@esbuild/openbsd-x64@0.20.2": + resolution: + { + integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + + "@esbuild/openbsd-x64@0.21.1": + resolution: + { + integrity: sha512-xxhTm5QtzNLc24R0hEkcH+zCx/o49AsdFZ0Cy5zSd/5tOj4X2g3/2AJB625NoadUuc4A8B3TenLJoYdWYOYCew==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [openbsd] + + "@esbuild/sunos-x64@0.20.2": + resolution: + { + integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + + "@esbuild/sunos-x64@0.21.1": + resolution: + { + integrity: sha512-CWibXszpWys1pYmbr9UiKAkX6x+Sxw8HWtw1dRESK1dLW5fFJ6rMDVw0o8MbadusvVQx1a8xuOxnHXT941Hp1A==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [sunos] + + "@esbuild/win32-arm64@0.20.2": + resolution: + { + integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + + "@esbuild/win32-arm64@0.21.1": + resolution: + { + integrity: sha512-jb5B4k+xkytGbGUS4T+Z89cQJ9DJ4lozGRSV+hhfmCPpfJ3880O31Q1srPCimm+V6UCbnigqD10EgDNgjvjerQ==, + } + engines: { node: ">=12" } + cpu: [arm64] + os: [win32] + + "@esbuild/win32-ia32@0.20.2": + resolution: + { + integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + + "@esbuild/win32-ia32@0.21.1": + resolution: + { + integrity: sha512-PgyFvjJhXqHn1uxPhyN1wZ6dIomKjiLUQh1LjFvjiV1JmnkZ/oMPrfeEAZg5R/1ftz4LZWZr02kefNIQ5SKREQ==, + } + engines: { node: ">=12" } + cpu: [ia32] + os: [win32] + + "@esbuild/win32-x64@0.20.2": + resolution: + { + integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + + "@esbuild/win32-x64@0.21.1": + resolution: + { + integrity: sha512-W9NttRZQR5ehAiqHGDnvfDaGmQOm6Fi4vSlce8mjM75x//XKuVAByohlEX6N17yZnVXxQFuh4fDRunP8ca6bfA==, + } + engines: { node: ">=12" } + cpu: [x64] + os: [win32] + + "@floating-ui/core@1.6.1": + resolution: + { + integrity: sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==, + } + + "@floating-ui/dom@1.6.5": + resolution: + { + integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==, + } + + "@floating-ui/utils@0.2.2": + resolution: + { + integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==, + } + + "@floating-ui/vue@1.0.6": + resolution: + { + integrity: sha512-EdrOljjkpkkqZnrpqUcPoz9NvHxuTjUtSInh6GMv3+Mcy+giY2cE2pHh9rpacRcZ2eMSCxel9jWkWXTjLmY55w==, + } + + "@iconify-json/radix-icons@1.1.14": + resolution: + { + integrity: sha512-AYBOyhnJ2hXlg3aIn8Ekphrr7zHRyz1l8x6bidM3PDUuTL+aRt8r6cpCvN3GeuTHy2JOhmihbVJRF0bt2FF7Ag==, + } + + "@iconify/types@2.0.0": + resolution: + { + integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==, + } + + "@iconify/vue@4.1.2": + resolution: + { + integrity: sha512-CQnYqLiQD5LOAaXhBrmj1mdL2/NCJvwcC4jtW2Z8ukhThiFkLDkutarTOV2trfc9EXqUqRs0KqXOL9pZ/IyysA==, + } + peerDependencies: + vue: ">=3" + + "@img/sharp-darwin-arm64@0.33.3": + resolution: + { + integrity: sha512-FaNiGX1MrOuJ3hxuNzWgsT/mg5OHG/Izh59WW2mk1UwYHUwtfbhk5QNKYZgxf0pLOhx9ctGiGa2OykD71vOnSw==, + } + engines: + { + glibc: ">=2.26", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [arm64] + os: [darwin] + + "@img/sharp-darwin-x64@0.33.3": + resolution: + { + integrity: sha512-2QeSl7QDK9ru//YBT4sQkoq7L0EAJZA3rtV+v9p8xTKl4U1bUqTIaCnoC7Ctx2kCjQgwFXDasOtPTCT8eCTXvw==, + } + engines: + { + glibc: ">=2.26", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [x64] + os: [darwin] + + "@img/sharp-libvips-darwin-arm64@1.0.2": + resolution: + { + integrity: sha512-tcK/41Rq8IKlSaKRCCAuuY3lDJjQnYIW1UXU1kxcEKrfL8WR7N6+rzNoOxoQRJWTAECuKwgAHnPvqXGN8XfkHA==, + } + engines: { macos: ">=11", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [arm64] + os: [darwin] + + "@img/sharp-libvips-darwin-x64@1.0.2": + resolution: + { + integrity: sha512-Ofw+7oaWa0HiiMiKWqqaZbaYV3/UGL2wAPeLuJTx+9cXpCRdvQhCLG0IH8YGwM0yGWGLpsF4Su9vM1o6aer+Fw==, + } + engines: { macos: ">=10.13", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [x64] + os: [darwin] + + "@img/sharp-libvips-linux-arm64@1.0.2": + resolution: + { + integrity: sha512-x7kCt3N00ofFmmkkdshwj3vGPCnmiDh7Gwnd4nUwZln2YjqPxV1NlTyZOvoDWdKQVDL911487HOueBvrpflagw==, + } + engines: { glibc: ">=2.26", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [arm64] + os: [linux] + + "@img/sharp-libvips-linux-arm@1.0.2": + resolution: + { + integrity: sha512-iLWCvrKgeFoglQxdEwzu1eQV04o8YeYGFXtfWU26Zr2wWT3q3MTzC+QTCO3ZQfWd3doKHT4Pm2kRmLbupT+sZw==, + } + engines: { glibc: ">=2.28", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [arm] + os: [linux] + + "@img/sharp-libvips-linux-s390x@1.0.2": + resolution: + { + integrity: sha512-cmhQ1J4qVhfmS6szYW7RT+gLJq9dH2i4maq+qyXayUSn9/3iY2ZeWpbAgSpSVbV2E1JUL2Gg7pwnYQ1h8rQIog==, + } + engines: { glibc: ">=2.28", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [s390x] + os: [linux] + + "@img/sharp-libvips-linux-x64@1.0.2": + resolution: + { + integrity: sha512-E441q4Qdb+7yuyiADVi5J+44x8ctlrqn8XgkDTwr4qPJzWkaHwD489iZ4nGDgcuya4iMN3ULV6NwbhRZJ9Z7SQ==, + } + engines: { glibc: ">=2.26", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [x64] + os: [linux] + + "@img/sharp-libvips-linuxmusl-arm64@1.0.2": + resolution: + { + integrity: sha512-3CAkndNpYUrlDqkCM5qhksfE+qSIREVpyoeHIU6jd48SJZViAmznoQQLAv4hVXF7xyUB9zf+G++e2v1ABjCbEQ==, + } + engines: { musl: ">=1.2.2", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [arm64] + os: [linux] + + "@img/sharp-libvips-linuxmusl-x64@1.0.2": + resolution: + { + integrity: sha512-VI94Q6khIHqHWNOh6LLdm9s2Ry4zdjWJwH56WoiJU7NTeDwyApdZZ8c+SADC8OH98KWNQXnE01UdJ9CSfZvwZw==, + } + engines: { musl: ">=1.2.2", npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [x64] + os: [linux] + + "@img/sharp-linux-arm64@0.33.3": + resolution: + { + integrity: sha512-Zf+sF1jHZJKA6Gor9hoYG2ljr4wo9cY4twaxgFDvlG0Xz9V7sinsPp8pFd1XtlhTzYo0IhDbl3rK7P6MzHpnYA==, + } + engines: + { + glibc: ">=2.26", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [arm64] + os: [linux] + + "@img/sharp-linux-arm@0.33.3": + resolution: + { + integrity: sha512-Q7Ee3fFSC9P7vUSqVEF0zccJsZ8GiiCJYGWDdhEjdlOeS9/jdkyJ6sUSPj+bL8VuOYFSbofrW0t/86ceVhx32w==, + } + engines: + { + glibc: ">=2.28", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [arm] + os: [linux] + + "@img/sharp-linux-s390x@0.33.3": + resolution: + { + integrity: sha512-vFk441DKRFepjhTEH20oBlFrHcLjPfI8B0pMIxGm3+yilKyYeHEVvrZhYFdqIseSclIqbQ3SnZMwEMWonY5XFA==, + } + engines: + { + glibc: ">=2.28", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [s390x] + os: [linux] + + "@img/sharp-linux-x64@0.33.3": + resolution: + { + integrity: sha512-Q4I++herIJxJi+qmbySd072oDPRkCg/SClLEIDh5IL9h1zjhqjv82H0Seupd+q2m0yOfD+/fJnjSoDFtKiHu2g==, + } + engines: + { + glibc: ">=2.26", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [x64] + os: [linux] + + "@img/sharp-linuxmusl-arm64@0.33.3": + resolution: + { + integrity: sha512-qnDccehRDXadhM9PM5hLvcPRYqyFCBN31kq+ErBSZtZlsAc1U4Z85xf/RXv1qolkdu+ibw64fUDaRdktxTNP9A==, + } + engines: + { + musl: ">=1.2.2", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [arm64] + os: [linux] + + "@img/sharp-linuxmusl-x64@0.33.3": + resolution: + { + integrity: sha512-Jhchim8kHWIU/GZ+9poHMWRcefeaxFIs9EBqf9KtcC14Ojk6qua7ghKiPs0sbeLbLj/2IGBtDcxHyjCdYWkk2w==, + } + engines: + { + musl: ">=1.2.2", + node: ^18.17.0 || ^20.3.0 || >=21.0.0, + npm: ">=9.6.5", + pnpm: ">=7.1.0", + yarn: ">=3.2.0", + } + cpu: [x64] + os: [linux] + + "@img/sharp-wasm32@0.33.3": + resolution: + { + integrity: sha512-68zivsdJ0koE96stdUfM+gmyaK/NcoSZK5dV5CAjES0FUXS9lchYt8LAB5rTbM7nlWtxaU/2GON0HVN6/ZYJAQ==, + } + engines: + { node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [wasm32] + + "@img/sharp-win32-ia32@0.33.3": + resolution: + { + integrity: sha512-CyimAduT2whQD8ER4Ux7exKrtfoaUiVr7HG0zZvO0XTFn2idUWljjxv58GxNTkFb8/J9Ub9AqITGkJD6ZginxQ==, + } + engines: + { node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [ia32] + os: [win32] + + "@img/sharp-win32-x64@0.33.3": + resolution: + { + integrity: sha512-viT4fUIDKnli3IfOephGnolMzhz5VaTvDRkYqtZxOMIoMQ4MrAziO7pT1nVnOt2FAm7qW5aa+CCc13aEY6Le0g==, + } + engines: + { node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: ">=9.6.5", pnpm: ">=7.1.0", yarn: ">=3.2.0" } + cpu: [x64] + os: [win32] + + "@internationalized/date@3.5.3": + resolution: + { + integrity: sha512-X9bi8NAEHAjD8yzmPYT2pdJsbe+tYSEBAfowtlxJVJdZR3aK8Vg7ZUT1Fm5M47KLzp/M1p1VwAaeSma3RT7biw==, + } + + "@isaacs/cliui@8.0.2": + resolution: + { + integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==, + } + engines: { node: ">=12" } + + "@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462": + resolution: + { + integrity: sha512-etqLfpSJ5zaw76KUNF603be6d6QsiQPmaHr9FKEp4zhLZJzWCCMH6Icak7MtLUFLZLMpL761mZNImi/joBo1ZA==, + } + + "@jridgewell/gen-mapping@0.3.5": + resolution: + { + integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/resolve-uri@3.1.2": + resolution: + { + integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/set-array@1.2.1": + resolution: + { + integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==, + } + engines: { node: ">=6.0.0" } + + "@jridgewell/sourcemap-codec@1.4.15": + resolution: + { + integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==, + } + + "@jridgewell/trace-mapping@0.3.25": + resolution: + { + integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==, + } + + "@nodelib/fs.scandir@2.1.5": + resolution: + { + integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==, + } + engines: { node: ">= 8" } + + "@nodelib/fs.stat@2.0.5": + resolution: + { + integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==, + } + engines: { node: ">= 8" } + + "@nodelib/fs.walk@1.2.8": + resolution: + { + integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==, + } + engines: { node: ">= 8" } + + "@pkgjs/parseargs@0.11.0": + resolution: + { + integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==, + } + engines: { node: ">=14" } + + "@polka/url@1.0.0-next.25": + resolution: + { + integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==, + } + + "@rollup/pluginutils@5.1.0": + resolution: + { + integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + "@rollup/rollup-android-arm-eabi@4.17.2": + resolution: + { + integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==, + } + cpu: [arm] + os: [android] + + "@rollup/rollup-android-arm64@4.17.2": + resolution: + { + integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==, + } + cpu: [arm64] + os: [android] + + "@rollup/rollup-darwin-arm64@4.17.2": + resolution: + { + integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==, + } + cpu: [arm64] + os: [darwin] + + "@rollup/rollup-darwin-x64@4.17.2": + resolution: + { + integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==, + } + cpu: [x64] + os: [darwin] + + "@rollup/rollup-linux-arm-gnueabihf@4.17.2": + resolution: + { + integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==, + } + cpu: [arm] + os: [linux] + + "@rollup/rollup-linux-arm-musleabihf@4.17.2": + resolution: + { + integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==, + } + cpu: [arm] + os: [linux] + + "@rollup/rollup-linux-arm64-gnu@4.17.2": + resolution: + { + integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==, + } + cpu: [arm64] + os: [linux] + + "@rollup/rollup-linux-arm64-musl@4.17.2": + resolution: + { + integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==, + } + cpu: [arm64] + os: [linux] + + "@rollup/rollup-linux-powerpc64le-gnu@4.17.2": + resolution: + { + integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==, + } + cpu: [ppc64] + os: [linux] + + "@rollup/rollup-linux-riscv64-gnu@4.17.2": + resolution: + { + integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==, + } + cpu: [riscv64] + os: [linux] + + "@rollup/rollup-linux-s390x-gnu@4.17.2": + resolution: + { + integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==, + } + cpu: [s390x] + os: [linux] + + "@rollup/rollup-linux-x64-gnu@4.17.2": + resolution: + { + integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==, + } + cpu: [x64] + os: [linux] + + "@rollup/rollup-linux-x64-musl@4.17.2": + resolution: + { + integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==, + } + cpu: [x64] + os: [linux] + + "@rollup/rollup-win32-arm64-msvc@4.17.2": + resolution: + { + integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==, + } + cpu: [arm64] + os: [win32] + + "@rollup/rollup-win32-ia32-msvc@4.17.2": + resolution: + { + integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==, + } + cpu: [ia32] + os: [win32] + + "@rollup/rollup-win32-x64-msvc@4.17.2": + resolution: + { + integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==, + } + cpu: [x64] + os: [win32] + + "@shikijs/core@1.5.1": + resolution: + { + integrity: sha512-xjV63pRUBvxA1LsxOUhRKLPh0uUjwBLzAKLdEuYSLIylo71sYuwDcttqNP01Ib1TZlLfO840CXHPlgUUsYFjzg==, + } + + "@swc/helpers@0.5.11": + resolution: + { + integrity: sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==, + } + + "@tanstack/virtual-core@3.5.0": + resolution: + { + integrity: sha512-KnPRCkQTyqhanNC0K63GBG3wA8I+D1fQuVnAvcBF8f13akOKeQp1gSbu6f77zCxhEk727iV5oQnbHLYzHrECLg==, + } + + "@tanstack/vue-virtual@3.5.0": + resolution: + { + integrity: sha512-wvRQ8sFxn/NDr3WvI5XabhFovZ5MBmpEck2GHpTxYunmV63Ovpl30lRu6W5BPQo35a1GqDZ+Pvzlz6WDWRNqqw==, + } + peerDependencies: + vue: ^2.7.0 || ^3.0.0 + + "@types/babel__core@7.20.5": + resolution: + { + integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==, + } + + "@types/babel__generator@7.6.8": + resolution: + { + integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==, + } + + "@types/babel__template@7.4.4": + resolution: + { + integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==, + } + + "@types/babel__traverse@7.20.5": + resolution: + { + integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==, + } + + "@types/cookie@0.6.0": + resolution: + { + integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==, + } + + "@types/debug@4.1.12": + resolution: + { + integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==, + } + + "@types/estree@1.0.5": + resolution: + { + integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==, + } + + "@types/hast@3.0.4": + resolution: + { + integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==, + } + + "@types/mdast@4.0.3": + resolution: + { + integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==, + } + + "@types/ms@0.7.34": + resolution: + { + integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==, + } + + "@types/nlcst@1.0.4": + resolution: + { + integrity: sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg==, + } + + "@types/unist@2.0.10": + resolution: + { + integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==, + } + + "@types/unist@3.0.2": + resolution: + { + integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==, + } + + "@types/web-bluetooth@0.0.20": + resolution: + { + integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==, + } + + "@ungap/structured-clone@1.2.0": + resolution: + { + integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==, + } + + "@vitejs/plugin-vue-jsx@3.1.0": + resolution: + { + integrity: sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==, + } + engines: { node: ^14.18.0 || >=16.0.0 } + peerDependencies: + vite: ^4.0.0 || ^5.0.0 + vue: ^3.0.0 + + "@vitejs/plugin-vue@5.0.4": + resolution: + { + integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + peerDependencies: + vite: ^5.0.0 + vue: ^3.2.25 + + "@volar/kit@2.2.2": + resolution: + { + integrity: sha512-mIPWV7sjuJPNL+TLnpQwFD6hW+D5tF4Axg+nv0wHjdxrik+ilWT5DnBomMftoekUF4+SxUqxMjU8kd7caOuT5Q==, + } + peerDependencies: + typescript: "*" + + "@volar/language-core@2.2.2": + resolution: + { + integrity: sha512-GuvEL4JdxbnLVhPLICncCGT+tVW4cIz9GxXNeDofNnJ4iNTKhr5suGVsA1GLOne9PbraSjn8PlLt+pvLxuRVeQ==, + } + + "@volar/language-server@2.2.2": + resolution: + { + integrity: sha512-9KwlCDNeFCoxTIhYOJNtpQA7M0JP0DHvvwXrqN8qNNEMJT1Oe0cic0C2tUCa/poCgkiXDbUxRldwamyuTZ6ZQg==, + } + + "@volar/language-service@2.2.2": + resolution: + { + integrity: sha512-uxooJqRhtESXaPAGs+YFJGAtZQuRO1KLG4LPPGrHHO1ZTkx0TfQPym6WNnBfVCcBXwnSlyFVv+IbAndR5oKz1w==, + } + + "@volar/snapshot-document@2.2.2": + resolution: + { + integrity: sha512-JKj3aRpfoJZ84EeFN62PFw3jwKo2WTQnaemhWu/S4QNlw7q+IoDI1jNcgxZwblfBl0X5YGlRI1zYbwr8WidBTA==, + } + + "@volar/source-map@2.2.2": + resolution: + { + integrity: sha512-vUwvZuSW6iN4JI9QRinh9EjFasx1TUtnaWMKwgWx08xz1PyYuNkLlWlrZXBZ5GGBhML0u230M/7X+AHY2h9yKg==, + } + + "@volar/typescript@2.2.2": + resolution: + { + integrity: sha512-WcwOREz7+uOrpjUrKhOMaOKKmyPdtqF95HWX7SE0d9hhBB1KkfahxhaAex5U9Bn43LfINHlycLoYCNEtfeKm0g==, + } + + "@vscode/emmet-helper@2.9.3": + resolution: + { + integrity: sha512-rB39LHWWPQYYlYfpv9qCoZOVioPCftKXXqrsyqN1mTWZM6dTnONT63Db+03vgrBbHzJN45IrgS/AGxw9iiqfEw==, + } + + "@vscode/l10n@0.0.16": + resolution: + { + integrity: sha512-JT5CvrIYYCrmB+dCana8sUqJEcGB1ZDXNLMQ2+42bW995WmNoenijWMUdZfwmuQUTQcEVVIa2OecZzTYWUW9Cg==, + } + + "@vscode/l10n@0.0.18": + resolution: + { + integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==, + } + + "@vue/babel-helper-vue-transform-on@1.2.2": + resolution: + { + integrity: sha512-nOttamHUR3YzdEqdM/XXDyCSdxMA9VizUKoroLX6yTyRtggzQMHXcmwh8a7ZErcJttIBIc9s68a1B8GZ+Dmvsw==, + } + + "@vue/babel-plugin-jsx@1.2.2": + resolution: + { + integrity: sha512-nYTkZUVTu4nhP199UoORePsql0l+wj7v/oyQjtThUVhJl1U+6qHuoVhIvR3bf7eVKjbCK+Cs2AWd7mi9Mpz9rA==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + peerDependenciesMeta: + "@babel/core": + optional: true + + "@vue/babel-plugin-resolve-type@1.2.2": + resolution: + { + integrity: sha512-EntyroPwNg5IPVdUJupqs0CFzuf6lUrVvCspmv2J1FITLeGnUCuoGNNk78dgCusxEiYj6RMkTJflGSxk5aIC4A==, + } + peerDependencies: + "@babel/core": ^7.0.0-0 + + "@vue/compiler-core@3.4.27": + resolution: + { + integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==, + } + + "@vue/compiler-dom@3.4.27": + resolution: + { + integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==, + } + + "@vue/compiler-sfc@3.4.27": + resolution: + { + integrity: sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==, + } + + "@vue/compiler-ssr@3.4.27": + resolution: + { + integrity: sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==, + } + + "@vue/devtools-core@7.1.3": + resolution: + { + integrity: sha512-pVbWi8pf2Z/fZPioYOIgu+cv9pQG55k4D8bL31ec+Wfe+pQR0ImFDu0OhHfch1Ra8uvLLrAZTF4IKeGAkmzD4A==, + } + + "@vue/devtools-kit@7.1.3": + resolution: + { + integrity: sha512-NFskFSJMVCBXTkByuk2llzI3KD3Blcm7WqiRorWjD6nClHPgkH5BobDH08rfulqq5ocRt5xV+3qOT1Q9FXJrwQ==, + } + peerDependencies: + vue: ^3.0.0 + + "@vue/devtools-shared@7.1.3": + resolution: + { + integrity: sha512-KJ3AfgjTn3tJz/XKF+BlVShNPecim3G21oHRue+YQOsooW+0s+qXvm09U09aO7yBza5SivL1QgxSrzAbiKWjhQ==, + } + + "@vue/reactivity@3.4.27": + resolution: + { + integrity: sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==, + } + + "@vue/runtime-core@3.4.27": + resolution: + { + integrity: sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==, + } + + "@vue/runtime-dom@3.4.27": + resolution: + { + integrity: sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==, + } + + "@vue/server-renderer@3.4.27": + resolution: + { + integrity: sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==, + } + peerDependencies: + vue: 3.4.27 + + "@vue/shared@3.4.27": + resolution: + { + integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==, + } + + "@vueuse/core@10.9.0": + resolution: + { + integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==, + } + + "@vueuse/metadata@10.9.0": + resolution: + { + integrity: sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==, + } + + "@vueuse/shared@10.9.0": + resolution: + { + integrity: sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==, + } + + acorn@8.11.3: + resolution: + { + integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==, + } + engines: { node: ">=0.4.0" } + hasBin: true + + ansi-align@3.0.1: + resolution: + { + integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==, + } + + ansi-regex@5.0.1: + resolution: + { + integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==, + } + engines: { node: ">=8" } + + ansi-regex@6.0.1: + resolution: + { + integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==, + } + engines: { node: ">=12" } + + ansi-styles@3.2.1: + resolution: + { + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==, + } + engines: { node: ">=4" } + + ansi-styles@4.3.0: + resolution: + { + integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==, + } + engines: { node: ">=8" } + + ansi-styles@6.2.1: + resolution: + { + integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==, + } + engines: { node: ">=12" } + + any-promise@1.3.0: + resolution: + { + integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==, + } + + anymatch@3.1.3: + resolution: + { + integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==, + } + engines: { node: ">= 8" } + + arg@5.0.2: + resolution: + { + integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==, + } + + argparse@1.0.10: + resolution: + { + integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==, + } + + argparse@2.0.1: + resolution: + { + integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==, + } + + aria-hidden@1.2.4: + resolution: + { + integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==, + } + engines: { node: ">=10" } + + aria-query@5.3.0: + resolution: + { + integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==, + } + + array-iterate@2.0.1: + resolution: + { + integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==, + } + + astro@4.8.2: + resolution: + { + integrity: sha512-WBrnNePQ03cF5c+9sjD3TeyJodWMuPCwygDOUo7r+7LbKDN9TJK+KxIxo01AOX4HcexhxcLiTVVCBLSsi+OX9A==, + } + engines: { node: ^18.17.1 || ^20.3.0 || >=21.0.0, npm: ">=9.6.5", pnpm: ">=7.1.0" } + hasBin: true + + autoprefixer@10.4.19: + resolution: + { + integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==, + } + engines: { node: ^10 || ^12 || >=14 } + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + axobject-query@4.0.0: + resolution: + { + integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==, + } + + bail@2.0.2: + resolution: + { + integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==, + } + + balanced-match@1.0.2: + resolution: + { + integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==, + } + + base-64@1.0.0: + resolution: + { + integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==, + } + + binary-extensions@2.3.0: + resolution: + { + integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==, + } + engines: { node: ">=8" } + + boxen@7.1.1: + resolution: + { + integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==, + } + engines: { node: ">=14.16" } + + brace-expansion@2.0.1: + resolution: + { + integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==, + } + + braces@3.0.2: + resolution: + { + integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==, + } + engines: { node: ">=8" } + + browserslist@4.23.0: + resolution: + { + integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==, + } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } + hasBin: true + + bundle-name@4.1.0: + resolution: + { + integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==, + } + engines: { node: ">=18" } + + camelcase-css@2.0.1: + resolution: + { + integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==, + } + engines: { node: ">= 6" } + + camelcase@6.3.0: + resolution: + { + integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==, + } + engines: { node: ">=10" } + + camelcase@7.0.1: + resolution: + { + integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==, + } + engines: { node: ">=14.16" } + + caniuse-lite@1.0.30001617: + resolution: + { + integrity: sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==, + } + + ccount@2.0.1: + resolution: + { + integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==, + } + + chalk@2.4.2: + resolution: + { + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==, + } + engines: { node: ">=4" } + + chalk@5.3.0: + resolution: + { + integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==, + } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + + character-entities-html4@2.1.0: + resolution: + { + integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==, + } + + character-entities-legacy@3.0.0: + resolution: + { + integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==, + } + + character-entities@2.0.2: + resolution: + { + integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==, + } + + chokidar@3.6.0: + resolution: + { + integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==, + } + engines: { node: ">= 8.10.0" } + + ci-info@4.0.0: + resolution: + { + integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==, + } + engines: { node: ">=8" } + + class-variance-authority@0.7.0: + resolution: + { + integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==, + } + + cli-boxes@3.0.0: + resolution: + { + integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==, + } + engines: { node: ">=10" } + + cli-cursor@4.0.0: + resolution: + { + integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + cli-spinners@2.9.2: + resolution: + { + integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==, + } + engines: { node: ">=6" } + + cliui@8.0.1: + resolution: + { + integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==, + } + engines: { node: ">=12" } + + clsx@2.0.0: + resolution: + { + integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==, + } + engines: { node: ">=6" } + + clsx@2.1.1: + resolution: + { + integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==, + } + engines: { node: ">=6" } + + color-convert@1.9.3: + resolution: + { + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==, + } + + color-convert@2.0.1: + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } + + color-name@1.1.3: + resolution: + { + integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==, + } + + color-name@1.1.4: + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } + + color-string@1.9.1: + resolution: + { + integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==, + } + + color@4.2.3: + resolution: + { + integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==, + } + engines: { node: ">=12.5.0" } + + comma-separated-tokens@2.0.3: + resolution: + { + integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==, + } + + commander@4.1.1: + resolution: + { + integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, + } + engines: { node: ">= 6" } + + common-ancestor-path@1.0.1: + resolution: + { + integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==, + } + + convert-source-map@2.0.0: + resolution: + { + integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==, + } + + cookie@0.6.0: + resolution: + { + integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==, + } + engines: { node: ">= 0.6" } + + cross-spawn@7.0.3: + resolution: + { + integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==, + } + engines: { node: ">= 8" } + + cssesc@3.0.0: + resolution: + { + integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, + } + engines: { node: ">=4" } + hasBin: true + + csstype@3.1.3: + resolution: + { + integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, + } + + debug@4.3.4: + resolution: + { + integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==, + } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.0.2: + resolution: + { + integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==, + } + + default-browser-id@5.0.0: + resolution: + { + integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==, + } + engines: { node: ">=18" } + + default-browser@5.2.1: + resolution: + { + integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==, + } + engines: { node: ">=18" } + + define-lazy-prop@3.0.0: + resolution: + { + integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==, + } + engines: { node: ">=12" } + + defu@6.1.4: + resolution: + { + integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==, + } + + dequal@2.0.3: + resolution: + { + integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==, + } + engines: { node: ">=6" } + + detect-libc@2.0.3: + resolution: + { + integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==, + } + engines: { node: ">=8" } + + deterministic-object-hash@2.0.2: + resolution: + { + integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==, + } + engines: { node: ">=18" } + + devalue@5.0.0: + resolution: + { + integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==, + } + + devlop@1.1.0: + resolution: + { + integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==, + } + + didyoumean@1.2.2: + resolution: + { + integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==, + } + + diff@5.2.0: + resolution: + { + integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==, + } + engines: { node: ">=0.3.1" } + + dlv@1.1.3: + resolution: + { + integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==, + } + + dset@3.1.3: + resolution: + { + integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==, + } + engines: { node: ">=4" } + + eastasianwidth@0.2.0: + resolution: + { + integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==, + } + + electron-to-chromium@1.4.763: + resolution: + { + integrity: sha512-k4J8NrtJ9QrvHLRo8Q18OncqBCB7tIUyqxRcJnlonQ0ioHKYB988GcDFF3ZePmnb8eHEopDs/wPHR/iGAFgoUQ==, + } + + emmet@2.4.7: + resolution: + { + integrity: sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==, + } + + emoji-regex@10.3.0: + resolution: + { + integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==, + } + + emoji-regex@8.0.0: + resolution: + { + integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==, + } + + emoji-regex@9.2.2: + resolution: + { + integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==, + } + + entities@4.5.0: + resolution: + { + integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==, + } + engines: { node: ">=0.12" } + + error-stack-parser-es@0.1.1: + resolution: + { + integrity: sha512-g/9rfnvnagiNf+DRMHEVGuGuIBlCIMDFoTA616HaP2l9PlCjGjVhD98PNbVSJvmK4TttqT5mV5tInMhoFgi+aA==, + } + + es-module-lexer@1.5.2: + resolution: + { + integrity: sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==, + } + + esbuild@0.20.2: + resolution: + { + integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==, + } + engines: { node: ">=12" } + hasBin: true + + esbuild@0.21.1: + resolution: + { + integrity: sha512-GPqx+FX7mdqulCeQ4TsGZQ3djBJkx5k7zBGtqt9ycVlWNg8llJ4RO9n2vciu8BN2zAEs6lPbPl0asZsAh7oWzg==, + } + engines: { node: ">=12" } + hasBin: true + + escalade@3.1.2: + resolution: + { + integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==, + } + engines: { node: ">=6" } + + escape-string-regexp@1.0.5: + resolution: + { + integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==, + } + engines: { node: ">=0.8.0" } + + escape-string-regexp@5.0.0: + resolution: + { + integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==, + } + engines: { node: ">=12" } + + esprima@4.0.1: + resolution: + { + integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==, + } + engines: { node: ">=4" } + hasBin: true + + estree-walker@2.0.2: + resolution: + { + integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==, + } + + estree-walker@3.0.3: + resolution: + { + integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==, + } + + eventemitter3@5.0.1: + resolution: + { + integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==, + } + + execa@8.0.1: + resolution: + { + integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==, + } + engines: { node: ">=16.17" } + + extend-shallow@2.0.1: + resolution: + { + integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==, + } + engines: { node: ">=0.10.0" } + + extend@3.0.2: + resolution: + { + integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==, + } + + fast-deep-equal@3.1.3: + resolution: + { + integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==, + } + + fast-glob@3.3.2: + resolution: + { + integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==, + } + engines: { node: ">=8.6.0" } + + fastq@1.17.1: + resolution: + { + integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==, + } + + fill-range@7.0.1: + resolution: + { + integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==, + } + engines: { node: ">=8" } + + find-up@4.1.0: + resolution: + { + integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==, + } + engines: { node: ">=8" } + + find-up@5.0.0: + resolution: + { + integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==, + } + engines: { node: ">=10" } + + find-yarn-workspace-root2@1.2.16: + resolution: + { + integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==, + } + + flattie@1.1.1: + resolution: + { + integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==, + } + engines: { node: ">=8" } + + foreground-child@3.1.1: + resolution: + { + integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==, + } + engines: { node: ">=14" } + + fraction.js@4.3.7: + resolution: + { + integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==, + } + + fs-extra@11.2.0: + resolution: + { + integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==, + } + engines: { node: ">=14.14" } + + 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.2.0: + resolution: + { + integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==, + } + engines: { node: ">=18" } + + get-stream@8.0.1: + resolution: + { + integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==, + } + engines: { node: ">=16" } + + github-slugger@2.0.0: + resolution: + { + integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==, + } + + glob-parent@5.1.2: + resolution: + { + integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==, + } + engines: { node: ">= 6" } + + glob-parent@6.0.2: + resolution: + { + integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==, + } + engines: { node: ">=10.13.0" } + + glob@10.3.14: + resolution: + { + integrity: sha512-4fkAqu93xe9Mk7le9v0y3VrPDqLKHarNi2s4Pv7f2yOvfhWfhc7hRPHC/JyqMqb8B/Dt/eGS4n7ykwf3fOsl8g==, + } + engines: { node: ">=16 || 14 >=14.17" } + hasBin: true + + globals@11.12.0: + resolution: + { + integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==, + } + engines: { node: ">=4" } + + graceful-fs@4.2.11: + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } + + gray-matter@4.0.3: + resolution: + { + integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==, + } + engines: { node: ">=6.0" } + + has-flag@3.0.0: + resolution: + { + integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==, + } + engines: { node: ">=4" } + + hasown@2.0.2: + resolution: + { + integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + } + engines: { node: ">= 0.4" } + + hast-util-from-html@2.0.1: + resolution: + { + integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==, + } + + hast-util-from-parse5@8.0.1: + resolution: + { + integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==, + } + + hast-util-is-element@3.0.0: + resolution: + { + integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==, + } + + hast-util-parse-selector@4.0.0: + resolution: + { + integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==, + } + + hast-util-raw@9.0.3: + resolution: + { + integrity: sha512-ICWvVOF2fq4+7CMmtCPD5CM4QKjPbHpPotE6+8tDooV0ZuyJVUzHsrNX+O5NaRbieTf0F7FfeBOMAwi6Td0+yQ==, + } + + hast-util-to-html@9.0.1: + resolution: + { + integrity: sha512-hZOofyZANbyWo+9RP75xIDV/gq+OUKx+T46IlwERnKmfpwp81XBFbT9mi26ws+SJchA4RVUQwIBJpqEOBhMzEQ==, + } + + hast-util-to-parse5@8.0.0: + resolution: + { + integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==, + } + + hast-util-to-text@4.0.2: + resolution: + { + integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==, + } + + hast-util-whitespace@3.0.0: + resolution: + { + integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==, + } + + hastscript@8.0.0: + resolution: + { + integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==, + } + + hookable@5.5.3: + resolution: + { + integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==, + } + + html-escaper@3.0.3: + resolution: + { + integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==, + } + + html-tags@3.3.1: + resolution: + { + integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==, + } + engines: { node: ">=8" } + + html-void-elements@3.0.0: + resolution: + { + integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==, + } + + http-cache-semantics@4.1.1: + resolution: + { + integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==, + } + + human-signals@5.0.0: + resolution: + { + integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==, + } + engines: { node: ">=16.17.0" } + + import-meta-resolve@4.1.0: + resolution: + { + integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==, + } + + is-arrayish@0.3.2: + resolution: + { + integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, + } + + is-binary-path@2.1.0: + resolution: + { + integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==, + } + engines: { node: ">=8" } + + is-buffer@2.0.5: + resolution: + { + integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==, + } + engines: { node: ">=4" } + + is-core-module@2.13.1: + resolution: + { + integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==, + } + + is-docker@3.0.0: + resolution: + { + integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + hasBin: true + + is-extendable@0.1.1: + resolution: + { + integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==, + } + engines: { node: ">=0.10.0" } + + is-extglob@2.1.1: + resolution: + { + integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==, + } + engines: { node: ">=0.10.0" } + + is-fullwidth-code-point@3.0.0: + resolution: + { + integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==, + } + engines: { node: ">=8" } + + is-glob@4.0.3: + resolution: + { + integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==, + } + engines: { node: ">=0.10.0" } + + is-inside-container@1.0.0: + resolution: + { + integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==, + } + engines: { node: ">=14.16" } + hasBin: true + + is-interactive@2.0.0: + resolution: + { + integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==, + } + engines: { node: ">=12" } + + is-number@7.0.0: + resolution: + { + integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==, + } + engines: { node: ">=0.12.0" } + + is-plain-obj@4.1.0: + resolution: + { + integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==, + } + engines: { node: ">=12" } + + is-stream@3.0.0: + resolution: + { + integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + is-unicode-supported@1.3.0: + resolution: + { + integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==, + } + engines: { node: ">=12" } + + is-unicode-supported@2.0.0: + resolution: + { + integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==, + } + engines: { node: ">=18" } + + is-wsl@3.1.0: + resolution: + { + integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==, + } + engines: { node: ">=16" } + + isexe@2.0.0: + resolution: + { + integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==, + } + + jackspeak@2.3.6: + resolution: + { + integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==, + } + engines: { node: ">=14" } + + jiti@1.21.0: + resolution: + { + integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==, + } + hasBin: true + + js-tokens@4.0.0: + resolution: + { + integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==, + } + + js-yaml@3.14.1: + resolution: + { + integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==, + } + hasBin: true + + js-yaml@4.1.0: + resolution: + { + integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==, + } + hasBin: true + + jsesc@2.5.2: + resolution: + { + integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==, + } + engines: { node: ">=4" } + hasBin: true + + 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==, + } + + jsonfile@6.1.0: + resolution: + { + integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==, + } + + kind-of@6.0.3: + resolution: + { + integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==, + } + engines: { node: ">=0.10.0" } + + kleur@3.0.3: + resolution: + { + integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==, + } + engines: { node: ">=6" } + + kleur@4.1.5: + resolution: + { + integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==, + } + engines: { node: ">=6" } + + kolorist@1.8.0: + resolution: + { + integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==, + } + + lilconfig@2.1.0: + resolution: + { + integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==, + } + engines: { node: ">=10" } + + lilconfig@3.1.1: + resolution: + { + integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==, + } + engines: { node: ">=14" } + + lines-and-columns@1.2.4: + resolution: + { + integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, + } + + load-yaml-file@0.2.0: + resolution: + { + integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==, + } + engines: { node: ">=6" } + + locate-path@5.0.0: + resolution: + { + integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==, + } + engines: { node: ">=8" } + + locate-path@6.0.0: + resolution: + { + integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==, + } + engines: { node: ">=10" } + + log-symbols@6.0.0: + resolution: + { + integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==, + } + engines: { node: ">=18" } + + longest-streak@3.1.0: + resolution: + { + integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==, + } + + lru-cache@10.2.2: + resolution: + { + integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==, + } + engines: { node: 14 || >=16.14 } + + lru-cache@5.1.1: + resolution: + { + integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, + } + + lucide-vue-next@0.378.0: + resolution: + { + integrity: sha512-tz2IUhdOf1q0x1mPOTZEJZYfXVLreQorO2ax4M+CxGOTgCNgXH3cljIWWfJ4jUvxn5rbkFlGPbl9EIfIelZBRA==, + } + peerDependencies: + vue: ">=3.0.1" + + magic-string@0.30.10: + resolution: + { + integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==, + } + + markdown-table@3.0.3: + resolution: + { + integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==, + } + + mdast-util-definitions@6.0.0: + resolution: + { + integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==, + } + + mdast-util-find-and-replace@3.0.1: + resolution: + { + integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==, + } + + mdast-util-from-markdown@2.0.0: + resolution: + { + integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==, + } + + mdast-util-gfm-autolink-literal@2.0.0: + resolution: + { + integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==, + } + + mdast-util-gfm-footnote@2.0.0: + resolution: + { + integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==, + } + + mdast-util-gfm-strikethrough@2.0.0: + resolution: + { + integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==, + } + + mdast-util-gfm-table@2.0.0: + resolution: + { + integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==, + } + + mdast-util-gfm-task-list-item@2.0.0: + resolution: + { + integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==, + } + + mdast-util-gfm@3.0.0: + resolution: + { + integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==, + } + + mdast-util-phrasing@4.1.0: + resolution: + { + integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==, + } + + mdast-util-to-hast@13.1.0: + resolution: + { + integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==, + } + + mdast-util-to-markdown@2.1.0: + resolution: + { + integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==, + } + + mdast-util-to-string@4.0.0: + resolution: + { + integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==, + } + + merge-stream@2.0.0: + resolution: + { + integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==, + } + + merge2@1.4.1: + resolution: + { + integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==, + } + engines: { node: ">= 8" } + + micromark-core-commonmark@2.0.1: + resolution: + { + integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==, + } + + micromark-extension-gfm-autolink-literal@2.0.0: + resolution: + { + integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==, + } + + micromark-extension-gfm-footnote@2.0.0: + resolution: + { + integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==, + } + + micromark-extension-gfm-strikethrough@2.0.0: + resolution: + { + integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==, + } + + micromark-extension-gfm-table@2.0.0: + resolution: + { + integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==, + } + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: + { + integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==, + } + + micromark-extension-gfm-task-list-item@2.0.1: + resolution: + { + integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==, + } + + micromark-extension-gfm@3.0.0: + resolution: + { + integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==, + } + + micromark-factory-destination@2.0.0: + resolution: + { + integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==, + } + + micromark-factory-label@2.0.0: + resolution: + { + integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==, + } + + micromark-factory-space@2.0.0: + resolution: + { + integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==, + } + + micromark-factory-title@2.0.0: + resolution: + { + integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==, + } + + micromark-factory-whitespace@2.0.0: + resolution: + { + integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==, + } + + micromark-util-character@2.1.0: + resolution: + { + integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==, + } + + micromark-util-chunked@2.0.0: + resolution: + { + integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==, + } + + micromark-util-classify-character@2.0.0: + resolution: + { + integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==, + } + + micromark-util-combine-extensions@2.0.0: + resolution: + { + integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==, + } + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: + { + integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==, + } + + micromark-util-decode-string@2.0.0: + resolution: + { + integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==, + } + + micromark-util-encode@2.0.0: + resolution: + { + integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==, + } + + micromark-util-html-tag-name@2.0.0: + resolution: + { + integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==, + } + + micromark-util-normalize-identifier@2.0.0: + resolution: + { + integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==, + } + + micromark-util-resolve-all@2.0.0: + resolution: + { + integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==, + } + + micromark-util-sanitize-uri@2.0.0: + resolution: + { + integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==, + } + + micromark-util-subtokenize@2.0.1: + resolution: + { + integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==, + } + + micromark-util-symbol@2.0.0: + resolution: + { + integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==, + } + + micromark-util-types@2.0.0: + resolution: + { + integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==, + } + + micromark@4.0.0: + resolution: + { + integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==, + } + + micromatch@4.0.5: + resolution: + { + integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==, + } + engines: { node: ">=8.6" } + + mimic-fn@2.1.0: + resolution: + { + integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==, + } + engines: { node: ">=6" } + + mimic-fn@4.0.0: + resolution: + { + integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==, + } + engines: { node: ">=12" } + + minimatch@9.0.4: + resolution: + { + integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==, + } + engines: { node: ">=16 || 14 >=14.17" } + + minipass@7.1.1: + resolution: + { + integrity: sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==, + } + engines: { node: ">=16 || 14 >=14.17" } + + mitt@3.0.1: + resolution: + { + integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==, + } + + mrmime@2.0.0: + resolution: + { + integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==, + } + engines: { node: ">=10" } + + ms@2.1.2: + resolution: + { + integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==, + } + + muggle-string@0.4.1: + resolution: + { + integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==, + } + + mz@2.7.0: + resolution: + { + integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==, + } + + nanoid@3.3.7: + resolution: + { + integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } + hasBin: true + + nanoid@5.0.7: + resolution: + { + integrity: sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==, + } + engines: { node: ^18 || >=20 } + hasBin: true + + nlcst-to-string@3.1.1: + resolution: + { + integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==, + } + + node-releases@2.0.14: + resolution: + { + integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==, + } + + normalize-path@3.0.0: + resolution: + { + integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==, + } + engines: { node: ">=0.10.0" } + + normalize-range@0.1.2: + resolution: + { + integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==, + } + engines: { node: ">=0.10.0" } + + npm-run-path@5.3.0: + resolution: + { + integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + object-assign@4.1.1: + resolution: + { + integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==, + } + engines: { node: ">=0.10.0" } + + object-hash@3.0.0: + resolution: + { + integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==, + } + engines: { node: ">= 6" } + + onetime@5.1.2: + resolution: + { + integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==, + } + engines: { node: ">=6" } + + onetime@6.0.0: + resolution: + { + integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==, + } + engines: { node: ">=12" } + + open@10.1.0: + resolution: + { + integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==, + } + engines: { node: ">=18" } + + ora@8.0.1: + resolution: + { + integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==, + } + engines: { node: ">=18" } + + p-limit@2.3.0: + resolution: + { + integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==, + } + engines: { node: ">=6" } + + p-limit@3.1.0: + resolution: + { + integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==, + } + engines: { node: ">=10" } + + p-limit@5.0.0: + resolution: + { + integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==, + } + engines: { node: ">=18" } + + p-locate@4.1.0: + resolution: + { + integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==, + } + engines: { node: ">=8" } + + p-locate@5.0.0: + resolution: + { + integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==, + } + engines: { node: ">=10" } + + p-queue@8.0.1: + resolution: + { + integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==, + } + engines: { node: ">=18" } + + p-timeout@6.1.2: + resolution: + { + integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==, + } + engines: { node: ">=14.16" } + + p-try@2.2.0: + resolution: + { + integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==, + } + engines: { node: ">=6" } + + parse-latin@5.0.1: + resolution: + { + integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==, + } + + parse5@7.1.2: + resolution: + { + integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==, + } + + path-browserify@1.0.1: + resolution: + { + integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==, + } + + path-exists@4.0.0: + resolution: + { + integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==, + } + engines: { node: ">=8" } + + path-key@3.1.1: + resolution: + { + integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==, + } + engines: { node: ">=8" } + + path-key@4.0.0: + resolution: + { + integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==, + } + engines: { node: ">=12" } + + path-parse@1.0.7: + resolution: + { + integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==, + } + + path-scurry@1.11.0: + resolution: + { + integrity: sha512-LNHTaVkzaYaLGlO+0u3rQTz7QrHTFOuKyba9JMTQutkmtNew8dw8wOD7mTU/5fCPZzCWpfW0XnQKzY61P0aTaw==, + } + engines: { node: ">=16 || 14 >=14.17" } + + path-to-regexp@6.2.2: + resolution: + { + integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==, + } + + pathe@1.1.2: + resolution: + { + integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==, + } + + perfect-debounce@1.0.0: + resolution: + { + integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==, + } + + picocolors@1.0.0: + resolution: + { + integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==, + } + + picomatch@2.3.1: + resolution: + { + integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==, + } + engines: { node: ">=8.6" } + + pify@2.3.0: + resolution: + { + integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==, + } + engines: { node: ">=0.10.0" } + + pify@4.0.1: + resolution: + { + integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==, + } + engines: { node: ">=6" } + + pirates@4.0.6: + resolution: + { + integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==, + } + engines: { node: ">= 6" } + + pkg-dir@4.2.0: + resolution: + { + integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==, + } + engines: { node: ">=8" } + + postcss-import@15.1.0: + resolution: + { + integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==, + } + engines: { node: ">=14.0.0" } + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: + { + integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==, + } + engines: { node: ^12 || ^14 || >= 16 } + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: + { + integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==, + } + engines: { node: ">= 14" } + peerDependencies: + postcss: ">=8.0.9" + ts-node: ">=9.0.0" + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.0.1: + resolution: + { + integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==, + } + engines: { node: ">=12.0" } + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.0.16: + resolution: + { + integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==, + } + engines: { node: ">=4" } + + postcss-value-parser@4.2.0: + resolution: + { + integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==, + } + + postcss@8.4.38: + resolution: + { + integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==, + } + engines: { node: ^10 || ^12 || >=14 } + + preferred-pm@3.1.3: + resolution: + { + integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==, + } + engines: { node: ">=10" } + + prismjs@1.29.0: + resolution: + { + integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==, + } + engines: { node: ">=6" } + + prompts@2.4.2: + resolution: + { + integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==, + } + engines: { node: ">= 6" } + + property-information@6.5.0: + resolution: + { + integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==, + } + + queue-microtask@1.2.3: + resolution: + { + integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==, + } + + radix-vue@1.7.4: + resolution: + { + integrity: sha512-Z75iJVb2rNL6347pWwqDIP02ktTowiDKVsScrLRv9y7uj8tMsEcD4pC0oTogVScRP5voZd3rov6zKE20MQTj+A==, + } + peerDependencies: + vue: ">= 3.2.0" + + read-cache@1.0.0: + resolution: + { + integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==, + } + + readdirp@3.6.0: + resolution: + { + integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==, + } + engines: { node: ">=8.10.0" } + + regenerator-runtime@0.14.1: + resolution: + { + integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==, + } + + rehype-parse@9.0.0: + resolution: + { + integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==, + } + + rehype-raw@7.0.0: + resolution: + { + integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==, + } + + rehype-stringify@10.0.0: + resolution: + { + integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==, + } + + rehype@13.0.1: + resolution: + { + integrity: sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==, + } + + remark-gfm@4.0.0: + resolution: + { + integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==, + } + + remark-parse@11.0.0: + resolution: + { + integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==, + } + + remark-rehype@11.1.0: + resolution: + { + integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==, + } + + remark-smartypants@2.1.0: + resolution: + { + integrity: sha512-qoF6Vz3BjU2tP6OfZqHOvCU0ACmu/6jhGaINSQRI9mM7wCxNQTKB3JUAN4SVoN2ybElEDTxBIABRep7e569iJw==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + remark-stringify@11.0.0: + resolution: + { + integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==, + } + + request-light@0.7.0: + resolution: + { + integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==, + } + + require-directory@2.1.1: + resolution: + { + integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==, + } + engines: { node: ">=0.10.0" } + + resolve@1.22.8: + resolution: + { + integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==, + } + hasBin: true + + restore-cursor@4.0.0: + resolution: + { + integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==, + } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + retext-latin@3.1.0: + resolution: + { + integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==, + } + + retext-smartypants@5.2.0: + resolution: + { + integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==, + } + + retext-stringify@3.1.0: + resolution: + { + integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==, + } + + retext@8.1.0: + resolution: + { + integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==, + } + + reusify@1.0.4: + resolution: + { + integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==, + } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } + + rfdc@1.3.1: + resolution: + { + integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==, + } + + rollup@4.17.2: + resolution: + { + integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==, + } + engines: { node: ">=18.0.0", npm: ">=8.0.0" } + hasBin: true + + run-applescript@7.0.0: + resolution: + { + integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==, + } + engines: { node: ">=18" } + + run-parallel@1.2.0: + resolution: + { + integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==, + } + + section-matter@1.0.0: + resolution: + { + integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==, + } + engines: { node: ">=4" } + + semver@6.3.1: + resolution: + { + integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==, + } + hasBin: true + + semver@7.6.2: + resolution: + { + integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==, + } + engines: { node: ">=10" } + hasBin: true + + sharp@0.33.3: + resolution: + { + integrity: sha512-vHUeXJU1UvlO/BNwTpT0x/r53WkLUVxrmb5JTgW92fdFCFk0ispLMAeu/jPO2vjkXM1fYUi3K7/qcLF47pwM1A==, + } + engines: { libvips: ">=8.15.2", node: ^18.17.0 || ^20.3.0 || >=21.0.0 } + + 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" } + + shiki@1.5.1: + resolution: + { + integrity: sha512-vx4Ds3M3B9ZEmLeSXqBAB85osBWV8ErZfP69kuFQZozPgHc33m7spLTCUkcjwEjFm3gk3F9IdXMv8kX+v9xDHA==, + } + + signal-exit@3.0.7: + resolution: + { + integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==, + } + + signal-exit@4.1.0: + resolution: + { + integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==, + } + engines: { node: ">=14" } + + simple-swizzle@0.2.2: + resolution: + { + integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, + } + + sirv@2.0.4: + resolution: + { + integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==, + } + engines: { node: ">= 10" } + + sisteransi@1.0.5: + resolution: + { + integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, + } + + source-map-js@1.2.0: + resolution: + { + integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==, + } + engines: { node: ">=0.10.0" } + + space-separated-tokens@2.0.2: + resolution: + { + integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==, + } + + speakingurl@14.0.1: + resolution: + { + integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==, + } + engines: { node: ">=0.10.0" } + + sprintf-js@1.0.3: + resolution: + { + integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==, + } + + stdin-discarder@0.2.2: + resolution: + { + integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==, + } + engines: { node: ">=18" } + + string-width@4.2.3: + resolution: + { + integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==, + } + engines: { node: ">=8" } + + string-width@5.1.2: + resolution: + { + integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==, + } + engines: { node: ">=12" } + + string-width@7.1.0: + resolution: + { + integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==, + } + engines: { node: ">=18" } + + 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.1.0: + resolution: + { + integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==, + } + engines: { node: ">=12" } + + strip-bom-string@1.0.0: + resolution: + { + integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==, + } + engines: { node: ">=0.10.0" } + + strip-bom@3.0.0: + resolution: + { + integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==, + } + engines: { node: ">=4" } + + strip-final-newline@3.0.0: + resolution: + { + integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==, + } + engines: { node: ">=12" } + + sucrase@3.35.0: + resolution: + { + integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==, + } + engines: { node: ">=16 || 14 >=14.17" } + hasBin: true + + supports-color@5.5.0: + resolution: + { + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==, + } + engines: { node: ">=4" } + + supports-preserve-symlinks-flag@1.0.0: + resolution: + { + integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==, + } + engines: { node: ">= 0.4" } + + svg-tags@1.0.0: + resolution: + { + integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==, + } + + tailwind-merge@2.3.0: + resolution: + { + integrity: sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==, + } + + tailwindcss-animate@1.0.7: + resolution: + { + integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==, + } + peerDependencies: + tailwindcss: ">=3.0.0 || insiders" + + tailwindcss@3.4.3: + resolution: + { + integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==, + } + engines: { node: ">=14.0.0" } + hasBin: true + + thenify-all@1.6.0: + resolution: + { + integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==, + } + engines: { node: ">=0.8" } + + thenify@3.3.1: + resolution: + { + integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==, + } + + to-fast-properties@2.0.0: + resolution: + { + integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==, + } + engines: { node: ">=4" } + + to-regex-range@5.0.1: + resolution: + { + integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==, + } + engines: { node: ">=8.0" } + + totalist@3.0.1: + resolution: + { + integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==, + } + engines: { node: ">=6" } + + trim-lines@3.0.1: + resolution: + { + integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==, + } + + trough@2.2.0: + resolution: + { + integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==, + } + + ts-interface-checker@0.1.13: + resolution: + { + integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==, + } + + tsconfck@3.0.3: + resolution: + { + integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==, + } + engines: { node: ^18 || >=20 } + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tslib@2.6.2: + resolution: + { + integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==, + } + + type-fest@2.19.0: + resolution: + { + integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==, + } + engines: { node: ">=12.20" } + + typesafe-path@0.2.2: + resolution: + { + integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==, + } + + typescript-auto-import-cache@0.3.2: + resolution: + { + integrity: sha512-+laqe5SFL1vN62FPOOJSUDTZxtgsoOXjneYOXIpx5rQ4UMiN89NAtJLpqLqyebv9fgQ/IMeeTX+mQyRnwvJzvg==, + } + + typescript@5.4.5: + resolution: + { + integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==, + } + engines: { node: ">=14.17" } + hasBin: true + + unherit@3.0.1: + resolution: + { + integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==, + } + + unified@10.1.2: + resolution: + { + integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==, + } + + unified@11.0.4: + resolution: + { + integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==, + } + + unist-util-find-after@5.0.0: + resolution: + { + integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==, + } + + unist-util-is@5.2.1: + resolution: + { + integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==, + } + + unist-util-is@6.0.0: + resolution: + { + integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==, + } + + unist-util-modify-children@3.1.1: + resolution: + { + integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==, + } + + unist-util-position@5.0.0: + resolution: + { + integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==, + } + + unist-util-remove-position@5.0.0: + resolution: + { + integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==, + } + + unist-util-stringify-position@3.0.3: + resolution: + { + integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==, + } + + unist-util-stringify-position@4.0.0: + resolution: + { + integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==, + } + + unist-util-visit-children@2.0.2: + resolution: + { + integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==, + } + + unist-util-visit-parents@5.1.3: + resolution: + { + integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==, + } + + unist-util-visit-parents@6.0.1: + resolution: + { + integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==, + } + + unist-util-visit@4.1.2: + resolution: + { + integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==, + } + + unist-util-visit@5.0.0: + resolution: + { + integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==, + } + + universalify@2.0.1: + resolution: + { + integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==, + } + engines: { node: ">= 10.0.0" } + + update-browserslist-db@1.0.15: + resolution: + { + integrity: sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==, + } + hasBin: true + peerDependencies: + browserslist: ">= 4.21.0" + + util-deprecate@1.0.2: + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } + + vfile-location@5.0.2: + resolution: + { + integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==, + } + + vfile-message@3.1.4: + resolution: + { + integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==, + } + + vfile-message@4.0.2: + resolution: + { + integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==, + } + + vfile@5.3.7: + resolution: + { + integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==, + } + + vfile@6.0.1: + resolution: + { + integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==, + } + + vite-hot-client@0.2.3: + resolution: + { + integrity: sha512-rOGAV7rUlUHX89fP2p2v0A2WWvV3QMX2UYq0fRqsWSvFvev4atHWqjwGoKaZT1VTKyLGk533ecu3eyd0o59CAg==, + } + peerDependencies: + vite: ^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 + + vite-plugin-inspect@0.8.4: + resolution: + { + integrity: sha512-G0N3rjfw+AiiwnGw50KlObIHYWfulVwaCBUBLh2xTW9G1eM9ocE5olXkEYUbwyTmX+azM8duubi+9w5awdCz+g==, + } + engines: { node: ">=14" } + peerDependencies: + "@nuxt/kit": "*" + vite: ^3.1.0 || ^4.0.0 || ^5.0.0-0 + peerDependenciesMeta: + "@nuxt/kit": + optional: true + + vite-plugin-vue-devtools@7.1.3: + resolution: + { + integrity: sha512-qv8Z4yok9RYo6TEs89WnIAlmTHby/+XTim8tlSnMs3lAPcQqqcl/wGRY8gAeYrGCANngOqO+VuabW3Jb1HZtyw==, + } + engines: { node: ">=v14.21.3" } + peerDependencies: + vite: ^3.1.0 || ^4.0.0-0 || ^5.0.0-0 + + vite-plugin-vue-inspector@5.1.0: + resolution: + { + integrity: sha512-yIw9dvBz9nQW7DPfbJtUVW6JTnt67hqTPRnTwT2CZWMqDvISyQHRjgKl32nlMh1DRH+92533Sv6t59pWMLUCWA==, + } + peerDependencies: + vite: ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 + + vite@5.2.11: + resolution: + { + integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==, + } + engines: { node: ^18.0.0 || >=20.0.0 } + hasBin: true + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitefu@0.2.5: + resolution: + { + integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==, + } + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + vite: + optional: true + + volar-service-css@0.0.43: + resolution: + { + integrity: sha512-rg2gTXhswq6Wz8euZgCRS68+7EPH+3R7SeTqYfAAtHKoU0rS1bwdxP1CWHezyxnHrLMiXEypCgJJWcMTay3W7g==, + } + peerDependencies: + "@volar/language-service": ~2.2.0 + peerDependenciesMeta: + "@volar/language-service": + optional: true + + volar-service-emmet@0.0.43: + resolution: + { + integrity: sha512-ODsSOsSScVTNSD1Z+e4EV21RuN3q38ahGnuyxKYHW9Fg0RwfLatHl6wIRfj21XlVVa8twBMsA/Fp43ObuDEBxQ==, + } + peerDependencies: + "@volar/language-service": ~2.2.0 + peerDependenciesMeta: + "@volar/language-service": + optional: true + + volar-service-html@0.0.43: + resolution: + { + integrity: sha512-Z/S7SCkHmpoR708WTQLCE3k+hfT16xjMfq9Htv7Y3yJeykah1jZO8oZX3433OPFfbS/ZFbGa2VlAIgDTVRU5Pg==, + } + peerDependencies: + "@volar/language-service": ~2.2.0 + peerDependenciesMeta: + "@volar/language-service": + optional: true + + volar-service-prettier@0.0.43: + resolution: + { + integrity: sha512-Beq+iNyG05PlSPTISOFK5Yoj29rXdGb6htvyFk2u0jVFRGX1QD0Pb5ze9OiqfUVwT+3cFZhPrSPndbTR1ft/aA==, + } + peerDependencies: + "@volar/language-service": ~2.2.0 + prettier: ^2.2 || ^3.0 + peerDependenciesMeta: + "@volar/language-service": + optional: true + prettier: + optional: true + + volar-service-typescript-twoslash-queries@0.0.43: + resolution: + { + integrity: sha512-FUqgvK2a6YxNO0P+zmY5syVatD8I7+qEA+mj1lotqQxwtY0Gh3UDCCqTVapX1E4VxF/pvNac7eVOBkCUVVZC5w==, + } + peerDependencies: + "@volar/language-service": ~2.2.0 + peerDependenciesMeta: + "@volar/language-service": + optional: true + + volar-service-typescript@0.0.43: + resolution: + { + integrity: sha512-oXYZHuM7QYBmgSiheFkoQPyUzzvm9ddaUzfDqc9cOM+fDuMAkUer2bEqnqZXerGjhsjuXNCu4PGlSOJJMxWe3A==, + } + peerDependencies: + "@volar/language-service": ~2.2.0 + peerDependenciesMeta: + "@volar/language-service": + optional: true + + vscode-css-languageservice@6.2.14: + resolution: + { + integrity: sha512-5UPQ9Y1sUTnuMyaMBpO7LrBkqjhEJb5eAwdUlDp+Uez8lry+Tspnk3+3p2qWS4LlNsr4p3v9WkZxUf1ltgFpgw==, + } + + vscode-html-languageservice@5.2.0: + resolution: + { + integrity: sha512-cdNMhyw57/SQzgUUGSIMQ66jikqEN6nBNyhx5YuOyj9310+eY9zw8Q0cXpiKzDX8aHYFewQEXRnigl06j/TVwQ==, + } + + vscode-jsonrpc@8.2.0: + resolution: + { + integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==, + } + engines: { node: ">=14.0.0" } + + vscode-languageserver-protocol@3.17.5: + resolution: + { + integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==, + } + + vscode-languageserver-textdocument@1.0.11: + resolution: + { + integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==, + } + + vscode-languageserver-types@3.17.5: + resolution: + { + integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==, + } + + vscode-languageserver@9.0.1: + resolution: + { + integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==, + } + hasBin: true + + vscode-nls@5.2.0: + resolution: + { + integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==, + } + + vscode-uri@2.1.2: + resolution: + { + integrity: sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==, + } + + vscode-uri@3.0.8: + resolution: + { + integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==, + } + + vue-demi@0.14.7: + resolution: + { + integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==, + } + engines: { node: ">=12" } + hasBin: true + peerDependencies: + "@vue/composition-api": ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + "@vue/composition-api": + optional: true + + vue@3.4.27: + resolution: + { + integrity: sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==, + } + peerDependencies: + typescript: "*" + peerDependenciesMeta: + typescript: + optional: true + + web-namespaces@2.0.1: + resolution: + { + integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==, + } + + which-pm-runs@1.1.0: + resolution: + { + integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==, + } + engines: { node: ">=4" } + + which-pm@2.0.0: + resolution: + { + integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==, + } + engines: { node: ">=8.15" } + + which-pm@2.1.1: + resolution: + { + integrity: sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==, + } + engines: { node: ">=8.15" } + + which@2.0.2: + resolution: + { + integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==, + } + engines: { node: ">= 8" } + hasBin: true + + widest-line@4.0.1: + resolution: + { + integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==, + } + engines: { node: ">=12" } + + wrap-ansi@7.0.0: + resolution: + { + integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==, + } + engines: { node: ">=10" } + + wrap-ansi@8.1.0: + resolution: + { + integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==, + } + engines: { node: ">=12" } + + y18n@5.0.8: + resolution: + { + integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==, + } + engines: { node: ">=10" } + + yallist@3.1.1: + resolution: + { + integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==, + } + + yaml@2.4.2: + resolution: + { + integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==, + } + engines: { node: ">= 14" } + hasBin: true + + yargs-parser@21.1.1: + resolution: + { + integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==, + } + engines: { node: ">=12" } + + yargs@17.7.2: + resolution: + { + integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==, + } + engines: { node: ">=12" } + + yocto-queue@0.1.0: + resolution: + { + integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==, + } + engines: { node: ">=10" } + + yocto-queue@1.0.0: + resolution: + { + integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==, + } + engines: { node: ">=12.20" } + + zod-to-json-schema@3.23.0: + resolution: + { + integrity: sha512-az0uJ243PxsRIa2x1WmNE/pnuA05gUq/JB8Lwe1EDCCL/Fz9MgjYQ0fPlyc2Tcv6aF2ZA7WM5TWaRZVEFaAIag==, + } + peerDependencies: + zod: ^3.23.3 + + zod@3.23.8: + resolution: + { + integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==, + } + + zwitch@2.0.4: + resolution: + { + integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==, + } + +snapshots: + "@alloc/quick-lru@5.2.0": {} + + "@ampproject/remapping@2.3.0": + dependencies: + "@jridgewell/gen-mapping": 0.3.5 + "@jridgewell/trace-mapping": 0.3.25 + + "@antfu/utils@0.7.8": {} + + "@astrojs/check@0.6.0(typescript@5.4.5)": + dependencies: + "@astrojs/language-server": 2.9.0(typescript@5.4.5) + chokidar: 3.6.0 + fast-glob: 3.3.2 + kleur: 4.1.5 + typescript: 5.4.5 + yargs: 17.7.2 + transitivePeerDependencies: + - prettier + - prettier-plugin-astro + + "@astrojs/compiler@2.8.0": {} + + "@astrojs/internal-helpers@0.4.0": {} + + "@astrojs/language-server@2.9.0(typescript@5.4.5)": + dependencies: + "@astrojs/compiler": 2.8.0 + "@jridgewell/sourcemap-codec": 1.4.15 + "@volar/kit": 2.2.2(typescript@5.4.5) + "@volar/language-core": 2.2.2 + "@volar/language-server": 2.2.2 + "@volar/language-service": 2.2.2 + "@volar/typescript": 2.2.2 + fast-glob: 3.3.2 + volar-service-css: 0.0.43(@volar/language-service@2.2.2) + volar-service-emmet: 0.0.43(@volar/language-service@2.2.2) + volar-service-html: 0.0.43(@volar/language-service@2.2.2) + volar-service-prettier: 0.0.43(@volar/language-service@2.2.2) + volar-service-typescript: 0.0.43(@volar/language-service@2.2.2) + volar-service-typescript-twoslash-queries: 0.0.43(@volar/language-service@2.2.2) + vscode-html-languageservice: 5.2.0 + vscode-uri: 3.0.8 + transitivePeerDependencies: + - typescript + + "@astrojs/markdown-remark@5.1.0": + dependencies: + "@astrojs/prism": 3.1.0 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.1 + hast-util-to-text: 4.0.2 + import-meta-resolve: 4.1.0 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.0 + remark-gfm: 4.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + remark-smartypants: 2.1.0 + shiki: 1.5.1 + unified: 11.0.4 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + + "@astrojs/prism@3.1.0": + dependencies: + prismjs: 1.29.0 + + "@astrojs/tailwind@5.1.0(astro@4.8.2(typescript@5.4.5))(tailwindcss@3.4.3)": + dependencies: + astro: 4.8.2(typescript@5.4.5) + autoprefixer: 10.4.19(postcss@8.4.38) + postcss: 8.4.38 + postcss-load-config: 4.0.2(postcss@8.4.38) + tailwindcss: 3.4.3 + transitivePeerDependencies: + - ts-node + + "@astrojs/telemetry@3.1.0": + dependencies: + ci-info: 4.0.0 + debug: 4.3.4 + dlv: 1.1.3 + dset: 3.1.3 + is-docker: 3.0.0 + is-wsl: 3.1.0 + which-pm-runs: 1.1.0 + transitivePeerDependencies: + - supports-color + + "@astrojs/vue@4.2.0(astro@4.8.2(typescript@5.4.5))(rollup@4.17.2)(vite@5.2.11)(vue@3.4.27(typescript@5.4.5))": + dependencies: + "@vitejs/plugin-vue": 5.0.4(vite@5.2.11)(vue@3.4.27(typescript@5.4.5)) + "@vitejs/plugin-vue-jsx": 3.1.0(vite@5.2.11)(vue@3.4.27(typescript@5.4.5)) + "@vue/compiler-sfc": 3.4.27 + astro: 4.8.2(typescript@5.4.5) + vite-plugin-vue-devtools: 7.1.3(rollup@4.17.2)(vite@5.2.11)(vue@3.4.27(typescript@5.4.5)) + vue: 3.4.27(typescript@5.4.5) + transitivePeerDependencies: + - "@nuxt/kit" + - rollup + - supports-color + - vite + + "@babel/code-frame@7.24.2": + dependencies: + "@babel/highlight": 7.24.5 + picocolors: 1.0.0 + + "@babel/compat-data@7.24.4": {} + + "@babel/core@7.24.5": + dependencies: + "@ampproject/remapping": 2.3.0 + "@babel/code-frame": 7.24.2 + "@babel/generator": 7.24.5 + "@babel/helper-compilation-targets": 7.23.6 + "@babel/helper-module-transforms": 7.24.5(@babel/core@7.24.5) + "@babel/helpers": 7.24.5 + "@babel/parser": 7.24.5 + "@babel/template": 7.24.0 + "@babel/traverse": 7.24.5 + "@babel/types": 7.24.5 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + "@babel/generator@7.24.5": + dependencies: + "@babel/types": 7.24.5 + "@jridgewell/gen-mapping": 0.3.5 + "@jridgewell/trace-mapping": 0.3.25 + jsesc: 2.5.2 + + "@babel/helper-annotate-as-pure@7.22.5": + dependencies: + "@babel/types": 7.24.5 + + "@babel/helper-compilation-targets@7.23.6": + dependencies: + "@babel/compat-data": 7.24.4 + "@babel/helper-validator-option": 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + "@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.24.5)": + dependencies: + "@babel/core": 7.24.5 + "@babel/helper-annotate-as-pure": 7.22.5 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-function-name": 7.23.0 + "@babel/helper-member-expression-to-functions": 7.24.5 + "@babel/helper-optimise-call-expression": 7.22.5 + "@babel/helper-replace-supers": 7.24.1(@babel/core@7.24.5) + "@babel/helper-skip-transparent-expression-wrappers": 7.22.5 + "@babel/helper-split-export-declaration": 7.24.5 + semver: 6.3.1 + + "@babel/helper-environment-visitor@7.22.20": {} + + "@babel/helper-function-name@7.23.0": + dependencies: + "@babel/template": 7.24.0 + "@babel/types": 7.24.5 + + "@babel/helper-hoist-variables@7.22.5": + dependencies: + "@babel/types": 7.24.5 + + "@babel/helper-member-expression-to-functions@7.24.5": + dependencies: + "@babel/types": 7.24.5 + + "@babel/helper-module-imports@7.22.15": + dependencies: + "@babel/types": 7.24.5 + + "@babel/helper-module-imports@7.24.3": + dependencies: + "@babel/types": 7.24.5 + + "@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)": + dependencies: + "@babel/core": 7.24.5 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-module-imports": 7.24.3 + "@babel/helper-simple-access": 7.24.5 + "@babel/helper-split-export-declaration": 7.24.5 + "@babel/helper-validator-identifier": 7.24.5 + + "@babel/helper-optimise-call-expression@7.22.5": + dependencies: + "@babel/types": 7.24.5 + + "@babel/helper-plugin-utils@7.24.5": {} + + "@babel/helper-replace-supers@7.24.1(@babel/core@7.24.5)": + dependencies: + "@babel/core": 7.24.5 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-member-expression-to-functions": 7.24.5 + "@babel/helper-optimise-call-expression": 7.22.5 + + "@babel/helper-simple-access@7.24.5": + dependencies: + "@babel/types": 7.24.5 + + "@babel/helper-skip-transparent-expression-wrappers@7.22.5": + dependencies: + "@babel/types": 7.24.5 + + "@babel/helper-split-export-declaration@7.24.5": + dependencies: + "@babel/types": 7.24.5 + + "@babel/helper-string-parser@7.24.1": {} + + "@babel/helper-validator-identifier@7.24.5": {} + + "@babel/helper-validator-option@7.23.5": {} + + "@babel/helpers@7.24.5": + dependencies: + "@babel/template": 7.24.0 + "@babel/traverse": 7.24.5 + "@babel/types": 7.24.5 + transitivePeerDependencies: + - supports-color + + "@babel/highlight@7.24.5": + dependencies: + "@babel/helper-validator-identifier": 7.24.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + + "@babel/parser@7.24.5": + dependencies: + "@babel/types": 7.24.5 + + "@babel/plugin-proposal-decorators@7.24.1(@babel/core@7.24.5)": + dependencies: + "@babel/core": 7.24.5 + "@babel/helper-create-class-features-plugin": 7.24.5(@babel/core@7.24.5) + "@babel/helper-plugin-utils": 7.24.5 + "@babel/plugin-syntax-decorators": 7.24.1(@babel/core@7.24.5) + + "@babel/plugin-syntax-decorators@7.24.1(@babel/core@7.24.5)": + dependencies: + "@babel/core": 7.24.5 + "@babel/helper-plugin-utils": 7.24.5 + + "@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.24.5)": + dependencies: + "@babel/core": 7.24.5 + "@babel/helper-plugin-utils": 7.24.5 + + "@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5)": + dependencies: + "@babel/core": 7.24.5 + "@babel/helper-plugin-utils": 7.24.5 + + "@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.5)": + dependencies: + "@babel/core": 7.24.5 + "@babel/helper-plugin-utils": 7.24.5 + + "@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.5)": + dependencies: + "@babel/core": 7.24.5 + "@babel/helper-plugin-utils": 7.24.5 + + "@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.24.5)": + dependencies: + "@babel/core": 7.24.5 + "@babel/helper-annotate-as-pure": 7.22.5 + "@babel/helper-module-imports": 7.24.3 + "@babel/helper-plugin-utils": 7.24.5 + "@babel/plugin-syntax-jsx": 7.24.1(@babel/core@7.24.5) + "@babel/types": 7.24.5 + + "@babel/plugin-transform-typescript@7.24.5(@babel/core@7.24.5)": + dependencies: + "@babel/core": 7.24.5 + "@babel/helper-annotate-as-pure": 7.22.5 + "@babel/helper-create-class-features-plugin": 7.24.5(@babel/core@7.24.5) + "@babel/helper-plugin-utils": 7.24.5 + "@babel/plugin-syntax-typescript": 7.24.1(@babel/core@7.24.5) + + "@babel/runtime@7.24.5": + dependencies: + regenerator-runtime: 0.14.1 + + "@babel/template@7.24.0": + dependencies: + "@babel/code-frame": 7.24.2 + "@babel/parser": 7.24.5 + "@babel/types": 7.24.5 + + "@babel/traverse@7.24.5": + dependencies: + "@babel/code-frame": 7.24.2 + "@babel/generator": 7.24.5 + "@babel/helper-environment-visitor": 7.22.20 + "@babel/helper-function-name": 7.23.0 + "@babel/helper-hoist-variables": 7.22.5 + "@babel/helper-split-export-declaration": 7.24.5 + "@babel/parser": 7.24.5 + "@babel/types": 7.24.5 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + "@babel/types@7.24.5": + dependencies: + "@babel/helper-string-parser": 7.24.1 + "@babel/helper-validator-identifier": 7.24.5 + to-fast-properties: 2.0.0 + + "@emmetio/abbreviation@2.3.3": + dependencies: + "@emmetio/scanner": 1.0.4 + + "@emmetio/css-abbreviation@2.1.8": + dependencies: + "@emmetio/scanner": 1.0.4 + + "@emmetio/scanner@1.0.4": {} + + "@emnapi/runtime@1.1.1": + dependencies: + tslib: 2.6.2 + optional: true + + "@esbuild/aix-ppc64@0.20.2": + optional: true + + "@esbuild/aix-ppc64@0.21.1": + optional: true + + "@esbuild/android-arm64@0.20.2": + optional: true + + "@esbuild/android-arm64@0.21.1": + optional: true + + "@esbuild/android-arm@0.20.2": + optional: true + + "@esbuild/android-arm@0.21.1": + optional: true + + "@esbuild/android-x64@0.20.2": + optional: true + + "@esbuild/android-x64@0.21.1": + optional: true + + "@esbuild/darwin-arm64@0.20.2": + optional: true + + "@esbuild/darwin-arm64@0.21.1": + optional: true + + "@esbuild/darwin-x64@0.20.2": + optional: true + + "@esbuild/darwin-x64@0.21.1": + optional: true + + "@esbuild/freebsd-arm64@0.20.2": + optional: true + + "@esbuild/freebsd-arm64@0.21.1": + optional: true + + "@esbuild/freebsd-x64@0.20.2": + optional: true + + "@esbuild/freebsd-x64@0.21.1": + optional: true + + "@esbuild/linux-arm64@0.20.2": + optional: true + + "@esbuild/linux-arm64@0.21.1": + optional: true + + "@esbuild/linux-arm@0.20.2": + optional: true + + "@esbuild/linux-arm@0.21.1": + optional: true + + "@esbuild/linux-ia32@0.20.2": + optional: true + + "@esbuild/linux-ia32@0.21.1": + optional: true + + "@esbuild/linux-loong64@0.20.2": + optional: true + + "@esbuild/linux-loong64@0.21.1": + optional: true + + "@esbuild/linux-mips64el@0.20.2": + optional: true + + "@esbuild/linux-mips64el@0.21.1": + optional: true + + "@esbuild/linux-ppc64@0.20.2": + optional: true + + "@esbuild/linux-ppc64@0.21.1": + optional: true + + "@esbuild/linux-riscv64@0.20.2": + optional: true + + "@esbuild/linux-riscv64@0.21.1": + optional: true + + "@esbuild/linux-s390x@0.20.2": + optional: true + + "@esbuild/linux-s390x@0.21.1": + optional: true + + "@esbuild/linux-x64@0.20.2": + optional: true + + "@esbuild/linux-x64@0.21.1": + optional: true + + "@esbuild/netbsd-x64@0.20.2": + optional: true + + "@esbuild/netbsd-x64@0.21.1": + optional: true + + "@esbuild/openbsd-x64@0.20.2": + optional: true + + "@esbuild/openbsd-x64@0.21.1": + optional: true + + "@esbuild/sunos-x64@0.20.2": + optional: true + + "@esbuild/sunos-x64@0.21.1": + optional: true + + "@esbuild/win32-arm64@0.20.2": + optional: true + + "@esbuild/win32-arm64@0.21.1": + optional: true + + "@esbuild/win32-ia32@0.20.2": + optional: true + + "@esbuild/win32-ia32@0.21.1": + optional: true + + "@esbuild/win32-x64@0.20.2": + optional: true + + "@esbuild/win32-x64@0.21.1": + optional: true + + "@floating-ui/core@1.6.1": + dependencies: + "@floating-ui/utils": 0.2.2 + + "@floating-ui/dom@1.6.5": + dependencies: + "@floating-ui/core": 1.6.1 + "@floating-ui/utils": 0.2.2 + + "@floating-ui/utils@0.2.2": {} + + "@floating-ui/vue@1.0.6(vue@3.4.27(typescript@5.4.5))": + dependencies: + "@floating-ui/dom": 1.6.5 + "@floating-ui/utils": 0.2.2 + vue-demi: 0.14.7(vue@3.4.27(typescript@5.4.5)) + transitivePeerDependencies: + - "@vue/composition-api" + - vue + + "@iconify-json/radix-icons@1.1.14": + dependencies: + "@iconify/types": 2.0.0 + + "@iconify/types@2.0.0": {} + + "@iconify/vue@4.1.2(vue@3.4.27(typescript@5.4.5))": + dependencies: + "@iconify/types": 2.0.0 + vue: 3.4.27(typescript@5.4.5) + + "@img/sharp-darwin-arm64@0.33.3": + optionalDependencies: + "@img/sharp-libvips-darwin-arm64": 1.0.2 + optional: true + + "@img/sharp-darwin-x64@0.33.3": + optionalDependencies: + "@img/sharp-libvips-darwin-x64": 1.0.2 + optional: true + + "@img/sharp-libvips-darwin-arm64@1.0.2": + optional: true + + "@img/sharp-libvips-darwin-x64@1.0.2": + optional: true + + "@img/sharp-libvips-linux-arm64@1.0.2": + optional: true + + "@img/sharp-libvips-linux-arm@1.0.2": + optional: true + + "@img/sharp-libvips-linux-s390x@1.0.2": + optional: true + + "@img/sharp-libvips-linux-x64@1.0.2": + optional: true + + "@img/sharp-libvips-linuxmusl-arm64@1.0.2": + optional: true + + "@img/sharp-libvips-linuxmusl-x64@1.0.2": + optional: true + + "@img/sharp-linux-arm64@0.33.3": + optionalDependencies: + "@img/sharp-libvips-linux-arm64": 1.0.2 + optional: true + + "@img/sharp-linux-arm@0.33.3": + optionalDependencies: + "@img/sharp-libvips-linux-arm": 1.0.2 + optional: true + + "@img/sharp-linux-s390x@0.33.3": + optionalDependencies: + "@img/sharp-libvips-linux-s390x": 1.0.2 + optional: true + + "@img/sharp-linux-x64@0.33.3": + optionalDependencies: + "@img/sharp-libvips-linux-x64": 1.0.2 + optional: true + + "@img/sharp-linuxmusl-arm64@0.33.3": + optionalDependencies: + "@img/sharp-libvips-linuxmusl-arm64": 1.0.2 + optional: true + + "@img/sharp-linuxmusl-x64@0.33.3": + optionalDependencies: + "@img/sharp-libvips-linuxmusl-x64": 1.0.2 + optional: true + + "@img/sharp-wasm32@0.33.3": + dependencies: + "@emnapi/runtime": 1.1.1 + optional: true + + "@img/sharp-win32-ia32@0.33.3": + optional: true + + "@img/sharp-win32-x64@0.33.3": + optional: true + + "@internationalized/date@3.5.3": + dependencies: + "@swc/helpers": 0.5.11 + + "@isaacs/cliui@8.0.2": + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + "@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462": + dependencies: + "@vscode/l10n": 0.0.18 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + + "@jridgewell/gen-mapping@0.3.5": + dependencies: + "@jridgewell/set-array": 1.2.1 + "@jridgewell/sourcemap-codec": 1.4.15 + "@jridgewell/trace-mapping": 0.3.25 + + "@jridgewell/resolve-uri@3.1.2": {} + + "@jridgewell/set-array@1.2.1": {} + + "@jridgewell/sourcemap-codec@1.4.15": {} + + "@jridgewell/trace-mapping@0.3.25": + dependencies: + "@jridgewell/resolve-uri": 3.1.2 + "@jridgewell/sourcemap-codec": 1.4.15 + + "@nodelib/fs.scandir@2.1.5": + dependencies: + "@nodelib/fs.stat": 2.0.5 + run-parallel: 1.2.0 + + "@nodelib/fs.stat@2.0.5": {} + + "@nodelib/fs.walk@1.2.8": + dependencies: + "@nodelib/fs.scandir": 2.1.5 + fastq: 1.17.1 + + "@pkgjs/parseargs@0.11.0": + optional: true + + "@polka/url@1.0.0-next.25": {} + + "@rollup/pluginutils@5.1.0(rollup@4.17.2)": + dependencies: + "@types/estree": 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.17.2 + + "@rollup/rollup-android-arm-eabi@4.17.2": + optional: true + + "@rollup/rollup-android-arm64@4.17.2": + optional: true + + "@rollup/rollup-darwin-arm64@4.17.2": + optional: true + + "@rollup/rollup-darwin-x64@4.17.2": + optional: true + + "@rollup/rollup-linux-arm-gnueabihf@4.17.2": + optional: true + + "@rollup/rollup-linux-arm-musleabihf@4.17.2": + optional: true + + "@rollup/rollup-linux-arm64-gnu@4.17.2": + optional: true + + "@rollup/rollup-linux-arm64-musl@4.17.2": + optional: true + + "@rollup/rollup-linux-powerpc64le-gnu@4.17.2": + optional: true + + "@rollup/rollup-linux-riscv64-gnu@4.17.2": + optional: true + + "@rollup/rollup-linux-s390x-gnu@4.17.2": + optional: true + + "@rollup/rollup-linux-x64-gnu@4.17.2": + optional: true + + "@rollup/rollup-linux-x64-musl@4.17.2": + optional: true + + "@rollup/rollup-win32-arm64-msvc@4.17.2": + optional: true + + "@rollup/rollup-win32-ia32-msvc@4.17.2": + optional: true + + "@rollup/rollup-win32-x64-msvc@4.17.2": + optional: true + + "@shikijs/core@1.5.1": {} + + "@swc/helpers@0.5.11": + dependencies: + tslib: 2.6.2 + + "@tanstack/virtual-core@3.5.0": {} + + "@tanstack/vue-virtual@3.5.0(vue@3.4.27(typescript@5.4.5))": + dependencies: + "@tanstack/virtual-core": 3.5.0 + vue: 3.4.27(typescript@5.4.5) + + "@types/babel__core@7.20.5": + dependencies: + "@babel/parser": 7.24.5 + "@babel/types": 7.24.5 + "@types/babel__generator": 7.6.8 + "@types/babel__template": 7.4.4 + "@types/babel__traverse": 7.20.5 + + "@types/babel__generator@7.6.8": + dependencies: + "@babel/types": 7.24.5 + + "@types/babel__template@7.4.4": + dependencies: + "@babel/parser": 7.24.5 + "@babel/types": 7.24.5 + + "@types/babel__traverse@7.20.5": + dependencies: + "@babel/types": 7.24.5 + + "@types/cookie@0.6.0": {} + + "@types/debug@4.1.12": + dependencies: + "@types/ms": 0.7.34 + + "@types/estree@1.0.5": {} + + "@types/hast@3.0.4": + dependencies: + "@types/unist": 3.0.2 + + "@types/mdast@4.0.3": + dependencies: + "@types/unist": 3.0.2 + + "@types/ms@0.7.34": {} + + "@types/nlcst@1.0.4": + dependencies: + "@types/unist": 2.0.10 + + "@types/unist@2.0.10": {} + + "@types/unist@3.0.2": {} + + "@types/web-bluetooth@0.0.20": {} + + "@ungap/structured-clone@1.2.0": {} + + "@vitejs/plugin-vue-jsx@3.1.0(vite@5.2.11)(vue@3.4.27(typescript@5.4.5))": + dependencies: + "@babel/core": 7.24.5 + "@babel/plugin-transform-typescript": 7.24.5(@babel/core@7.24.5) + "@vue/babel-plugin-jsx": 1.2.2(@babel/core@7.24.5) + vite: 5.2.11 + vue: 3.4.27(typescript@5.4.5) + transitivePeerDependencies: + - supports-color + + "@vitejs/plugin-vue@5.0.4(vite@5.2.11)(vue@3.4.27(typescript@5.4.5))": + dependencies: + vite: 5.2.11 + vue: 3.4.27(typescript@5.4.5) + + "@volar/kit@2.2.2(typescript@5.4.5)": + dependencies: + "@volar/language-service": 2.2.2 + "@volar/typescript": 2.2.2 + typesafe-path: 0.2.2 + typescript: 5.4.5 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + + "@volar/language-core@2.2.2": + dependencies: + "@volar/source-map": 2.2.2 + + "@volar/language-server@2.2.2": + dependencies: + "@volar/language-core": 2.2.2 + "@volar/language-service": 2.2.2 + "@volar/snapshot-document": 2.2.2 + "@volar/typescript": 2.2.2 + "@vscode/l10n": 0.0.16 + path-browserify: 1.0.1 + request-light: 0.7.0 + vscode-languageserver: 9.0.1 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + + "@volar/language-service@2.2.2": + dependencies: + "@volar/language-core": 2.2.2 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + + "@volar/snapshot-document@2.2.2": + dependencies: + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.11 + + "@volar/source-map@2.2.2": + dependencies: + muggle-string: 0.4.1 + + "@volar/typescript@2.2.2": + dependencies: + "@volar/language-core": 2.2.2 + path-browserify: 1.0.1 + + "@vscode/emmet-helper@2.9.3": + dependencies: + emmet: 2.4.7 + jsonc-parser: 2.3.1 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-uri: 2.1.2 + + "@vscode/l10n@0.0.16": {} + + "@vscode/l10n@0.0.18": {} + + "@vue/babel-helper-vue-transform-on@1.2.2": {} + + "@vue/babel-plugin-jsx@1.2.2(@babel/core@7.24.5)": + dependencies: + "@babel/helper-module-imports": 7.22.15 + "@babel/helper-plugin-utils": 7.24.5 + "@babel/plugin-syntax-jsx": 7.24.1(@babel/core@7.24.5) + "@babel/template": 7.24.0 + "@babel/traverse": 7.24.5 + "@babel/types": 7.24.5 + "@vue/babel-helper-vue-transform-on": 1.2.2 + "@vue/babel-plugin-resolve-type": 1.2.2(@babel/core@7.24.5) + camelcase: 6.3.0 + html-tags: 3.3.1 + svg-tags: 1.0.0 + optionalDependencies: + "@babel/core": 7.24.5 + transitivePeerDependencies: + - supports-color + + "@vue/babel-plugin-resolve-type@1.2.2(@babel/core@7.24.5)": + dependencies: + "@babel/code-frame": 7.24.2 + "@babel/core": 7.24.5 + "@babel/helper-module-imports": 7.22.15 + "@babel/helper-plugin-utils": 7.24.5 + "@babel/parser": 7.24.5 + "@vue/compiler-sfc": 3.4.27 + + "@vue/compiler-core@3.4.27": + dependencies: + "@babel/parser": 7.24.5 + "@vue/shared": 3.4.27 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.0 + + "@vue/compiler-dom@3.4.27": + dependencies: + "@vue/compiler-core": 3.4.27 + "@vue/shared": 3.4.27 + + "@vue/compiler-sfc@3.4.27": + dependencies: + "@babel/parser": 7.24.5 + "@vue/compiler-core": 3.4.27 + "@vue/compiler-dom": 3.4.27 + "@vue/compiler-ssr": 3.4.27 + "@vue/shared": 3.4.27 + estree-walker: 2.0.2 + magic-string: 0.30.10 + postcss: 8.4.38 + source-map-js: 1.2.0 + + "@vue/compiler-ssr@3.4.27": + dependencies: + "@vue/compiler-dom": 3.4.27 + "@vue/shared": 3.4.27 + + "@vue/devtools-core@7.1.3(vite@5.2.11)(vue@3.4.27(typescript@5.4.5))": + dependencies: + "@vue/devtools-kit": 7.1.3(vue@3.4.27(typescript@5.4.5)) + "@vue/devtools-shared": 7.1.3 + mitt: 3.0.1 + nanoid: 3.3.7 + pathe: 1.1.2 + vite-hot-client: 0.2.3(vite@5.2.11) + transitivePeerDependencies: + - vite + - vue + + "@vue/devtools-kit@7.1.3(vue@3.4.27(typescript@5.4.5))": + dependencies: + "@vue/devtools-shared": 7.1.3 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + vue: 3.4.27(typescript@5.4.5) + + "@vue/devtools-shared@7.1.3": + dependencies: + rfdc: 1.3.1 + + "@vue/reactivity@3.4.27": + dependencies: + "@vue/shared": 3.4.27 + + "@vue/runtime-core@3.4.27": + dependencies: + "@vue/reactivity": 3.4.27 + "@vue/shared": 3.4.27 + + "@vue/runtime-dom@3.4.27": + dependencies: + "@vue/runtime-core": 3.4.27 + "@vue/shared": 3.4.27 + csstype: 3.1.3 + + "@vue/server-renderer@3.4.27(vue@3.4.27(typescript@5.4.5))": + dependencies: + "@vue/compiler-ssr": 3.4.27 + "@vue/shared": 3.4.27 + vue: 3.4.27(typescript@5.4.5) + + "@vue/shared@3.4.27": {} + + "@vueuse/core@10.9.0(vue@3.4.27(typescript@5.4.5))": + dependencies: + "@types/web-bluetooth": 0.0.20 + "@vueuse/metadata": 10.9.0 + "@vueuse/shared": 10.9.0(vue@3.4.27(typescript@5.4.5)) + vue-demi: 0.14.7(vue@3.4.27(typescript@5.4.5)) + transitivePeerDependencies: + - "@vue/composition-api" + - vue + + "@vueuse/metadata@10.9.0": {} + + "@vueuse/shared@10.9.0(vue@3.4.27(typescript@5.4.5))": + dependencies: + vue-demi: 0.14.7(vue@3.4.27(typescript@5.4.5)) + transitivePeerDependencies: + - "@vue/composition-api" + - vue + + acorn@8.11.3: {} + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + aria-hidden@1.2.4: + dependencies: + tslib: 2.6.2 + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + array-iterate@2.0.1: {} + + astro@4.8.2(typescript@5.4.5): + dependencies: + "@astrojs/compiler": 2.8.0 + "@astrojs/internal-helpers": 0.4.0 + "@astrojs/markdown-remark": 5.1.0 + "@astrojs/telemetry": 3.1.0 + "@babel/core": 7.24.5 + "@babel/generator": 7.24.5 + "@babel/parser": 7.24.5 + "@babel/plugin-transform-react-jsx": 7.23.4(@babel/core@7.24.5) + "@babel/traverse": 7.24.5 + "@babel/types": 7.24.5 + "@types/babel__core": 7.20.5 + "@types/cookie": 0.6.0 + acorn: 8.11.3 + aria-query: 5.3.0 + axobject-query: 4.0.0 + boxen: 7.1.1 + chokidar: 3.6.0 + ci-info: 4.0.0 + clsx: 2.1.1 + common-ancestor-path: 1.0.1 + cookie: 0.6.0 + cssesc: 3.0.0 + debug: 4.3.4 + deterministic-object-hash: 2.0.2 + devalue: 5.0.0 + diff: 5.2.0 + dlv: 1.1.3 + dset: 3.1.3 + es-module-lexer: 1.5.2 + esbuild: 0.21.1 + estree-walker: 3.0.3 + execa: 8.0.1 + fast-glob: 3.3.2 + flattie: 1.1.1 + github-slugger: 2.0.0 + gray-matter: 4.0.3 + html-escaper: 3.0.3 + http-cache-semantics: 4.1.1 + js-yaml: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.10 + mrmime: 2.0.0 + ora: 8.0.1 + p-limit: 5.0.0 + p-queue: 8.0.1 + path-to-regexp: 6.2.2 + preferred-pm: 3.1.3 + prompts: 2.4.2 + rehype: 13.0.1 + resolve: 1.22.8 + semver: 7.6.2 + shiki: 1.5.1 + string-width: 7.1.0 + strip-ansi: 7.1.0 + tsconfck: 3.0.3(typescript@5.4.5) + unist-util-visit: 5.0.0 + vfile: 6.0.1 + vite: 5.2.11 + vitefu: 0.2.5(vite@5.2.11) + which-pm: 2.1.1 + yargs-parser: 21.1.1 + zod: 3.23.8 + zod-to-json-schema: 3.23.0(zod@3.23.8) + optionalDependencies: + sharp: 0.33.3 + transitivePeerDependencies: + - "@types/node" + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + - typescript + + autoprefixer@10.4.19(postcss@8.4.38): + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001617 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + + axobject-query@4.0.0: + dependencies: + dequal: 2.0.3 + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + base-64@1.0.0: {} + + binary-extensions@2.3.0: {} + + boxen@7.1.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.2: + dependencies: + fill-range: 7.0.1 + + browserslist@4.23.0: + dependencies: + caniuse-lite: 1.0.30001617 + electron-to-chromium: 1.4.763 + node-releases: 2.0.14 + update-browserslist-db: 1.0.15(browserslist@4.23.0) + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 + + camelcase-css@2.0.1: {} + + camelcase@6.3.0: {} + + camelcase@7.0.1: {} + + caniuse-lite@1.0.30001617: {} + + ccount@2.0.1: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@5.3.0: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + ci-info@4.0.0: {} + + class-variance-authority@0.7.0: + dependencies: + clsx: 2.0.0 + + cli-boxes@3.0.0: {} + + cli-cursor@4.0.0: + dependencies: + restore-cursor: 4.0.0 + + cli-spinners@2.9.2: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.0.0: {} + + clsx@2.1.1: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + optional: true + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + optional: true + + comma-separated-tokens@2.0.3: {} + + commander@4.1.1: {} + + common-ancestor-path@1.0.1: {} + + convert-source-map@2.0.0: {} + + cookie@0.6.0: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + default-browser-id@5.0.0: {} + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + + define-lazy-prop@3.0.0: {} + + defu@6.1.4: {} + + dequal@2.0.3: {} + + detect-libc@2.0.3: + optional: true + + deterministic-object-hash@2.0.2: + dependencies: + base-64: 1.0.0 + + devalue@5.0.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + didyoumean@1.2.2: {} + + diff@5.2.0: {} + + dlv@1.1.3: {} + + dset@3.1.3: {} + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.4.763: {} + + emmet@2.4.7: + dependencies: + "@emmetio/abbreviation": 2.3.3 + "@emmetio/css-abbreviation": 2.1.8 + + emoji-regex@10.3.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + entities@4.5.0: {} + + error-stack-parser-es@0.1.1: {} + + es-module-lexer@1.5.2: {} + + esbuild@0.20.2: + optionalDependencies: + "@esbuild/aix-ppc64": 0.20.2 + "@esbuild/android-arm": 0.20.2 + "@esbuild/android-arm64": 0.20.2 + "@esbuild/android-x64": 0.20.2 + "@esbuild/darwin-arm64": 0.20.2 + "@esbuild/darwin-x64": 0.20.2 + "@esbuild/freebsd-arm64": 0.20.2 + "@esbuild/freebsd-x64": 0.20.2 + "@esbuild/linux-arm": 0.20.2 + "@esbuild/linux-arm64": 0.20.2 + "@esbuild/linux-ia32": 0.20.2 + "@esbuild/linux-loong64": 0.20.2 + "@esbuild/linux-mips64el": 0.20.2 + "@esbuild/linux-ppc64": 0.20.2 + "@esbuild/linux-riscv64": 0.20.2 + "@esbuild/linux-s390x": 0.20.2 + "@esbuild/linux-x64": 0.20.2 + "@esbuild/netbsd-x64": 0.20.2 + "@esbuild/openbsd-x64": 0.20.2 + "@esbuild/sunos-x64": 0.20.2 + "@esbuild/win32-arm64": 0.20.2 + "@esbuild/win32-ia32": 0.20.2 + "@esbuild/win32-x64": 0.20.2 + + esbuild@0.21.1: + optionalDependencies: + "@esbuild/aix-ppc64": 0.21.1 + "@esbuild/android-arm": 0.21.1 + "@esbuild/android-arm64": 0.21.1 + "@esbuild/android-x64": 0.21.1 + "@esbuild/darwin-arm64": 0.21.1 + "@esbuild/darwin-x64": 0.21.1 + "@esbuild/freebsd-arm64": 0.21.1 + "@esbuild/freebsd-x64": 0.21.1 + "@esbuild/linux-arm": 0.21.1 + "@esbuild/linux-arm64": 0.21.1 + "@esbuild/linux-ia32": 0.21.1 + "@esbuild/linux-loong64": 0.21.1 + "@esbuild/linux-mips64el": 0.21.1 + "@esbuild/linux-ppc64": 0.21.1 + "@esbuild/linux-riscv64": 0.21.1 + "@esbuild/linux-s390x": 0.21.1 + "@esbuild/linux-x64": 0.21.1 + "@esbuild/netbsd-x64": 0.21.1 + "@esbuild/openbsd-x64": 0.21.1 + "@esbuild/sunos-x64": 0.21.1 + "@esbuild/win32-arm64": 0.21.1 + "@esbuild/win32-ia32": 0.21.1 + "@esbuild/win32-x64": 0.21.1 + + escalade@3.1.2: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@5.0.0: {} + + esprima@4.0.1: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + "@types/estree": 1.0.5 + + eventemitter3@5.0.1: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 + + extend@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fill-range@7.0.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-yarn-workspace-root2@1.2.16: + dependencies: + micromatch: 4.0.5 + pkg-dir: 4.2.0 + + flattie@1.1.1: {} + + foreground-child@3.1.1: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + fraction.js@4.3.7: {} + + fs-extra@11.2.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + 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.2.0: {} + + get-stream@8.0.1: {} + + github-slugger@2.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.3.14: + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.4 + minipass: 7.1.1 + path-scurry: 1.11.0 + + globals@11.12.0: {} + + graceful-fs@4.2.11: {} + + gray-matter@4.0.3: + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + + has-flag@3.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-from-html@2.0.1: + dependencies: + "@types/hast": 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.1 + parse5: 7.1.2 + vfile: 6.0.1 + vfile-message: 4.0.2 + + hast-util-from-parse5@8.0.1: + dependencies: + "@types/hast": 3.0.4 + "@types/unist": 3.0.2 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.5.0 + vfile: 6.0.1 + vfile-location: 5.0.2 + web-namespaces: 2.0.1 + + hast-util-is-element@3.0.0: + dependencies: + "@types/hast": 3.0.4 + + hast-util-parse-selector@4.0.0: + dependencies: + "@types/hast": 3.0.4 + + hast-util-raw@9.0.3: + dependencies: + "@types/hast": 3.0.4 + "@types/unist": 3.0.2 + "@ungap/structured-clone": 1.2.0 + hast-util-from-parse5: 8.0.1 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.1.0 + parse5: 7.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-html@9.0.1: + dependencies: + "@types/hast": 3.0.4 + "@types/unist": 3.0.2 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-raw: 9.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-parse5@8.0.0: + dependencies: + "@types/hast": 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-text@4.0.2: + dependencies: + "@types/hast": 3.0.4 + "@types/unist": 3.0.2 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + + hast-util-whitespace@3.0.0: + dependencies: + "@types/hast": 3.0.4 + + hastscript@8.0.0: + dependencies: + "@types/hast": 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + + hookable@5.5.3: {} + + html-escaper@3.0.3: {} + + html-tags@3.3.1: {} + + html-void-elements@3.0.0: {} + + http-cache-semantics@4.1.1: {} + + human-signals@5.0.0: {} + + import-meta-resolve@4.1.0: {} + + is-arrayish@0.3.2: + optional: true + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-buffer@2.0.5: {} + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.2 + + is-docker@3.0.0: {} + + is-extendable@0.1.1: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-interactive@2.0.0: {} + + is-number@7.0.0: {} + + is-plain-obj@4.1.0: {} + + is-stream@3.0.0: {} + + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.0.0: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isexe@2.0.0: {} + + jackspeak@2.3.6: + dependencies: + "@isaacs/cliui": 8.0.2 + optionalDependencies: + "@pkgjs/parseargs": 0.11.0 + + jiti@1.21.0: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@2.5.2: {} + + json5@2.2.3: {} + + jsonc-parser@2.3.1: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + kolorist@1.8.0: {} + + lilconfig@2.1.0: {} + + lilconfig@3.1.1: {} + + lines-and-columns@1.2.4: {} + + load-yaml-file@0.2.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + log-symbols@6.0.0: + dependencies: + chalk: 5.3.0 + is-unicode-supported: 1.3.0 + + longest-streak@3.1.0: {} + + lru-cache@10.2.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lucide-vue-next@0.378.0(vue@3.4.27(typescript@5.4.5)): + dependencies: + vue: 3.4.27(typescript@5.4.5) + + magic-string@0.30.10: + dependencies: + "@jridgewell/sourcemap-codec": 1.4.15 + + markdown-table@3.0.3: {} + + mdast-util-definitions@6.0.0: + dependencies: + "@types/mdast": 4.0.3 + "@types/unist": 3.0.2 + unist-util-visit: 5.0.0 + + mdast-util-find-and-replace@3.0.1: + dependencies: + "@types/mdast": 4.0.3 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + mdast-util-from-markdown@2.0.0: + dependencies: + "@types/mdast": 4.0.3 + "@types/unist": 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.0: + dependencies: + "@types/mdast": 4.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.1.0 + + mdast-util-gfm-footnote@2.0.0: + dependencies: + "@types/mdast": 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + "@types/mdast": 4.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + "@types/mdast": 4.0.3 + devlop: 1.1.0 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + "@types/mdast": 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + "@types/mdast": 4.0.3 + unist-util-is: 6.0.0 + + mdast-util-to-hast@13.1.0: + dependencies: + "@types/hast": 3.0.4 + "@types/mdast": 4.0.3 + "@ungap/structured-clone": 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + + mdast-util-to-markdown@2.1.0: + dependencies: + "@types/mdast": 4.0.3 + "@types/unist": 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@4.0.0: + dependencies: + "@types/mdast": 4.0.3 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromark-core-commonmark@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-autolink-literal@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-footnote@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-strikethrough@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-table@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-gfm-task-list-item@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.0.0 + micromark-extension-gfm-footnote: 2.0.0 + micromark-extension-gfm-strikethrough: 2.0.0 + micromark-extension-gfm-table: 2.0.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.0.1 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-destination@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-label@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-space@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 + + micromark-factory-title@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-whitespace@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-character@2.1.0: + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-chunked@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-classify-character@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-combine-extensions@2.0.0: + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-decode-numeric-character-reference@2.0.1: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-decode-string@2.0.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + + micromark-util-encode@2.0.0: {} + + micromark-util-html-tag-name@2.0.0: {} + + micromark-util-normalize-identifier@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-resolve-all@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-util-sanitize-uri@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + + micromark-util-subtokenize@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-symbol@2.0.0: {} + + micromark-util-types@2.0.0: {} + + micromark@4.0.0: + dependencies: + "@types/debug": 4.1.12 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.5: + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + minimatch@9.0.4: + dependencies: + brace-expansion: 2.0.1 + + minipass@7.1.1: {} + + mitt@3.0.1: {} + + mrmime@2.0.0: {} + + ms@2.1.2: {} + + muggle-string@0.4.1: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.7: {} + + nanoid@5.0.7: {} + + nlcst-to-string@3.1.1: + dependencies: + "@types/nlcst": 1.0.4 + + node-releases@2.0.14: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + open@10.1.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + + ora@8.0.1: + dependencies: + chalk: 5.3.0 + cli-cursor: 4.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.0.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.1.0 + strip-ansi: 7.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@5.0.0: + dependencies: + yocto-queue: 1.0.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-queue@8.0.1: + dependencies: + eventemitter3: 5.0.1 + p-timeout: 6.1.2 + + p-timeout@6.1.2: {} + + p-try@2.2.0: {} + + parse-latin@5.0.1: + dependencies: + nlcst-to-string: 3.1.1 + unist-util-modify-children: 3.1.1 + unist-util-visit-children: 2.0.2 + + parse5@7.1.2: + dependencies: + entities: 4.5.0 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.0: + dependencies: + lru-cache: 10.2.2 + minipass: 7.1.1 + + path-to-regexp@6.2.2: {} + + pathe@1.1.2: {} + + perfect-debounce@1.0.0: {} + + picocolors@1.0.0: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pify@4.0.1: {} + + pirates@4.0.6: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + postcss-import@15.1.0(postcss@8.4.38): + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + postcss-js@4.0.1(postcss@8.4.38): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.38 + + postcss-load-config@4.0.2(postcss@8.4.38): + dependencies: + lilconfig: 3.1.1 + yaml: 2.4.2 + optionalDependencies: + postcss: 8.4.38 + + postcss-nested@6.0.1(postcss@8.4.38): + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + + postcss-selector-parser@6.0.16: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + + preferred-pm@3.1.3: + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.0.0 + + prismjs@1.29.0: {} + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + property-information@6.5.0: {} + + queue-microtask@1.2.3: {} + + radix-vue@1.7.4(vue@3.4.27(typescript@5.4.5)): + dependencies: + "@floating-ui/dom": 1.6.5 + "@floating-ui/vue": 1.0.6(vue@3.4.27(typescript@5.4.5)) + "@internationalized/date": 3.5.3 + "@tanstack/vue-virtual": 3.5.0(vue@3.4.27(typescript@5.4.5)) + "@vueuse/core": 10.9.0(vue@3.4.27(typescript@5.4.5)) + "@vueuse/shared": 10.9.0(vue@3.4.27(typescript@5.4.5)) + aria-hidden: 1.2.4 + defu: 6.1.4 + fast-deep-equal: 3.1.3 + nanoid: 5.0.7 + vue: 3.4.27(typescript@5.4.5) + transitivePeerDependencies: + - "@vue/composition-api" + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + regenerator-runtime@0.14.1: {} + + rehype-parse@9.0.0: + dependencies: + "@types/hast": 3.0.4 + hast-util-from-html: 2.0.1 + unified: 11.0.4 + + rehype-raw@7.0.0: + dependencies: + "@types/hast": 3.0.4 + hast-util-raw: 9.0.3 + vfile: 6.0.1 + + rehype-stringify@10.0.0: + dependencies: + "@types/hast": 3.0.4 + hast-util-to-html: 9.0.1 + unified: 11.0.4 + + rehype@13.0.1: + dependencies: + "@types/hast": 3.0.4 + rehype-parse: 9.0.0 + rehype-stringify: 10.0.0 + unified: 11.0.4 + + remark-gfm@4.0.0: + dependencies: + "@types/mdast": 4.0.3 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + "@types/mdast": 4.0.3 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.0: + dependencies: + "@types/hast": 3.0.4 + "@types/mdast": 4.0.3 + mdast-util-to-hast: 13.1.0 + unified: 11.0.4 + vfile: 6.0.1 + + remark-smartypants@2.1.0: + dependencies: + retext: 8.1.0 + retext-smartypants: 5.2.0 + unist-util-visit: 5.0.0 + + remark-stringify@11.0.0: + dependencies: + "@types/mdast": 4.0.3 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 + + request-light@0.7.0: {} + + require-directory@2.1.1: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@4.0.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + retext-latin@3.1.0: + dependencies: + "@types/nlcst": 1.0.4 + parse-latin: 5.0.1 + unherit: 3.0.1 + unified: 10.1.2 + + retext-smartypants@5.2.0: + dependencies: + "@types/nlcst": 1.0.4 + nlcst-to-string: 3.1.1 + unified: 10.1.2 + unist-util-visit: 4.1.2 + + retext-stringify@3.1.0: + dependencies: + "@types/nlcst": 1.0.4 + nlcst-to-string: 3.1.1 + unified: 10.1.2 + + retext@8.1.0: + dependencies: + "@types/nlcst": 1.0.4 + retext-latin: 3.1.0 + retext-stringify: 3.1.0 + unified: 10.1.2 + + reusify@1.0.4: {} + + rfdc@1.3.1: {} + + rollup@4.17.2: + dependencies: + "@types/estree": 1.0.5 + optionalDependencies: + "@rollup/rollup-android-arm-eabi": 4.17.2 + "@rollup/rollup-android-arm64": 4.17.2 + "@rollup/rollup-darwin-arm64": 4.17.2 + "@rollup/rollup-darwin-x64": 4.17.2 + "@rollup/rollup-linux-arm-gnueabihf": 4.17.2 + "@rollup/rollup-linux-arm-musleabihf": 4.17.2 + "@rollup/rollup-linux-arm64-gnu": 4.17.2 + "@rollup/rollup-linux-arm64-musl": 4.17.2 + "@rollup/rollup-linux-powerpc64le-gnu": 4.17.2 + "@rollup/rollup-linux-riscv64-gnu": 4.17.2 + "@rollup/rollup-linux-s390x-gnu": 4.17.2 + "@rollup/rollup-linux-x64-gnu": 4.17.2 + "@rollup/rollup-linux-x64-musl": 4.17.2 + "@rollup/rollup-win32-arm64-msvc": 4.17.2 + "@rollup/rollup-win32-ia32-msvc": 4.17.2 + "@rollup/rollup-win32-x64-msvc": 4.17.2 + fsevents: 2.3.3 + + run-applescript@7.0.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + + semver@6.3.1: {} + + semver@7.6.2: {} + + sharp@0.33.3: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.2 + optionalDependencies: + "@img/sharp-darwin-arm64": 0.33.3 + "@img/sharp-darwin-x64": 0.33.3 + "@img/sharp-libvips-darwin-arm64": 1.0.2 + "@img/sharp-libvips-darwin-x64": 1.0.2 + "@img/sharp-libvips-linux-arm": 1.0.2 + "@img/sharp-libvips-linux-arm64": 1.0.2 + "@img/sharp-libvips-linux-s390x": 1.0.2 + "@img/sharp-libvips-linux-x64": 1.0.2 + "@img/sharp-libvips-linuxmusl-arm64": 1.0.2 + "@img/sharp-libvips-linuxmusl-x64": 1.0.2 + "@img/sharp-linux-arm": 0.33.3 + "@img/sharp-linux-arm64": 0.33.3 + "@img/sharp-linux-s390x": 0.33.3 + "@img/sharp-linux-x64": 0.33.3 + "@img/sharp-linuxmusl-arm64": 0.33.3 + "@img/sharp-linuxmusl-x64": 0.33.3 + "@img/sharp-wasm32": 0.33.3 + "@img/sharp-win32-ia32": 0.33.3 + "@img/sharp-win32-x64": 0.33.3 + optional: true + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shiki@1.5.1: + dependencies: + "@shikijs/core": 1.5.1 + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + optional: true + + sirv@2.0.4: + dependencies: + "@polka/url": 1.0.0-next.25 + mrmime: 2.0.0 + totalist: 3.0.1 + + sisteransi@1.0.5: {} + + source-map-js@1.2.0: {} + + space-separated-tokens@2.0.2: {} + + speakingurl@14.0.1: {} + + sprintf-js@1.0.3: {} + + stdin-discarder@0.2.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@7.1.0: + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom-string@1.0.0: {} + + strip-bom@3.0.0: {} + + strip-final-newline@3.0.0: {} + + sucrase@3.35.0: + dependencies: + "@jridgewell/gen-mapping": 0.3.5 + commander: 4.1.1 + glob: 10.3.14 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-tags@1.0.0: {} + + tailwind-merge@2.3.0: + dependencies: + "@babel/runtime": 7.24.5 + + tailwindcss-animate@1.0.7(tailwindcss@3.4.3): + dependencies: + tailwindcss: 3.4.3 + + tailwindcss@3.4.3: + dependencies: + "@alloc/quick-lru": 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38) + postcss-nested: 6.0.1(postcss@8.4.38) + postcss-selector-parser: 6.0.16 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + totalist@3.0.1: {} + + trim-lines@3.0.1: {} + + trough@2.2.0: {} + + ts-interface-checker@0.1.13: {} + + tsconfck@3.0.3(typescript@5.4.5): + optionalDependencies: + typescript: 5.4.5 + + tslib@2.6.2: {} + + type-fest@2.19.0: {} + + typesafe-path@0.2.2: {} + + typescript-auto-import-cache@0.3.2: + dependencies: + semver: 7.6.2 + + typescript@5.4.5: {} + + unherit@3.0.1: {} + + unified@10.1.2: + dependencies: + "@types/unist": 2.0.10 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 5.3.7 + + unified@11.0.4: + dependencies: + "@types/unist": 3.0.2 + 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.1 + + unist-util-find-after@5.0.0: + dependencies: + "@types/unist": 3.0.2 + unist-util-is: 6.0.0 + + unist-util-is@5.2.1: + dependencies: + "@types/unist": 2.0.10 + + unist-util-is@6.0.0: + dependencies: + "@types/unist": 3.0.2 + + unist-util-modify-children@3.1.1: + dependencies: + "@types/unist": 2.0.10 + array-iterate: 2.0.1 + + unist-util-position@5.0.0: + dependencies: + "@types/unist": 3.0.2 + + unist-util-remove-position@5.0.0: + dependencies: + "@types/unist": 3.0.2 + unist-util-visit: 5.0.0 + + unist-util-stringify-position@3.0.3: + dependencies: + "@types/unist": 2.0.10 + + unist-util-stringify-position@4.0.0: + dependencies: + "@types/unist": 3.0.2 + + unist-util-visit-children@2.0.2: + dependencies: + "@types/unist": 2.0.10 + + unist-util-visit-parents@5.1.3: + dependencies: + "@types/unist": 2.0.10 + unist-util-is: 5.2.1 + + unist-util-visit-parents@6.0.1: + dependencies: + "@types/unist": 3.0.2 + unist-util-is: 6.0.0 + + unist-util-visit@4.1.2: + dependencies: + "@types/unist": 2.0.10 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + + unist-util-visit@5.0.0: + dependencies: + "@types/unist": 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universalify@2.0.1: {} + + update-browserslist-db@1.0.15(browserslist@4.23.0): + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + + util-deprecate@1.0.2: {} + + vfile-location@5.0.2: + dependencies: + "@types/unist": 3.0.2 + vfile: 6.0.1 + + vfile-message@3.1.4: + dependencies: + "@types/unist": 2.0.10 + unist-util-stringify-position: 3.0.3 + + vfile-message@4.0.2: + dependencies: + "@types/unist": 3.0.2 + unist-util-stringify-position: 4.0.0 + + vfile@5.3.7: + dependencies: + "@types/unist": 2.0.10 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + + vfile@6.0.1: + dependencies: + "@types/unist": 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + + vite-hot-client@0.2.3(vite@5.2.11): + dependencies: + vite: 5.2.11 + + vite-plugin-inspect@0.8.4(rollup@4.17.2)(vite@5.2.11): + dependencies: + "@antfu/utils": 0.7.8 + "@rollup/pluginutils": 5.1.0(rollup@4.17.2) + debug: 4.3.4 + error-stack-parser-es: 0.1.1 + fs-extra: 11.2.0 + open: 10.1.0 + perfect-debounce: 1.0.0 + picocolors: 1.0.0 + sirv: 2.0.4 + vite: 5.2.11 + transitivePeerDependencies: + - rollup + - supports-color + + vite-plugin-vue-devtools@7.1.3(rollup@4.17.2)(vite@5.2.11)(vue@3.4.27(typescript@5.4.5)): + dependencies: + "@vue/devtools-core": 7.1.3(vite@5.2.11)(vue@3.4.27(typescript@5.4.5)) + "@vue/devtools-kit": 7.1.3(vue@3.4.27(typescript@5.4.5)) + "@vue/devtools-shared": 7.1.3 + execa: 8.0.1 + sirv: 2.0.4 + vite: 5.2.11 + vite-plugin-inspect: 0.8.4(rollup@4.17.2)(vite@5.2.11) + vite-plugin-vue-inspector: 5.1.0(vite@5.2.11) + transitivePeerDependencies: + - "@nuxt/kit" + - rollup + - supports-color + - vue + + vite-plugin-vue-inspector@5.1.0(vite@5.2.11): + dependencies: + "@babel/core": 7.24.5 + "@babel/plugin-proposal-decorators": 7.24.1(@babel/core@7.24.5) + "@babel/plugin-syntax-import-attributes": 7.24.1(@babel/core@7.24.5) + "@babel/plugin-syntax-import-meta": 7.10.4(@babel/core@7.24.5) + "@babel/plugin-transform-typescript": 7.24.5(@babel/core@7.24.5) + "@vue/babel-plugin-jsx": 1.2.2(@babel/core@7.24.5) + "@vue/compiler-dom": 3.4.27 + kolorist: 1.8.0 + magic-string: 0.30.10 + vite: 5.2.11 + transitivePeerDependencies: + - supports-color + + vite@5.2.11: + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.17.2 + optionalDependencies: + fsevents: 2.3.3 + + vitefu@0.2.5(vite@5.2.11): + optionalDependencies: + vite: 5.2.11 + + volar-service-css@0.0.43(@volar/language-service@2.2.2): + dependencies: + vscode-css-languageservice: 6.2.14 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + optionalDependencies: + "@volar/language-service": 2.2.2 + + volar-service-emmet@0.0.43(@volar/language-service@2.2.2): + dependencies: + "@vscode/emmet-helper": 2.9.3 + vscode-html-languageservice: "@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462" + optionalDependencies: + "@volar/language-service": 2.2.2 + + volar-service-html@0.0.43(@volar/language-service@2.2.2): + dependencies: + vscode-html-languageservice: "@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462" + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + optionalDependencies: + "@volar/language-service": 2.2.2 + + volar-service-prettier@0.0.43(@volar/language-service@2.2.2): + dependencies: + vscode-uri: 3.0.8 + optionalDependencies: + "@volar/language-service": 2.2.2 + + volar-service-typescript-twoslash-queries@0.0.43(@volar/language-service@2.2.2): + optionalDependencies: + "@volar/language-service": 2.2.2 + + volar-service-typescript@0.0.43(@volar/language-service@2.2.2): + dependencies: + path-browserify: 1.0.1 + semver: 7.6.2 + typescript-auto-import-cache: 0.3.2 + vscode-languageserver-textdocument: 1.0.11 + vscode-nls: 5.2.0 + optionalDependencies: + "@volar/language-service": 2.2.2 + + vscode-css-languageservice@6.2.14: + dependencies: + "@vscode/l10n": 0.0.18 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + + vscode-html-languageservice@5.2.0: + dependencies: + "@vscode/l10n": 0.0.18 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.11: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-nls@5.2.0: {} + + vscode-uri@2.1.2: {} + + vscode-uri@3.0.8: {} + + vue-demi@0.14.7(vue@3.4.27(typescript@5.4.5)): + dependencies: + vue: 3.4.27(typescript@5.4.5) + + vue@3.4.27(typescript@5.4.5): + dependencies: + "@vue/compiler-dom": 3.4.27 + "@vue/compiler-sfc": 3.4.27 + "@vue/runtime-dom": 3.4.27 + "@vue/server-renderer": 3.4.27(vue@3.4.27(typescript@5.4.5)) + "@vue/shared": 3.4.27 + optionalDependencies: + typescript: 5.4.5 + + web-namespaces@2.0.1: {} + + which-pm-runs@1.1.0: {} + + which-pm@2.0.0: + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + + which-pm@2.1.1: + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + widest-line@4.0.1: + dependencies: + string-width: 5.1.2 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yaml@2.4.2: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + yocto-queue@1.0.0: {} + + zod-to-json-schema@3.23.0(zod@3.23.8): + dependencies: + zod: 3.23.8 + + zod@3.23.8: {} + + zwitch@2.0.4: {} diff --git a/extension-templates/jarvis-ext-astro/public/favicon.svg b/extension-templates/jarvis-ext-astro/public/favicon.svg new file mode 100644 index 0000000..f157bd1 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/public/favicon.svg @@ -0,0 +1,9 @@ + + + + diff --git a/extension-templates/jarvis-ext-astro/src/components/ModeToggle.vue b/extension-templates/jarvis-ext-astro/src/components/ModeToggle.vue new file mode 100644 index 0000000..26946a7 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/components/ModeToggle.vue @@ -0,0 +1,36 @@ + + + diff --git a/extension-templates/jarvis-ext-astro/src/components/ui/button/Button.vue b/extension-templates/jarvis-ext-astro/src/components/ui/button/Button.vue new file mode 100644 index 0000000..5cd440f --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/components/ui/button/Button.vue @@ -0,0 +1,26 @@ + + + diff --git a/extension-templates/jarvis-ext-astro/src/components/ui/button/index.ts b/extension-templates/jarvis-ext-astro/src/components/ui/button/index.ts new file mode 100644 index 0000000..c5b1b72 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/components/ui/button/index.ts @@ -0,0 +1,35 @@ +import { type VariantProps, cva } from "class-variance-authority"; + +export { default as Button } from "./Button.vue"; + +export const buttonVariants = cva( + "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground hover:bg-destructive/90", + outline: + "border border-input bg-background hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-10 px-4 py-2", + xs: "h-7 rounded px-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +); + +export type ButtonVariants = VariantProps; diff --git a/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenu.vue b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenu.vue new file mode 100644 index 0000000..6fc03a6 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenu.vue @@ -0,0 +1,19 @@ + + + diff --git a/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue new file mode 100644 index 0000000..9af100c --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue @@ -0,0 +1,42 @@ + + + diff --git a/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuContent.vue b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuContent.vue new file mode 100644 index 0000000..1c2dd26 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuContent.vue @@ -0,0 +1,43 @@ + + + diff --git a/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuGroup.vue b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuGroup.vue new file mode 100644 index 0000000..b1af9b7 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuGroup.vue @@ -0,0 +1,11 @@ + + + diff --git a/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuItem.vue b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuItem.vue new file mode 100644 index 0000000..f4d95a7 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuItem.vue @@ -0,0 +1,32 @@ + + + diff --git a/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuLabel.vue b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuLabel.vue new file mode 100644 index 0000000..b6c1c9c --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuLabel.vue @@ -0,0 +1,26 @@ + + + diff --git a/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue new file mode 100644 index 0000000..bc48432 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue @@ -0,0 +1,19 @@ + + + diff --git a/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue new file mode 100644 index 0000000..b72f7fd --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuRadioItem.vue @@ -0,0 +1,43 @@ + + + diff --git a/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue new file mode 100644 index 0000000..def12f7 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuSeparator.vue @@ -0,0 +1,24 @@ + + + diff --git a/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue new file mode 100644 index 0000000..3345db3 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuShortcut.vue @@ -0,0 +1,14 @@ + + + diff --git a/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuSub.vue b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuSub.vue new file mode 100644 index 0000000..48564bb --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuSub.vue @@ -0,0 +1,19 @@ + + + diff --git a/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue new file mode 100644 index 0000000..c6e37ef --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuSubContent.vue @@ -0,0 +1,35 @@ + + + diff --git a/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue new file mode 100644 index 0000000..92fd103 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue @@ -0,0 +1,35 @@ + + + diff --git a/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue new file mode 100644 index 0000000..f0709e5 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/DropdownMenuTrigger.vue @@ -0,0 +1,13 @@ + + + diff --git a/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/index.ts b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/index.ts new file mode 100644 index 0000000..84f7c3a --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/components/ui/dropdown-menu/index.ts @@ -0,0 +1,16 @@ +export { DropdownMenuPortal } from "radix-vue"; + +export { default as DropdownMenu } from "./DropdownMenu.vue"; +export { default as DropdownMenuTrigger } from "./DropdownMenuTrigger.vue"; +export { default as DropdownMenuContent } from "./DropdownMenuContent.vue"; +export { default as DropdownMenuGroup } from "./DropdownMenuGroup.vue"; +export { default as DropdownMenuRadioGroup } from "./DropdownMenuRadioGroup.vue"; +export { default as DropdownMenuItem } from "./DropdownMenuItem.vue"; +export { default as DropdownMenuCheckboxItem } from "./DropdownMenuCheckboxItem.vue"; +export { default as DropdownMenuRadioItem } from "./DropdownMenuRadioItem.vue"; +export { default as DropdownMenuShortcut } from "./DropdownMenuShortcut.vue"; +export { default as DropdownMenuSeparator } from "./DropdownMenuSeparator.vue"; +export { default as DropdownMenuLabel } from "./DropdownMenuLabel.vue"; +export { default as DropdownMenuSub } from "./DropdownMenuSub.vue"; +export { default as DropdownMenuSubTrigger } from "./DropdownMenuSubTrigger.vue"; +export { default as DropdownMenuSubContent } from "./DropdownMenuSubContent.vue"; diff --git a/extension-templates/jarvis-ext-astro/src/env.d.ts b/extension-templates/jarvis-ext-astro/src/env.d.ts new file mode 100644 index 0000000..f964fe0 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/extension-templates/jarvis-ext-astro/src/layouts/Default.astro b/extension-templates/jarvis-ext-astro/src/layouts/Default.astro new file mode 100644 index 0000000..3c8105c --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/layouts/Default.astro @@ -0,0 +1,45 @@ +--- +import "@/styles/globals.css"; + +interface Props { + title: string; +} + +const { title } = Astro.props; +--- + + + + + + + + + + + + + + {title} + + + + + diff --git a/extension-templates/jarvis-ext-astro/src/lib/utils.ts b/extension-templates/jarvis-ext-astro/src/lib/utils.ts new file mode 100644 index 0000000..365058c --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/extension-templates/jarvis-ext-astro/src/pages/about.astro b/extension-templates/jarvis-ext-astro/src/pages/about.astro new file mode 100644 index 0000000..6dc935c --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/pages/about.astro @@ -0,0 +1,8 @@ +--- +import DefaultLayout from "@/layouts/Default.astro"; +--- + + +

About

+ home +
diff --git a/extension-templates/jarvis-ext-astro/src/pages/index.astro b/extension-templates/jarvis-ext-astro/src/pages/index.astro new file mode 100644 index 0000000..ca16b3a --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/pages/index.astro @@ -0,0 +1,15 @@ +--- +import { Button } from "@/components/ui/button"; +import DefaultLayout from "@/layouts/Default.astro"; +import ModeToggle from "@/components/ModeToggle.vue"; +--- + + +
+

Tauri Astro Template

+
+ +
+ +
+
diff --git a/extension-templates/jarvis-ext-astro/src/styles/globals.css b/extension-templates/jarvis-ext-astro/src/styles/globals.css new file mode 100644 index 0000000..10b7e9c --- /dev/null +++ b/extension-templates/jarvis-ext-astro/src/styles/globals.css @@ -0,0 +1,78 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --ring: 212.7 26.8% 83.9%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} \ No newline at end of file diff --git a/extension-templates/jarvis-ext-astro/tailwind.config.mjs b/extension-templates/jarvis-ext-astro/tailwind.config.mjs new file mode 100644 index 0000000..68d5ec7 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/tailwind.config.mjs @@ -0,0 +1,90 @@ +import animate from "tailwindcss-animate" + +/** @type {import('tailwindcss').Config} */ +export default { + darkMode: ["class"], + safelist: ["dark"], + prefix: "", + + content: [ + './src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}', + ], + + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + xl: "calc(var(--radius) + 4px)", + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: 0 }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: 0 }, + }, + "collapsible-down": { + from: { height: 0 }, + to: { height: 'var(--radix-collapsible-content-height)' }, + }, + "collapsible-up": { + from: { height: 'var(--radix-collapsible-content-height)' }, + to: { height: 0 }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + "collapsible-down": "collapsible-down 0.2s ease-in-out", + "collapsible-up": "collapsible-up 0.2s ease-in-out", + }, + }, + }, + plugins: [animate], +} \ No newline at end of file diff --git a/extension-templates/jarvis-ext-astro/tsconfig.json b/extension-templates/jarvis-ext-astro/tsconfig.json new file mode 100644 index 0000000..fbd6542 --- /dev/null +++ b/extension-templates/jarvis-ext-astro/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "astro/tsconfigs/strict", + "compilerOptions": { + "jsx": "preserve", + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + } +} diff --git a/extension-templates/jarvis-ext-nuxt/.gitignore b/extension-templates/jarvis-ext-nuxt/.gitignore new file mode 100644 index 0000000..4a7f73a --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/.gitignore @@ -0,0 +1,24 @@ +# Nuxt dev/build outputs +.output +.data +.nuxt +.nitro +.cache +dist + +# Node dependencies +node_modules + +# Logs +logs +*.log + +# Misc +.DS_Store +.fleet +.idea + +# Local env files +.env +.env.* +!.env.example diff --git a/extension-templates/jarvis-ext-nuxt/README.md b/extension-templates/jarvis-ext-nuxt/README.md new file mode 100644 index 0000000..f5db2a2 --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/README.md @@ -0,0 +1,75 @@ +# Nuxt 3 Minimal Starter + +Look at the [Nuxt 3 documentation](https://nuxt.com/docs/getting-started/introduction) to learn more. + +## Setup + +Make sure to install the dependencies: + +```bash +# npm +npm install + +# pnpm +pnpm install + +# yarn +yarn install + +# bun +bun install +``` + +## Development Server + +Start the development server on `http://localhost:3000`: + +```bash +# npm +npm run dev + +# pnpm +pnpm run dev + +# yarn +yarn dev + +# bun +bun run dev +``` + +## Production + +Build the application for production: + +```bash +# npm +npm run build + +# pnpm +pnpm run build + +# yarn +yarn build + +# bun +bun run build +``` + +Locally preview production build: + +```bash +# npm +npm run preview + +# pnpm +pnpm run preview + +# yarn +yarn preview + +# bun +bun run preview +``` + +Check out the [deployment documentation](https://nuxt.com/docs/getting-started/deployment) for more information. diff --git a/extension-templates/jarvis-ext-nuxt/app.vue b/extension-templates/jarvis-ext-nuxt/app.vue new file mode 100644 index 0000000..8f62b8b --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/app.vue @@ -0,0 +1,3 @@ + diff --git a/extension-templates/jarvis-ext-nuxt/assets/css/tailwind.css b/extension-templates/jarvis-ext-nuxt/assets/css/tailwind.css new file mode 100644 index 0000000..010919c --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/assets/css/tailwind.css @@ -0,0 +1,78 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --ring: 212.7 26.8% 83.9%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/extension-templates/jarvis-ext-nuxt/components.json b/extension-templates/jarvis-ext-nuxt/components.json new file mode 100644 index 0000000..89d34d1 --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://shadcn-vue.com/schema.json", + "style": "new-york", + "typescript": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "assets/css/tailwind.css", + "baseColor": "slate", + "cssVariables": true + }, + "framework": "nuxt", + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} diff --git a/extension-templates/jarvis-ext-nuxt/components/mode-toggle.vue b/extension-templates/jarvis-ext-nuxt/components/mode-toggle.vue new file mode 100644 index 0000000..026022f --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components/mode-toggle.vue @@ -0,0 +1,35 @@ + + + diff --git a/extension-templates/jarvis-ext-nuxt/components/ui/button/Button.vue b/extension-templates/jarvis-ext-nuxt/components/ui/button/Button.vue new file mode 100644 index 0000000..5cd440f --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components/ui/button/Button.vue @@ -0,0 +1,26 @@ + + + diff --git a/extension-templates/jarvis-ext-nuxt/components/ui/button/index.ts b/extension-templates/jarvis-ext-nuxt/components/ui/button/index.ts new file mode 100644 index 0000000..520fb87 --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components/ui/button/index.ts @@ -0,0 +1,36 @@ +import { type VariantProps, cva } from "class-variance-authority"; + +export { default as Button } from "./Button.vue"; + +export const buttonVariants = cva( + "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + xs: "h-7 rounded px-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +); + +export type ButtonVariants = VariantProps; diff --git a/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenu.vue b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenu.vue new file mode 100644 index 0000000..6fc03a6 --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenu.vue @@ -0,0 +1,19 @@ + + + diff --git a/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue new file mode 100644 index 0000000..95f3dcc --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuCheckboxItem.vue @@ -0,0 +1,42 @@ + + + diff --git a/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuContent.vue b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuContent.vue new file mode 100644 index 0000000..1c2dd26 --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuContent.vue @@ -0,0 +1,43 @@ + + + diff --git a/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuGroup.vue b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuGroup.vue new file mode 100644 index 0000000..b1af9b7 --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuGroup.vue @@ -0,0 +1,11 @@ + + + diff --git a/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuItem.vue b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuItem.vue new file mode 100644 index 0000000..f4d95a7 --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuItem.vue @@ -0,0 +1,32 @@ + + + diff --git a/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuLabel.vue b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuLabel.vue new file mode 100644 index 0000000..b6c1c9c --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuLabel.vue @@ -0,0 +1,26 @@ + + + diff --git a/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue new file mode 100644 index 0000000..bc48432 --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuRadioGroup.vue @@ -0,0 +1,19 @@ + + + diff --git a/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuRadioItem.vue b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuRadioItem.vue new file mode 100644 index 0000000..940b584 --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuRadioItem.vue @@ -0,0 +1,43 @@ + + + diff --git a/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuSeparator.vue b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuSeparator.vue new file mode 100644 index 0000000..def12f7 --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuSeparator.vue @@ -0,0 +1,24 @@ + + + diff --git a/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuShortcut.vue b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuShortcut.vue new file mode 100644 index 0000000..3345db3 --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuShortcut.vue @@ -0,0 +1,14 @@ + + + diff --git a/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuSub.vue b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuSub.vue new file mode 100644 index 0000000..48564bb --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuSub.vue @@ -0,0 +1,19 @@ + + + diff --git a/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuSubContent.vue b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuSubContent.vue new file mode 100644 index 0000000..c6e37ef --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuSubContent.vue @@ -0,0 +1,35 @@ + + + diff --git a/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue new file mode 100644 index 0000000..07481ca --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuSubTrigger.vue @@ -0,0 +1,35 @@ + + + diff --git a/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuTrigger.vue b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuTrigger.vue new file mode 100644 index 0000000..f0709e5 --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/DropdownMenuTrigger.vue @@ -0,0 +1,13 @@ + + + diff --git a/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/index.ts b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/index.ts new file mode 100644 index 0000000..84f7c3a --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/components/ui/dropdown-menu/index.ts @@ -0,0 +1,16 @@ +export { DropdownMenuPortal } from "radix-vue"; + +export { default as DropdownMenu } from "./DropdownMenu.vue"; +export { default as DropdownMenuTrigger } from "./DropdownMenuTrigger.vue"; +export { default as DropdownMenuContent } from "./DropdownMenuContent.vue"; +export { default as DropdownMenuGroup } from "./DropdownMenuGroup.vue"; +export { default as DropdownMenuRadioGroup } from "./DropdownMenuRadioGroup.vue"; +export { default as DropdownMenuItem } from "./DropdownMenuItem.vue"; +export { default as DropdownMenuCheckboxItem } from "./DropdownMenuCheckboxItem.vue"; +export { default as DropdownMenuRadioItem } from "./DropdownMenuRadioItem.vue"; +export { default as DropdownMenuShortcut } from "./DropdownMenuShortcut.vue"; +export { default as DropdownMenuSeparator } from "./DropdownMenuSeparator.vue"; +export { default as DropdownMenuLabel } from "./DropdownMenuLabel.vue"; +export { default as DropdownMenuSub } from "./DropdownMenuSub.vue"; +export { default as DropdownMenuSubTrigger } from "./DropdownMenuSubTrigger.vue"; +export { default as DropdownMenuSubContent } from "./DropdownMenuSubContent.vue"; diff --git a/extension-templates/jarvis-ext-nuxt/layouts/default.vue b/extension-templates/jarvis-ext-nuxt/layouts/default.vue new file mode 100644 index 0000000..4fea4ce --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/layouts/default.vue @@ -0,0 +1,5 @@ + diff --git a/extension-templates/jarvis-ext-nuxt/lib/utils.ts b/extension-templates/jarvis-ext-nuxt/lib/utils.ts new file mode 100644 index 0000000..365058c --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/extension-templates/jarvis-ext-nuxt/nuxt.config.ts b/extension-templates/jarvis-ext-nuxt/nuxt.config.ts new file mode 100644 index 0000000..0ca542b --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/nuxt.config.ts @@ -0,0 +1,27 @@ +// https://nuxt.com/docs/api/configuration/nuxt-config +export default defineNuxtConfig({ + devtools: { enabled: true }, + modules: ["@nuxtjs/tailwindcss", "shadcn-nuxt", "@nuxtjs/color-mode"], + colorMode: { + classSuffix: "", + }, + shadcn: { + /** + * Prefix for all the imported component + */ + prefix: "", + /** + * Directory that the component lives in. + * @default "./components/ui" + */ + componentDir: "./components/ui", + }, + ssr: false, + app: { + baseURL: "/extensions-template/jarvis-ext-nuxt/dist/", + // process.env.NODE_ENV === "production" ? "/extensions/encode/dist/" : "/", + // process.env.NODE_ENV === "production" ? "/extensions-template/jarvis-ext-nuxt/dist/" : "/", + // process.env.NODE_ENV === "production" ? "/dist" : "/", + // buildAssetsDir: "" + }, +}); diff --git a/extension-templates/jarvis-ext-nuxt/package.json b/extension-templates/jarvis-ext-nuxt/package.json new file mode 100644 index 0000000..dda8f3a --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/package.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://extensions.jarvis.huakun.tech/schema.json", + "name": "jarvis-ext-nuxt", + "private": true, + "type": "module", + "jarvis": {}, + "scripts": { + "build": "nuxt generate", + "dev": "nuxt dev", + "generate": "nuxt generate", + "preview": "nuxt preview", + "postinstall": "nuxt prepare" + }, + "dependencies": { + "jarvis-api": "latest", + "@radix-icons/vue": "^1.0.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "nuxt": "^3.11.2", + "radix-vue": "^1.7.4", + "shadcn-nuxt": "^0.10.4", + "tailwind-merge": "^2.3.0", + "tailwindcss-animate": "^1.0.7", + "vue": "^3.4.27", + "vue-router": "^4.3.2" + }, + "devDependencies": { + "@iconify-json/radix-icons": "^1.1.14", + "@iconify/vue": "^4.1.2", + "@nuxtjs/color-mode": "^3.4.1", + "@nuxtjs/tailwindcss": "^6.12.0", + "typescript": "^5.4.5" + } +} diff --git a/extension-templates/jarvis-ext-nuxt/pages/about.vue b/extension-templates/jarvis-ext-nuxt/pages/about.vue new file mode 100644 index 0000000..2e3b1cc --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/pages/about.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/extension-templates/jarvis-ext-nuxt/pages/index.vue b/extension-templates/jarvis-ext-nuxt/pages/index.vue new file mode 100644 index 0000000..db62d34 --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/pages/index.vue @@ -0,0 +1,12 @@ + + diff --git a/extension-templates/jarvis-ext-nuxt/public/favicon.ico b/extension-templates/jarvis-ext-nuxt/public/favicon.ico new file mode 100644 index 0000000..18993ad Binary files /dev/null and b/extension-templates/jarvis-ext-nuxt/public/favicon.ico differ diff --git a/extension-templates/jarvis-ext-nuxt/server/tsconfig.json b/extension-templates/jarvis-ext-nuxt/server/tsconfig.json new file mode 100644 index 0000000..b9ed69c --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/server/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../.nuxt/tsconfig.server.json" +} diff --git a/extension-templates/jarvis-ext-nuxt/tailwind.config.js b/extension-templates/jarvis-ext-nuxt/tailwind.config.js new file mode 100644 index 0000000..37013bf --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/tailwind.config.js @@ -0,0 +1,86 @@ +const animate = require("tailwindcss-animate"); + +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: ["class"], + safelist: ["dark"], + prefix: "", + + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + xl: "calc(var(--radius) + 4px)", + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: 0 }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: 0 }, + }, + "collapsible-down": { + from: { height: 0 }, + to: { height: "var(--radix-collapsible-content-height)" }, + }, + "collapsible-up": { + from: { height: "var(--radix-collapsible-content-height)" }, + to: { height: 0 }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + "collapsible-down": "collapsible-down 0.2s ease-in-out", + "collapsible-up": "collapsible-up 0.2s ease-in-out", + }, + }, + }, + plugins: [animate], +}; diff --git a/extension-templates/jarvis-ext-nuxt/tsconfig.json b/extension-templates/jarvis-ext-nuxt/tsconfig.json new file mode 100644 index 0000000..a746f2a --- /dev/null +++ b/extension-templates/jarvis-ext-nuxt/tsconfig.json @@ -0,0 +1,4 @@ +{ + // https://nuxt.com/docs/guide/concepts/typescript + "extends": "./.nuxt/tsconfig.json" +} diff --git a/extension-templates/jarvis-ext-react/.eslintrc.cjs b/extension-templates/jarvis-ext-react/.eslintrc.cjs new file mode 100644 index 0000000..6e8698b --- /dev/null +++ b/extension-templates/jarvis-ext-react/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:react-hooks/recommended", + ], + ignorePatterns: ["dist", ".eslintrc.cjs"], + parser: "@typescript-eslint/parser", + plugins: ["react-refresh"], + rules: { + "react-refresh/only-export-components": [ + "warn", + { allowConstantExport: true }, + ], + }, +}; diff --git a/extension-templates/jarvis-ext-react/.gitignore b/extension-templates/jarvis-ext-react/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/extension-templates/jarvis-ext-react/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/extension-templates/jarvis-ext-react/README.md b/extension-templates/jarvis-ext-react/README.md new file mode 100644 index 0000000..bb15685 --- /dev/null +++ b/extension-templates/jarvis-ext-react/README.md @@ -0,0 +1,30 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default { + // other rules... + parserOptions: { + ecmaVersion: "latest", + sourceType: "module", + project: ["./tsconfig.json", "./tsconfig.node.json"], + tsconfigRootDir: __dirname, + }, +}; +``` + +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/extension-templates/jarvis-ext-react/components.json b/extension-templates/jarvis-ext-react/components.json new file mode 100644 index 0000000..1aaa3a6 --- /dev/null +++ b/extension-templates/jarvis-ext-react/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/index.css", + "baseColor": "slate", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} diff --git a/extension-templates/jarvis-ext-react/index.html b/extension-templates/jarvis-ext-react/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/extension-templates/jarvis-ext-react/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/extension-templates/jarvis-ext-react/package.json b/extension-templates/jarvis-ext-react/package.json new file mode 100644 index 0000000..58094e2 --- /dev/null +++ b/extension-templates/jarvis-ext-react/package.json @@ -0,0 +1,43 @@ +{ + "$schema": "https://extensions.jarvis.huakun.tech/schema.json", + "name": "jarvis-ext-react", + "private": true, + "version": "0.0.0", + "type": "module", + "jarvis": {}, + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "jarvis-api": "latest", + "@radix-ui/react-dropdown-menu": "^2.0.6", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-slot": "^1.0.2", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "lucide-react": "^0.378.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "tailwind-merge": "^2.3.0", + "tailwindcss-animate": "^1.0.7" + }, + "devDependencies": { + "@types/node": "^20.12.11", + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.19", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "postcss": "^8.4.38", + "tailwindcss": "^3.4.3", + "typescript": "^5.2.2", + "vite": "^5.2.0" + } +} diff --git a/extension-templates/jarvis-ext-react/postcss.config.js b/extension-templates/jarvis-ext-react/postcss.config.js new file mode 100644 index 0000000..2aa7205 --- /dev/null +++ b/extension-templates/jarvis-ext-react/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/extension-templates/jarvis-ext-react/public/vite.svg b/extension-templates/jarvis-ext-react/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/extension-templates/jarvis-ext-react/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extension-templates/jarvis-ext-react/src/App.css b/extension-templates/jarvis-ext-react/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/extension-templates/jarvis-ext-react/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/extension-templates/jarvis-ext-react/src/App.tsx b/extension-templates/jarvis-ext-react/src/App.tsx new file mode 100644 index 0000000..47f4ff8 --- /dev/null +++ b/extension-templates/jarvis-ext-react/src/App.tsx @@ -0,0 +1,39 @@ +import { useState } from "react"; +import reactLogo from "./assets/react.svg"; +import viteLogo from "/vite.svg"; +import "./App.css"; +import { ThemeProvider } from "@/components/theme-provider"; +import { Button } from "@/components/ui/button"; +import { ModeToggle } from "@/components/ui/mode-toggle"; + +function App() { + const [count, setCount] = useState(0); + + return ( + + +

React Template For Jarvis Extension

+ +
+ +

+ Edit src/App.tsx and save to test HMR +

+
+

+ Click on the Vite and React logos to learn more +

+
+ ); +} + +export default App; diff --git a/extension-templates/jarvis-ext-react/src/assets/react.svg b/extension-templates/jarvis-ext-react/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/extension-templates/jarvis-ext-react/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extension-templates/jarvis-ext-react/src/components/theme-provider.tsx b/extension-templates/jarvis-ext-react/src/components/theme-provider.tsx new file mode 100644 index 0000000..e18440d --- /dev/null +++ b/extension-templates/jarvis-ext-react/src/components/theme-provider.tsx @@ -0,0 +1,73 @@ +import { createContext, useContext, useEffect, useState } from "react"; + +type Theme = "dark" | "light" | "system"; + +type ThemeProviderProps = { + children: React.ReactNode; + defaultTheme?: Theme; + storageKey?: string; +}; + +type ThemeProviderState = { + theme: Theme; + setTheme: (theme: Theme) => void; +}; + +const initialState: ThemeProviderState = { + theme: "system", + setTheme: () => null, +}; + +const ThemeProviderContext = createContext(initialState); + +export function ThemeProvider({ + children, + defaultTheme = "system", + storageKey = "vite-ui-theme", + ...props +}: ThemeProviderProps) { + const [theme, setTheme] = useState( + () => (localStorage.getItem(storageKey) as Theme) || defaultTheme, + ); + + useEffect(() => { + const root = window.document.documentElement; + + root.classList.remove("light", "dark"); + + if (theme === "system") { + const systemTheme = window.matchMedia("(prefers-color-scheme: dark)") + .matches + ? "dark" + : "light"; + + root.classList.add(systemTheme); + return; + } + + root.classList.add(theme); + }, [theme]); + + const value = { + theme, + setTheme: (theme: Theme) => { + localStorage.setItem(storageKey, theme); + setTheme(theme); + }, + }; + + return ( + + {children} + + ); +} + +export const useTheme = () => { + const context = useContext(ThemeProviderContext); + + if (context === undefined) + throw new Error("useTheme must be used within a ThemeProvider"); + + return context; +}; diff --git a/extension-templates/jarvis-ext-react/src/components/ui/button.tsx b/extension-templates/jarvis-ext-react/src/components/ui/button.tsx new file mode 100644 index 0000000..225e113 --- /dev/null +++ b/extension-templates/jarvis-ext-react/src/components/ui/button.tsx @@ -0,0 +1,57 @@ +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; + +import { cn } from "@/lib/utils"; + +const buttonVariants = cva( + "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +); + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean; +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button"; + return ( + + ); + }, +); +Button.displayName = "Button"; + +export { Button, buttonVariants }; diff --git a/extension-templates/jarvis-ext-react/src/components/ui/dropdown-menu.tsx b/extension-templates/jarvis-ext-react/src/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..cc1729a --- /dev/null +++ b/extension-templates/jarvis-ext-react/src/components/ui/dropdown-menu.tsx @@ -0,0 +1,203 @@ +import * as React from "react"; +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; +import { + CheckIcon, + ChevronRightIcon, + DotFilledIcon, +} from "@radix-ui/react-icons"; + +import { cn } from "@/lib/utils"; + +const DropdownMenu = DropdownMenuPrimitive.Root; + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; + +const DropdownMenuGroup = DropdownMenuPrimitive.Group; + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal; + +const DropdownMenuSub = DropdownMenuPrimitive.Sub; + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)); +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName; + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName; + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)); +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName; + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ); +}; +DropdownMenuShortcut.displayName = "DropdownMenuShortcut"; + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +}; diff --git a/extension-templates/jarvis-ext-react/src/components/ui/mode-toggle.tsx b/extension-templates/jarvis-ext-react/src/components/ui/mode-toggle.tsx new file mode 100644 index 0000000..6490f27 --- /dev/null +++ b/extension-templates/jarvis-ext-react/src/components/ui/mode-toggle.tsx @@ -0,0 +1,37 @@ +import { Moon, Sun } from "lucide-react"; + +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { useTheme } from "@/components/theme-provider"; + +export function ModeToggle() { + const { setTheme } = useTheme(); + + return ( + + + + + + setTheme("light")}> + Light + + setTheme("dark")}> + Dark + + setTheme("system")}> + System + + + + ); +} diff --git a/extension-templates/jarvis-ext-react/src/index.css b/extension-templates/jarvis-ext-react/src/index.css new file mode 100644 index 0000000..bc724a1 --- /dev/null +++ b/extension-templates/jarvis-ext-react/src/index.css @@ -0,0 +1,77 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 212.7 26.8% 83.9%; + } +} + +@layer base { + * { + @apply border-border; + } + + body { + @apply bg-background text-foreground; + } +} diff --git a/extension-templates/jarvis-ext-react/src/lib/utils.ts b/extension-templates/jarvis-ext-react/src/lib/utils.ts new file mode 100644 index 0000000..365058c --- /dev/null +++ b/extension-templates/jarvis-ext-react/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/extension-templates/jarvis-ext-react/src/main.tsx b/extension-templates/jarvis-ext-react/src/main.tsx new file mode 100644 index 0000000..f25366e --- /dev/null +++ b/extension-templates/jarvis-ext-react/src/main.tsx @@ -0,0 +1,10 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./App.tsx"; +import "./index.css"; + +ReactDOM.createRoot(document.getElementById("root")!).render( + + + , +); diff --git a/extension-templates/jarvis-ext-react/src/vite-env.d.ts b/extension-templates/jarvis-ext-react/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/extension-templates/jarvis-ext-react/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/extension-templates/jarvis-ext-react/tailwind.config.js b/extension-templates/jarvis-ext-react/tailwind.config.js new file mode 100644 index 0000000..0730ff9 --- /dev/null +++ b/extension-templates/jarvis-ext-react/tailwind.config.js @@ -0,0 +1,77 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: ["class"], + content: [ + "./pages/**/*.{ts,tsx}", + "./components/**/*.{ts,tsx}", + "./app/**/*.{ts,tsx}", + "./src/**/*.{ts,tsx}", + ], + prefix: "", + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: "0" }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: "0" }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + }, + }, + }, + plugins: [require("tailwindcss-animate")], +}; diff --git a/extension-templates/jarvis-ext-react/tsconfig.json b/extension-templates/jarvis-ext-react/tsconfig.json new file mode 100644 index 0000000..4a83aa7 --- /dev/null +++ b/extension-templates/jarvis-ext-react/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/extension-templates/jarvis-ext-react/tsconfig.node.json b/extension-templates/jarvis-ext-react/tsconfig.node.json new file mode 100644 index 0000000..97ede7e --- /dev/null +++ b/extension-templates/jarvis-ext-react/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/extension-templates/jarvis-ext-react/vite.config.ts b/extension-templates/jarvis-ext-react/vite.config.ts new file mode 100644 index 0000000..d137f9d --- /dev/null +++ b/extension-templates/jarvis-ext-react/vite.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import path from "path"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + "@": path.resolve(__dirname, "./src"), + }, + }, + base: "./", +}); diff --git a/extension-templates/jarvis-ext-svelte/.gitignore b/extension-templates/jarvis-ext-svelte/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/extension-templates/jarvis-ext-svelte/.vscode/extensions.json b/extension-templates/jarvis-ext-svelte/.vscode/extensions.json new file mode 100644 index 0000000..bdef820 --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["svelte.svelte-vscode"] +} diff --git a/extension-templates/jarvis-ext-svelte/README.md b/extension-templates/jarvis-ext-svelte/README.md new file mode 100644 index 0000000..a45e2a0 --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/README.md @@ -0,0 +1,47 @@ +# Svelte + TS + Vite + +This template should help get you started developing with Svelte and TypeScript in Vite. + +## Recommended IDE Setup + +[VS Code](https://code.visualstudio.com/) + [Svelte](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode). + +## Need an official Svelte framework? + +Check out [SvelteKit](https://github.com/sveltejs/kit#readme), which is also powered by Vite. Deploy anywhere with its serverless-first approach and adapt to various platforms, with out of the box support for TypeScript, SCSS, and Less, and easily-added support for mdsvex, GraphQL, PostCSS, Tailwind CSS, and more. + +## Technical considerations + +**Why use this over SvelteKit?** + +- It brings its own routing solution which might not be preferable for some users. +- It is first and foremost a framework that just happens to use Vite under the hood, not a Vite app. + +This template contains as little as possible to get started with Vite + TypeScript + Svelte, while taking into account the developer experience with regards to HMR and intellisense. It demonstrates capabilities on par with the other `create-vite` templates and is a good starting point for beginners dipping their toes into a Vite + Svelte project. + +Should you later need the extended capabilities and extensibility provided by SvelteKit, the template has been structured similarly to SvelteKit so that it is easy to migrate. + +**Why `global.d.ts` instead of `compilerOptions.types` inside `jsconfig.json` or `tsconfig.json`?** + +Setting `compilerOptions.types` shuts out all other types not explicitly listed in the configuration. Using triple-slash references keeps the default TypeScript setting of accepting type information from the entire workspace, while also adding `svelte` and `vite/client` type information. + +**Why include `.vscode/extensions.json`?** + +Other templates indirectly recommend extensions via the README, but this file allows VS Code to prompt the user to install the recommended extension upon opening the project. + +**Why enable `allowJs` in the TS template?** + +While `allowJs: false` would indeed prevent the use of `.js` files in the project, it does not prevent the use of JavaScript syntax in `.svelte` files. In addition, it would force `checkJs: false`, bringing the worst of both worlds: not being able to guarantee the entire codebase is TypeScript, and also having worse typechecking for the existing JavaScript. In addition, there are valid use cases in which a mixed codebase may be relevant. + +**Why is HMR not preserving my local component state?** + +HMR state preservation comes with a number of gotchas! It has been disabled by default in both `svelte-hmr` and `@sveltejs/vite-plugin-svelte` due to its often surprising behavior. You can read the details [here](https://github.com/rixo/svelte-hmr#svelte-hmr). + +If you have state that's important to retain within a component, consider creating an external store which would not be replaced by HMR. + +```ts +// store.ts +// An extremely simple external store +import { writable } from "svelte/store"; +export default writable(0); +``` diff --git a/extension-templates/jarvis-ext-svelte/components.json b/extension-templates/jarvis-ext-svelte/components.json new file mode 100644 index 0000000..a71b9b8 --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/components.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://shadcn-svelte.com/schema.json", + "style": "new-york", + "tailwind": { + "config": "tailwind.config.ts", + "css": "src/app.css", + "baseColor": "slate" + }, + "aliases": { + "components": "$lib/components", + "utils": "$lib/utils" + }, + "typescript": true +} diff --git a/extension-templates/jarvis-ext-svelte/index.html b/extension-templates/jarvis-ext-svelte/index.html new file mode 100644 index 0000000..b6c5f0a --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + Svelte + TS + + +
+ + + diff --git a/extension-templates/jarvis-ext-svelte/package.json b/extension-templates/jarvis-ext-svelte/package.json new file mode 100644 index 0000000..9c69ce0 --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/package.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://extensions.jarvis.huakun.tech/schema.json", + "name": "jarvis-ext-svelte", + "private": true, + "version": "0.0.0", + "type": "module", + "jarvis": {}, + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-check --tsconfig ./tsconfig.json" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^3.0.2", + "@tsconfig/svelte": "^5.0.2", + "autoprefixer": "^10.4.16", + "postcss": "^8.4.33", + "svelte": "^4.2.12", + "svelte-check": "^3.6.7", + "tailwindcss": "^3.4.1", + "tslib": "^2.6.2", + "typescript": "^5.2.2", + "vite": "^5.2.0" + }, + "dependencies": { + "jarvis-api": "latest", + "bits-ui": "^0.21.7", + "clsx": "^2.1.1", + "mode-watcher": "^0.3.0", + "tailwind-merge": "^2.3.0", + "tailwind-variants": "^0.2.1" + } +} diff --git a/extension-templates/jarvis-ext-svelte/postcss.config.js b/extension-templates/jarvis-ext-svelte/postcss.config.js new file mode 100644 index 0000000..2aa7205 --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/extension-templates/jarvis-ext-svelte/public/vite.svg b/extension-templates/jarvis-ext-svelte/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extension-templates/jarvis-ext-svelte/src/App.svelte b/extension-templates/jarvis-ext-svelte/src/App.svelte new file mode 100644 index 0000000..4338eee --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/src/App.svelte @@ -0,0 +1,50 @@ + + +
+
+ + +

Svelte Extension Template for Jarvis

+ +
+ +
+ +

+ Check out SvelteKit, the official Svelte app framework powered by Vite! +

+ +

+ Click on the Vite and Svelte logos to learn more +

+
+
diff --git a/extension-templates/jarvis-ext-svelte/src/app.css b/extension-templates/jarvis-ext-svelte/src/app.css new file mode 100644 index 0000000..d5d1389 --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/src/app.css @@ -0,0 +1,78 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 72.2% 50.6%; + --destructive-foreground: 210 40% 98%; + + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --ring: hsl(212.7, 26.8%, 83.9); + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/extension-templates/jarvis-ext-svelte/src/assets/svelte.svg b/extension-templates/jarvis-ext-svelte/src/assets/svelte.svg new file mode 100644 index 0000000..c5e0848 --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/src/assets/svelte.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extension-templates/jarvis-ext-svelte/src/lib/Counter.svelte b/extension-templates/jarvis-ext-svelte/src/lib/Counter.svelte new file mode 100644 index 0000000..8cee48f --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/src/lib/Counter.svelte @@ -0,0 +1,12 @@ + + + diff --git a/extension-templates/jarvis-ext-svelte/src/lib/components/ui/button/button.svelte b/extension-templates/jarvis-ext-svelte/src/lib/components/ui/button/button.svelte new file mode 100644 index 0000000..86827f3 --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/src/lib/components/ui/button/button.svelte @@ -0,0 +1,25 @@ + + + + + diff --git a/extension-templates/jarvis-ext-svelte/src/lib/components/ui/button/index.ts b/extension-templates/jarvis-ext-svelte/src/lib/components/ui/button/index.ts new file mode 100644 index 0000000..1f40982 --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/src/lib/components/ui/button/index.ts @@ -0,0 +1,51 @@ +import type { Button as ButtonPrimitive } from "bits-ui"; +import { type VariantProps, tv } from "tailwind-variants"; +import Root from "./button.svelte"; + +const buttonVariants = tv({ + base: "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50", + variants: { + variant: { + default: "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, +}); + +type Variant = VariantProps["variant"]; +type Size = VariantProps["size"]; + +type Props = ButtonPrimitive.Props & { + variant?: Variant; + size?: Size; +}; + +type Events = ButtonPrimitive.Events; + +export { + Root, + type Props, + type Events, + // + Root as Button, + type Props as ButtonProps, + type Events as ButtonEvents, + buttonVariants, +}; diff --git a/extension-templates/jarvis-ext-svelte/src/lib/utils.ts b/extension-templates/jarvis-ext-svelte/src/lib/utils.ts new file mode 100644 index 0000000..5e50069 --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/src/lib/utils.ts @@ -0,0 +1,62 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; +import { cubicOut } from "svelte/easing"; +import type { TransitionConfig } from "svelte/transition"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +type FlyAndScaleParams = { + y?: number; + x?: number; + start?: number; + duration?: number; +}; + +export const flyAndScale = ( + node: Element, + params: FlyAndScaleParams = { y: -8, x: 0, start: 0.95, duration: 150 }, +): TransitionConfig => { + const style = getComputedStyle(node); + const transform = style.transform === "none" ? "" : style.transform; + + const scaleConversion = ( + valueA: number, + scaleA: [number, number], + scaleB: [number, number], + ) => { + const [minA, maxA] = scaleA; + const [minB, maxB] = scaleB; + + const percentage = (valueA - minA) / (maxA - minA); + const valueB = percentage * (maxB - minB) + minB; + + return valueB; + }; + + const styleToString = ( + style: Record, + ): string => { + return Object.keys(style).reduce((str, key) => { + if (style[key] === undefined) return str; + return str + `${key}:${style[key]};`; + }, ""); + }; + + return { + duration: params.duration ?? 200, + delay: 0, + css: (t) => { + const y = scaleConversion(t, [0, 1], [params.y ?? 5, 0]); + const x = scaleConversion(t, [0, 1], [params.x ?? 0, 0]); + const scale = scaleConversion(t, [0, 1], [params.start ?? 0.95, 1]); + + return styleToString({ + transform: `${transform} translate3d(${x}px, ${y}px, 0) scale(${scale})`, + opacity: t, + }); + }, + easing: cubicOut, + }; +}; diff --git a/extension-templates/jarvis-ext-svelte/src/main.ts b/extension-templates/jarvis-ext-svelte/src/main.ts new file mode 100644 index 0000000..e736285 --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/src/main.ts @@ -0,0 +1,8 @@ +import "./app.css"; +import App from "./App.svelte"; + +const app = new App({ + target: document.getElementById("app")!, +}); + +export default app; diff --git a/extension-templates/jarvis-ext-svelte/src/vite-env.d.ts b/extension-templates/jarvis-ext-svelte/src/vite-env.d.ts new file mode 100644 index 0000000..4078e74 --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/extension-templates/jarvis-ext-svelte/svelte.config.js b/extension-templates/jarvis-ext-svelte/svelte.config.js new file mode 100644 index 0000000..de2ddd6 --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/svelte.config.js @@ -0,0 +1,7 @@ +import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; + +export default { + // Consult https://svelte.dev/docs#compile-time-svelte-preprocess + // for more information about preprocessors + preprocess: vitePreprocess(), +}; diff --git a/extension-templates/jarvis-ext-svelte/tailwind.config.ts b/extension-templates/jarvis-ext-svelte/tailwind.config.ts new file mode 100644 index 0000000..b656a36 --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/tailwind.config.ts @@ -0,0 +1,64 @@ +import { fontFamily } from "tailwindcss/defaultTheme"; +import type { Config } from "tailwindcss"; + +const config: Config = { + darkMode: ["class"], + content: ["./src/**/*.{html,js,svelte,ts}"], + safelist: ["dark"], + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border) / )", + input: "hsl(var(--input) / )", + ring: "hsl(var(--ring) / )", + background: "hsl(var(--background) / )", + foreground: "hsl(var(--foreground) / )", + primary: { + DEFAULT: "hsl(var(--primary) / )", + foreground: "hsl(var(--primary-foreground) / )", + }, + secondary: { + DEFAULT: "hsl(var(--secondary) / )", + foreground: "hsl(var(--secondary-foreground) / )", + }, + destructive: { + DEFAULT: "hsl(var(--destructive) / )", + foreground: "hsl(var(--destructive-foreground) / )", + }, + muted: { + DEFAULT: "hsl(var(--muted) / )", + foreground: "hsl(var(--muted-foreground) / )", + }, + accent: { + DEFAULT: "hsl(var(--accent) / )", + foreground: "hsl(var(--accent-foreground) / )", + }, + popover: { + DEFAULT: "hsl(var(--popover) / )", + foreground: "hsl(var(--popover-foreground) / )", + }, + card: { + DEFAULT: "hsl(var(--card) / )", + foreground: "hsl(var(--card-foreground) / )", + }, + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + fontFamily: { + sans: [...fontFamily.sans], + }, + }, + }, +}; + +export default config; diff --git a/extension-templates/jarvis-ext-svelte/tsconfig.json b/extension-templates/jarvis-ext-svelte/tsconfig.json new file mode 100644 index 0000000..1618573 --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/tsconfig.json @@ -0,0 +1,26 @@ +{ + "extends": "@tsconfig/svelte/tsconfig.json", + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "resolveJsonModule": true, + /** + * Typecheck JS in `.svelte` and `.js` files by default. + * Disable checkJs if you'd like to use dynamic types in JS. + * Note that setting allowJs false does not prevent the use + * of JS in `.svelte` files. + */ + "allowJs": true, + "checkJs": true, + "isolatedModules": true, + + "baseUrl": ".", + "paths": { + "$lib": ["./src/lib"], + "$lib/*": ["./src/lib/*"] + } + }, + "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/extension-templates/jarvis-ext-svelte/tsconfig.node.json b/extension-templates/jarvis-ext-svelte/tsconfig.node.json new file mode 100644 index 0000000..d02c37d --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/extension-templates/jarvis-ext-svelte/vite.config.ts b/extension-templates/jarvis-ext-svelte/vite.config.ts new file mode 100644 index 0000000..e8f5215 --- /dev/null +++ b/extension-templates/jarvis-ext-svelte/vite.config.ts @@ -0,0 +1,14 @@ +import path from "path"; +import { defineConfig } from "vite"; +import { svelte } from "@sveltejs/vite-plugin-svelte"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [svelte()], + resolve: { + alias: { + $lib: path.resolve("./src/lib"), + }, + }, + base: "./", +}); diff --git a/extension-templates/jarvis-ext-vue/.gitignore b/extension-templates/jarvis-ext-vue/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/extension-templates/jarvis-ext-vue/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/extension-templates/jarvis-ext-vue/.vscode/extensions.json b/extension-templates/jarvis-ext-vue/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/extension-templates/jarvis-ext-vue/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/extension-templates/jarvis-ext-vue/README.md b/extension-templates/jarvis-ext-vue/README.md new file mode 100644 index 0000000..0bfecb0 --- /dev/null +++ b/extension-templates/jarvis-ext-vue/README.md @@ -0,0 +1,9 @@ +# Vue 3 + TypeScript + Vite + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + diff --git a/extension-templates/jarvis-ext-vue/package.json b/extension-templates/jarvis-ext-vue/package.json new file mode 100644 index 0000000..acc4a73 --- /dev/null +++ b/extension-templates/jarvis-ext-vue/package.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://extensions.jarvis.huakun.tech/schema.json", + "name": "jarvis-ext-vue", + "private": true, + "version": "0.0.0", + "type": "module", + "jarvis": {}, + "scripts": { + "dev": "vite", + "build": "vue-tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "jarvis-api": "latest", + "@radix-icons/vue": "^1.0.0", + "@vueuse/core": "^10.9.0", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "radix-vue": "^1.7.4", + "tailwind-merge": "^2.3.0", + "tailwindcss-animate": "^1.0.7", + "vue": "^3.4.21" + }, + "devDependencies": { + "@iconify-json/radix-icons": "^1.1.14", + "@iconify/vue": "^4.1.2", + "@types/node": "^20.12.11", + "@vitejs/plugin-vue": "^5.0.4", + "autoprefixer": "^10.4.19", + "tailwindcss": "^3.4.3", + "typescript": "^5.2.2", + "vite": "^5.2.0", + "vue-tsc": "^2.0.6" + } +} diff --git a/extension-templates/jarvis-ext-vue/public/vite.svg b/extension-templates/jarvis-ext-vue/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/extension-templates/jarvis-ext-vue/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extension-templates/jarvis-ext-vue/src/App.vue b/extension-templates/jarvis-ext-vue/src/App.vue new file mode 100644 index 0000000..89d0a7b --- /dev/null +++ b/extension-templates/jarvis-ext-vue/src/App.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/extension-templates/jarvis-ext-vue/src/assets/vue.svg b/extension-templates/jarvis-ext-vue/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/extension-templates/jarvis-ext-vue/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extension-templates/jarvis-ext-vue/src/components/ui/button/Button.vue b/extension-templates/jarvis-ext-vue/src/components/ui/button/Button.vue new file mode 100644 index 0000000..5cd440f --- /dev/null +++ b/extension-templates/jarvis-ext-vue/src/components/ui/button/Button.vue @@ -0,0 +1,26 @@ + + + diff --git a/extension-templates/jarvis-ext-vue/src/components/ui/button/index.ts b/extension-templates/jarvis-ext-vue/src/components/ui/button/index.ts new file mode 100644 index 0000000..520fb87 --- /dev/null +++ b/extension-templates/jarvis-ext-vue/src/components/ui/button/index.ts @@ -0,0 +1,36 @@ +import { type VariantProps, cva } from "class-variance-authority"; + +export { default as Button } from "./Button.vue"; + +export const buttonVariants = cva( + "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + xs: "h-7 rounded px-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +); + +export type ButtonVariants = VariantProps; diff --git a/extension-templates/jarvis-ext-vue/src/index.css b/extension-templates/jarvis-ext-vue/src/index.css new file mode 100644 index 0000000..010919c --- /dev/null +++ b/extension-templates/jarvis-ext-vue/src/index.css @@ -0,0 +1,78 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 210 40% 98%; + + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --ring: 212.7 26.8% 83.9%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} diff --git a/extension-templates/jarvis-ext-vue/src/lib/utils.ts b/extension-templates/jarvis-ext-vue/src/lib/utils.ts new file mode 100644 index 0000000..365058c --- /dev/null +++ b/extension-templates/jarvis-ext-vue/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/extension-templates/jarvis-ext-vue/src/main.ts b/extension-templates/jarvis-ext-vue/src/main.ts new file mode 100644 index 0000000..e0eb9d7 --- /dev/null +++ b/extension-templates/jarvis-ext-vue/src/main.ts @@ -0,0 +1,6 @@ +import { createApp } from "vue"; +import "./index.css"; +import "./style.css"; +import App from "./App.vue"; + +createApp(App).mount("#app"); diff --git a/extension-templates/jarvis-ext-vue/src/style.css b/extension-templates/jarvis-ext-vue/src/style.css new file mode 100644 index 0000000..e69de29 diff --git a/extension-templates/jarvis-ext-vue/src/vite-env.d.ts b/extension-templates/jarvis-ext-vue/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/extension-templates/jarvis-ext-vue/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/extension-templates/jarvis-ext-vue/tailwind.config.js b/extension-templates/jarvis-ext-vue/tailwind.config.js new file mode 100644 index 0000000..32a175b --- /dev/null +++ b/extension-templates/jarvis-ext-vue/tailwind.config.js @@ -0,0 +1,93 @@ +const animate = require("tailwindcss-animate"); + +/** @type {import('tailwindcss').Config} */ +module.exports = { + darkMode: ["class"], + safelist: ["dark"], + prefix: "", + + content: [ + "./pages/**/*.{ts,tsx,vue}", + "./components/**/*.{ts,tsx,vue}", + "./app/**/*.{ts,tsx,vue}", + "./src/**/*.{ts,tsx,vue}", + ], + + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px", + }, + }, + extend: { + colors: { + border: "hsl(var(--border))", + input: "hsl(var(--input))", + ring: "hsl(var(--ring))", + background: "hsl(var(--background))", + foreground: "hsl(var(--foreground))", + primary: { + DEFAULT: "hsl(var(--primary))", + foreground: "hsl(var(--primary-foreground))", + }, + secondary: { + DEFAULT: "hsl(var(--secondary))", + foreground: "hsl(var(--secondary-foreground))", + }, + destructive: { + DEFAULT: "hsl(var(--destructive))", + foreground: "hsl(var(--destructive-foreground))", + }, + muted: { + DEFAULT: "hsl(var(--muted))", + foreground: "hsl(var(--muted-foreground))", + }, + accent: { + DEFAULT: "hsl(var(--accent))", + foreground: "hsl(var(--accent-foreground))", + }, + popover: { + DEFAULT: "hsl(var(--popover))", + foreground: "hsl(var(--popover-foreground))", + }, + card: { + DEFAULT: "hsl(var(--card))", + foreground: "hsl(var(--card-foreground))", + }, + }, + borderRadius: { + xl: "calc(var(--radius) + 4px)", + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)", + }, + keyframes: { + "accordion-down": { + from: { height: 0 }, + to: { height: "var(--radix-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--radix-accordion-content-height)" }, + to: { height: 0 }, + }, + "collapsible-down": { + from: { height: 0 }, + to: { height: "var(--radix-collapsible-content-height)" }, + }, + "collapsible-up": { + from: { height: "var(--radix-collapsible-content-height)" }, + to: { height: 0 }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + "collapsible-down": "collapsible-down 0.2s ease-in-out", + "collapsible-up": "collapsible-up 0.2s ease-in-out", + }, + }, + }, + plugins: [animate], +}; diff --git a/extension-templates/jarvis-ext-vue/tsconfig.json b/extension-templates/jarvis-ext-vue/tsconfig.json new file mode 100644 index 0000000..24972f9 --- /dev/null +++ b/extension-templates/jarvis-ext-vue/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "preserve", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/extension-templates/jarvis-ext-vue/tsconfig.node.json b/extension-templates/jarvis-ext-vue/tsconfig.node.json new file mode 100644 index 0000000..97ede7e --- /dev/null +++ b/extension-templates/jarvis-ext-vue/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/extension-templates/jarvis-ext-vue/vite.config.ts b/extension-templates/jarvis-ext-vue/vite.config.ts new file mode 100644 index 0000000..5193633 --- /dev/null +++ b/extension-templates/jarvis-ext-vue/vite.config.ts @@ -0,0 +1,21 @@ +import path from "path"; +import { defineConfig } from "vite"; +import vue from "@vitejs/plugin-vue"; +import tailwind from "tailwindcss"; +import autoprefixer from "autoprefixer"; + +// https://vitejs.dev/config/ +export default defineConfig({ + css: { + postcss: { + plugins: [tailwind(), autoprefixer()], + }, + }, + plugins: [vue()], + base: "./", + resolve: { + alias: { + "@": path.resolve(__dirname, "./src"), + }, + }, +}); diff --git a/extensions/download-twitter-video/.eslintrc.cjs b/extensions/download-twitter-video/.eslintrc.cjs new file mode 100644 index 0000000..6e8698b --- /dev/null +++ b/extensions/download-twitter-video/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:react-hooks/recommended", + ], + ignorePatterns: ["dist", ".eslintrc.cjs"], + parser: "@typescript-eslint/parser", + plugins: ["react-refresh"], + rules: { + "react-refresh/only-export-components": [ + "warn", + { allowConstantExport: true }, + ], + }, +}; diff --git a/extensions/download-twitter-video/.gitignore b/extensions/download-twitter-video/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/extensions/download-twitter-video/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/extensions/download-twitter-video/README.md b/extensions/download-twitter-video/README.md new file mode 100644 index 0000000..bb15685 --- /dev/null +++ b/extensions/download-twitter-video/README.md @@ -0,0 +1,30 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default { + // other rules... + parserOptions: { + ecmaVersion: "latest", + sourceType: "module", + project: ["./tsconfig.json", "./tsconfig.node.json"], + tsconfigRootDir: __dirname, + }, +}; +``` + +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/extensions/download-twitter-video/components.json b/extensions/download-twitter-video/components.json new file mode 100644 index 0000000..1aaa3a6 --- /dev/null +++ b/extensions/download-twitter-video/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/index.css", + "baseColor": "slate", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils" + } +} diff --git a/extensions/download-twitter-video/demo/download-twitter.png b/extensions/download-twitter-video/demo/download-twitter.png new file mode 100644 index 0000000..037cf39 Binary files /dev/null and b/extensions/download-twitter-video/demo/download-twitter.png differ diff --git a/extensions/download-twitter-video/index.html b/extensions/download-twitter-video/index.html new file mode 100644 index 0000000..e4b78ea --- /dev/null +++ b/extensions/download-twitter-video/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + TS + + +
+ + + diff --git a/extensions/download-twitter-video/package.json b/extensions/download-twitter-video/package.json new file mode 100644 index 0000000..b7c5838 --- /dev/null +++ b/extensions/download-twitter-video/package.json @@ -0,0 +1,86 @@ +{ + "$schema": "https://extensions.jarvis.huakun.tech/schema.json", + "name": "jarvis-ext-download-twitter", + "private": true, + "version": "0.0.1", + "description": "Download YouTube Video Extension", + "type": "module", + "jarvis": { + "name": "Download Twitter Video", + "shortDescription": "Download Twitter Video", + "longDescription": "Prodivde a Tweet URL, the video in the given tweet will be downloaded for you", + "identifier": "tech.huakun.jarvis-ext-twitter-download-video", + "permissions": [ + "clipboard-read" + ], + "demoImages": [ + "./demo/download-twitter.png" + ], + "icon": { + "type": "iconify", + "value": "skill-icons:twitter" + }, + "uiCmds": [ + { + "main": "dist", + "name": "Download Twitter Video", + "devMain": "http://localhost:5173", + "window": { + "titleBarStyle": "overlay", + "width": 700, + "height": 300 + }, + "cmds": [ + { + "type": "text", + "value": "twitter" + } + ] + } + ] + }, + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@hookform/resolvers": "^3.4.0", + "jarvis-api": "latest", + "@radix-ui/react-dropdown-menu": "^2.0.6", + "@radix-ui/react-icons": "^1.3.0", + "@radix-ui/react-label": "^2.0.2", + "@radix-ui/react-slot": "^1.0.2", + "@radix-ui/react-toast": "^1.1.5", + "axios": "^1.6.8", + "class-variance-authority": "^0.7.0", + "clsx": "^2.1.1", + "lucide-react": "^0.378.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-hook-form": "^7.51.4", + "tailwind-merge": "^2.3.0", + "tailwindcss-animate": "^1.0.7", + "zod": "^3.23.8" + }, + "devDependencies": { + "@types/node": "^20.12.11", + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.19", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "postcss": "^8.4.38", + "tailwindcss": "^3.4.3", + "typescript": "^5.2.2", + "vite": "^5.2.0" + }, + "files": [ + "dist" + ] +} \ No newline at end of file diff --git a/extensions/download-twitter-video/postcss.config.js b/extensions/download-twitter-video/postcss.config.js new file mode 100644 index 0000000..2aa7205 --- /dev/null +++ b/extensions/download-twitter-video/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/extensions/download-twitter-video/public/vite.svg b/extensions/download-twitter-video/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/extensions/download-twitter-video/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/download-twitter-video/src/App.css b/extensions/download-twitter-video/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/extensions/download-twitter-video/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/extensions/download-twitter-video/src/App.tsx b/extensions/download-twitter-video/src/App.tsx new file mode 100644 index 0000000..8c7f604 --- /dev/null +++ b/extensions/download-twitter-video/src/App.tsx @@ -0,0 +1,22 @@ +import { ThemeProvider } from "@/components/theme-provider"; +import DownloadForm from "@/components/download-form"; +import { Toaster } from "@/components/ui/toaster"; +import { SkillIconsTwitter } from "./components/TwitterIcon"; + +function App() { + return ( + + +
+
+ + + + Download Video + +
+ + ); +} + +export default App; diff --git a/extensions/download-twitter-video/src/assets/react.svg b/extensions/download-twitter-video/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/extensions/download-twitter-video/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/download-twitter-video/src/components/TwitterIcon.tsx b/extensions/download-twitter-video/src/components/TwitterIcon.tsx new file mode 100644 index 0000000..d0be3db --- /dev/null +++ b/extensions/download-twitter-video/src/components/TwitterIcon.tsx @@ -0,0 +1,22 @@ +import type { SVGProps } from "react"; + +export function SkillIconsTwitter(props: SVGProps) { + return ( + + + + + + + + ); +} diff --git a/extensions/download-twitter-video/src/components/download-form.tsx b/extensions/download-twitter-video/src/components/download-form.tsx new file mode 100644 index 0000000..d8bcf5f --- /dev/null +++ b/extensions/download-twitter-video/src/components/download-form.tsx @@ -0,0 +1,128 @@ +import { useToast } from "@/components/ui/use-toast"; +import { ToastAction } from "@/components/ui/toast"; +import { clipboard, updownload, path, open } from "jarvis-api/ui"; +import Axios from "axios"; +import { z } from "zod"; +import { Label } from "@/components/ui/label"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { FormEvent, useState } from "react"; +import { CopyIcon } from "@radix-ui/react-icons"; +import { cn } from "@/lib/utils"; + +const formSchema = z.object({ + url: z.string().url(), +}); + +export default function DownloadForm({ className }: { className: string }) { + const { toast } = useToast(); + const [url, setUrl] = useState(""); + const [downloadUrl, setDownloadUrl] = useState(""); + + async function checkClipboardValue() { + const clipboardText = await clipboard.readText(); + + if ( + // TODO: Improve URL validation + clipboardText && + (clipboardText.includes("twitter.com") || + clipboardText.includes("x.com")) && + clipboardText.split("/").length > 4 + ) + setUrl(clipboardText); + } + + async function handleDownload(username: string, tweetID: string) { + // const Writer = createWriteStream(`${DOWNLOADS_DIR}/${tweetID}.mp4`); + const APIResponse = await Axios( + `https://api.vxtwitter.com/${username}/status/${tweetID}`, + ); + const directURL = APIResponse.data.media_extended[0]?.url; + if (!directURL) + return toast({ + title: "Error", + description: "No video found", + variant: "destructive", + }); + setDownloadUrl(directURL); + const targetPath = await path.join( + await path.downloadDir(), + `${tweetID}.mp4`, + ); + + updownload.download(directURL, targetPath); + return toast({ + title: "Success", + description: "Downloaded", + variant: "success", + action: ( + { + open(await path.downloadDir()); + }} + altText="Open Downloads Folder" + > + Open Downloads Folder + + ), + }); + } + + function onSubmit(values: z.infer) { + // Do something with the form values. + // ✅ This will be type-safe and validated. + console.log(values); + const [username, tweetID] = [url.split("/")[3], url.split("/")[5]]; + if (!username || !tweetID) { + return toast({ + title: "Error", + description: "Invalid URL", + variant: "destructive", + }); + } + handleDownload(username, tweetID); + } + + return ( +
+ +
) => { + e.preventDefault(); + onSubmit({ url }); + }} + className="flex space-x-2 mt-2" + > + { + setUrl(e.target.value); + }} + autoFocus + onFocus={checkClipboardValue} + /> + +
+
+ {downloadUrl && ( + + {downloadUrl} + + + )} +
+ ); +} diff --git a/extensions/download-twitter-video/src/components/theme-provider.tsx b/extensions/download-twitter-video/src/components/theme-provider.tsx new file mode 100644 index 0000000..e18440d --- /dev/null +++ b/extensions/download-twitter-video/src/components/theme-provider.tsx @@ -0,0 +1,73 @@ +import { createContext, useContext, useEffect, useState } from "react"; + +type Theme = "dark" | "light" | "system"; + +type ThemeProviderProps = { + children: React.ReactNode; + defaultTheme?: Theme; + storageKey?: string; +}; + +type ThemeProviderState = { + theme: Theme; + setTheme: (theme: Theme) => void; +}; + +const initialState: ThemeProviderState = { + theme: "system", + setTheme: () => null, +}; + +const ThemeProviderContext = createContext(initialState); + +export function ThemeProvider({ + children, + defaultTheme = "system", + storageKey = "vite-ui-theme", + ...props +}: ThemeProviderProps) { + const [theme, setTheme] = useState( + () => (localStorage.getItem(storageKey) as Theme) || defaultTheme, + ); + + useEffect(() => { + const root = window.document.documentElement; + + root.classList.remove("light", "dark"); + + if (theme === "system") { + const systemTheme = window.matchMedia("(prefers-color-scheme: dark)") + .matches + ? "dark" + : "light"; + + root.classList.add(systemTheme); + return; + } + + root.classList.add(theme); + }, [theme]); + + const value = { + theme, + setTheme: (theme: Theme) => { + localStorage.setItem(storageKey, theme); + setTheme(theme); + }, + }; + + return ( + + {children} + + ); +} + +export const useTheme = () => { + const context = useContext(ThemeProviderContext); + + if (context === undefined) + throw new Error("useTheme must be used within a ThemeProvider"); + + return context; +}; diff --git a/extensions/download-twitter-video/src/components/ui/button.tsx b/extensions/download-twitter-video/src/components/ui/button.tsx new file mode 100644 index 0000000..48bc772 --- /dev/null +++ b/extensions/download-twitter-video/src/components/ui/button.tsx @@ -0,0 +1,58 @@ +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; + +import { cn } from "@/lib/utils"; + +const buttonVariants = cva( + "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + success: "border-success bg-success text-success-foreground", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 rounded-md px-3 text-xs", + lg: "h-10 rounded-md px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +); + +export interface ButtonProps + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean; +} + +const Button = React.forwardRef( + ({ className, variant, size, asChild = false, ...props }, ref) => { + const Comp = asChild ? Slot : "button"; + return ( + + ); + }, +); +Button.displayName = "Button"; + +export { Button, buttonVariants }; diff --git a/extensions/download-twitter-video/src/components/ui/dropdown-menu.tsx b/extensions/download-twitter-video/src/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..cc1729a --- /dev/null +++ b/extensions/download-twitter-video/src/components/ui/dropdown-menu.tsx @@ -0,0 +1,203 @@ +import * as React from "react"; +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; +import { + CheckIcon, + ChevronRightIcon, + DotFilledIcon, +} from "@radix-ui/react-icons"; + +import { cn } from "@/lib/utils"; + +const DropdownMenu = DropdownMenuPrimitive.Root; + +const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; + +const DropdownMenuGroup = DropdownMenuPrimitive.Group; + +const DropdownMenuPortal = DropdownMenuPrimitive.Portal; + +const DropdownMenuSub = DropdownMenuPrimitive.Sub; + +const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; + +const DropdownMenuSubTrigger = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, children, ...props }, ref) => ( + + {children} + + +)); +DropdownMenuSubTrigger.displayName = + DropdownMenuPrimitive.SubTrigger.displayName; + +const DropdownMenuSubContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSubContent.displayName = + DropdownMenuPrimitive.SubContent.displayName; + +const DropdownMenuContent = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, sideOffset = 4, ...props }, ref) => ( + + + +)); +DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; + +const DropdownMenuItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; + +const DropdownMenuCheckboxItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, checked, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuCheckboxItem.displayName = + DropdownMenuPrimitive.CheckboxItem.displayName; + +const DropdownMenuRadioItem = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, children, ...props }, ref) => ( + + + + + + + {children} + +)); +DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; + +const DropdownMenuLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & { + inset?: boolean; + } +>(({ className, inset, ...props }, ref) => ( + +)); +DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; + +const DropdownMenuSeparator = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)); +DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; + +const DropdownMenuShortcut = ({ + className, + ...props +}: React.HTMLAttributes) => { + return ( + + ); +}; +DropdownMenuShortcut.displayName = "DropdownMenuShortcut"; + +export { + DropdownMenu, + DropdownMenuTrigger, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuCheckboxItem, + DropdownMenuRadioItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuGroup, + DropdownMenuPortal, + DropdownMenuSub, + DropdownMenuSubContent, + DropdownMenuSubTrigger, + DropdownMenuRadioGroup, +}; diff --git a/extensions/download-twitter-video/src/components/ui/form.tsx b/extensions/download-twitter-video/src/components/ui/form.tsx new file mode 100644 index 0000000..670c325 --- /dev/null +++ b/extensions/download-twitter-video/src/components/ui/form.tsx @@ -0,0 +1,177 @@ +import * as React from "react"; +import * as LabelPrimitive from "@radix-ui/react-label"; +import { Slot } from "@radix-ui/react-slot"; +import { + Controller, + ControllerProps, + FieldPath, + FieldValues, + FormProvider, + useFormContext, +} from "react-hook-form"; + +import { cn } from "@/lib/utils"; +import { Label } from "@/components/ui/label"; + +const Form = FormProvider; + +type FormFieldContextValue< + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath, +> = { + name: TName; +}; + +const FormFieldContext = React.createContext( + {} as FormFieldContextValue, +); + +const FormField = < + TFieldValues extends FieldValues = FieldValues, + TName extends FieldPath = FieldPath, +>({ + ...props +}: ControllerProps) => { + return ( + + + + ); +}; + +const useFormField = () => { + const fieldContext = React.useContext(FormFieldContext); + const itemContext = React.useContext(FormItemContext); + const { getFieldState, formState } = useFormContext(); + + const fieldState = getFieldState(fieldContext.name, formState); + + if (!fieldContext) { + throw new Error("useFormField should be used within "); + } + + const { id } = itemContext; + + return { + id, + name: fieldContext.name, + formItemId: `${id}-form-item`, + formDescriptionId: `${id}-form-item-description`, + formMessageId: `${id}-form-item-message`, + ...fieldState, + }; +}; + +type FormItemContextValue = { + id: string; +}; + +const FormItemContext = React.createContext( + {} as FormItemContextValue, +); + +const FormItem = React.forwardRef< + HTMLDivElement, + React.HTMLAttributes +>(({ className, ...props }, ref) => { + const id = React.useId(); + + return ( + +
+ + ); +}); +FormItem.displayName = "FormItem"; + +const FormLabel = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => { + const { error, formItemId } = useFormField(); + + return ( +