diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..a6553d8da --- /dev/null +++ b/.dockerignore @@ -0,0 +1,19 @@ +Dockerfile +.dockerignore +.git +.gitignore +.gitattributes +README.md +.npmrc +.prettierrc +prettier.config.mjs +.eslintrc.cjs +eslint.config.mjs +.graphqlrc +.editorconfig +.svelte-kit +.vscode +node_modules +build +package +**/.env \ No newline at end of file diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 38972655f..000000000 --- a/.eslintignore +++ /dev/null @@ -1,13 +0,0 @@ -.DS_Store -node_modules -/build -/.svelte-kit -/package -.env -.env.* -!.env.example - -# Ignore files for PNPM, NPM and YARN -pnpm-lock.yaml -package-lock.json -yarn.lock diff --git a/.github/workflows/build-app.yml b/.github/workflows/build-app.yml index 341cdfac6..9cbbcc507 100644 --- a/.github/workflows/build-app.yml +++ b/.github/workflows/build-app.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - dev jobs: build-app: @@ -12,17 +13,26 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Setup pnpm 9 + - name: Setup pnpm uses: pnpm/action-setup@v4 + + - name: Get pnpm store directory + shell: bash + run: | + echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV + + - name: Setup pnpm cache + uses: actions/cache@v4 with: - version: 9 + path: ${{ env.STORE_PATH }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- - name: Install dependencies - run: pnpm install + run: pnpm install --frozen-lockfile - name: Build app - run: pnpm vite:build + run: pnpm build env: - UPSTASH_REDIS_TOKEN: ${{ secrets.UPSTASH_REDIS_TOKEN }} - UPSTASH_REDIS_URL: ${{ secrets.UPSTASH_REDIS_URL }} - SVGL_API_REQUESTS: ${{ secrets.SVGL_API_REQUESTS }} + PUBLIC_SVGL_VERSION: v5 diff --git a/.github/workflows/check-app.yml b/.github/workflows/check-app.yml index c4124b995..43f890988 100644 --- a/.github/workflows/check-app.yml +++ b/.github/workflows/check-app.yml @@ -4,29 +4,29 @@ on: push: branches: - main - - next + - dev pull_request: branches: - main - - next + - dev jobs: - vitest: + lint: runs-on: ubuntu-latest - name: ⚡ Testing with Vitest + name: ⚙️ Linting steps: - uses: actions/checkout@v4 - - name: Setup pnpm 9 + - name: Setup pnpm uses: pnpm/action-setup@v4 - with: - version: 9 - name: Install dependencies run: pnpm install - - name: Run Vitest - run: pnpm test + - name: Run Eslint + run: pnpm lint + env: + PUBLIC_SVGL_VERSION: v5 svgs-size: runs-on: ubuntu-latest @@ -34,15 +34,11 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Setup pnpm 9 + - name: Setup pnpm uses: pnpm/action-setup@v4 - with: - version: 9 - - name: Install utility dependencies + - name: Install dependencies run: pnpm install - working-directory: ./utils/check-size - - name: Check svgs size - run: pnpm start - working-directory: ./utils/check-size + - name: Check SVGs size + run: pnpm check:size diff --git a/.github/workflows/deploy-api.yml b/.github/workflows/deploy-api.yml index e84af3797..9cb663b4c 100644 --- a/.github/workflows/deploy-api.yml +++ b/.github/workflows/deploy-api.yml @@ -12,10 +12,10 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Setup pnpm 9 - uses: pnpm/action-setup@v2 + - name: Setup pnpm 10 + uses: pnpm/action-setup@v4 with: - version: 9 + version: 10 - name: Install global dependencies run: pnpm install @@ -25,4 +25,4 @@ jobs: with: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} packageManager: pnpm - workingDirectory: 'api-routes' + workingDirectory: "api-routes" diff --git a/.gitignore b/.gitignore index 8298df170..c66ead5b4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,34 +1,27 @@ # Dependencies node_modules -package-lock.json -yarn.lock -# Folders -/.svelte-kit -/build -dist -/package -.idea/ - -# Hono -.wrangler -.dev.vars +# Content Collections +.content-collections -# Vercel +# Output +.output .vercel +.netlify +.wrangler +/.svelte-kit +/build -# Logs +# OS .DS_Store +Thumbs.db -# Environment variables +# Env .env .env.* !.env.example +!.env.test -# Vite files +# Vite vite.config.js.timestamp-* vite.config.ts.timestamp-* -src/figma/dist - -# Lychee files -.lycheecache \ No newline at end of file diff --git a/.prettierignore b/.prettierignore index 38972655f..7d74fe246 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,13 +1,9 @@ -.DS_Store -node_modules -/build -/.svelte-kit -/package -.env -.env.* -!.env.example - -# Ignore files for PNPM, NPM and YARN -pnpm-lock.yaml +# Package Managers package-lock.json +pnpm-lock.yaml yarn.lock +bun.lock +bun.lockb + +# Miscellaneous +/static/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..1160e6a07 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,37 @@ +FROM node:22.17.0-alpine AS base + +# Install pnpm +RUN npm install -g pnpm@10.13.1 + +# Set working directory +WORKDIR /app + +# Install dependencies with cache +FROM base AS deps +COPY package.json pnpm-lock.yaml ./ +RUN pnpm install --frozen-lockfile + +# Build the application +FROM base AS builder +COPY --from=deps /app/node_modules ./node_modules +COPY . . +RUN pnpm run check:size +RUN pnpm run build:prod + +# Production image +FROM node:22.17.0-alpine AS runner +WORKDIR /app + +# Copy necessary files from builder +COPY --from=builder /app/build ./build +COPY --from=builder /app/node_modules ./node_modules +COPY package.json ./ + +# Set production environment +ENV NODE_ENV=production + +# Expose port +EXPOSE 3000 + +# Start the server +CMD ["node", "build"] \ No newline at end of file diff --git a/README.md b/README.md index 689d8195e..8173f3d9b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
- +

@@ -10,25 +10,29 @@ Explore  ✦  - - Request logo + + Sponsor this project  ✦  - Submit logo + Getting Started  ✦  - + Extensions  ✦  - - API + + Stack  ✦  - + Contributing +  ✦  + + License +

@@ -48,50 +52,51 @@ ## 📦 Extensions -A list of extensions that use the [svgl API](https://svgl.app/api), created by the community: - -| | Extension | Description | Created by | Link | -| ---------------------------------------------------------------------------------------------------------- | ---------------------- | --------------------------------------------------------------- | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | -| | SVGL CLI | A CLI for easily adding SVG icons to your project. | [sujjeee](https://twitter.com/sujjeeee) | [GitHub Repository](https://github.com/sujjeee/svgls) | -| | SVGL for React | An open-source NPM package that offers a SVGL Logos for React. | [ridemountainpig](https://x.com/ridemountainpig) | [GitHub Repository](https://github.com/ridemountainpig/svgl-react?tab=readme-ov-file#svgl-react) | -| | SVGL for Vue | An open-source NPM package that offers a SVGL Logos for Vue. | [selemondev](https://x.com/selemondev) | [GitHub Repository](https://github.com/selemondev/svgl-vue?tab=readme-ov-file#--svgl-vue--) | -| | SVGL for Svelte | An open-source NPM package that offers a SVGL Logos for Svelte. | [selemondev](https://x.com/selemondev) | [GitHub Repository](https://github.com/selemondev/svgl-svelte#--svgl-svelte--) | -| | SVGL for Figma | Add svgs from svgl to your Figma project. | [quilljou](https://twitter.com/quillzhou) | [Figma Plugin](https://www.figma.com/community/plugin/1320306989350693206/svgl) | -| | SVGL for PowerToys | Search & copy SVG logos in PowerToys Run. | [SameerJS6](https://x.com/Sameerjs6) | [Website](https://svgl.sameerjs.com/) | -| | SVGL for Raycast | Search SVG logos via svgl. | [1weiho](https://twitter.com/1weiho) | [Raycast Store](https://www.raycast.com/1weiho/svgl) | -| | SVGL for VSCode | SVGL directly in your VSCode. | [girlazote](https://twitter.com/girlazote) | [VSCode Marketplace](https://marketplace.visualstudio.com/items?itemName=EsteveSegura.svgl) | -| | SVGL Badge | A beautiful badges with svgl SVG logos. | [ridemountainpig](https://twitter.com/ridemountainpig) | [Website](https://svgl-badge.vercel.app/) | -| | Magic | AI extension for Cursor & other IDEs | [serafimcloud](https://x.com/serafimcloud) | [Website](https://21st.dev/magic) | -| | SVGL for PowerShell | PowerShell extension to quickly get svgl logos anywhere | [Bart Spaans](https://bsky.app/profile/bartspaans.bsky.social) | [GitHub](https://github.com/spaansba/SVGL-PowerShell) | -| | SVGL for Flow Launcher | Search & copy SVG logos in Flow Launcher | [AF_Askar](https://x.com/Askar_AF) | [GitHub](https://github.com/abo3skr2019/SVGl-plugin) | +A list of extensions that use the [**SVGL API**](https://svgl.app/docs/api), created by the community: + +| | Extension | Description | Created by | Link | +| ---------------------------------------------------------------------------------------------------------- | ---------------------- | ---------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | +| | SVGL CLI | A CLI for easily adding SVG icons to your project. | [sujjeee](https://twitter.com/sujjeeee) | [GitHub Repository](https://github.com/sujjeee/svgls) | +| | SVGL for Framer | Our SVGL plugin for Framer simplifies the use of SVG-based colourful logos. Easily import and easy to use. | [Krishna Singh](https://x.com/krishnasinghdev) | [Framer Marketplace](https://www.framer.com/marketplace/plugins/svgl/) | +| | SVGL for React | An open-source NPM package that offers a SVGL Logos for React. | [ridemountainpig](https://x.com/ridemountainpig) | [GitHub Repository](https://github.com/ridemountainpig/svgl-react?tab=readme-ov-file#svgl-react) | +| | SVGL for Vue | An open-source NPM package that offers a SVGL Logos for Vue. | [selemondev](https://x.com/selemondev) | [GitHub Repository](https://github.com/selemondev/svgl-vue?tab=readme-ov-file#--svgl-vue--) | +| | SVGL for Svelte | An open-source NPM package that offers a SVGL Logos for Svelte. | [selemondev](https://x.com/selemondev) | [GitHub Repository](https://github.com/selemondev/svgl-svelte#--svgl-svelte--) | +| | SVGL for Figma | Add svgs from svgl to your Figma project. | [quilljou](https://twitter.com/quillzhou) | [Figma Plugin](https://www.figma.com/community/plugin/1320306989350693206/svgl) | +| | SVGL for PowerToys | Search & copy SVG logos in PowerToys Run. | [SameerJS6](https://x.com/Sameerjs6) | [Website](https://svgl.sameerjs.com/) | +| | SVGL for Raycast | Search SVG logos via svgl. | [1weiho](https://twitter.com/1weiho) | [Raycast Store](https://www.raycast.com/1weiho/svgl) | +| | SVGL for VSCode | SVGL directly in your VSCode. | [girlazote](https://twitter.com/girlazote) | [VSCode Marketplace](https://marketplace.visualstudio.com/items?itemName=EsteveSegura.svgl) | +| | SVGL Badge | A beautiful badges with svgl SVG logos. | [ridemountainpig](https://twitter.com/ridemountainpig) | [Website](https://svgl-badge.vercel.app/) | +| | Magic | AI extension for Cursor & other IDEs | [serafimcloud](https://x.com/serafimcloud) | [Website](https://21st.dev/magic) | +| | SVGL for PowerShell | PowerShell extension to quickly get svgl logos anywhere | [Bart Spaans](https://bsky.app/profile/bartspaans.bsky.social) | [GitHub Repository](https://github.com/spaansba/SVGL-PowerShell) | +| | SVGL for Flow Launcher | Search & copy SVG logos in Flow Launcher | [AF_Askar](https://x.com/Askar_AF) | [GitHub Repository](https://github.com/abo3skr2019/SVGl-plugin) | ## 🛠️ Stack -- [**Sveltekit**](https://kit.svelte.dev/) - Web development, streamlined. +- [**Sveltekit** + **Svelte 5**](https://kit.svelte.dev/) - Web development, streamlined. - [**Typescript**](https://www.typescriptlang.org/) - JavaScript with syntax for types. -- [**mdsvex**](https://mdsvex.com/) - Markdown for Svelte apps. +- [**Content-Collections**](https://www.content-collections.dev/) - Transform your content into type-safe data collections and say goodbye to manual data fetching and parsing. - [**Shiki**](https://github.com/shikijs/shiki) - A beautiful Syntax Highlighter. -- [**Tailwindcss**](https://tailwindcss.com/) - A utility-first CSS framework for rapidly building custom designs. +- [**Tailwind CSS**](https://tailwindcss.com/) - A utility-first CSS framework for rapidly building custom designs. - [**bits-ui**](https://www.bits-ui.com) - A collection of headless components for Svelte. - [**clsx**](https://github.com/lukeed/clsx) + [**tailwind-merge**](https://github.com/dcastil/tailwind-merge) inspired by [shadcn/ui](https://ui.shadcn.com) - A tiny utility for constructing `className` strings conditionally. - [**Prettier**](https://prettier.io/) + [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) - An opinionated code formatter. -- [**Lucide Icons**](https://lucide.dev/) + [**phosphor-svelte**](https://github.com/haruaki07/phosphor-svelte) - A clean and friendly icons libraries. +- [**Lucide Icons**](https://lucide.dev/) - Beautiful & + consistent icons. - [**svelte-sonner**](https://github.com/wobsoriano/svelte-sonner) - An opinionated toast component for Svelte. -- [**@svgr/core**](https://react-svgr.com/) - Node.js utility to transform SVGs into React components. +- [**Hono**](https://hono.dev/) - Fast, lightweight, built on Web Standards. Support for any JavaScript runtime. - [**@upstash/redis** + **@upstash/ratelimit**](https://upstash.com/) - Serverless Redis for developers. -- [**Vitest**](https://vitest.dev/) - Blazing Fast Unit Test Framework. ## 🚀 Getting Started > [!IMPORTANT] -> Before submitting the SVG, **make sure that you have permission** or that the license of the SVG allows you to add it to svgl. If you are not sure, please contact the company or author. +> Before submitting an SVG, ensure you have the right to use it and that its license permits adding it to svgl. If you are uncertain, please contact the author or the company. You will need: -- [Node.js 18+ (recommended 20 LTS)](https://nodejs.org/en/). +- [Node.js 20+](https://nodejs.org/en/). - [Git](https://git-scm.com/). -1. [Fork](https://github.com/pheralb/svgl/fork) this repository and clone it locally: +1. [**Fork this repository**](https://github.com/pheralb/svgl/fork) and clone it locally: ```bash git clone git@github.com:your_username/svgl.git @@ -128,7 +133,7 @@ pnpm install } ``` -- **Logo + wordmark** version: +- **Simple logo + wordmark**: ```ts { @@ -140,7 +145,35 @@ pnpm install } ``` -- **Logo + wordmark** & **light + dark mode**: +- **Logo (light & dark mode)**: + +```ts +{ + title: 'Title', + category: 'Category', + route: { + light: '/library/your_logo_light.svg', + dark: '/library/your_logo_dark.svg' + }, + url: 'Website' +} +``` + +- **Wordmark (light & dark mode)**: + +```ts +{ + title: 'Title', + category: 'Category', + wordmark: { + light: '/library/your_logo_light.svg', + dark: '/library/your_logo_dark.svg' + }, + url: 'Website' +} +``` + +- **Full example with all properties**: ```ts { @@ -151,14 +184,14 @@ pnpm install dark: '/library/your_logo_dark.svg' }, wordmark: { - light: '/library/your_wordmark-logo_light.svg', - dark: '/library/your_wordmark-logo_dark.svg' + light: '/library/your_logo_wordmark_light.svg', + dark: '/library/your_logo_wordmark_dark.svg' }, url: 'Website' } ``` -- **Add brand guidelines**: +- **Add brand guidelines** (where to find the images, how to use it, colors, fonts...): ```ts { @@ -176,19 +209,38 @@ pnpm install > - The list of categories is here: [`src/types/categories.ts`](https://github.com/pheralb/svgl/blob/main/src/types/categories.ts). You can add a new category if you need it. > - You can add multiple categories to the same logo, for example: `category: ['Social', 'Design']`. -And create a pull request with your logo 🚀. +And create a pull request with your logo ✨. -5. (Optional) If you want to run the [API](https://svgl.app/api) locally, you will need to create a `.dev.vars` file in the [`/api-routes`](https://github.com/pheralb/svgl/tree/main/api-routes) folder with the following variables: +## 🧑‍🚀 Getting Started with API -- [Create a Upstash account](https://console.upstash.com/). -- [Create a Upstash Redis Database](https://upstash.com/docs/redis/overall/getstarted). +> [!WARNING] +> This section is how to run API locally. For all API endpoints, check the [**API documentation**](https://svgl.app/api). + +1. Go to the [**`api-routes`**](https://github.com/pheralb/svgl/tree/main/api-routes) folder and install the dependencies with [pnpm](https://pnpm.io/): + +```bash +cd api-routes +pnpm install +``` + +2. Create a `.dev.vars` env file in the `api-routes` folder with the following variables: ```bash +# .dev.vars SVGL_API_REQUESTS = 1 UPSTASH_REDIS_URL = "" UPSTASH_REDIS_TOKEN = "" ``` +- [Create a Upstash account](https://console.upstash.com/). +- [Create a Upstash Redis Database](https://upstash.com/docs/redis/overall/getstarted). + +3. Run the development server: + +```bash +pnpm dev +``` + ## ✌️ Contributing diff --git a/api-routes/package.json b/api-routes/package.json index 597d631e9..4bac8e301 100644 --- a/api-routes/package.json +++ b/api-routes/package.json @@ -11,10 +11,11 @@ }, "dependencies": { "@upstash/ratelimit": "2.0.6", - "hono": "4.8.12" + "@upstash/redis": "1.35.3", + "hono": "4.9.6" }, "devDependencies": { - "@cloudflare/workers-types": "4.20250805.0", - "wrangler": "4.28.0" + "@cloudflare/workers-types": "4.20250906.0", + "wrangler": "4.34.0" } } diff --git a/api-routes/pnpm-lock.yaml b/api-routes/pnpm-lock.yaml index e8c18b586..46cc8ed99 100644 --- a/api-routes/pnpm-lock.yaml +++ b/api-routes/pnpm-lock.yaml @@ -10,17 +10,20 @@ importers: dependencies: '@upstash/ratelimit': specifier: 2.0.6 - version: 2.0.6(@upstash/redis@1.34.0) + version: 2.0.6(@upstash/redis@1.35.3) + '@upstash/redis': + specifier: 1.35.3 + version: 1.35.3 hono: - specifier: 4.8.12 - version: 4.8.12 + specifier: 4.9.6 + version: 4.9.6 devDependencies: '@cloudflare/workers-types': - specifier: 4.20250805.0 - version: 4.20250805.0 + specifier: 4.20250906.0 + version: 4.20250906.0 wrangler: - specifier: 4.28.0 - version: 4.28.0(@cloudflare/workers-types@4.20250805.0) + specifier: 4.34.0 + version: 4.34.0(@cloudflare/workers-types@4.20250906.0) packages: @@ -28,47 +31,47 @@ packages: resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} engines: {node: '>=18.0.0'} - '@cloudflare/unenv-preset@2.6.0': - resolution: {integrity: sha512-h7Txw0WbDuUbrvZwky6+x7ft+U/Gppfn/rWx6IdR+e9gjygozRJnV26Y2TOr3yrIFa6OsZqqR2lN+jWTrakHXg==} + '@cloudflare/unenv-preset@2.7.2': + resolution: {integrity: sha512-JY7Uf8GhWcbOMDZX8ke2czp9f9TijvJN4CpRBs3+WYN9U7jHpj3XaV+HHm78iHkAwTm/JeBHqyQNhq/PizynRA==} peerDependencies: - unenv: 2.0.0-rc.19 - workerd: ^1.20250802.0 + unenv: 2.0.0-rc.20 + workerd: ^1.20250828.1 peerDependenciesMeta: workerd: optional: true - '@cloudflare/workerd-darwin-64@1.20250803.0': - resolution: {integrity: sha512-6QciMnJp1p3F1qUiN0LaLfmw7SuZA/gfUBOe8Ft81pw16JYZ3CyiqIKPJvc1SV8jgDx8r+gz/PRi1NwOMt329A==} + '@cloudflare/workerd-darwin-64@1.20250902.0': + resolution: {integrity: sha512-mwC/YEtDUGfnjXdbW5Lya+bgODrpJ5RxxqpaTjtMJycqnjR0RZgVpOqISwGfBHIhseykU3ahPugM5t91XkBKTg==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20250803.0': - resolution: {integrity: sha512-DoIgghDowtqoNhL6OoN/F92SKtrk7mRQKc4YSs/Dst8IwFZq+pCShOlWfB0MXqHKPSoiz5xLSrUKR9H6gQMPvw==} + '@cloudflare/workerd-darwin-arm64@1.20250902.0': + resolution: {integrity: sha512-5Wr6a5/ixoXuMPOvbprN8k9HhAHDBh8f7H5V4DN/Xb4ORoGkI9AbC5QPpYV0wa3Ncf+CRSGobdmZNyO24hRccA==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20250803.0': - resolution: {integrity: sha512-mYdz4vNWX3+PoqRjssepVQqgh42IBiSrl+wb7vbh7VVWUVzBnQKtW3G+UFiBF62hohCLexGIEi7L0cFfRlcKSQ==} + '@cloudflare/workerd-linux-64@1.20250902.0': + resolution: {integrity: sha512-1yJGt56VQBuG01nrhkRGoa1FGz7xQwJTrgewxt/MRRtigZTf84qJQiPQxyM7PQWCLREKa+JS7G8HFqvOwK7kZA==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20250803.0': - resolution: {integrity: sha512-RmrtUYLRUg6djKU7Z6yebS6YGJVnaDVY6bbXca+2s26vw4ibJDOTPLuBHFQF62Grw3fAfsNbjQh5i14vG2mqUg==} + '@cloudflare/workerd-linux-arm64@1.20250902.0': + resolution: {integrity: sha512-ArDodWzfo0BVqMQGUgaOGV5Mzf8wEMUX8TJonExpGbYavoVXVDbp2rTLFRJg1vkFGpmw1teCtSoOjSDisFZQMg==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20250803.0': - resolution: {integrity: sha512-uLV8gdudz36o9sUaAKbBxxTwZwLFz1KyW7QpBvOo4+r3Ib8yVKXGiySIMWGD7A0urSMrjf3e5LlLcJKgZUOjMA==} + '@cloudflare/workerd-windows-64@1.20250902.0': + resolution: {integrity: sha512-DT/o8ZSkmze1YGI7vgVt4ST+VYGb3tNChiFnOM9Z8YOejqKqbVvATB4gi/xMSnNR9CsKFqH4hHWDDtz+wf4uZg==} engines: {node: '>=16'} cpu: [x64] os: [win32] - '@cloudflare/workers-types@4.20250805.0': - resolution: {integrity: sha512-HOt0lqFiw5WzhvxH/IViMAWI/zwzokCSx33DlRnJqECT9khskK9X4Jrw/+IiAprJ5YloiFxK8Xn1oGbsabdUWg==} + '@cloudflare/workers-types@4.20250906.0': + resolution: {integrity: sha512-CMRTupQpAdNZJrxRGaM2JzxmpWOnzgxcyTGmjAOcosRfi1ZsNUTAZ0kj1dzY+4bPDIdFwvvJL3t91DEpqitOJg==} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -367,8 +370,8 @@ packages: peerDependencies: '@upstash/redis': ^1.34.3 - '@upstash/redis@1.34.0': - resolution: {integrity: sha512-TrXNoJLkysIl8SBc4u9bNnyoFYoILpCcFJcLyWCccb/QSUmaVKdvY0m5diZqc3btExsapcMbaw/s/wh9Sf1pJw==} + '@upstash/redis@1.35.3': + resolution: {integrity: sha512-hSjv66NOuahW3MisRGlSgoszU2uONAY2l5Qo3Sae8OT3/Tng9K+2/cBRuyPBX8egwEGcNNCF9+r0V6grNnhL+w==} acorn-walk@8.3.2: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} @@ -400,9 +403,6 @@ packages: resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==} engines: {node: '>=18'} - crypto-js@4.2.0: - resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} @@ -433,8 +433,8 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - hono@4.8.12: - resolution: {integrity: sha512-MQSKk1Mg7b74k8l+A025LfysnLtXDKkE4pLaSsYRQC5iy85lgZnuyeQ1Wynair9mmECzoLu+FtJtqNZSoogBDQ==} + hono@4.9.6: + resolution: {integrity: sha512-doVjXhSFvYZ7y0dNokjwwSahcrAfdz+/BCLvAMa/vHLzjj8+CFyV5xteThGUsKdkaasgN+gF2mUxao+SGLpUeA==} engines: {node: '>=16.9.0'} is-arrayish@0.3.2: @@ -449,8 +449,8 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - miniflare@4.20250803.0: - resolution: {integrity: sha512-1tmCLfmMw0SqRBF9PPII9CVLQRzOrO7uIBmSng8BMSmtgs2kos7OeoM0sg6KbR9FrvP/zAniLyZuCAMAjuu4fQ==} + miniflare@4.20250902.0: + resolution: {integrity: sha512-QHjI17yVDxDXsjDvX6GNRySx2uYsQJyiZ2MRBAsA0CFpAI2BcHd4oz0FIjbqgpZK+4Fhm7OKht/AfBNCd234Zg==} engines: {node: '>=18.0.0'} hasBin: true @@ -489,24 +489,27 @@ packages: ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + uncrypto@0.1.3: + resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + undici@7.13.0: resolution: {integrity: sha512-l+zSMssRqrzDcb3fjMkjjLGmuiiK2pMIcV++mJaAc9vhjSGpvM7h43QgP+OAMb1GImHmbPyG2tBXeuyG5iY4gA==} engines: {node: '>=20.18.1'} - unenv@2.0.0-rc.19: - resolution: {integrity: sha512-t/OMHBNAkknVCI7bVB9OWjUUAwhVv9vsPIAGnNUxnu3FxPQN11rjh0sksLMzc3g7IlTgvHmOTl4JM7JHpcv5wA==} + unenv@2.0.0-rc.20: + resolution: {integrity: sha512-8tn4tAl9vD5nWoggAAPz28vf0FY8+pQAayhU94qD+ZkIbVKCBAH/E1MWEEmhb9Whn5EgouYVfBJB20RsTLRDdg==} - workerd@1.20250803.0: - resolution: {integrity: sha512-oYH29mE/wNolPc32NHHQbySaNorj6+KASUtOvQHySxB5mO1NWdGuNv49woxNCF5971UYceGQndY+OLT+24C3wQ==} + workerd@1.20250902.0: + resolution: {integrity: sha512-rM+8ARYoy9gWJNPW89ERWyjbp7+m1hu6PFbehiP8FW9Hm5kNVo71lXFrkCP2HSsTP1OLfIU/IwanYOijJ0mQDw==} engines: {node: '>=16'} hasBin: true - wrangler@4.28.0: - resolution: {integrity: sha512-y0yHIuScpok9oSErLqDbxkBChC2+/jZpvqMg2NxOto1JCyUtDUuKljOfcVMaI48d9GuhOCSoWSumYxLAHNxaLA==} + wrangler@4.34.0: + resolution: {integrity: sha512-iU+T8klWX6M/oN9y2PG8HrekoHwlBs/7wNMouyRToCJGn5EFtVl98a1fxxPCgkuUNZ2sKLrCyx/TlhgilIlqpQ==} engines: {node: '>=18.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20250803.0 + '@cloudflare/workers-types': ^4.20250902.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -538,28 +541,28 @@ snapshots: dependencies: mime: 3.0.0 - '@cloudflare/unenv-preset@2.6.0(unenv@2.0.0-rc.19)(workerd@1.20250803.0)': + '@cloudflare/unenv-preset@2.7.2(unenv@2.0.0-rc.20)(workerd@1.20250902.0)': dependencies: - unenv: 2.0.0-rc.19 + unenv: 2.0.0-rc.20 optionalDependencies: - workerd: 1.20250803.0 + workerd: 1.20250902.0 - '@cloudflare/workerd-darwin-64@1.20250803.0': + '@cloudflare/workerd-darwin-64@1.20250902.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20250803.0': + '@cloudflare/workerd-darwin-arm64@1.20250902.0': optional: true - '@cloudflare/workerd-linux-64@1.20250803.0': + '@cloudflare/workerd-linux-64@1.20250902.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20250803.0': + '@cloudflare/workerd-linux-arm64@1.20250902.0': optional: true - '@cloudflare/workerd-windows-64@1.20250803.0': + '@cloudflare/workerd-windows-64@1.20250902.0': optional: true - '@cloudflare/workers-types@4.20250805.0': {} + '@cloudflare/workers-types@4.20250906.0': {} '@cspotcode/source-map-support@0.8.1': dependencies: @@ -747,16 +750,16 @@ snapshots: '@upstash/core-analytics@0.0.10': dependencies: - '@upstash/redis': 1.34.0 + '@upstash/redis': 1.35.3 - '@upstash/ratelimit@2.0.6(@upstash/redis@1.34.0)': + '@upstash/ratelimit@2.0.6(@upstash/redis@1.35.3)': dependencies: '@upstash/core-analytics': 0.0.10 - '@upstash/redis': 1.34.0 + '@upstash/redis': 1.35.3 - '@upstash/redis@1.34.0': + '@upstash/redis@1.35.3': dependencies: - crypto-js: 4.2.0 + uncrypto: 0.1.3 acorn-walk@8.3.2: {} @@ -782,8 +785,6 @@ snapshots: cookie@1.0.2: {} - crypto-js@4.2.0: {} - defu@6.1.4: {} detect-libc@2.0.3: {} @@ -827,7 +828,7 @@ snapshots: glob-to-regexp@0.4.1: {} - hono@4.8.12: {} + hono@4.9.6: {} is-arrayish@0.3.2: {} @@ -835,7 +836,7 @@ snapshots: mime@3.0.0: {} - miniflare@4.20250803.0: + miniflare@4.20250902.0: dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.14.0 @@ -845,7 +846,7 @@ snapshots: sharp: 0.33.5 stoppable: 1.1.0 undici: 7.13.0 - workerd: 1.20250803.0 + workerd: 1.20250902.0 ws: 8.18.0 youch: 4.1.0-beta.10 zod: 3.22.3 @@ -900,9 +901,11 @@ snapshots: ufo@1.6.1: {} + uncrypto@0.1.3: {} + undici@7.13.0: {} - unenv@2.0.0-rc.19: + unenv@2.0.0-rc.20: dependencies: defu: 6.1.4 exsolve: 1.0.7 @@ -910,26 +913,26 @@ snapshots: pathe: 2.0.3 ufo: 1.6.1 - workerd@1.20250803.0: + workerd@1.20250902.0: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20250803.0 - '@cloudflare/workerd-darwin-arm64': 1.20250803.0 - '@cloudflare/workerd-linux-64': 1.20250803.0 - '@cloudflare/workerd-linux-arm64': 1.20250803.0 - '@cloudflare/workerd-windows-64': 1.20250803.0 + '@cloudflare/workerd-darwin-64': 1.20250902.0 + '@cloudflare/workerd-darwin-arm64': 1.20250902.0 + '@cloudflare/workerd-linux-64': 1.20250902.0 + '@cloudflare/workerd-linux-arm64': 1.20250902.0 + '@cloudflare/workerd-windows-64': 1.20250902.0 - wrangler@4.28.0(@cloudflare/workers-types@4.20250805.0): + wrangler@4.34.0(@cloudflare/workers-types@4.20250906.0): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 - '@cloudflare/unenv-preset': 2.6.0(unenv@2.0.0-rc.19)(workerd@1.20250803.0) + '@cloudflare/unenv-preset': 2.7.2(unenv@2.0.0-rc.20)(workerd@1.20250902.0) blake3-wasm: 2.1.5 esbuild: 0.25.4 - miniflare: 4.20250803.0 + miniflare: 4.20250902.0 path-to-regexp: 6.3.0 - unenv: 2.0.0-rc.19 - workerd: 1.20250803.0 + unenv: 2.0.0-rc.20 + workerd: 1.20250902.0 optionalDependencies: - '@cloudflare/workers-types': 4.20250805.0 + '@cloudflare/workers-types': 4.20250906.0 fsevents: 2.3.3 transitivePeerDependencies: - bufferutil diff --git a/api-routes/src/index.ts b/api-routes/src/index.ts index b4b8fe110..27bb339ae 100644 --- a/api-routes/src/index.ts +++ b/api-routes/src/index.ts @@ -1,19 +1,23 @@ -import { Context, Hono } from 'hono'; -import { env } from 'hono/adapter'; -import { cors } from 'hono/cors'; -import { BlankInput, Env } from 'hono/types'; -import { Ratelimit } from '@upstash/ratelimit'; -import { Redis } from '@upstash/redis/cloudflare'; +import type { Context } from "hono"; +import type { BlankInput, Env } from "hono/types"; + +import type { iSVG } from "../../src/types/svg"; +import type { Category } from "../../src/types/categories"; + +import { Hono } from "hono"; +import { env } from "hono/adapter"; +import { cors } from "hono/cors"; +import { Ratelimit } from "@upstash/ratelimit"; +import { Redis } from "@upstash/redis/cloudflare"; // 🌿 Import utils: -import { addFullUrl } from './utils'; +import { addFullUrl } from "./utils"; +import { optimizeSvg } from "../../src/utils/optimizeSvg"; -// 📦 Import data from main app: -import { svgsData } from '../../src/data'; -import { iSVG } from '../../src/types/svg'; -import { tCategory } from '../../src/types/categories'; +// 📦 Import data from SVGL src: +import { svgsData } from "../../src/data"; -declare module 'hono' { +declare module "hono" { interface ContextVariableMap { ratelimit: Ratelimit; } @@ -24,7 +28,7 @@ const fullRouteSvgsData = svgsData.map((svg) => { return { ...svg, route: addFullUrl(svg.route), - wordmark: svg.wordmark ? addFullUrl(svg.wordmark) : undefined + wordmark: svg.wordmark ? addFullUrl(svg.wordmark) : undefined, }; }) as iSVG[]; @@ -34,21 +38,24 @@ const cache = new Map(); class RedisRateLimiter { static instance: Ratelimit; - static getInstance(c: Context) { + static getInstance(c: Context) { if (!this.instance) { const { UPSTASH_REDIS_URL, UPSTASH_REDIS_TOKEN } = env<{ UPSTASH_REDIS_URL: string; UPSTASH_REDIS_TOKEN: string; }>(c); - const cleanRedisUrl = UPSTASH_REDIS_URL.replace(/^['"]|['"]$/g, '').trim(); + const cleanRedisUrl = UPSTASH_REDIS_URL.replace( + /^['"]|['"]$/g, + "", + ).trim(); const redisClient = new Redis({ token: UPSTASH_REDIS_TOKEN, - url: cleanRedisUrl + url: cleanRedisUrl, }); const ratelimit = new Ratelimit({ redis: redisClient, - limiter: Ratelimit.slidingWindow(5, '5 s'), - ephemeralCache: cache + limiter: Ratelimit.slidingWindow(5, "5 s"), + ephemeralCache: cache, }); this.instance = ratelimit; return this.instance; @@ -60,22 +67,22 @@ class RedisRateLimiter { app.use(async (c, next) => { const ratelimit = RedisRateLimiter.getInstance(c); - c.set('ratelimit', ratelimit); + c.set("ratelimit", ratelimit); await next(); }); app.use(cors()); // 🌱 GET: "/" - Returns all the SVGs data: -app.get('/', async (c) => { - const limit = c.req.query('limit'); - const search = c.req.query('search'); - const ratelimit = c.get('ratelimit'); - const ip = c.req.raw.headers.get('CF-Connecting-IP'); - const { success } = await ratelimit.limit(ip ?? 'anonymous'); +app.get("/", async (c) => { + const limit = c.req.query("limit"); + const search = c.req.query("search"); + const ratelimit = c.get("ratelimit"); + const ip = c.req.raw.headers.get("CF-Connecting-IP"); + const { success } = await ratelimit.limit(ip ?? "anonymous"); if (!success) { - return c.json({ error: '🛑 Too many request' }, 429); + return c.json({ error: "🛑 (SVGL - API) Too many request" }, 429); } if (limit) { @@ -87,10 +94,10 @@ app.get('/', async (c) => { if (search) { const searchResults = fullRouteSvgsData.filter((svg) => - svg.title.toLowerCase().includes(search.toLowerCase()) + svg.title.toLowerCase().includes(search.toLowerCase()), ); if (searchResults.length === 0) { - return c.json({ error: 'not found' }, 404); + return c.json({ error: "❌ (SVGL - API) SVG not found" }, 404); } return c.json(searchResults); } @@ -99,19 +106,19 @@ app.get('/', async (c) => { }); // 🌱 GET: "/categories" - Return an array with categories: -app.get('/categories', async (c) => { - const ratelimit = c.get('ratelimit'); - const ip = c.req.raw.headers.get('CF-Connecting-IP'); - const { success } = await ratelimit.limit(ip ?? 'anonymous'); +app.get("/categories", async (c) => { + const ratelimit = c.get("ratelimit"); + const ip = c.req.raw.headers.get("CF-Connecting-IP"); + const { success } = await ratelimit.limit(ip ?? "anonymous"); if (!success) { - return c.json({ error: '🛑 Too many request' }, 429); + return c.json({ error: "❌ (SVGL - API) Too many request" }, 429); } const categoryTotals: Record = {}; fullRouteSvgsData.forEach((svg) => { - if (typeof svg.category === 'string') { + if (typeof svg.category === "string") { categoryTotals[svg.category] = (categoryTotals[svg.category] || 0) + 1; } else if (Array.isArray(svg.category)) { svg.category.forEach((category) => { @@ -120,62 +127,79 @@ app.get('/categories', async (c) => { } }); - const categories = Object.entries(categoryTotals).map(([category, total]) => ({ - category, - total - })); + const categories = Object.entries(categoryTotals).map( + ([category, total]) => ({ + category, + total, + }), + ); return c.json(categories); }); // 🌱 GET: /category/:category - Return an list of svgs by specific category: -app.get('/category/:category', async (c) => { - const category = c.req.param('category') as string; - const targetCategory = category.charAt(0).toUpperCase() + category.slice(1); - const ratelimit = c.get('ratelimit'); - const ip = c.req.raw.headers.get('CF-Connecting-IP'); - const { success } = await ratelimit.limit(ip ?? 'anonymous'); +app.get("/category/:category", async (c) => { + const category = c.req.param("category") as string; + const targeCategory = category.charAt(0).toUpperCase() + category.slice(1); + const ratelimit = c.get("ratelimit"); + const ip = c.req.raw.headers.get("CF-Connecting-IP"); + const { success } = await ratelimit.limit(ip ?? "anonymous"); if (!success) { - return c.json({ error: '🛑 Too many request' }, 429); + return c.json({ error: "🛑 (SVGL - API) Too many request" }, 429); } const categorySvgs = fullRouteSvgsData.filter((svg) => { - if (typeof svg.category === 'string') { - return svg.category === targetCategory; + if (typeof svg.category === "string") { + return svg.category === targeCategory; } if (Array.isArray(svg.category)) { - return svg.category.includes(targetCategory as tCategory); + return svg.category.includes(targeCategory as Category); } return false; }); if (categorySvgs.length === 0) { - return c.json({ error: 'not found' }, 404); + return c.json({ error: "❌ (SVGL - API) Category not found" }, 404); } return c.json(categorySvgs); }); -// 🌱 GET: "/svg/:filename" - Return the SVG file by filename: -app.get('/svg/:filename', async (c) => { - const fileName = c.req.param('filename') as string; - const svgLibrary = 'https://svgl.app/library/'; +// 🌱 GET: "/svg/:filename" - Return the SVG code file by filename: +app.get("/svg/:filename", async (c) => { + const fileName = c.req.param("filename") as string; + const svgLibrary = "https://svgl.app/library/"; - const ratelimit = c.get('ratelimit'); - const ip = c.req.raw.headers.get('CF-Connecting-IP'); - const { success } = await ratelimit.limit(ip ?? 'anonymous'); + const ratelimit = c.get("ratelimit"); + const returnNoOptimized = c.req.query("no-optimize"); + const ip = c.req.raw.headers.get("CF-Connecting-IP"); + const { success } = await ratelimit.limit(ip ?? "anonymous"); if (!success) { - return c.json({ error: '🛑 Too many request' }, 429); + return c.json({ error: "🛑 (SVGL - API) Too many request" }, 429); } try { const svg = await fetch(`${svgLibrary}${fileName}`).then((res) => { - if (!res.ok) throw new Error('Network response was not ok'); + if (!res.ok) + throw new Error("❌ (SVGL - API) Network response was not ok"); return res.text(); }); - return c.body(svg, 200); + + if (returnNoOptimized) { + return c.body(svg, 200, { + "Content-Type": "image/svg+xml; charset=utf-8", + }); + } + + const optimizedSvg = optimizeSvg({ svgCode: svg }); + return c.body(optimizedSvg, 200, { + "Content-Type": "image/svg+xml; charset=utf-8", + }); } catch (err) { - return c.json({ error: 'not found' }, 404); + return c.json( + { error: `❌ (SVGL - API) SVG file not found - ${err}` }, + 404, + ); } }); diff --git a/components.json b/components.json index f8ac31c58..1a5a7879b 100644 --- a/components.json +++ b/components.json @@ -1,14 +1,16 @@ { "$schema": "https://shadcn-svelte.com/schema.json", - "style": "new-york", "tailwind": { - "config": "tailwind.config.js", - "css": "src\\app.css", + "css": "src\\styles\\globals.css", "baseColor": "neutral" }, "aliases": { - "components": "@/ui", - "utils": "@/utils" + "components": "@/components", + "utils": "@/utils", + "ui": "@/components/ui", + "hooks": "@/hooks", + "lib": "@/lib" }, - "typescript": true + "typescript": true, + "registry": "https://shadcn-svelte.com/registry" } diff --git a/content-collections.ts b/content-collections.ts new file mode 100644 index 000000000..f892c69fc --- /dev/null +++ b/content-collections.ts @@ -0,0 +1,59 @@ +import { z } from "zod"; +import path from "node:path"; +import fs from "node:fs/promises"; + +// Content Collections: +import { compileMarkdown } from "@content-collections/markdown"; +import { defineCollection, defineConfig } from "@content-collections/core"; + +// Plugins: +import rehypeSlug from "rehype-slug"; +import rehypeShiki from "@shikijs/rehype/core"; +import rehypeAutolinkHeadings from "rehype-autolink-headings"; + +// Custom Plugins: +import { rehypeCopyBtn } from "./src/markdown/rehypeCopyBtn"; +import { getTableOfContents } from "./src/markdown/generateToC"; +import { rehypeExternalLinks } from "./src/markdown/rehypeExternalLinks"; +import { shikiHighlighter, rehypeShikiOptions } from "./src/utils/shiki"; + +const docs = defineCollection({ + name: "docs", + directory: "src/docs", + include: "**/*.md", + schema: z.object({ + title: z.string(), + description: z.string(), + }), + transform: async (document, context) => { + const highlighter = await shikiHighlighter(); + const filePath = path.join( + context.collection.directory, + document._meta.filePath, + ); + const { mtimeMs, birthtimeMs } = await fs.stat(filePath); + const html = await compileMarkdown(context, document, { + rehypePlugins: [ + [rehypeShiki, highlighter, rehypeShikiOptions], + rehypeExternalLinks, + rehypeSlug, + rehypeAutolinkHeadings, + rehypeCopyBtn, + ], + }); + const tableOfContents = getTableOfContents(document.content); + return { + ...document, + html, + createdAt: new Date(birthtimeMs), + updatedAt: new Date(mtimeMs), + tableOfContents, + rawUrl: `https://svgl.app/api/docs/${document._meta.path}`, + documentUrl: `https://svgl.app/docs/${document._meta.path}`, + }; + }, +}); + +export default defineConfig({ + collections: [docs], +}); diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index ea5902c73..000000000 --- a/eslint.config.js +++ /dev/null @@ -1,33 +0,0 @@ -import js from '@eslint/js'; -import ts from 'typescript-eslint'; -import svelte from 'eslint-plugin-svelte'; -import prettier from 'eslint-config-prettier'; -import globals from 'globals'; - -/** @type {import('eslint').Linter.Config[]} */ -export default [ - js.configs.recommended, - ...ts.configs.recommended, - ...svelte.configs['flat/recommended'], - prettier, - ...svelte.configs['flat/prettier'], - { - languageOptions: { - globals: { - ...globals.browser, - ...globals.node - } - } - }, - { - files: ['**/*.svelte'], - languageOptions: { - parserOptions: { - parser: ts.parser - } - } - }, - { - ignores: ['build/', '.svelte-kit/', 'dist/'] - } -]; diff --git a/eslint.config.ts b/eslint.config.ts new file mode 100644 index 000000000..ecce8d7fd --- /dev/null +++ b/eslint.config.ts @@ -0,0 +1,63 @@ +import js from "@eslint/js"; +import globals from "globals"; +import { fileURLToPath } from "node:url"; +import { includeIgnoreFile } from "@eslint/compat"; + +// Plugins: +import ts from "typescript-eslint"; +import svelte from "eslint-plugin-svelte"; +import prettier from "eslint-config-prettier"; + +// Svelte Config: +import svelteConfig from "./svelte.config.js"; + +// Ignore files: +const gitignorePath = fileURLToPath(new URL("./.gitignore", import.meta.url)); + +export default [ + includeIgnoreFile(gitignorePath), + js.configs.recommended, + ...ts.configs.recommended, + ...svelte.configs.recommended, + prettier, + ...svelte.configs.prettier, + { + languageOptions: { + globals: { ...globals.browser, ...globals.node }, + parserOptions: { + tsconfigRootDir: fileURLToPath(new URL(".", import.meta.url)), + }, + }, + rules: { + "no-undef": "off", + "@typescript-eslint/array-type": "off", + "@typescript-eslint/consistent-type-definitions": "off", + "@typescript-eslint/consistent-type-imports": [ + "warn", + { prefer: "type-imports", fixStyle: "inline-type-imports" }, + ], + "@typescript-eslint/no-unused-vars": [ + "warn", + { argsIgnorePattern: "^_" }, + ], + "@typescript-eslint/require-await": "off", + }, + }, + { + files: ["**/*.svelte", "**/*.svelte.ts", "**/*.svelte.js"], + languageOptions: { + parserOptions: { + projectService: true, + extraFileExtensions: [".svelte"], + parser: ts.parser, + svelteConfig, + }, + }, + rules: { + "svelte/no-unused-svelte-ignore": "warn", + "svelte/no-useless-mustaches": "warn", + "svelte/require-each-key": "warn", + "svelte/no-at-html-tags": "off", + }, + }, +]; diff --git a/markdown.config.js b/markdown.config.js deleted file mode 100644 index 36c5b6270..000000000 --- a/markdown.config.js +++ /dev/null @@ -1,51 +0,0 @@ -import { escapeSvelte } from 'mdsvex'; -import { createHighlighter, makeSingletonHighlighter } from 'shiki'; - -// Markdown Plugins -import remarkGfm from 'remark-gfm'; -import rehypeSlug from 'rehype-slug'; -import rehypeAutolinkHeadings from 'rehype-autolink-headings'; - -// Highlighter -const getHighlighter = makeSingletonHighlighter(createHighlighter); - -/** @type {import('mdsvex').MdsvexOptions} */ -const mdsvexOptions = { - remarkPlugins: [[remarkGfm]], - rehypePlugins: [ - [rehypeSlug], - [ - rehypeAutolinkHeadings, - { - behavior: 'wrap', - properties: { - className: [ - `before:content-['#'] before:absolute before:-ml-[1em] before:text-neutral-100/0 hover:before:text-neutral-200/50 pl-[1em] -ml-[1em]` - ] - } - } - ] - ], - extensions: ['.md'], - highlight: { - highlighter: async (code, lang = 'text') => { - const highlighter = await getHighlighter({ - themes: ['github-light', 'github-dark'], - langs: ['javascript', 'typescript', 'bash', 'json', 'html'] - }); - await highlighter.loadLanguage('javascript', 'typescript', 'bash', 'html'); - const html = escapeSvelte( - highlighter.codeToHtml(code, { - lang, - themes: { - light: 'github-light', - dark: 'github-dark' - } - }) - ); - return `{@html \`${html}\` }`; - } - } -}; - -export { mdsvexOptions }; diff --git a/package.json b/package.json index c1258c616..2be0eba24 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,12 @@ { "name": "@pheralb/svgl", "author": "@pheralb_", - "version": "4.6.1", + "version": "5.0.0", "description": "A beautiful library with SVG logos.", "private": true, "license": "MIT", "type": "module", + "packageManager": "pnpm@10.13.1", "keywords": [ "svgs", "logos", @@ -19,77 +20,78 @@ "type": "git", "url": "git+https://github.com/pheralb/svgl.git" }, + "pnpm": { + "onlyBuiltDependencies": [ + "esbuild" + ] + }, "scripts": { "dev": "vite dev", - "host": "vite dev --host", - "build": "pnpm run prebuild && vite build", - "prebuild": "cd ./utils/check-size && pnpm install && pnpm run start", - "vite:build": "vite build", + "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", - "check:size": "cd ./utils/check-size && npm run start", + "check:size": "tsx ./utils/check-size.ts", "check:links": " lychee --base . ./src/data/svgs.ts --cache --max-cache-age 3d . --include 'https://svgl.app'", - "fix:viewbox": "cd ./utils/fix-viewbox && npm run start", - "test": "vitest run", - "lint": "prettier --plugin-search-dir . --check . && eslint .", - "format": "prettier --plugin-search-dir . --write .", - "dev:figma": "concurrently -n plugin,svelte 'npm run build:plugin -- --watch --define:SITE_URL=\\\"http://localhost:5173?figma=1\\\"' 'npm run dev'", - "build:plugin": "esbuild src/figma/code.ts --bundle --target=es6 --loader:.svg=text --outfile=src/figma/dist/code.js", - "build:figma": "concurrently -n plugin,svelte 'npm run build:plugin -- --define:SITE_URL=\\\"$npm_package_config_siteURL\\\"' 'npm run build'" + "fix:viewbox": "tsx ./utils/fix-viewbox.ts", + "format": "prettier --write \"src/**/*.{ts,js,md,svelte}\" --cache", + "format:check": "prettier --check \"src/**/*.{ts,js,md,svelte}\" --cache", + "lint": "eslint ./src", + "lint:fix": "eslint ./src --fix", + "build:shadcn": "shadcn build --output ./static/r", + "build:prod": "pnpm build:registry && vite build", + "build:registry": "tsx ./utils/generate-registry.ts" }, "dependencies": { - "@figma/plugin-typings": "1.115.0", - "@svelte-dev/pretty-code": "1.0.0", - "@svgr/core": "8.1.0", - "@svgr/plugin-jsx": "8.1.0", - "@upstash/ratelimit": "2.0.6", - "@upstash/redis": "1.35.3", - "clsx": "2.1.1", - "downloadjs": "1.4.7", + "@shikijs/langs": "3.12.0", + "@shikijs/themes": "3.12.0", "fuse.js": "7.1.0", "jszip": "3.10.1", - "lucide-svelte": "0.525.0", - "mode-watcher": "0.5.1", - "rehype-autolink-headings": "7.1.0", - "rehype-slug": "6.0.0", - "remark-gfm": "4.0.1", - "shiki": "3.7.0", - "svelte-sonner": "0.3.28", + "mode-watcher": "1.1.0", + "shadcn": "3.0.0", + "shiki": "3.12.0", "svgo": "4.0.0", - "tailwind-merge": "2.6.0", - "tailwind-variants": "0.3.1" + "tsx": "4.20.5" }, "devDependencies": { - "@sveltejs/adapter-auto": "3.2.5", - "@sveltejs/adapter-node": "5.2.5", - "@sveltejs/kit": "2.5.28", - "@sveltejs/vite-plugin-svelte": "3.1.2", - "@tailwindcss/typography": "0.5.16", - "@types/downloadjs": "1.4.6", - "@types/eslint": "9.6.1", - "@types/node": "22.5.5", - "autoprefixer": "10.4.21", - "bits-ui": "0.22.0", - "concurrently": "9.0.1", - "esbuild": "0.24.0", - "eslint": "9.11.0", - "eslint-config-prettier": "9.1.0", - "eslint-plugin-svelte": "2.44.0", - "globals": "15.9.0", - "mdsvex": "0.12.5", - "postcss": "8.5.3", - "prettier": "3.3.3", - "prettier-plugin-svelte": "3.2.6", - "prettier-plugin-tailwindcss": "0.6.6", - "svelte": "4.2.20", - "svelte-check": "4.0.9", - "sveltekit-search-params": "3.0.0", - "tailwindcss": "3.4.17", - "tslib": "2.7.0", - "typescript": "5.6.2", - "typescript-eslint": "8.6.0", - "vite": "5.4.7", - "vitest": "2.1.1" + "@content-collections/core": "0.11.0", + "@content-collections/markdown": "0.1.4", + "@content-collections/vite": "0.2.7", + "@eslint/compat": "1.3.2", + "@eslint/js": "9.33.0", + "@internationalized/date": "3.8.2", + "@lucide/svelte": "0.515.0", + "@shikijs/rehype": "3.12.0", + "@sveltejs/adapter-auto": "6.1.0", + "@sveltejs/adapter-node": "5.3.1", + "@sveltejs/kit": "2.36.1", + "@sveltejs/vite-plugin-svelte": "6.1.3", + "@tailwindcss/vite": "4.1.12", + "@types/node": "24.3.0", + "bits-ui": "2.9.4", + "clsx": "2.1.1", + "eslint": "9.33.0", + "eslint-config-prettier": "10.1.8", + "eslint-plugin-svelte": "3.11.0", + "github-slugger": "2.0.0", + "globals": "16.3.0", + "prettier": "3.6.2", + "prettier-plugin-svelte": "3.4.0", + "prettier-plugin-tailwindcss": "0.6.14", + "rehype-autolink-headings": "7.1.0", + "rehype-slug": "6.0.0", + "svelte": "5.38.2", + "svelte-check": "4.3.1", + "svelte-sonner": "1.0.5", + "tailwind-merge": "3.3.1", + "tailwind-variants": "1.0.0", + "tailwindcss": "4.1.12", + "tw-animate-css": "1.3.7", + "typescript": "5.9.2", + "typescript-eslint": "8.40.0", + "unist-util-visit": "5.0.0", + "vite": "7.1.3", + "zod": "4.1.4" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5afd61bf9..6e2b84a73 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,515 +8,468 @@ importers: .: dependencies: - '@figma/plugin-typings': - specifier: 1.115.0 - version: 1.115.0 - '@svelte-dev/pretty-code': - specifier: 1.0.0 - version: 1.0.0(shikiji@0.10.2) - '@svgr/core': - specifier: 8.1.0 - version: 8.1.0(typescript@5.6.2) - '@svgr/plugin-jsx': - specifier: 8.1.0 - version: 8.1.0(@svgr/core@8.1.0(typescript@5.6.2)) - '@upstash/ratelimit': - specifier: 2.0.6 - version: 2.0.6(@upstash/redis@1.35.3) - '@upstash/redis': - specifier: 1.35.3 - version: 1.35.3 - clsx: - specifier: 2.1.1 - version: 2.1.1 - downloadjs: - specifier: 1.4.7 - version: 1.4.7 + '@shikijs/langs': + specifier: 3.12.0 + version: 3.12.0 + '@shikijs/themes': + specifier: 3.12.0 + version: 3.12.0 fuse.js: specifier: 7.1.0 version: 7.1.0 jszip: specifier: 3.10.1 version: 3.10.1 - lucide-svelte: - specifier: 0.525.0 - version: 0.525.0(svelte@4.2.20) mode-watcher: - specifier: 0.5.1 - version: 0.5.1(svelte@4.2.20) - rehype-autolink-headings: - specifier: 7.1.0 - version: 7.1.0 - rehype-slug: - specifier: 6.0.0 - version: 6.0.0 - remark-gfm: - specifier: 4.0.1 - version: 4.0.1 + specifier: 1.1.0 + version: 1.1.0(svelte@5.38.2) + shadcn: + specifier: 3.0.0 + version: 3.0.0(@types/node@24.3.0)(typescript@5.9.2) shiki: - specifier: 3.7.0 - version: 3.7.0 - svelte-sonner: - specifier: 0.3.28 - version: 0.3.28(svelte@4.2.20) + specifier: 3.12.0 + version: 3.12.0 svgo: specifier: 4.0.0 version: 4.0.0 - tailwind-merge: - specifier: 2.6.0 - version: 2.6.0 - tailwind-variants: - specifier: 0.3.1 - version: 0.3.1(tailwindcss@3.4.17) + tsx: + specifier: 4.20.5 + version: 4.20.5 devDependencies: + '@content-collections/core': + specifier: 0.11.0 + version: 0.11.0(typescript@5.9.2) + '@content-collections/markdown': + specifier: 0.1.4 + version: 0.1.4(@content-collections/core@0.11.0(typescript@5.9.2)) + '@content-collections/vite': + specifier: 0.2.7 + version: 0.2.7(@content-collections/core@0.11.0(typescript@5.9.2))(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) + '@eslint/compat': + specifier: 1.3.2 + version: 1.3.2(eslint@9.33.0(jiti@2.5.1)) + '@eslint/js': + specifier: 9.33.0 + version: 9.33.0 + '@internationalized/date': + specifier: 3.8.2 + version: 3.8.2 + '@lucide/svelte': + specifier: 0.515.0 + version: 0.515.0(svelte@5.38.2) + '@shikijs/rehype': + specifier: 3.12.0 + version: 3.12.0 '@sveltejs/adapter-auto': - specifier: 3.2.5 - version: 3.2.5(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)))(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5))) + specifier: 6.1.0 + version: 6.1.0(@sveltejs/kit@2.36.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))) '@sveltejs/adapter-node': - specifier: 5.2.5 - version: 5.2.5(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)))(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5))) + specifier: 5.3.1 + version: 5.3.1(@sveltejs/kit@2.36.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))) '@sveltejs/kit': - specifier: 2.5.28 - version: 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)))(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)) + specifier: 2.36.1 + version: 2.36.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) '@sveltejs/vite-plugin-svelte': - specifier: 3.1.2 - version: 3.1.2(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)) - '@tailwindcss/typography': - specifier: 0.5.16 - version: 0.5.16(tailwindcss@3.4.17) - '@types/downloadjs': - specifier: 1.4.6 - version: 1.4.6 - '@types/eslint': - specifier: 9.6.1 - version: 9.6.1 + specifier: 6.1.3 + version: 6.1.3(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) + '@tailwindcss/vite': + specifier: 4.1.12 + version: 4.1.12(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) '@types/node': - specifier: 22.5.5 - version: 22.5.5 - autoprefixer: - specifier: 10.4.21 - version: 10.4.21(postcss@8.5.3) + specifier: 24.3.0 + version: 24.3.0 bits-ui: - specifier: 0.22.0 - version: 0.22.0(svelte@4.2.20) - concurrently: - specifier: 9.0.1 - version: 9.0.1 - esbuild: - specifier: 0.24.0 - version: 0.24.0 + specifier: 2.9.4 + version: 2.9.4(@internationalized/date@3.8.2)(svelte@5.38.2) + clsx: + specifier: 2.1.1 + version: 2.1.1 eslint: - specifier: 9.11.0 - version: 9.11.0(jiti@1.21.7) + specifier: 9.33.0 + version: 9.33.0(jiti@2.5.1) eslint-config-prettier: - specifier: 9.1.0 - version: 9.1.0(eslint@9.11.0(jiti@1.21.7)) + specifier: 10.1.8 + version: 10.1.8(eslint@9.33.0(jiti@2.5.1)) eslint-plugin-svelte: - specifier: 2.44.0 - version: 2.44.0(eslint@9.11.0(jiti@1.21.7))(svelte@4.2.20) + specifier: 3.11.0 + version: 3.11.0(eslint@9.33.0(jiti@2.5.1))(svelte@5.38.2) + github-slugger: + specifier: 2.0.0 + version: 2.0.0 globals: - specifier: 15.9.0 - version: 15.9.0 - mdsvex: - specifier: 0.12.5 - version: 0.12.5(svelte@4.2.20) - postcss: - specifier: 8.5.3 - version: 8.5.3 + specifier: 16.3.0 + version: 16.3.0 prettier: - specifier: 3.3.3 - version: 3.3.3 + specifier: 3.6.2 + version: 3.6.2 prettier-plugin-svelte: - specifier: 3.2.6 - version: 3.2.6(prettier@3.3.3)(svelte@4.2.20) + specifier: 3.4.0 + version: 3.4.0(prettier@3.6.2)(svelte@5.38.2) prettier-plugin-tailwindcss: - specifier: 0.6.6 - version: 0.6.6(prettier-plugin-svelte@3.2.6(prettier@3.3.3)(svelte@4.2.20))(prettier@3.3.3) + specifier: 0.6.14 + version: 0.6.14(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.38.2))(prettier@3.6.2) + rehype-autolink-headings: + specifier: 7.1.0 + version: 7.1.0 + rehype-slug: + specifier: 6.0.0 + version: 6.0.0 svelte: - specifier: 4.2.20 - version: 4.2.20 + specifier: 5.38.2 + version: 5.38.2 svelte-check: - specifier: 4.0.9 - version: 4.0.9(picomatch@4.0.2)(svelte@4.2.20)(typescript@5.6.2) - sveltekit-search-params: - specifier: 3.0.0 - version: 3.0.0(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)))(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)))(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)) + specifier: 4.3.1 + version: 4.3.1(picomatch@4.0.3)(svelte@5.38.2)(typescript@5.9.2) + svelte-sonner: + specifier: 1.0.5 + version: 1.0.5(svelte@5.38.2) + tailwind-merge: + specifier: 3.3.1 + version: 3.3.1 + tailwind-variants: + specifier: 1.0.0 + version: 1.0.0(tailwindcss@4.1.12) tailwindcss: - specifier: 3.4.17 - version: 3.4.17 - tslib: - specifier: 2.7.0 - version: 2.7.0 + specifier: 4.1.12 + version: 4.1.12 + tw-animate-css: + specifier: 1.3.7 + version: 1.3.7 typescript: - specifier: 5.6.2 - version: 5.6.2 + specifier: 5.9.2 + version: 5.9.2 typescript-eslint: - specifier: 8.6.0 - version: 8.6.0(eslint@9.11.0(jiti@1.21.7))(typescript@5.6.2) + specifier: 8.40.0 + version: 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + unist-util-visit: + specifier: 5.0.0 + version: 5.0.0 vite: - specifier: 5.4.7 - version: 5.4.7(@types/node@22.5.5) - vitest: - specifier: 2.1.1 - version: 2.1.1(@types/node@22.5.5) + specifier: 7.1.3 + version: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1) + zod: + specifier: 4.1.4 + version: 4.1.4 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'} - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + '@antfu/ni@25.0.0': + resolution: {integrity: sha512-9q/yCljni37pkMr4sPrI3G4jqdIk074+iukc5aFJl7kmDCCsiJrbZ6zKxnES1Gwg+i9RcDZwvktl23puGslmvA==} + hasBin: true + + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.28.0': + resolution: {integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.28.3': + resolution: {integrity: sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.28.3': + resolution: {integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.8': - resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + '@babel/helper-member-expression-to-functions@7.27.1': + resolution: {integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==} engines: {node: '>=6.9.0'} - '@babel/core@7.26.9': - resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==} + '@babel/helper-module-imports@7.27.1': + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.9': - resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==} + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@babel/helper-compilation-targets@7.26.5': - resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.26.9': - resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.9': - resolution: {integrity: sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==} + '@babel/helpers@7.28.3': + resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.3': + resolution: {integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/template@7.26.9': - resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} + '@babel/plugin-syntax-typescript@7.27.1': + resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.28.0': + resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/traverse@7.26.9': - resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/types@7.26.9': - resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==} + '@babel/traverse@7.28.3': + resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} engines: {node: '>=6.9.0'} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} - '@esbuild/aix-ppc64@0.24.0': - resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + '@bundled-es-modules/cookie@2.0.1': + resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} + + '@bundled-es-modules/statuses@1.0.1': + resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + + '@bundled-es-modules/tough-cookie@0.1.6': + resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} + + '@content-collections/core@0.11.0': + resolution: {integrity: sha512-k6g6AESyLLIYNu4KiBUFAPAq01mqeAZ/2QLmp97iBZLOURWfFrvo3zDGBPtCrXtKYgkRlWxOyLRpIjKqD6aNjw==} + peerDependencies: + typescript: ^5.0.2 + + '@content-collections/integrations@0.3.0': + resolution: {integrity: sha512-He+TXQC94LO/1bNygTioh3J5H0K/mkFVPVkIrM5kHybprvi5bRmGa91ViZ6K6icFAzGH4jFD0iasR56fZcMGTA==} + peerDependencies: + '@content-collections/core': 0.x + + '@content-collections/markdown@0.1.4': + resolution: {integrity: sha512-hUi+O9SDmYmn63aiftSw1KtmSZIjc6ger42rfQobBhPx+3n8kTJsWm1Cs//yU5iIAVRKyLX3qrtlheiOPdJT9w==} + peerDependencies: + '@content-collections/core': 0.x + + '@content-collections/vite@0.2.7': + resolution: {integrity: sha512-aGKZfv/iRWdQGGYcX5QFypCYgXY/K9dfJYTCX2KaWDxMcYgsvd02v1sX1sPkqenj/94trxzW37dD5oOUgOocQg==} + peerDependencies: + '@content-collections/core': ^0.x + vite: ^5 || ^6 || ^7 + + '@dotenvx/dotenvx@1.49.0': + resolution: {integrity: sha512-M1cyP6YstFQCjih54SAxCqHLMMi8QqV8tenpgGE48RTXWD7vfMYJiw/6xcCDpS2h28AcLpTsFCZA863Ge9yxzA==} + hasBin: true + + '@ecies/ciphers@0.2.4': + resolution: {integrity: sha512-t+iX+Wf5nRKyNzk8dviW3Ikb/280+aEJAnw9YXvCp2tYGPSkMki+NRY+8aNLmVFv3eNtMdvViPNOPxS8SZNP+w==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} + peerDependencies: + '@noble/ciphers': ^1.0.0 + + '@esbuild/aix-ppc64@0.25.9': + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.24.0': - resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + '@esbuild/android-arm64@0.25.9': + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.24.0': - resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + '@esbuild/android-arm@0.25.9': + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.24.0': - resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + '@esbuild/android-x64@0.25.9': + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.24.0': - resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + '@esbuild/darwin-arm64@0.25.9': + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.24.0': - resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + '@esbuild/darwin-x64@0.25.9': + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.24.0': - resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + '@esbuild/freebsd-arm64@0.25.9': + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.24.0': - resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + '@esbuild/freebsd-x64@0.25.9': + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.24.0': - resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + '@esbuild/linux-arm64@0.25.9': + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.24.0': - resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + '@esbuild/linux-arm@0.25.9': + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.24.0': - resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + '@esbuild/linux-ia32@0.25.9': + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.24.0': - resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + '@esbuild/linux-loong64@0.25.9': + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.24.0': - resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + '@esbuild/linux-mips64el@0.25.9': + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.24.0': - resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + '@esbuild/linux-ppc64@0.25.9': + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.24.0': - resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + '@esbuild/linux-riscv64@0.25.9': + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.24.0': - resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + '@esbuild/linux-s390x@0.25.9': + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.24.0': - resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + '@esbuild/linux-x64@0.25.9': + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} - cpu: [x64] + '@esbuild/netbsd-arm64@0.25.9': + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} + engines: {node: '>=18'} + cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.0': - resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + '@esbuild/netbsd-x64@0.25.9': + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.0': - resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + '@esbuild/openbsd-arm64@0.25.9': + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.24.0': - resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + '@esbuild/openbsd-x64@0.25.9': + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] + '@esbuild/openharmony-arm64@0.25.9': + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] - '@esbuild/sunos-x64@0.24.0': - resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + '@esbuild/sunos-x64@0.25.9': + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.24.0': - resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + '@esbuild/win32-arm64@0.25.9': + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.24.0': - resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + '@esbuild/win32-ia32@0.25.9': + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.24.0': - resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + '@esbuild/win32-x64@0.25.9': + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.1': - resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -525,41 +478,59 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.18.0': - resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + '@eslint/compat@1.3.2': + resolution: {integrity: sha512-jRNwzTbd6p2Rw4sZ1CgWRS8YMtqG15YyZf7zvb6gY2rB2u6n+2Z+ELW0GtL0fQgyl0pr4Y/BzBfng/BdsereRA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.40 || 9 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.3.1': + resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.12.0': - resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + '@eslint/core@0.15.2': + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.0': - resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.11.0': - resolution: {integrity: sha512-LPkkenkDqyzTFauZLLAPhIb48fj6drrfMvRGSL9tS3AcZBSVTllemLSNyCvHNNL2t797S/6DJNSIwRwXgMO/eQ==} + '@eslint/js@9.33.0': + resolution: {integrity: sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.7': - resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} + '@eslint/plugin-kit@0.3.5': + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@figma/plugin-typings@1.115.0': - resolution: {integrity: sha512-qAnJuOkZDXKzMacnkugoi9rIIQ9/P3CP0zqsSklXuXhREWsqOTua35Fpkxmp25DHjPqs6tC+eVuVWvKWHHq4pA==} + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} - '@floating-ui/core@1.6.9': - resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} - '@floating-ui/dom@1.6.13': - resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - '@floating-ui/utils@0.2.9': - resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} @@ -569,35 +540,96 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@internationalized/date@3.7.0': - resolution: {integrity: sha512-VJ5WS3fcVx0bejE/YHfbDKR/yawZgKqn/if+oEeLqNwBtPzVB06olkfcnojTmEMX+gTpH+FlQ69SHNitJ8/erQ==} + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@inquirer/confirm@5.1.16': + resolution: {integrity: sha512-j1a5VstaK5KQy8Mu8cHmuQvN1Zc62TbLhjJxwHvKPPKEoowSF6h/0UdOpA9DNdWZ+9Inq73+puRq1df6OJ8Sag==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} + '@inquirer/core@10.2.0': + resolution: {integrity: sha512-NyDSjPqhSvpZEMZrLCYUquWNl+XC/moEcVFqS55IEYIYsY0a1cUCevSqk7ctOlnm/RaSBU5psFryNlxcmGrjaA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.13': + resolution: {integrity: sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==} + engines: {node: '>=18'} + + '@inquirer/type@3.0.8': + resolution: {integrity: sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@internationalized/date@3.8.2': + resolution: {integrity: sha512-/wENk7CbvLbkUvX1tu0mwq49CVkkWpkXubGel6birjRPyo6uQ4nQpnq5xZu823zRCwwn82zgHrvgF1vZyvmVgA==} + + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} '@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.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.30': + resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} - '@melt-ui/svelte@0.76.2': - resolution: {integrity: sha512-7SbOa11tXUS95T3fReL+dwDs5FyJtCEqrqG3inRziDws346SYLsxOQ6HmX+4BkIsQh1R8U3XNa+EMmdMt38lMA==} + '@lucide/svelte@0.515.0': + resolution: {integrity: sha512-CEAyqcZmNBfYzVgaRmK2RFJP5tnbXxekRyDk0XX/eZQRfsJmkDvmQwXNX8C869BgNeryzmrRyjHhUL6g9ZOHNA==} peerDependencies: - svelte: '>=3 <5' + svelte: ^5 + + '@modelcontextprotocol/sdk@1.17.4': + resolution: {integrity: sha512-zq24hfuAmmlNZvik0FLI58uE5sriN0WWsQzIlYnzSuKDAHFqJtBFrl/LfB1NLgJT5Y7dEBzaX4yAKqOPrcetaw==} + engines: {node: '>=18'} + + '@mswjs/interceptors@0.39.6': + resolution: {integrity: sha512-bndDP83naYYkfayr/qhBHMhk0YGwS1iv6vaEGcr0SQbO0IZtbOPqjKjds/WcG+bJA+1T5vCx6kprKOzn5Bg+Vw==} + engines: {node: '>=18'} + + '@noble/ciphers@1.3.0': + resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -611,15 +643,20 @@ packages: 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'} + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@open-draft/logger@0.3.0': + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + + '@open-draft/until@2.1.0': + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} - '@polka/url@1.0.0-next.28': - resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - '@rollup/plugin-commonjs@28.0.2': - resolution: {integrity: sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==} + '@rollup/plugin-commonjs@28.0.6': + resolution: {integrity: sha512-XSQB1K7FUU5QP+3lOQmVCE3I0FcbbNvmNT4VJSj93iUjayaARrTQeoRdiYQoftAJBLrR9t2agwAd3ekaTgHNlw==} engines: {node: '>=16.0.0 || 14 >= 14.17'} peerDependencies: rollup: ^2.68.0||^3.0.0||^4.0.0 @@ -636,8 +673,8 @@ packages: rollup: optional: true - '@rollup/plugin-node-resolve@15.3.1': - resolution: {integrity: sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==} + '@rollup/plugin-node-resolve@16.0.1': + resolution: {integrity: sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^2.78.0||^3.0.0||^4.0.0 @@ -645,8 +682,8 @@ packages: rollup: optional: true - '@rollup/pluginutils@5.1.4': - resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + '@rollup/pluginutils@5.2.0': + resolution: {integrity: sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -654,234 +691,278 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.34.8': - resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} + '@rollup/rollup-android-arm-eabi@4.46.4': + resolution: {integrity: sha512-B2wfzCJ+ps/OBzRjeds7DlJumCU3rXMxJJS1vzURyj7+KBHGONm7c9q1TfdBl4vCuNMkDvARn3PBl2wZzuR5mw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.34.8': - resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} + '@rollup/rollup-android-arm64@4.46.4': + resolution: {integrity: sha512-FGJYXvYdn8Bs6lAlBZYT5n+4x0ciEp4cmttsvKAZc/c8/JiPaQK8u0c/86vKX8lA7OY/+37lIQSe0YoAImvBAA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.34.8': - resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} + '@rollup/rollup-darwin-arm64@4.46.4': + resolution: {integrity: sha512-/9qwE/BM7ATw/W/OFEMTm3dmywbJyLQb4f4v5nmOjgYxPIGpw7HaxRi6LnD4Pjn/q7k55FGeHe1/OD02w63apA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.34.8': - resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} + '@rollup/rollup-darwin-x64@4.46.4': + resolution: {integrity: sha512-QkWfNbeRuzFnv2d0aPlrzcA3Ebq2mE8kX/5Pl7VdRShbPBjSnom7dbT8E3Jmhxo2RL784hyqGvR5KHavCJQciw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.34.8': - resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} + '@rollup/rollup-freebsd-arm64@4.46.4': + resolution: {integrity: sha512-+ToyOMYnSfV8D+ckxO6NthPln/PDNp1P6INcNypfZ7muLmEvPKXqduUiD8DlJpMMT8LxHcE5W0dK9kXfJke9Zw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.34.8': - resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} + '@rollup/rollup-freebsd-x64@4.46.4': + resolution: {integrity: sha512-cGT6ey/W+sje6zywbLiqmkfkO210FgRz7tepWAzzEVgQU8Hn91JJmQWNqs55IuglG8sJdzk7XfNgmGRtcYlo1w==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.34.8': - resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} + '@rollup/rollup-linux-arm-gnueabihf@4.46.4': + resolution: {integrity: sha512-9fhTJyOb275w5RofPSl8lpr4jFowd+H4oQKJ9XTYzD1JWgxdZKE8bA6d4npuiMemkecQOcigX01FNZNCYnQBdA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.34.8': - resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} + '@rollup/rollup-linux-arm-musleabihf@4.46.4': + resolution: {integrity: sha512-+6kCIM5Zjvz2HwPl/udgVs07tPMIp1VU2Y0c72ezjOvSvEfAIWsUgpcSDvnC7g9NrjYR6X9bZT92mZZ90TfvXw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.34.8': - resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} + '@rollup/rollup-linux-arm64-gnu@4.46.4': + resolution: {integrity: sha512-SWuXdnsayCZL4lXoo6jn0yyAj7TTjWE4NwDVt9s7cmu6poMhtiras5c8h6Ih6Y0Zk6Z+8t/mLumvpdSPTWub2Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.34.8': - resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} + '@rollup/rollup-linux-arm64-musl@4.46.4': + resolution: {integrity: sha512-vDknMDqtMhrrroa5kyX6tuC0aRZZlQ+ipDfbXd2YGz5HeV2t8HOl/FDAd2ynhs7Ki5VooWiiZcCtxiZ4IjqZwQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.34.8': - resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} + '@rollup/rollup-linux-loongarch64-gnu@4.46.4': + resolution: {integrity: sha512-mCBkjRZWhvjtl/x+Bd4fQkWZT8canStKDxGrHlBiTnZmJnWygGcvBylzLVCZXka4dco5ymkWhZlLwKCGFF4ivw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': - resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} + '@rollup/rollup-linux-ppc64-gnu@4.46.4': + resolution: {integrity: sha512-YMdz2phOTFF+Z66dQfGf0gmeDSi5DJzY5bpZyeg9CPBkV9QDzJ1yFRlmi/j7WWRf3hYIWrOaJj5jsfwgc8GTHQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.34.8': - resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} + '@rollup/rollup-linux-riscv64-gnu@4.46.4': + resolution: {integrity: sha512-r0WKLSfFAK8ucG024v2yiLSJMedoWvk8yWqfNICX28NHDGeu3F/wBf8KG6mclghx4FsLePxJr/9N8rIj1PtCnw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.34.8': - resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} + '@rollup/rollup-linux-riscv64-musl@4.46.4': + resolution: {integrity: sha512-IaizpPP2UQU3MNyPH1u0Xxbm73D+4OupL0bjo4Hm0496e2wg3zuvoAIhubkD1NGy9fXILEExPQy87mweujEatA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.46.4': + resolution: {integrity: sha512-aCM29orANR0a8wk896p6UEgIfupReupnmISz6SUwMIwTGaTI8MuKdE0OD2LvEg8ondDyZdMvnaN3bW4nFbATPA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.34.8': - resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} + '@rollup/rollup-linux-x64-gnu@4.46.4': + resolution: {integrity: sha512-0Xj1vZE3cbr/wda8d/m+UeuSL+TDpuozzdD4QaSzu/xSOMK0Su5RhIkF7KVHFQsobemUNHPLEcYllL7ZTCP/Cg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.34.8': - resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} + '@rollup/rollup-linux-x64-musl@4.46.4': + resolution: {integrity: sha512-kM/orjpolfA5yxsx84kI6bnK47AAZuWxglGKcNmokw2yy9i5eHY5UAjcX45jemTJnfHAWo3/hOoRqEeeTdL5hw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.34.8': - resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} + '@rollup/rollup-win32-arm64-msvc@4.46.4': + resolution: {integrity: sha512-cNLH4psMEsWKILW0isbpQA2OvjXLbKvnkcJFmqAptPQbtLrobiapBJVj6RoIvg6UXVp5w0wnIfd/Q56cNpF+Ew==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.34.8': - resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} + '@rollup/rollup-win32-ia32-msvc@4.46.4': + resolution: {integrity: sha512-OiEa5lRhiANpv4SfwYVgQ3opYWi/QmPDC5ve21m8G9pf6ZO+aX1g2EEF1/IFaM1xPSP7mK0msTRXlPs6mIagkg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.34.8': - resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} + '@rollup/rollup-win32-x64-msvc@4.46.4': + resolution: {integrity: sha512-IKL9mewGZ5UuuX4NQlwOmxPyqielvkAPUS2s1cl6yWjjQvyN3h5JTdVFGD5Jr5xMjRC8setOfGQDVgX8V+dkjg==} cpu: [x64] os: [win32] - '@shikijs/core@3.7.0': - resolution: {integrity: sha512-yilc0S9HvTPyahHpcum8eonYrQtmGTU0lbtwxhA6jHv4Bm1cAdlPFRCJX4AHebkCm75aKTjjRAW+DezqD1b/cg==} + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@shikijs/core@3.12.0': + resolution: {integrity: sha512-rPfCBd6gHIKBPpf2hKKWn2ISPSrmRKAFi+bYDjvZHpzs3zlksWvEwaF3Z4jnvW+xHxSRef7qDooIJkY0RpA9EA==} - '@shikijs/engine-javascript@3.7.0': - resolution: {integrity: sha512-0t17s03Cbv+ZcUvv+y33GtX75WBLQELgNdVghnsdhTgU3hVcWcMsoP6Lb0nDTl95ZJfbP1mVMO0p3byVh3uuzA==} + '@shikijs/engine-javascript@3.12.0': + resolution: {integrity: sha512-Ni3nm4lnKxyKaDoXQQJYEayX052BL7D0ikU5laHp+ynxPpIF1WIwyhzrMU6WDN7AoAfggVR4Xqx3WN+JTS+BvA==} - '@shikijs/engine-oniguruma@3.7.0': - resolution: {integrity: sha512-5BxcD6LjVWsGu4xyaBC5bu8LdNgPCVBnAkWTtOCs/CZxcB22L8rcoWfv7Hh/3WooVjBZmFtyxhgvkQFedPGnFw==} + '@shikijs/engine-oniguruma@3.12.0': + resolution: {integrity: sha512-IfDl3oXPbJ/Jr2K8mLeQVpnF+FxjAc7ZPDkgr38uEw/Bg3u638neSrpwqOTnTHXt1aU0Fk1/J+/RBdst1kVqLg==} - '@shikijs/langs@3.7.0': - resolution: {integrity: sha512-1zYtdfXLr9xDKLTGy5kb7O0zDQsxXiIsw1iIBcNOO8Yi5/Y1qDbJ+0VsFoqTlzdmneO8Ij35g7QKF8kcLyznCQ==} + '@shikijs/langs@3.12.0': + resolution: {integrity: sha512-HIca0daEySJ8zuy9bdrtcBPhcYBo8wR1dyHk1vKrOuwDsITtZuQeGhEkcEfWc6IDyTcom7LRFCH6P7ljGSCEiQ==} - '@shikijs/themes@3.7.0': - resolution: {integrity: sha512-VJx8497iZPy5zLiiCTSIaOChIcKQwR0FebwE9S3rcN0+J/GTWwQ1v/bqhTbpbY3zybPKeO8wdammqkpXc4NVjQ==} + '@shikijs/rehype@3.12.0': + resolution: {integrity: sha512-qxZwugfCQUMECTmUOCGiG5cNHHTxxGk3esirD7mwwdSxl344KlN/6M9/anev+3uBFVs9UDNShjsMAla8egkCuw==} - '@shikijs/types@3.7.0': - resolution: {integrity: sha512-MGaLeaRlSWpnP0XSAum3kP3a8vtcTsITqoEPYdt3lQG3YCdQH4DnEhodkYcNMcU0uW0RffhoD1O3e0vG5eSBBg==} + '@shikijs/themes@3.12.0': + resolution: {integrity: sha512-/lxvQxSI5s4qZLV/AuFaA4Wt61t/0Oka/P9Lmpr1UV+HydNCczO3DMHOC/CsXCCpbv4Zq8sMD0cDa7mvaVoj0Q==} + + '@shikijs/types@3.12.0': + resolution: {integrity: sha512-jsFzm8hCeTINC3OCmTZdhR9DOl/foJWplH2Px0bTi4m8z59fnsueLsweX82oGcjRQ7mfQAluQYKGoH2VzsWY4A==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@svelte-dev/pretty-code@1.0.0': - resolution: {integrity: sha512-4dFacn9fv7SNK0kp6VjZeSQd9e7ISihaC3l/I7fB6sAAObZt5hRkbFeU2pM2kUlpjzRPGaYuXlWfYj7dLFvPHA==} + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + + '@sveltejs/acorn-typescript@1.0.5': + resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} + peerDependencies: + acorn: ^8.9.0 - '@sveltejs/adapter-auto@3.2.5': - resolution: {integrity: sha512-27LR+uKccZ62lgq4N/hvyU2G+hTP9fxWEAfnZcl70HnyfAjMSsGk1z/SjAPXNCD1mVJIE7IFu3TQ8cQ/UH3c0A==} + '@sveltejs/adapter-auto@6.1.0': + resolution: {integrity: sha512-shOuLI5D2s+0zTv2ab5M5PqfknXqWbKi+0UwB9yLTRIdzsK1R93JOO8jNhIYSHdW+IYXIYnLniu+JZqXs7h9Wg==} peerDependencies: '@sveltejs/kit': ^2.0.0 - '@sveltejs/adapter-node@5.2.5': - resolution: {integrity: sha512-FVeysFqeIlKFpDF1Oj38gby34f6uA9FuXnV330Z0RHmSyOR9JzJs70/nFKy1Ue3fWtf7S0RemOrP66Vr9Jcmew==} + '@sveltejs/adapter-node@5.3.1': + resolution: {integrity: sha512-PSoGfa9atkmuixe7jvuS2tsUohVZF20So87ASzfMRGTTNqEd8s48KAodlv3CzHwq9XO/BM8KsQLpqqsr/6dmuA==} peerDependencies: '@sveltejs/kit': ^2.4.0 - '@sveltejs/kit@2.5.28': - resolution: {integrity: sha512-/O7pvFGBsQPcFa9UrW8eUC5uHTOXLsUp3SN0dY6YmRAL9nfPSrJsSJk//j5vMpinSshzUjteAFcfQTU+04Ka1w==} + '@sveltejs/kit@2.36.1': + resolution: {integrity: sha512-dldNCtSIpaGxQMEfHaUxSPH/k3uU28pTZwtKzfkn8fqpOjWufKlMBeIL7FJ/s93dOrhEq41zaQYkXh+XTgEgVw==} engines: {node: '>=18.13'} hasBin: true peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 + '@opentelemetry/api': ^1.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.3 + vite: ^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true - '@sveltejs/vite-plugin-svelte-inspector@2.1.0': - resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} - engines: {node: ^18.0.0 || >=20} + '@sveltejs/vite-plugin-svelte-inspector@5.0.1': + resolution: {integrity: sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==} + engines: {node: ^20.19 || ^22.12 || >=24} peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 - svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.0 + '@sveltejs/vite-plugin-svelte': ^6.0.0-next.0 + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 - '@sveltejs/vite-plugin-svelte@3.1.2': - resolution: {integrity: sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==} - engines: {node: ^18.0.0 || >=20} + '@sveltejs/vite-plugin-svelte@6.1.3': + resolution: {integrity: sha512-3pppgIeIZs6nrQLazzKcdnTJ2IWiui/UucEPXKyFG35TKaHQrfkWBnv6hyJcLxFuR90t+LaoecrqTs8rJKWfSQ==} + engines: {node: ^20.19 || ^22.12 || >=24} peerDependencies: - svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.0 + svelte: ^5.0.0 + vite: ^6.3.0 || ^7.0.0 - '@svgr/babel-plugin-add-jsx-attribute@8.0.0': - resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': - resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@tailwindcss/node@4.1.12': + resolution: {integrity: sha512-3hm9brwvQkZFe++SBt+oLjo4OLDtkvlE8q2WalaD/7QWaeM7KEJbAiY/LJZUaCs7Xa8aUu4xy3uoyX4q54UVdQ==} - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': - resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@tailwindcss/oxide-android-arm64@4.1.12': + resolution: {integrity: sha512-oNY5pq+1gc4T6QVTsZKwZaGpBb2N1H1fsc1GD4o7yinFySqIuRZ2E4NvGasWc6PhYJwGK2+5YT1f9Tp80zUQZQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] - '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0': - resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@tailwindcss/oxide-darwin-arm64@4.1.12': + resolution: {integrity: sha512-cq1qmq2HEtDV9HvZlTtrj671mCdGB93bVY6J29mwCyaMYCP/JaUBXxrQQQm7Qn33AXXASPUb2HFZlWiiHWFytw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] - '@svgr/babel-plugin-svg-dynamic-title@8.0.0': - resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@tailwindcss/oxide-darwin-x64@4.1.12': + resolution: {integrity: sha512-6UCsIeFUcBfpangqlXay9Ffty9XhFH1QuUFn0WV83W8lGdX8cD5/+2ONLluALJD5+yJ7k8mVtwy3zMZmzEfbLg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] - '@svgr/babel-plugin-svg-em-dimensions@8.0.0': - resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@tailwindcss/oxide-freebsd-x64@4.1.12': + resolution: {integrity: sha512-JOH/f7j6+nYXIrHobRYCtoArJdMJh5zy5lr0FV0Qu47MID/vqJAY3r/OElPzx1C/wdT1uS7cPq+xdYYelny1ww==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] - '@svgr/babel-plugin-transform-react-native-svg@8.1.0': - resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': + resolution: {integrity: sha512-v4Ghvi9AU1SYgGr3/j38PD8PEe6bRfTnNSUE3YCMIRrrNigCFtHZ2TCm8142X8fcSqHBZBceDx+JlFJEfNg5zQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] - '@svgr/babel-plugin-transform-svg-component@8.0.0': - resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} - engines: {node: '>=12'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': + resolution: {integrity: sha512-YP5s1LmetL9UsvVAKusHSyPlzSRqYyRB0f+Kl/xcYQSPLEw/BvGfxzbH+ihUciePDjiXwHh+p+qbSP3SlJw+6g==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] - '@svgr/babel-preset@8.1.0': - resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@tailwindcss/oxide-linux-arm64-musl@4.1.12': + resolution: {integrity: sha512-V8pAM3s8gsrXcCv6kCHSuwyb/gPsd863iT+v1PGXC4fSL/OJqsKhfK//v8P+w9ThKIoqNbEnsZqNy+WDnwQqCA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] - '@svgr/core@8.1.0': - resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} - engines: {node: '>=14'} + '@tailwindcss/oxide-linux-x64-gnu@4.1.12': + resolution: {integrity: sha512-xYfqYLjvm2UQ3TZggTGrwxjYaLB62b1Wiysw/YE3Yqbh86sOMoTn0feF98PonP7LtjsWOWcXEbGqDL7zv0uW8Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] - '@svgr/hast-util-to-babel-ast@8.0.0': - resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} - engines: {node: '>=14'} + '@tailwindcss/oxide-linux-x64-musl@4.1.12': + resolution: {integrity: sha512-ha0pHPamN+fWZY7GCzz5rKunlv9L5R8kdh+YNvP5awe3LtuXb5nRi/H27GeL2U+TdhDOptU7T6Is7mdwh5Ar3A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] - '@svgr/plugin-jsx@8.1.0': - resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} - engines: {node: '>=14'} - peerDependencies: - '@svgr/core': '*' + '@tailwindcss/oxide-wasm32-wasi@4.1.12': + resolution: {integrity: sha512-4tSyu3dW+ktzdEpuk6g49KdEangu3eCYoqPhWNsZgUhyegEda3M9rG0/j1GV/JjVVsj+lG7jWAyrTlLzd/WEBg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': + resolution: {integrity: sha512-iGLyD/cVP724+FGtMWslhcFyg4xyYyM+5F4hGvKA7eifPkXHRAUDFaimu53fpNg9X8dfP75pXx/zFt/jlNF+lg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.12': + resolution: {integrity: sha512-NKIh5rzw6CpEodv/++r0hGLlfgT/gFN+5WNdZtvh6wpU2BpGNgdjvj6H2oFc8nCM839QM1YOhjpgbAONUb4IxA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@tailwindcss/oxide@4.1.12': + resolution: {integrity: sha512-gM5EoKHW/ukmlEtphNwaGx45fGoEmP10v51t9unv55voWh6WrOL19hfuIdo2FjxIaZzw776/BUQg7Pck++cIVw==} + engines: {node: '>= 10'} - '@tailwindcss/typography@0.5.16': - resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==} + '@tailwindcss/vite@4.1.12': + resolution: {integrity: sha512-4pt0AMFDx7gzIrAOIYgYP0KCBuKWqyW8ayrdiLEjoJTT4pKTjrzG/e4uzWtTLDziC+66R9wbUqZBccJalSE5vQ==} peerDependencies: - tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + vite: ^5.2.0 || ^6 || ^7 + + '@ts-morph/common@0.27.0': + resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -889,14 +970,8 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/downloadjs@1.4.6': - resolution: {integrity: sha512-mp3w70vsaiLRT9ix92fmI9Ob2yJAPZm6tShJtofo2uHbN11G2i6a0ApIEjBl/kv3e9V7Pv7jMjk1bUwYWvMHvA==} - - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -910,161 +985,126 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@22.5.5': - resolution: {integrity: sha512-Xjs4y5UPO/CLdzpgR6GirZJx36yScjh73+2NlLlkFRSoQN8B0DpfXPdZGnvVmLRLOsqDpOfTNv7D9trgGhmOIA==} + '@types/node@24.3.0': + resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - '@types/unist@2.0.11': - resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + '@types/statuses@2.0.6': + resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.6.0': - resolution: {integrity: sha512-UOaz/wFowmoh2G6Mr9gw60B1mm0MzUtm6Ic8G2yM1Le6gyj5Loi/N+O5mocugRGY+8OeeKmkMmbxNqUCq3B4Sg==} + '@typescript-eslint/eslint-plugin@8.40.0': + resolution: {integrity: sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + '@typescript-eslint/parser': ^8.40.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.6.0': - resolution: {integrity: sha512-eQcbCuA2Vmw45iGfcyG4y6rS7BhWfz9MQuk409WD47qMM+bKCGQWXxvoOs1DUp+T7UBMTtRTVT+kXr7Sh4O9Ow==} + '@typescript-eslint/parser@8.40.0': + resolution: {integrity: sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@8.6.0': - resolution: {integrity: sha512-ZuoutoS5y9UOxKvpc/GkvF4cuEmpokda4wRg64JEia27wX+PysIE9q+lzDtlHHgblwUWwo5/Qn+/WyTUvDwBHw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.6.0': - resolution: {integrity: sha512-dtePl4gsuenXVwC7dVNlb4mGDcKjDT/Ropsk4za/ouMBPplCLyznIaR+W65mvCvsyS97dymoBRrioEXI7k0XIg==} + '@typescript-eslint/project-service@8.40.0': + resolution: {integrity: sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.6.0': - resolution: {integrity: sha512-rojqFZGd4MQxw33SrOy09qIDS8WEldM8JWtKQLAjf/X5mGSeEFh5ixQlxssMNyPslVIk9yzWqXCsV2eFhYrYUw==} + '@typescript-eslint/scope-manager@8.40.0': + resolution: {integrity: sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.6.0': - resolution: {integrity: sha512-MOVAzsKJIPIlLK239l5s06YXjNqpKTVhBVDnqUumQJja5+Y94V3+4VUFRA0G60y2jNnTVwRCkhyGQpavfsbq/g==} + '@typescript-eslint/tsconfig-utils@8.40.0': + resolution: {integrity: sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.6.0': - resolution: {integrity: sha512-eNp9cWnYf36NaOVjkEUznf6fEgVy1TWpE0o52e4wtojjBx7D1UV2WAWGzR+8Y5lVFtpMLPwNbC67T83DWSph4A==} + '@typescript-eslint/type-utils@8.40.0': + resolution: {integrity: sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.6.0': - resolution: {integrity: sha512-wapVFfZg9H0qOYh4grNVQiMklJGluQrOUiOhYRrQWhx7BY/+I1IYb8BczWNbbUpO+pqy0rDciv3lQH5E1bCLrg==} + '@typescript-eslint/types@8.40.0': + resolution: {integrity: sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - - '@upstash/core-analytics@0.0.10': - resolution: {integrity: sha512-7qJHGxpQgQr9/vmeS1PktEwvNAF7TI4iJDi8Pu2CFZ9YUGHZH4fOP5TfYlZ4aVxfopnELiE4BS4FBjyK7V1/xQ==} - engines: {node: '>=16.0.0'} - - '@upstash/ratelimit@2.0.6': - resolution: {integrity: sha512-Uak5qklMfzFN5RXltxY6IXRENu+Hgmo9iEgMPOlUs2etSQas2N+hJfbHw37OUy4vldLRXeD0OzL+YRvO2l5acg==} + '@typescript-eslint/typescript-estree@8.40.0': + resolution: {integrity: sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@upstash/redis': ^1.34.3 + typescript: '>=4.8.4 <6.0.0' - '@upstash/redis@1.35.3': - resolution: {integrity: sha512-hSjv66NOuahW3MisRGlSgoszU2uONAY2l5Qo3Sae8OT3/Tng9K+2/cBRuyPBX8egwEGcNNCF9+r0V6grNnhL+w==} - - '@vitest/expect@2.1.1': - resolution: {integrity: sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==} - - '@vitest/mocker@2.1.1': - resolution: {integrity: sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==} + '@typescript-eslint/utils@8.40.0': + resolution: {integrity: sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@vitest/spy': 2.1.1 - msw: ^2.3.5 - vite: ^5.0.0 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - - '@vitest/pretty-format@2.1.1': - resolution: {integrity: sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==} - - '@vitest/pretty-format@2.1.9': - resolution: {integrity: sha512-KhRIdGV2U9HOUzxfiHmY8IFHTdqtOhIzCpd8WRdJiE7D/HUcZVD0EgQCVjm+Q9gkUXWgBvMmTtZgIG48wq7sOQ==} - - '@vitest/runner@2.1.1': - resolution: {integrity: sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==} + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - '@vitest/snapshot@2.1.1': - resolution: {integrity: sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==} + '@typescript-eslint/visitor-keys@8.40.0': + resolution: {integrity: sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/spy@2.1.1': - resolution: {integrity: sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitest/utils@2.1.1': - resolution: {integrity: sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==} + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} + engines: {node: '>= 0.6'} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true + agent-base@7.1.4: + resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} + engines: {node: '>= 14'} + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + ansi-regex@6.2.0: + resolution: {integrity: sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==} engines: {node: '>=12'} 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'} + ansis@4.1.0: + resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} + engines: {node: '>=14'} - 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==} @@ -1073,16 +1113,9 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - - autoprefixer@10.4.21: - resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 + ast-types@0.16.1: + resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==} + engines: {node: '>=4'} axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} @@ -1094,66 +1127,69 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bits-ui@0.22.0: - resolution: {integrity: sha512-r7Fw1HNgA4YxZBRcozl7oP0bheQ8EHh+kfMBZJgyFISix8t4p/nqDcHLmBgIiJ3T5XjYnJRorYDjIWaCfhb5fw==} + bits-ui@2.9.4: + resolution: {integrity: sha512-Cqn685P6DDuEyBZT/CWMyS5+8JAnYbctvoEVPcmiut+HUpG3SozVgjoDaUib5VG4ZYUKEi1FPwHxiXo9c6J0PA==} + engines: {node: '>=20'} peerDependencies: - svelte: ^4.0.0 || ^5.0.0 + '@internationalized/date': ^3.8.1 + svelte: ^5.33.0 + + body-parser@2.2.0: + resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} + engines: {node: '>=18'} boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + browserslist@4.25.3: + resolution: {integrity: sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - 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'} - - caniuse-lite@1.0.30001700: - resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==} + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} - caniuse-lite@1.0.30001715: - resolution: {integrity: sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==} + caniuse-lite@1.0.30001737: + resolution: {integrity: sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@5.2.0: - resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} - engines: {node: '>=12'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.6.0: + resolution: {integrity: sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} @@ -1163,18 +1199,26 @@ packages: character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -1183,8 +1227,8 @@ packages: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - code-red@1.0.4: - resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} + code-block-writer@13.0.3: + resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -1200,9 +1244,9 @@ packages: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} + commander@14.0.0: + resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} + engines: {node: '>=20'} commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -1210,23 +1254,38 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concurrently@9.0.1: - resolution: {integrity: sha512-wYKvCd/f54sTXJMSfV6Ln/B8UrfLBKOYa+lzc6CHay3Qek+LorVSBdMVfyewFhRbH0Rbabsk4D+3PL/VjQ5gzg==} - engines: {node: '>=18'} - hasBin: true + content-disposition@1.0.0: + resolution: {integrity: sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} + cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cosmiconfig@8.3.6: - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} peerDependencies: typescript: '>=4.9.5' @@ -1245,10 +1304,6 @@ packages: resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css-tree@3.1.0: resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} @@ -1266,8 +1321,12 @@ packages: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1275,12 +1334,16 @@ packages: supports-color: optional: true - decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decode-named-character-reference@1.2.0: + resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} - deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} + dedent@1.6.0: + resolution: {integrity: sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1289,21 +1352,27 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + engines: {node: '>=8'} + devalue@5.1.1: resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - - dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + diff@8.0.2: + resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} + engines: {node: '>=0.3.1'} dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -1318,38 +1387,67 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dotenv@17.2.1: + resolution: {integrity: sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==} + engines: {node: '>=12'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eciesjs@0.4.15: + resolution: {integrity: sha512-r6kEJXDKecVOCj2nLMuXK/FCPeurW33+3JRpfXVbjLja3XUYFfD9I/JBreH6sUyzcm3G/YQboBjMla6poKeSdA==} + engines: {bun: '>=1', deno: '>=2', node: '>=16'} - downloadjs@1.4.7: - resolution: {integrity: sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q==} + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + electron-to-chromium@1.5.209: + resolution: {integrity: sha512-Xoz0uMrim9ZETCQt8UgM5FxQF9+imA7PBpokoGcZloA1uw2LeHzTlip5cb5KOAsXZLjh/moN2vReN3ZjJmjI9A==} - electron-to-chromium@1.5.104: - resolution: {integrity: sha512-Us9M2L4cO/zMBqVkJtnj353nQhMju9slHm62NprKTmdF3HH8wYOtNvDFq/JB2+ZRoGLzdvYDiATlMHs98XBM1g==} + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + engines: {node: '>=10.13.0'} entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} - esbuild@0.24.0: - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + esbuild@0.25.9: + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} engines: {node: '>=18'} hasBin: true @@ -1357,54 +1455,43 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - - eslint-compat-utils@0.5.1: - resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' - - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-plugin-svelte@2.44.0: - resolution: {integrity: sha512-wav4MOs02vBb1WjvTCYItwJCxMkuk2Z4p+K/eyjL0N/z7ahXLP+0LtQQjiKc2ezuif7GnZLbD1F3o1VHzSvdVg==} - engines: {node: ^14.17.0 || >=16.0.0} + eslint-plugin-svelte@3.11.0: + resolution: {integrity: sha512-KliWlkieHyEa65aQIkRwUFfHzT5Cn4u3BQQsu3KlkJOs7c1u7ryn84EWaOjEzilbKgttT4OfBURA8Uc4JBSQIw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.191 + eslint: ^8.57.1 || ^9.0.0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 peerDependenciesMeta: svelte: optional: true - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-scope@8.2.0: - resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.0: - resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.11.0: - resolution: {integrity: sha512-yVS6XODx+tMFMDFcG4+Hlh+qG7RM6cCJXtQhCKLSsr3XkLvWggHjCqjfh0XsPPnt1c56oaT6PMgW9XWQQjdHXA==} + eslint@9.33.0: + resolution: {integrity: sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1416,18 +1503,22 @@ packages: esm-env@1.2.2: resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} + esrap@2.1.0: + resolution: {integrity: sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA==} + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -1439,13 +1530,44 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eventsource-parser@3.0.5: + resolution: {integrity: sha512-bSRG85ZrMdmWtm7qkF9He9TNRzc/Bm99gEJMaQoHJ9E6Kv9QBbsldh2oMj7iXmYNEAVvNgvv5vPorG6W+XtBhQ==} + engines: {node: '>=20.0.0'} + + eventsource@3.0.7: + resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} + engines: {node: '>=18.0.0'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@9.6.0: + resolution: {integrity: sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==} + engines: {node: ^18.19.0 || >=20.5.0} + + express-rate-limit@7.5.1: + resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} + engines: {node: '>= 16'} + peerDependencies: + express: '>= 4.11' + + express@5.1.0: + resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} + engines: {node: '>= 18'} + + 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==} @@ -1462,17 +1584,26 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.19.0: - resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: picomatch: optional: true + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -1481,6 +1612,10 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + finalhandler@2.1.0: + resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==} + engines: {node: '>= 0.8'} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -1492,15 +1627,21 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - focus-trap@7.6.4: - resolution: {integrity: sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==} + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} - fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} + + fs-extra@11.3.1: + resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} + engines: {node: '>=14.14'} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -1514,6 +1655,12 @@ packages: resolution: {integrity: sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==} engines: {node: '>=10'} + fuzzysort@3.1.0: + resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==} + + fzf@0.5.2: + resolution: {integrity: sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -1522,6 +1669,33 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-own-enumerable-keys@1.0.0: + resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} + engines: {node: '>=14.16'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} + github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -1533,42 +1707,44 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.9.0: - resolution: {integrity: sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==} + globals@16.3.0: + resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} engines: {node: '>=18'} - globalyzer@0.1.0: - resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} - globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + graphql@16.11.0: + resolution: {integrity: sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hast-util-from-html@2.0.3: - resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} - hast-util-from-parse5@8.0.3: resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} @@ -1581,9 +1757,15 @@ packages: hast-util-parse-selector@4.0.0: resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + hast-util-to-html@9.0.5: resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + hast-util-to-string@3.0.1: resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} @@ -1593,13 +1775,40 @@ packages: hastscript@9.0.1: resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + headers-polyfill@4.0.3: + resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} @@ -1607,9 +1816,6 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -1617,17 +1823,24 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inline-style-parser@0.2.4: + resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} + 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'} @@ -1640,43 +1853,78 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + is-obj@3.0.0: + resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} + engines: {node: '>=12'} is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} is-reference@3.0.3: resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-regexp@3.1.0: + resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} + engines: {node: '>=12'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} - jiti@1.21.7: - resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} + jiti@2.5.1: + resolution: {integrity: sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==} 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 @@ -1703,18 +1951,29 @@ packages: engines: {node: '>=6'} hasBin: true + jsonfile@6.2.0: + resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + 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'} - known-css-properties@0.34.0: - resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==} + known-css-properties@0.37.0: + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} @@ -1723,14 +1982,74 @@ packages: lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} - lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -1741,121 +2060,55 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash.castarray@4.4.0: - resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} - - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - - loupe@3.1.3: - resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} - - lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lucide-svelte@0.525.0: - resolution: {integrity: sha512-kfuN6JcCqTfCz2B76aXnyGLAzEBRSYw5GaUspM5RNHQZS5aI5yaKu06fbaofOk8cDvUtY0AUm/zAix7aUX6Q3A==} - peerDependencies: - svelte: ^3 || ^4 || ^5.0.0-next.42 - magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - markdown-table@3.0.4: - resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - - mdast-util-find-and-replace@3.0.2: - resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} mdast-util-from-markdown@2.0.2: resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==} - mdast-util-gfm-autolink-literal@2.0.1: - resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} - - mdast-util-gfm-footnote@2.1.0: - resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} - - mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} - - mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} - - mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - - mdast-util-gfm@3.1.0: - resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} - - mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - mdast-util-to-hast@13.2.0: resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} - mdast-util-to-markdown@2.1.2: - resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} - mdast-util-to-string@4.0.0: resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} mdn-data@2.0.28: resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} - mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} - mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - mdsvex@0.12.5: - resolution: {integrity: sha512-JQy8CBbGF1IvpxZTmGJigRiD1s2BKfLKS9xCLPKngjHToY8WMYLZ8WFGRpuR6x4C4bxipSuLm2LctwL2fVXaEQ==} - peerDependencies: - svelte: ^3.56.0 || ^4.0.0 || ^5.0.0-next.120 + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} + + 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.2: - resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==} - - micromark-extension-gfm-autolink-literal@2.1.0: - resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} - - micromark-extension-gfm-footnote@2.1.0: - resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} - - micromark-extension-gfm-strikethrough@2.1.0: - resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} - - micromark-extension-gfm-table@2.1.1: - resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} - - micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - - micromark-extension-gfm-task-list-item@2.1.0: - resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} - - micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} micromark-factory-destination@2.0.1: resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} @@ -1905,22 +2158,42 @@ packages: micromark-util-sanitize-uri@2.0.1: resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-subtokenize@2.0.4: - resolution: {integrity: sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==} + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} micromark-util-symbol@2.0.1: resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@2.0.1: - resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==} + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - micromark@4.0.1: - resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==} + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + + mime-types@3.0.1: + resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1928,14 +2201,26 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - mode-watcher@0.5.1: - resolution: {integrity: sha512-adEC6T7TMX/kzQlaO/MtiQOSFekZfQu4MC+lXyoceQG+U5sKpJWZ4yKXqw846ExIuWJgedkOIPqAYYRk/xHm+w==} + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mode-watcher@1.1.0: + resolution: {integrity: sha512-mUT9RRGPDYenk59qJauN1rhsIMKBmWA3xMF+uRwE8MW/tjhaDSCCARqkSuDTq8vr4/2KcAxIGVjACxTjdk5C3g==} peerDependencies: - svelte: ^4.0.0 || ^5.0.0-next.1 + svelte: ^5.27.0 mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} @@ -1948,35 +2233,51 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + msw@2.10.5: + resolution: {integrity: sha512-0EsQCrCI1HbhpBWd89DvmxY6plmvrM96b0sCIztnvcNHQbXn5vqwm1KlXslo6u4wN9LFGLC1WFjjgljcQhe40A==} + engines: {node: '>=18'} hasBin: true + peerDependencies: + typescript: '>= 4.8.x' + peerDependenciesMeta: + typescript: + optional: true - nanoid@5.1.2: - resolution: {integrity: sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==} - engines: {node: ^18 || >=20} + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} - normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -1985,9 +2286,28 @@ packages: 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'} + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-treeify@1.1.33: + resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} + engines: {node: '>= 10'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} oniguruma-parser@0.12.1: resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} @@ -1999,16 +2319,27 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} + engines: {node: '>=18'} + + outvariant@1.4.3: + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-limit@6.2.0: + resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==} + engines: {node: '>=18'} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@1.3.0: + resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} @@ -2021,11 +2352,19 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-numeric-range@1.3.0: - resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - parse5@7.2.1: - resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} @@ -2035,26 +2374,19 @@ packages: 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.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} - engines: {node: '>= 14.16'} - - periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + path-to-regexp@8.2.0: + resolution: {integrity: sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==} + engines: {node: '>=16'} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2063,29 +2395,17 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - - postcss-import@15.1.0: - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 + pkce-challenge@5.0.0: + resolution: {integrity: sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==} + engines: {node: '>=16.20.0'} - postcss-js@4.0.1: - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} postcss-load-config@3.1.4: resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} @@ -2099,29 +2419,11 @@ packages: ts-node: optional: true - 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.2.0: - resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - - postcss-safe-parser@6.0.0: - resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} - engines: {node: '>=12.0'} + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} peerDependencies: - postcss: ^8.3.3 + postcss: ^8.4.31 postcss-scss@4.0.9: resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} @@ -2129,40 +2431,35 @@ packages: peerDependencies: postcss: ^8.4.29 - postcss-selector-parser@6.0.10: - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} - engines: {node: '>=4'} - - postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} engines: {node: '>=4'} - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-svelte@3.2.6: - resolution: {integrity: sha512-Y1XWLw7vXUQQZmgv1JAEiLcErqUniAF2wO7QJsw8BVMvpLET2dI5WpEIEJx1r11iHVdSMzQxivyfrH9On9t2IQ==} + prettier-plugin-svelte@3.4.0: + resolution: {integrity: sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==} peerDependencies: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 - prettier-plugin-tailwindcss@0.6.6: - resolution: {integrity: sha512-OPva5S7WAsPLEsOuOWXATi13QrCKACCiIonFgIR6V4lYv4QLp++UXVhZSzRbZxXGimkQtQT86CC6fQqTOybGng==} + prettier-plugin-tailwindcss@0.6.14: + resolution: {integrity: sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==} engines: {node: '>=14.21.3'} peerDependencies: '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-hermes': '*' + '@prettier/plugin-oxc': '*' '@prettier/plugin-pug': '*' '@shopify/prettier-plugin-liquid': '*' '@trivago/prettier-plugin-sort-imports': '*' - '@zackad/prettier-plugin-twig-melody': '*' + '@zackad/prettier-plugin-twig': '*' prettier: ^3.0 prettier-plugin-astro: '*' prettier-plugin-css-order: '*' @@ -2178,13 +2475,17 @@ packages: peerDependenciesMeta: '@ianvs/prettier-plugin-sort-imports': optional: true + '@prettier/plugin-hermes': + optional: true + '@prettier/plugin-oxc': + optional: true '@prettier/plugin-pug': optional: true '@shopify/prettier-plugin-liquid': optional: true '@trivago/prettier-plugin-sort-imports': optional: true - '@zackad/prettier-plugin-twig-melody': + '@zackad/prettier-plugin-twig': optional: true prettier-plugin-astro: optional: true @@ -2209,45 +2510,71 @@ packages: prettier-plugin-svelte: optional: true - prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} hasBin: true - prism-svelte@0.4.7: - resolution: {integrity: sha512-yABh19CYbM24V7aS7TuPYRNMqthxwbvx6FF/Rw920YbyBWO3tnyPIqRMgHuSVsLmuHkkBS1Akyof463FVdkeDQ==} - - prismjs@1.29.0: - resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} - engines: {node: '>=6'} + pretty-ms@9.2.0: + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + engines: {node: '>=18'} process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - property-information@7.0.0: - resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + 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==} + + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@3.0.0: + resolution: {integrity: sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==} + engines: {node: '>= 0.8'} readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + recast@0.23.11: + resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} + engines: {node: '>= 4'} + regex-recursion@6.0.2: resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} @@ -2260,14 +2587,8 @@ packages: rehype-autolink-headings@7.1.0: resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} - rehype-parse@9.0.1: - resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==} - - rehype-pretty-code@0.12.6: - resolution: {integrity: sha512-AW18s4eXwnb4PGwL0Y8BoUzBJr23epWNXndCKaZ52S4kl/4tsgM+406oCp5NdtPZsB0ItpaY+hCMv3kw58DLrA==} - engines: {node: '>=18'} - peerDependencies: - shikiji: ^0.7.0 || ^0.8.0 || ^0.9.0 || ^0.10.0 + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} rehype-slug@6.0.0: resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} @@ -2275,45 +2596,70 @@ packages: rehype-stringify@10.0.1: resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} - remark-gfm@4.0.1: - resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} - remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - remark-rehype@11.1.1: - resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} - - remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} hasBin: true + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.34.8: - resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} + rollup@4.46.4: + resolution: {integrity: sha512-YbxoxvoqNg9zAmw4+vzh1FkGAiZRK+LhnSrbSrSXMdZYsRPDWoshcSd/pldKRO6lWzv/e9TiJAVQyirYIeSIPQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + runed@0.23.4: + resolution: {integrity: sha512-9q8oUiBYeXIDLWNK5DfCWlkL0EW3oGbk845VdKlPeia28l751VpfesaB/+7pI6rnbx1I6rqoZ2fZxptOJLxILA==} + peerDependencies: + svelte: ^5.7.0 + + runed@0.25.0: + resolution: {integrity: sha512-7+ma4AG9FT2sWQEA0Egf6mb7PBT2vHyuHail1ie8ropfSjvZGtEAx8YTmUjv/APCsdRRxEVvArNjALk9zFSOrg==} + peerDependencies: + svelte: ^5.7.0 + + runed@0.28.0: + resolution: {integrity: sha512-k2xx7RuO9hWcdd9f+8JoBeqWtYrm5CALfgpkg2YDB80ds/QE4w0qqu34A7fqiAwiBBSBQOid7TLxwxVC27ymWQ==} + peerDependencies: + svelte: ^5.7.0 + + runed@0.29.2: + resolution: {integrity: sha512-0cq6cA6sYGZwl/FvVqjx9YN+1xEBu9sDDyuWdDW1yWX7JF2wmvmVKfH+hVCZs+csW+P3ARH92MjI3H9QTagOQA==} + peerDependencies: + svelte: ^5.7.0 sade@1.8.1: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} @@ -2322,24 +2668,52 @@ packages: safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + 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.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true + send@1.2.0: + resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + engines: {node: '>= 18'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + serve-static@2.2.0: + resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + engines: {node: '>= 18'} + set-cookie-parser@2.7.1: resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shadcn@3.0.0: + resolution: {integrity: sha512-GhMwMwcxR3GpDO2ctocvyetQ7BJAxSakaznBtYM/1mPRTjN0I0TAZCGSXdfj0VXOW4PaHbFEHsyUCnFcEf/1Ag==} + hasBin: true + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2348,55 +2722,75 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.2: - resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + shiki@3.12.0: + resolution: {integrity: sha512-E+ke51tciraTHpaXYXfqnPZFSViKHhSQ3fiugThlfs/om/EonlQ0hSldcqgzOWWqX6PcjkKKzFgrjIaiPAXoaA==} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} - shiki@3.7.0: - resolution: {integrity: sha512-ZcI4UT9n6N2pDuM2n3Jbk0sR4Swzq43nLPgS/4h0E3B/NrFn2HKElrDtceSf8Zx/OWYOo7G1SAtBLypCp+YXqg==} + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} - shikiji-core@0.10.2: - resolution: {integrity: sha512-9Of8HMlF96usXJHmCL3Gd0Fcf0EcyJUF9m8EoAKKd98mHXi0La2AZl1h6PegSFGtiYcBDK/fLuKbDa1l16r1fA==} - deprecated: Deprecated, use @shikijs/core instead + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} - shikiji@0.10.2: - resolution: {integrity: sha512-wtZg3T0vtYV2PnqusWQs3mDaJBdCPWxFDrBM/SE5LfrX92gjUvfEMlc+vJnoKY6Z/S44OWaCRzNIsdBRWcTAiw==} - deprecated: Deprecated, use shiki instead + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} - siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + 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'} - sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} + sirv@3.0.1: + resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} + engines: {node: '>=18'} - snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} - std-env@3.8.0: - resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + + strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} 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.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -2404,6 +2798,10 @@ packages: stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + stringify-object@5.0.0: + resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} + engines: {node: '>=14.16'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2412,67 +2810,74 @@ packages: 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@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + style-to-object@1.0.9: + resolution: {integrity: sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw==} supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte-check@4.0.9: - resolution: {integrity: sha512-SVNCz2L+9ZELGli7G0n3B3QE5kdf0u27RtKr2ZivWQhcWIXatZxwM4VrQ6AiA2k9zKp2mk5AxkEhdjbpjv7rEw==} + svelte-check@4.3.1: + resolution: {integrity: sha512-lkh8gff5gpHLjxIV+IaApMxQhTGnir2pNUAqcNgeKkvK5bT/30Ey/nzBxNLDlkztCH4dP7PixkMt9SWEKFPBWg==} engines: {node: '>= 18.0.0'} hasBin: true peerDependencies: svelte: ^4.0.0 || ^5.0.0-next.0 typescript: '>=5.0.0' - svelte-eslint-parser@0.41.1: - resolution: {integrity: sha512-08ndI6zTghzI8SuJAFpvMbA/haPSGn3xz19pjre19yYMw8Nw/wQJ2PrZBI/L8ijGTgtkWCQQiLLy+Z1tfaCwNA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + svelte-eslint-parser@1.3.1: + resolution: {integrity: sha512-0Iztj5vcOVOVkhy1pbo5uA9r+d3yaVoE5XPc9eABIWDOSJZ2mOsZ4D+t45rphWCOr0uMw3jtSG2fh2e7GvKnPg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.191 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 peerDependenciesMeta: svelte: optional: true - svelte-hmr@0.16.0: - resolution: {integrity: sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==} - engines: {node: ^12.20 || ^14.13.1 || >= 16} + svelte-sonner@1.0.5: + resolution: {integrity: sha512-9dpGPFqKb/QWudYqGnEz93vuY+NgCEvyNvxoCLMVGw6sDN/3oVeKV1xiEirW2E1N3vJEyj5imSBNOGltQHA7mg==} peerDependencies: - svelte: ^3.19.0 || ^4.0.0 + svelte: ^5.0.0 - svelte-sonner@0.3.28: - resolution: {integrity: sha512-K3AmlySeFifF/cKgsYNv5uXqMVNln0NBAacOYgmkQStLa/UoU0LhfAACU6Gr+YYC8bOCHdVmFNoKuDbMEsppJg==} + svelte-toolbelt@0.7.1: + resolution: {integrity: sha512-HcBOcR17Vx9bjaOceUvxkY3nGmbBmCBBbuWLLEWO6jtmWH8f/QoWmbyUfQZrpDINH39en1b8mptfPQT9VKQ1xQ==} + engines: {node: '>=18', pnpm: '>=8.7.0'} peerDependencies: - svelte: ^3.0.0 || ^4.0.0 || ^5.0.0-next.1 - - svelte@4.2.20: - resolution: {integrity: sha512-eeEgGc2DtiUil5ANdtd8vPwt9AgaMdnuUFnPft9F5oMvU/FHu5IHFic+p1dR/UOB7XU2mX2yHW+NcTch4DCh5Q==} - engines: {node: '>=16'} + svelte: ^5.0.0 - sveltekit-search-params@3.0.0: - resolution: {integrity: sha512-wq1Yo5zITev8ty9CWGmHgvAh+Xb3mCUewyUmvCdv6MJWi+/aZ4o79Y6SjuduDL0Cfd/KYHkqt4f/wQ4FtokSdw==} + svelte-toolbelt@0.9.3: + resolution: {integrity: sha512-HCSWxCtVmv+c6g1ACb8LTwHVbDqLKJvHpo6J8TaqwUme2hj9ATJCpjCPNISR1OCq2Q4U1KT41if9ON0isINQZw==} + engines: {node: '>=18', pnpm: '>=8.7.0'} peerDependencies: - '@sveltejs/kit': ^1.0.0 || ^2.0.0 - svelte: ^3.55.0 || ^4.0.0 || ^5.0.0 + svelte: ^5.30.2 - svg-parser@2.0.4: - resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + svelte@5.38.2: + resolution: {integrity: sha512-iAcp/oFAWauVSGILdD67n7DiwgLHXZzWZIdzl7araRxu72jUr7PFAo2Iie7gXt0IbnlYvhxCb9GT3ZJUquO3PA==} + engines: {node: '>=18'} svgo@4.0.0: resolution: {integrity: sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==} @@ -2482,65 +2887,54 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - tailwind-merge@2.5.4: - resolution: {integrity: sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==} + tailwind-merge@3.0.2: + resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==} - tailwind-merge@2.6.0: - resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} + tailwind-merge@3.3.1: + resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} - tailwind-variants@0.3.1: - resolution: {integrity: sha512-krn67M3FpPwElg4FsZrOQd0U26o7UDH/QOkK8RNaiCCrr052f6YJPBUfNKnPo/s/xRzNPtv1Mldlxsg8Tb46BQ==} + tailwind-variants@1.0.0: + resolution: {integrity: sha512-2WSbv4ulEEyuBKomOunut65D8UZwxrHoRfYnxGcQNnHqlSCp2+B7Yz2W+yrNDrxRodOXtGD/1oCcKGNBnUqMqA==} engines: {node: '>=16.x', pnpm: '>=7.x'} peerDependencies: tailwindcss: '*' - tailwindcss@3.4.17: - resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} - engines: {node: '>=14.0.0'} - hasBin: true - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - 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==} - - tiny-glob@0.2.9: - resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + tailwindcss@4.1.12: + resolution: {integrity: sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==} - tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + engines: {node: '>=6'} - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} - tinypool@1.0.2: - resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} - engines: {node: ^18.0.0 || >=20.0.0} + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} - tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} - engines: {node: '>=14.0.0'} + tinyexec@1.0.1: + resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} - engines: {node: '>=14.0.0'} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} + engines: {node: '>=12.0.0'} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -2548,77 +2942,97 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - ts-api-utils@1.4.3: - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} peerDependencies: - typescript: '>=4.2.0' + typescript: '>=4.8.4' - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-morph@26.0.0: + resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==} - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsx@4.20.5: + resolution: {integrity: sha512-+wKjMNU9w/EaQayHXb7WA7ZaHY6hN8WgfvHNQ3t1PnU91/7O8TcTnIhCDYTZwnt8JsO9IBqZ30Ln1r7pPF52Aw==} + engines: {node: '>=18.0.0'} + hasBin: true + + tw-animate-css@1.3.7: + resolution: {integrity: sha512-lvLb3hTIpB5oGsk8JmLoAjeCHV58nKa2zHYn8yWOoG5JJusH3bhJlF2DLAZ/5NmJ+jyH3ssiAx/2KmbhavJy/A==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript-eslint@8.6.0: - resolution: {integrity: sha512-eEhhlxCEpCd4helh3AO1hk0UP2MvbRi9CtIAJTVPQjuSXOOO2jsEacNi4UdcJzZJbeuVg1gMhtZ8UYb+NFYPrA==} + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + type-is@2.0.1: + resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} + engines: {node: '>= 0.6'} + + typescript-eslint@8.40.0: + resolution: {integrity: sha512-Xvd2l+ZmFDPEt4oj1QEXzA4A2uUK6opvKu3eGN9aGjB8au02lIVcLyi375w94hHyejTOmzIU77L8ol2sRg9n7Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' - typescript@5.6.2: - resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} + typescript@5.9.2: + resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} engines: {node: '>=14.17'} hasBin: true - uncrypto@0.1.3: - resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + undici-types@7.10.0: + resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} - unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} - unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} - unist-util-visit-parents@6.0.1: resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - unist-util-visit@2.0.3: - resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} - unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - update-browserslist-db@1.1.2: - resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -2626,42 +3040,46 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} - vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} - - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@2.1.1: - resolution: {integrity: sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - - vite@5.4.7: - resolution: {integrity: sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@7.1.3: + resolution: {integrity: sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true + jiti: + optional: true less: optional: true lightningcss: @@ -2676,64 +3094,50 @@ packages: 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: + tsx: + optional: true + yaml: optional: true - vitest@2.1.1: - resolution: {integrity: sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true + vitefu@1.1.1: + resolution: {integrity: sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==} peerDependencies: - '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.1.1 - '@vitest/ui': 2.1.1 - happy-dom: '*' - jsdom: '*' + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@types/node': - optional: true - '@vitest/browser': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: + vite: optional: true web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true - why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} hasBin: true word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + 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'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} @@ -2742,13 +3146,17 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.7.0: - resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} - engines: {node: '>= 14'} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} hasBin: true yargs-parser@21.1.1: @@ -2763,281 +3171,385 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + + zimmerframe@1.1.2: + resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + + zod-to-json-schema@3.24.6: + resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} + peerDependencies: + zod: ^3.24.1 + + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + + zod@4.1.4: + resolution: {integrity: sha512-2YqJuWkU6IIK9qcE4k1lLLhyZ6zFw7XVRdQGpV97jEIZwTrscUw+DY31Xczd8nwaoksyJUIxCojZXwckJovWxA==} + 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.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 + + '@antfu/ni@25.0.0': + dependencies: + ansis: 4.1.0 + fzf: 0.5.2 + package-manager-detector: 1.3.0 + tinyexec: 1.0.1 - '@babel/code-frame@7.26.2': + '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.8': {} + '@babel/compat-data@7.28.0': {} - '@babel/core@7.26.9': + '@babel/core@7.28.3': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9) - '@babel/helpers': 7.26.9 - '@babel/parser': 7.26.9 - '@babel/template': 7.26.9 - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helpers': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.26.9': + '@babel/generator@7.28.3': dependencies: - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 jsesc: 3.1.0 - '@babel/helper-compilation-targets@7.26.5': + '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/compat-data': 7.26.8 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 + '@babel/types': 7.28.2 + + '@babel/helper-compilation-targets@7.27.2': + dependencies: + '@babel/compat-data': 7.28.0 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.25.3 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-module-imports@7.25.9': + '@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.3)': dependencies: - '@babel/traverse': 7.26.9 - '@babel/types': 7.26.9 + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/traverse': 7.28.3 + semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.9)': + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.27.1': dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.9 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 transitivePeerDependencies: - supports-color - '@babel/helper-string-parser@7.25.9': {} - - '@babel/helper-validator-identifier@7.25.9': {} - - '@babel/helper-validator-option@7.25.9': {} - - '@babel/helpers@7.26.9': + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/template': 7.26.9 - '@babel/types': 7.26.9 + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color - '@babel/parser@7.26.9': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.3)': dependencies: - '@babel/types': 7.26.9 + '@babel/core': 7.28.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.3 + transitivePeerDependencies: + - supports-color - '@babel/template@7.26.9': + '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.9 - '@babel/types': 7.26.9 + '@babel/types': 7.28.2 + + '@babel/helper-plugin-utils@7.27.1': {} - '@babel/traverse@7.26.9': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.9 - '@babel/parser': 7.26.9 - '@babel/template': 7.26.9 - '@babel/types': 7.26.9 - debug: 4.4.0 - globals: 11.12.0 + '@babel/core': 7.28.3 + '@babel/helper-member-expression-to-functions': 7.27.1 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.3 transitivePeerDependencies: - supports-color - '@babel/types@7.26.9': + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - - '@esbuild/aix-ppc64@0.21.5': - optional: true - - '@esbuild/aix-ppc64@0.24.0': - optional: true + '@babel/traverse': 7.28.3 + '@babel/types': 7.28.2 + transitivePeerDependencies: + - supports-color - '@esbuild/android-arm64@0.21.5': - optional: true + '@babel/helper-string-parser@7.27.1': {} - '@esbuild/android-arm64@0.24.0': - optional: true + '@babel/helper-validator-identifier@7.27.1': {} - '@esbuild/android-arm@0.21.5': - optional: true + '@babel/helper-validator-option@7.27.1': {} - '@esbuild/android-arm@0.24.0': - optional: true + '@babel/helpers@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 - '@esbuild/android-x64@0.21.5': - optional: true + '@babel/parser@7.28.3': + dependencies: + '@babel/types': 7.28.2 - '@esbuild/android-x64@0.24.0': - optional: true + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 - '@esbuild/darwin-arm64@0.21.5': - optional: true + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color - '@esbuild/darwin-arm64@0.24.0': - optional: true + '@babel/template@7.27.2': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 - '@esbuild/darwin-x64@0.21.5': - optional: true + '@babel/traverse@7.28.3': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.3 + '@babel/template': 7.27.2 + '@babel/types': 7.28.2 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color - '@esbuild/darwin-x64@0.24.0': - optional: true + '@babel/types@7.28.2': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 - '@esbuild/freebsd-arm64@0.21.5': - optional: true + '@bundled-es-modules/cookie@2.0.1': + dependencies: + cookie: 0.7.2 - '@esbuild/freebsd-arm64@0.24.0': - optional: true + '@bundled-es-modules/statuses@1.0.1': + dependencies: + statuses: 2.0.2 - '@esbuild/freebsd-x64@0.21.5': - optional: true + '@bundled-es-modules/tough-cookie@0.1.6': + dependencies: + '@types/tough-cookie': 4.0.5 + tough-cookie: 4.1.4 - '@esbuild/freebsd-x64@0.24.0': - optional: true + '@content-collections/core@0.11.0(typescript@5.9.2)': + dependencies: + '@standard-schema/spec': 1.0.0 + camelcase: 8.0.0 + chokidar: 4.0.3 + esbuild: 0.25.9 + gray-matter: 4.0.3 + p-limit: 6.2.0 + picomatch: 4.0.3 + pluralize: 8.0.0 + serialize-javascript: 6.0.2 + tinyglobby: 0.2.14 + typescript: 5.9.2 + yaml: 2.8.1 + zod: 3.25.76 - '@esbuild/linux-arm64@0.21.5': - optional: true + '@content-collections/integrations@0.3.0(@content-collections/core@0.11.0(typescript@5.9.2))': + dependencies: + '@content-collections/core': 0.11.0(typescript@5.9.2) - '@esbuild/linux-arm64@0.24.0': - optional: true + '@content-collections/markdown@0.1.4(@content-collections/core@0.11.0(typescript@5.9.2))': + dependencies: + '@content-collections/core': 0.11.0(typescript@5.9.2) + rehype-raw: 7.0.0 + rehype-stringify: 10.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color - '@esbuild/linux-arm@0.21.5': - optional: true + '@content-collections/vite@0.2.7(@content-collections/core@0.11.0(typescript@5.9.2))(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))': + dependencies: + '@content-collections/core': 0.11.0(typescript@5.9.2) + '@content-collections/integrations': 0.3.0(@content-collections/core@0.11.0(typescript@5.9.2)) + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1) - '@esbuild/linux-arm@0.24.0': - optional: true + '@dotenvx/dotenvx@1.49.0': + dependencies: + commander: 11.1.0 + dotenv: 17.2.1 + eciesjs: 0.4.15 + execa: 5.1.1 + fdir: 6.5.0(picomatch@4.0.3) + ignore: 5.3.2 + object-treeify: 1.1.33 + picomatch: 4.0.3 + which: 4.0.0 - '@esbuild/linux-ia32@0.21.5': - optional: true + '@ecies/ciphers@0.2.4(@noble/ciphers@1.3.0)': + dependencies: + '@noble/ciphers': 1.3.0 - '@esbuild/linux-ia32@0.24.0': + '@esbuild/aix-ppc64@0.25.9': optional: true - '@esbuild/linux-loong64@0.21.5': + '@esbuild/android-arm64@0.25.9': optional: true - '@esbuild/linux-loong64@0.24.0': + '@esbuild/android-arm@0.25.9': optional: true - '@esbuild/linux-mips64el@0.21.5': + '@esbuild/android-x64@0.25.9': optional: true - '@esbuild/linux-mips64el@0.24.0': + '@esbuild/darwin-arm64@0.25.9': optional: true - '@esbuild/linux-ppc64@0.21.5': + '@esbuild/darwin-x64@0.25.9': optional: true - '@esbuild/linux-ppc64@0.24.0': + '@esbuild/freebsd-arm64@0.25.9': optional: true - '@esbuild/linux-riscv64@0.21.5': + '@esbuild/freebsd-x64@0.25.9': optional: true - '@esbuild/linux-riscv64@0.24.0': + '@esbuild/linux-arm64@0.25.9': optional: true - '@esbuild/linux-s390x@0.21.5': + '@esbuild/linux-arm@0.25.9': optional: true - '@esbuild/linux-s390x@0.24.0': + '@esbuild/linux-ia32@0.25.9': optional: true - '@esbuild/linux-x64@0.21.5': + '@esbuild/linux-loong64@0.25.9': optional: true - '@esbuild/linux-x64@0.24.0': + '@esbuild/linux-mips64el@0.25.9': optional: true - '@esbuild/netbsd-x64@0.21.5': + '@esbuild/linux-ppc64@0.25.9': optional: true - '@esbuild/netbsd-x64@0.24.0': + '@esbuild/linux-riscv64@0.25.9': optional: true - '@esbuild/openbsd-arm64@0.24.0': + '@esbuild/linux-s390x@0.25.9': optional: true - '@esbuild/openbsd-x64@0.21.5': + '@esbuild/linux-x64@0.25.9': optional: true - '@esbuild/openbsd-x64@0.24.0': + '@esbuild/netbsd-arm64@0.25.9': optional: true - '@esbuild/sunos-x64@0.21.5': + '@esbuild/netbsd-x64@0.25.9': optional: true - '@esbuild/sunos-x64@0.24.0': + '@esbuild/openbsd-arm64@0.25.9': optional: true - '@esbuild/win32-arm64@0.21.5': + '@esbuild/openbsd-x64@0.25.9': optional: true - '@esbuild/win32-arm64@0.24.0': + '@esbuild/openharmony-arm64@0.25.9': optional: true - '@esbuild/win32-ia32@0.21.5': + '@esbuild/sunos-x64@0.25.9': optional: true - '@esbuild/win32-ia32@0.24.0': + '@esbuild/win32-arm64@0.25.9': optional: true - '@esbuild/win32-x64@0.21.5': + '@esbuild/win32-ia32@0.25.9': optional: true - '@esbuild/win32-x64@0.24.0': + '@esbuild/win32-x64@0.25.9': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.11.0(jiti@1.21.7))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.33.0(jiti@2.5.1))': dependencies: - eslint: 9.11.0(jiti@1.21.7) + eslint: 9.33.0(jiti@2.5.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.18.0': + '@eslint/compat@1.3.2(eslint@9.33.0(jiti@2.5.1))': + optionalDependencies: + eslint: 9.33.0(jiti@2.5.1) + + '@eslint/config-array@0.21.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.0 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/core@0.12.0': + '@eslint/config-helpers@0.3.1': {} + + '@eslint/core@0.15.2': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.0': + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.0 - espree: 10.3.0 + debug: 4.4.1 + espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 @@ -3047,71 +3559,135 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.11.0': {} + '@eslint/js@9.33.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.7': + '@eslint/plugin-kit@0.3.5': dependencies: - '@eslint/core': 0.12.0 + '@eslint/core': 0.15.2 levn: 0.4.1 - '@figma/plugin-typings@1.115.0': {} - - '@floating-ui/core@1.6.9': + '@floating-ui/core@1.7.3': dependencies: - '@floating-ui/utils': 0.2.9 + '@floating-ui/utils': 0.2.10 - '@floating-ui/dom@1.6.13': + '@floating-ui/dom@1.7.4': dependencies: - '@floating-ui/core': 1.6.9 - '@floating-ui/utils': 0.2.9 + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/utils@0.2.10': {} - '@floating-ui/utils@0.2.9': {} + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.3.1': {} - '@internationalized/date@3.7.0': + '@humanwhocodes/retry@0.4.3': {} + + '@inquirer/confirm@5.1.16(@types/node@24.3.0)': dependencies: - '@swc/helpers': 0.5.15 + '@inquirer/core': 10.2.0(@types/node@24.3.0) + '@inquirer/type': 3.0.8(@types/node@24.3.0) + optionalDependencies: + '@types/node': 24.3.0 - '@isaacs/cliui@8.0.2': + '@inquirer/core@10.2.0(@types/node@24.3.0)': 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 + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@24.3.0) + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.3.0 + + '@inquirer/figures@1.0.13': {} + + '@inquirer/type@3.0.8(@types/node@24.3.0)': + optionalDependencies: + '@types/node': 24.3.0 - '@jridgewell/gen-mapping@0.3.8': + '@internationalized/date@3.8.2': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@swc/helpers': 0.5.17 - '@jridgewell/resolve-uri@3.1.2': {} + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.30 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.30 - '@jridgewell/set-array@1.2.1': {} + '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.30': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 - '@melt-ui/svelte@0.76.2(svelte@4.2.20)': + '@lucide/svelte@0.515.0(svelte@5.38.2)': dependencies: - '@floating-ui/core': 1.6.9 - '@floating-ui/dom': 1.6.13 - '@internationalized/date': 3.7.0 - dequal: 2.0.3 - focus-trap: 7.6.4 - nanoid: 5.1.2 - svelte: 4.2.20 + svelte: 5.38.2 + + '@modelcontextprotocol/sdk@1.17.4': + dependencies: + ajv: 6.12.6 + content-type: 1.0.5 + cors: 2.8.5 + cross-spawn: 7.0.6 + eventsource: 3.0.7 + eventsource-parser: 3.0.5 + express: 5.1.0 + express-rate-limit: 7.5.1(express@5.1.0) + pkce-challenge: 5.0.0 + raw-body: 3.0.0 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - supports-color + + '@mswjs/interceptors@0.39.6': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.3 + strict-event-emitter: 0.5.1 + + '@noble/ciphers@1.3.0': {} + + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/hashes@1.8.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -3123,285 +3699,300 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.0 + fastq: 1.19.1 - '@pkgjs/parseargs@0.11.0': - optional: true + '@open-draft/deferred-promise@2.2.0': {} + + '@open-draft/logger@0.3.0': + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.3 - '@polka/url@1.0.0-next.28': {} + '@open-draft/until@2.1.0': {} - '@rollup/plugin-commonjs@28.0.2(rollup@4.34.8)': + '@polka/url@1.0.0-next.29': {} + + '@rollup/plugin-commonjs@28.0.6(rollup@4.46.4)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.34.8) + '@rollup/pluginutils': 5.2.0(rollup@4.46.4) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.4.3(picomatch@4.0.2) + fdir: 6.5.0(picomatch@4.0.3) is-reference: 1.2.1 magic-string: 0.30.17 - picomatch: 4.0.2 + picomatch: 4.0.3 optionalDependencies: - rollup: 4.34.8 + rollup: 4.46.4 - '@rollup/plugin-json@6.1.0(rollup@4.34.8)': + '@rollup/plugin-json@6.1.0(rollup@4.46.4)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.34.8) + '@rollup/pluginutils': 5.2.0(rollup@4.46.4) optionalDependencies: - rollup: 4.34.8 + rollup: 4.46.4 - '@rollup/plugin-node-resolve@15.3.1(rollup@4.34.8)': + '@rollup/plugin-node-resolve@16.0.1(rollup@4.46.4)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.34.8) + '@rollup/pluginutils': 5.2.0(rollup@4.46.4) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.10 optionalDependencies: - rollup: 4.34.8 + rollup: 4.46.4 - '@rollup/pluginutils@5.1.4(rollup@4.34.8)': + '@rollup/pluginutils@5.2.0(rollup@4.46.4)': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.2 + picomatch: 4.0.3 optionalDependencies: - rollup: 4.34.8 + rollup: 4.46.4 + + '@rollup/rollup-android-arm-eabi@4.46.4': + optional: true - '@rollup/rollup-android-arm-eabi@4.34.8': + '@rollup/rollup-android-arm64@4.46.4': optional: true - '@rollup/rollup-android-arm64@4.34.8': + '@rollup/rollup-darwin-arm64@4.46.4': optional: true - '@rollup/rollup-darwin-arm64@4.34.8': + '@rollup/rollup-darwin-x64@4.46.4': optional: true - '@rollup/rollup-darwin-x64@4.34.8': + '@rollup/rollup-freebsd-arm64@4.46.4': optional: true - '@rollup/rollup-freebsd-arm64@4.34.8': + '@rollup/rollup-freebsd-x64@4.46.4': optional: true - '@rollup/rollup-freebsd-x64@4.34.8': + '@rollup/rollup-linux-arm-gnueabihf@4.46.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.34.8': + '@rollup/rollup-linux-arm-musleabihf@4.46.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.34.8': + '@rollup/rollup-linux-arm64-gnu@4.46.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.34.8': + '@rollup/rollup-linux-arm64-musl@4.46.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.34.8': + '@rollup/rollup-linux-loongarch64-gnu@4.46.4': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.34.8': + '@rollup/rollup-linux-ppc64-gnu@4.46.4': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': + '@rollup/rollup-linux-riscv64-gnu@4.46.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.34.8': + '@rollup/rollup-linux-riscv64-musl@4.46.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.34.8': + '@rollup/rollup-linux-s390x-gnu@4.46.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.34.8': + '@rollup/rollup-linux-x64-gnu@4.46.4': optional: true - '@rollup/rollup-linux-x64-musl@4.34.8': + '@rollup/rollup-linux-x64-musl@4.46.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.34.8': + '@rollup/rollup-win32-arm64-msvc@4.46.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.34.8': + '@rollup/rollup-win32-ia32-msvc@4.46.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.34.8': + '@rollup/rollup-win32-x64-msvc@4.46.4': optional: true - '@shikijs/core@3.7.0': + '@sec-ant/readable-stream@0.4.1': {} + + '@shikijs/core@3.12.0': dependencies: - '@shikijs/types': 3.7.0 + '@shikijs/types': 3.12.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@3.7.0': + '@shikijs/engine-javascript@3.12.0': dependencies: - '@shikijs/types': 3.7.0 + '@shikijs/types': 3.12.0 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 4.3.3 - '@shikijs/engine-oniguruma@3.7.0': + '@shikijs/engine-oniguruma@3.12.0': dependencies: - '@shikijs/types': 3.7.0 + '@shikijs/types': 3.12.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.7.0': + '@shikijs/langs@3.12.0': dependencies: - '@shikijs/types': 3.7.0 + '@shikijs/types': 3.12.0 - '@shikijs/themes@3.7.0': + '@shikijs/rehype@3.12.0': dependencies: - '@shikijs/types': 3.7.0 + '@shikijs/types': 3.12.0 + '@types/hast': 3.0.4 + hast-util-to-string: 3.0.1 + shiki: 3.12.0 + unified: 11.0.5 + unist-util-visit: 5.0.0 - '@shikijs/types@3.7.0': + '@shikijs/themes@3.12.0': + dependencies: + '@shikijs/types': 3.12.0 + + '@shikijs/types@3.12.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 '@shikijs/vscode-textmate@10.0.2': {} - '@svelte-dev/pretty-code@1.0.0(shikiji@0.10.2)': + '@sindresorhus/merge-streams@4.0.0': {} + + '@standard-schema/spec@1.0.0': {} + + '@sveltejs/acorn-typescript@1.0.5(acorn@8.15.0)': dependencies: - rehype-pretty-code: 0.12.6(shikiji@0.10.2) - rehype-stringify: 10.0.1 - remark-parse: 11.0.0 - remark-rehype: 11.1.1 - unified: 11.0.5 - transitivePeerDependencies: - - shikiji - - supports-color + acorn: 8.15.0 - '@sveltejs/adapter-auto@3.2.5(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)))(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)))': + '@sveltejs/adapter-auto@6.1.0(@sveltejs/kit@2.36.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)))': dependencies: - '@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)))(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)) - import-meta-resolve: 4.1.0 + '@sveltejs/kit': 2.36.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) - '@sveltejs/adapter-node@5.2.5(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)))(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)))': + '@sveltejs/adapter-node@5.3.1(@sveltejs/kit@2.36.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)))': dependencies: - '@rollup/plugin-commonjs': 28.0.2(rollup@4.34.8) - '@rollup/plugin-json': 6.1.0(rollup@4.34.8) - '@rollup/plugin-node-resolve': 15.3.1(rollup@4.34.8) - '@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)))(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)) - rollup: 4.34.8 + '@rollup/plugin-commonjs': 28.0.6(rollup@4.46.4) + '@rollup/plugin-json': 6.1.0(rollup@4.46.4) + '@rollup/plugin-node-resolve': 16.0.1(rollup@4.46.4) + '@sveltejs/kit': 2.36.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) + rollup: 4.46.4 - '@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)))(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5))': + '@sveltejs/kit@2.36.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)) + '@standard-schema/spec': 1.0.0 + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) + '@sveltejs/vite-plugin-svelte': 6.1.3(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) '@types/cookie': 0.6.0 + acorn: 8.15.0 cookie: 0.6.0 devalue: 5.1.1 esm-env: 1.2.2 - import-meta-resolve: 4.1.0 kleur: 4.1.5 magic-string: 0.30.17 mrmime: 2.0.1 sade: 1.8.1 set-cookie-parser: 2.7.1 - sirv: 2.0.4 - svelte: 4.2.20 - tiny-glob: 0.2.9 - vite: 5.4.7(@types/node@22.5.5) + sirv: 3.0.1 + svelte: 5.38.2 + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1) - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)))(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5))': + '@sveltejs/vite-plugin-svelte-inspector@5.0.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)) - debug: 4.4.0 - svelte: 4.2.20 - vite: 5.4.7(@types/node@22.5.5) + '@sveltejs/vite-plugin-svelte': 6.1.3(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) + debug: 4.4.1 + svelte: 5.38.2 + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5))': + '@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)))(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)) - debug: 4.4.0 + '@sveltejs/vite-plugin-svelte-inspector': 5.0.1(@sveltejs/vite-plugin-svelte@6.1.3(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)))(svelte@5.38.2)(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) + debug: 4.4.1 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 - svelte: 4.2.20 - svelte-hmr: 0.16.0(svelte@4.2.20) - vite: 5.4.7(@types/node@22.5.5) - vitefu: 0.2.5(vite@5.4.7(@types/node@22.5.5)) + svelte: 5.38.2 + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1) + vitefu: 1.1.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)) transitivePeerDependencies: - supports-color - '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.26.9)': + '@swc/helpers@0.5.17': dependencies: - '@babel/core': 7.26.9 + tslib: 2.8.1 - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.26.9)': + '@tailwindcss/node@4.1.12': dependencies: - '@babel/core': 7.26.9 + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.18.3 + jiti: 2.5.1 + lightningcss: 1.30.1 + magic-string: 0.30.17 + source-map-js: 1.2.1 + tailwindcss: 4.1.12 - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 + '@tailwindcss/oxide-android-arm64@4.1.12': + optional: true - '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 + '@tailwindcss/oxide-darwin-arm64@4.1.12': + optional: true - '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 + '@tailwindcss/oxide-darwin-x64@4.1.12': + optional: true - '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 + '@tailwindcss/oxide-freebsd-x64@4.1.12': + optional: true - '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.12': + optional: true - '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 + '@tailwindcss/oxide-linux-arm64-gnu@4.1.12': + optional: true - '@svgr/babel-preset@8.1.0(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.26.9) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.26.9) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.26.9) - '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.26.9) - '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.26.9) - '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.26.9) - '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.26.9) - '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.26.9) + '@tailwindcss/oxide-linux-arm64-musl@4.1.12': + optional: true - '@svgr/core@8.1.0(typescript@5.6.2)': - dependencies: - '@babel/core': 7.26.9 - '@svgr/babel-preset': 8.1.0(@babel/core@7.26.9) - camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@5.6.2) - snake-case: 3.0.4 - transitivePeerDependencies: - - supports-color - - typescript + '@tailwindcss/oxide-linux-x64-gnu@4.1.12': + optional: true - '@svgr/hast-util-to-babel-ast@8.0.0': - dependencies: - '@babel/types': 7.26.9 - entities: 4.5.0 + '@tailwindcss/oxide-linux-x64-musl@4.1.12': + optional: true - '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.6.2))': - dependencies: - '@babel/core': 7.26.9 - '@svgr/babel-preset': 8.1.0(@babel/core@7.26.9) - '@svgr/core': 8.1.0(typescript@5.6.2) - '@svgr/hast-util-to-babel-ast': 8.0.0 - svg-parser: 2.0.4 - transitivePeerDependencies: - - supports-color + '@tailwindcss/oxide-wasm32-wasi@4.1.12': + optional: true - '@swc/helpers@0.5.15': - dependencies: - tslib: 2.8.1 + '@tailwindcss/oxide-win32-arm64-msvc@4.1.12': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.12': + optional: true - '@tailwindcss/typography@0.5.16(tailwindcss@3.4.17)': + '@tailwindcss/oxide@4.1.12': dependencies: - lodash.castarray: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.merge: 4.6.2 - postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.17 + detect-libc: 2.0.4 + tar: 7.4.3 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.12 + '@tailwindcss/oxide-darwin-arm64': 4.1.12 + '@tailwindcss/oxide-darwin-x64': 4.1.12 + '@tailwindcss/oxide-freebsd-x64': 4.1.12 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.12 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.12 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.12 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.12 + '@tailwindcss/oxide-linux-x64-musl': 4.1.12 + '@tailwindcss/oxide-wasm32-wasi': 4.1.12 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.12 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.12 + + '@tailwindcss/vite@4.1.12(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1))': + dependencies: + '@tailwindcss/node': 4.1.12 + '@tailwindcss/oxide': 4.1.12 + tailwindcss: 4.1.12 + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1) + + '@ts-morph/common@0.27.0': + dependencies: + fast-glob: 3.3.3 + minimatch: 10.0.3 + path-browserify: 1.0.1 '@types/cookie@0.6.0': {} @@ -3409,14 +4000,7 @@ snapshots: dependencies: '@types/ms': 2.1.0 - '@types/downloadjs@1.4.6': {} - - '@types/eslint@9.6.1': - dependencies: - '@types/estree': 1.0.6 - '@types/json-schema': 7.0.15 - - '@types/estree@1.0.6': {} + '@types/estree@1.0.8': {} '@types/hast@3.0.4': dependencies: @@ -3430,161 +4014,125 @@ snapshots: '@types/ms@2.1.0': {} - '@types/node@22.5.5': + '@types/node@24.3.0': dependencies: - undici-types: 6.19.8 + undici-types: 7.10.0 '@types/resolve@1.20.2': {} - '@types/unist@2.0.11': {} + '@types/statuses@2.0.6': {} + + '@types/tough-cookie@4.0.5': {} '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.0(jiti@1.21.7))(typescript@5.6.2))(eslint@9.11.0(jiti@1.21.7))(typescript@5.6.2)': + '@typescript-eslint/eslint-plugin@8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.6.0(eslint@9.11.0(jiti@1.21.7))(typescript@5.6.2) - '@typescript-eslint/scope-manager': 8.6.0 - '@typescript-eslint/type-utils': 8.6.0(eslint@9.11.0(jiti@1.21.7))(typescript@5.6.2) - '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.7))(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 8.6.0 - eslint: 9.11.0(jiti@1.21.7) + '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.40.0 + '@typescript-eslint/type-utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.40.0 + eslint: 9.33.0(jiti@2.5.1) graphemer: 1.4.0 - ignore: 5.3.2 + ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.6.0(eslint@9.11.0(jiti@1.21.7))(typescript@5.6.2)': + '@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.6.0 - '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 8.6.0 - debug: 4.4.0 - eslint: 9.11.0(jiti@1.21.7) - optionalDependencies: - typescript: 5.6.2 + '@typescript-eslint/scope-manager': 8.40.0 + '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.40.0 + debug: 4.4.1 + eslint: 9.33.0(jiti@2.5.1) + typescript: 5.9.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.40.0(typescript@5.9.2)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.9.2) + '@typescript-eslint/types': 8.40.0 + debug: 4.4.1 + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.6.0': + '@typescript-eslint/scope-manager@8.40.0': dependencies: - '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/visitor-keys': 8.6.0 + '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/visitor-keys': 8.40.0 - '@typescript-eslint/type-utils@8.6.0(eslint@9.11.0(jiti@1.21.7))(typescript@5.6.2)': + '@typescript-eslint/tsconfig-utils@8.40.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) - '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.7))(typescript@5.6.2) - debug: 4.4.0 - ts-api-utils: 1.4.3(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 + typescript: 5.9.2 + + '@typescript-eslint/type-utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + debug: 4.4.1 + eslint: 9.33.0(jiti@2.5.1) + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - - eslint - supports-color - '@typescript-eslint/types@8.6.0': {} + '@typescript-eslint/types@8.40.0': {} - '@typescript-eslint/typescript-estree@8.6.0(typescript@5.6.2)': + '@typescript-eslint/typescript-estree@8.40.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/visitor-keys': 8.6.0 - debug: 4.4.0 + '@typescript-eslint/project-service': 8.40.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.9.2) + '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/visitor-keys': 8.40.0 + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 - ts-api-utils: 1.4.3(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.9.2) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.6.0(eslint@9.11.0(jiti@1.21.7))(typescript@5.6.2)': + '@typescript-eslint/utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.11.0(jiti@1.21.7)) - '@typescript-eslint/scope-manager': 8.6.0 - '@typescript-eslint/types': 8.6.0 - '@typescript-eslint/typescript-estree': 8.6.0(typescript@5.6.2) - eslint: 9.11.0(jiti@1.21.7) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) + '@typescript-eslint/scope-manager': 8.40.0 + '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) + eslint: 9.33.0(jiti@2.5.1) + typescript: 5.9.2 transitivePeerDependencies: - supports-color - - typescript - '@typescript-eslint/visitor-keys@8.6.0': + '@typescript-eslint/visitor-keys@8.40.0': dependencies: - '@typescript-eslint/types': 8.6.0 - eslint-visitor-keys: 3.4.3 + '@typescript-eslint/types': 8.40.0 + eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.3.0': {} - '@upstash/core-analytics@0.0.10': - dependencies: - '@upstash/redis': 1.35.3 - - '@upstash/ratelimit@2.0.6(@upstash/redis@1.35.3)': - dependencies: - '@upstash/core-analytics': 0.0.10 - '@upstash/redis': 1.35.3 - - '@upstash/redis@1.35.3': - dependencies: - uncrypto: 0.1.3 - - '@vitest/expect@2.1.1': - dependencies: - '@vitest/spy': 2.1.1 - '@vitest/utils': 2.1.1 - chai: 5.2.0 - tinyrainbow: 1.2.0 - - '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.7(@types/node@22.5.5))': - dependencies: - '@vitest/spy': 2.1.1 - estree-walker: 3.0.3 - magic-string: 0.30.17 - optionalDependencies: - vite: 5.4.7(@types/node@22.5.5) - - '@vitest/pretty-format@2.1.1': - dependencies: - tinyrainbow: 1.2.0 - - '@vitest/pretty-format@2.1.9': - dependencies: - tinyrainbow: 1.2.0 - - '@vitest/runner@2.1.1': - dependencies: - '@vitest/utils': 2.1.1 - pathe: 1.1.2 - - '@vitest/snapshot@2.1.1': - dependencies: - '@vitest/pretty-format': 2.1.1 - magic-string: 0.30.17 - pathe: 1.1.2 - - '@vitest/spy@2.1.1': + accepts@2.0.0: dependencies: - tinyspy: 3.0.2 + mime-types: 3.0.1 + negotiator: 1.0.0 - '@vitest/utils@2.1.1': + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - '@vitest/pretty-format': 2.1.1 - loupe: 3.1.3 - tinyrainbow: 1.2.0 + acorn: 8.15.0 - acorn-jsx@5.3.2(acorn@8.14.0): - dependencies: - acorn: 8.14.0 + acorn@8.15.0: {} - acorn@8.14.0: {} + agent-base@7.1.4: {} ajv@6.12.6: dependencies: @@ -3593,40 +4141,31 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} + ansi-regex@6.2.0: {} ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.1: {} - - any-promise@1.3.0: {} + ansis@4.1.0: {} - anymatch@3.1.3: + argparse@1.0.10: dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - arg@5.0.2: {} + sprintf-js: 1.0.3 argparse@2.0.1: {} aria-query@5.3.2: {} - assertion-error@2.0.1: {} - - autoprefixer@10.4.21(postcss@8.5.3): + ast-types@0.16.1: dependencies: - browserslist: 4.24.4 - caniuse-lite: 1.0.30001715 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.1.1 - postcss: 8.5.3 - postcss-value-parser: 4.2.0 + tslib: 2.8.1 axobject-query@4.1.0: {} @@ -3634,23 +4173,39 @@ snapshots: balanced-match@1.0.2: {} - binary-extensions@2.3.0: {} - - bits-ui@0.22.0(svelte@4.2.20): + bits-ui@2.9.4(@internationalized/date@3.8.2)(svelte@5.38.2): dependencies: - '@internationalized/date': 3.7.0 - '@melt-ui/svelte': 0.76.2(svelte@4.2.20) - nanoid: 5.1.2 - svelte: 4.2.20 + '@floating-ui/core': 1.7.3 + '@floating-ui/dom': 1.7.4 + '@internationalized/date': 3.8.2 + esm-env: 1.2.2 + runed: 0.29.2(svelte@5.38.2) + svelte: 5.38.2 + svelte-toolbelt: 0.9.3(svelte@5.38.2) + tabbable: 6.2.0 + + body-parser@2.2.0: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 4.4.1 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + on-finished: 2.4.1 + qs: 6.14.0 + raw-body: 3.0.0 + type-is: 2.0.1 + transitivePeerDependencies: + - supports-color boolbase@1.0.0: {} - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -3658,64 +4213,60 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.24.4: + browserslist@4.25.3: dependencies: - caniuse-lite: 1.0.30001700 - electron-to-chromium: 1.5.104 + caniuse-lite: 1.0.30001737 + electron-to-chromium: 1.5.209 node-releases: 2.0.19 - update-browserslist-db: 1.1.2(browserslist@4.24.4) + update-browserslist-db: 1.1.3(browserslist@4.25.3) - cac@6.7.14: {} + bytes@3.1.2: {} - callsites@3.1.0: {} + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 - camelcase-css@2.0.1: {} + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 - camelcase@6.3.0: {} + callsites@3.1.0: {} - caniuse-lite@1.0.30001700: {} + camelcase@8.0.0: {} - caniuse-lite@1.0.30001715: {} + caniuse-lite@1.0.30001737: {} ccount@2.0.1: {} - chai@5.2.0: - dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.1.3 - pathval: 2.0.0 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.6.0: {} + character-entities-html4@2.1.0: {} character-entities-legacy@3.0.0: {} character-entities@2.0.2: {} - check-error@2.1.1: {} - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - 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 - chokidar@4.0.3: dependencies: readdirp: 4.1.2 + chownr@3.0.0: {} + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@2.9.2: {} + + cli-width@4.1.0: {} + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -3724,13 +4275,7 @@ snapshots: clsx@2.1.1: {} - code-red@1.0.4: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - '@types/estree': 1.0.6 - acorn: 8.14.0 - estree-walker: 3.0.3 - periscopic: 3.1.0 + code-block-writer@13.0.3: {} color-convert@2.0.1: dependencies: @@ -3742,36 +4287,41 @@ snapshots: commander@11.1.0: {} - commander@4.1.1: {} + commander@14.0.0: {} commondir@1.0.1: {} concat-map@0.0.1: {} - concurrently@9.0.1: + content-disposition@1.0.0: dependencies: - chalk: 4.1.2 - lodash: 4.17.21 - rxjs: 7.8.2 - shell-quote: 1.8.2 - supports-color: 8.1.1 - tree-kill: 1.2.2 - yargs: 17.7.2 + safe-buffer: 5.2.1 + + content-type@1.0.5: {} convert-source-map@2.0.0: {} + cookie-signature@1.2.2: {} + cookie@0.6.0: {} + cookie@0.7.2: {} + core-util-is@1.0.3: {} - cosmiconfig@8.3.6(typescript@5.6.2): + cors@2.8.5: dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + cosmiconfig@9.0.0(typescript@5.9.2): + dependencies: + env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.0 parse-json: 5.2.0 - path-type: 4.0.0 optionalDependencies: - typescript: 5.6.2 + typescript: 5.9.2 cross-spawn@7.0.6: dependencies: @@ -3792,11 +4342,6 @@ snapshots: mdn-data: 2.0.28 source-map-js: 1.2.1 - css-tree@2.3.1: - dependencies: - mdn-data: 2.0.30 - source-map-js: 1.2.1 - css-tree@3.1.0: dependencies: mdn-data: 2.12.2 @@ -3810,31 +4355,35 @@ snapshots: dependencies: css-tree: 2.2.1 - debug@4.4.0: + data-uri-to-buffer@4.0.1: {} + + debug@4.4.1: dependencies: ms: 2.1.3 - decode-named-character-reference@1.0.2: + decode-named-character-reference@1.2.0: dependencies: character-entities: 2.0.2 - deep-eql@5.0.2: {} + dedent@1.6.0: {} deep-is@0.1.4: {} deepmerge@4.3.1: {} + depd@2.0.0: {} + dequal@2.0.3: {} + detect-libc@2.0.4: {} + devalue@5.1.1: {} devlop@1.1.0: dependencies: dequal: 2.0.3 - didyoumean@1.2.2: {} - - dlv@1.1.3: {} + diff@8.0.2: {} dom-serializer@2.0.0: dependencies: @@ -3854,147 +4403,143 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - dot-case@3.0.4: + dotenv@17.2.1: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eciesjs@0.4.15: dependencies: - no-case: 3.0.4 - tslib: 2.7.0 + '@ecies/ciphers': 0.2.4(@noble/ciphers@1.3.0) + '@noble/ciphers': 1.3.0 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 - downloadjs@1.4.7: {} + ee-first@1.1.1: {} - eastasianwidth@0.2.0: {} + electron-to-chromium@1.5.209: {} - electron-to-chromium@1.5.104: {} + emoji-regex@10.4.0: {} emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} + encodeurl@2.0.0: {} + + enhanced-resolve@5.18.3: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.2 entities@4.5.0: {} + entities@6.0.1: {} + + env-paths@2.2.1: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - esbuild@0.21.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 - - esbuild@0.24.0: + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + esbuild@0.25.9: optionalDependencies: - '@esbuild/aix-ppc64': 0.24.0 - '@esbuild/android-arm': 0.24.0 - '@esbuild/android-arm64': 0.24.0 - '@esbuild/android-x64': 0.24.0 - '@esbuild/darwin-arm64': 0.24.0 - '@esbuild/darwin-x64': 0.24.0 - '@esbuild/freebsd-arm64': 0.24.0 - '@esbuild/freebsd-x64': 0.24.0 - '@esbuild/linux-arm': 0.24.0 - '@esbuild/linux-arm64': 0.24.0 - '@esbuild/linux-ia32': 0.24.0 - '@esbuild/linux-loong64': 0.24.0 - '@esbuild/linux-mips64el': 0.24.0 - '@esbuild/linux-ppc64': 0.24.0 - '@esbuild/linux-riscv64': 0.24.0 - '@esbuild/linux-s390x': 0.24.0 - '@esbuild/linux-x64': 0.24.0 - '@esbuild/netbsd-x64': 0.24.0 - '@esbuild/openbsd-arm64': 0.24.0 - '@esbuild/openbsd-x64': 0.24.0 - '@esbuild/sunos-x64': 0.24.0 - '@esbuild/win32-arm64': 0.24.0 - '@esbuild/win32-ia32': 0.24.0 - '@esbuild/win32-x64': 0.24.0 + '@esbuild/aix-ppc64': 0.25.9 + '@esbuild/android-arm': 0.25.9 + '@esbuild/android-arm64': 0.25.9 + '@esbuild/android-x64': 0.25.9 + '@esbuild/darwin-arm64': 0.25.9 + '@esbuild/darwin-x64': 0.25.9 + '@esbuild/freebsd-arm64': 0.25.9 + '@esbuild/freebsd-x64': 0.25.9 + '@esbuild/linux-arm': 0.25.9 + '@esbuild/linux-arm64': 0.25.9 + '@esbuild/linux-ia32': 0.25.9 + '@esbuild/linux-loong64': 0.25.9 + '@esbuild/linux-mips64el': 0.25.9 + '@esbuild/linux-ppc64': 0.25.9 + '@esbuild/linux-riscv64': 0.25.9 + '@esbuild/linux-s390x': 0.25.9 + '@esbuild/linux-x64': 0.25.9 + '@esbuild/netbsd-arm64': 0.25.9 + '@esbuild/netbsd-x64': 0.25.9 + '@esbuild/openbsd-arm64': 0.25.9 + '@esbuild/openbsd-x64': 0.25.9 + '@esbuild/openharmony-arm64': 0.25.9 + '@esbuild/sunos-x64': 0.25.9 + '@esbuild/win32-arm64': 0.25.9 + '@esbuild/win32-ia32': 0.25.9 + '@esbuild/win32-x64': 0.25.9 escalade@3.2.0: {} - escape-string-regexp@4.0.0: {} + escape-html@1.0.3: {} - escape-string-regexp@5.0.0: {} - - eslint-compat-utils@0.5.1(eslint@9.11.0(jiti@1.21.7)): - dependencies: - eslint: 9.11.0(jiti@1.21.7) - semver: 7.7.1 + escape-string-regexp@4.0.0: {} - eslint-config-prettier@9.1.0(eslint@9.11.0(jiti@1.21.7)): + eslint-config-prettier@10.1.8(eslint@9.33.0(jiti@2.5.1)): dependencies: - eslint: 9.11.0(jiti@1.21.7) + eslint: 9.33.0(jiti@2.5.1) - eslint-plugin-svelte@2.44.0(eslint@9.11.0(jiti@1.21.7))(svelte@4.2.20): + eslint-plugin-svelte@3.11.0(eslint@9.33.0(jiti@2.5.1))(svelte@5.38.2): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.11.0(jiti@1.21.7)) - '@jridgewell/sourcemap-codec': 1.5.0 - eslint: 9.11.0(jiti@1.21.7) - eslint-compat-utils: 0.5.1(eslint@9.11.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) + '@jridgewell/sourcemap-codec': 1.5.5 + eslint: 9.33.0(jiti@2.5.1) esutils: 2.0.3 - known-css-properties: 0.34.0 - postcss: 8.5.3 - postcss-load-config: 3.1.4(postcss@8.5.3) - postcss-safe-parser: 6.0.0(postcss@8.5.3) - postcss-selector-parser: 6.1.2 - semver: 7.7.1 - svelte-eslint-parser: 0.41.1(svelte@4.2.20) + globals: 16.3.0 + known-css-properties: 0.37.0 + postcss: 8.5.6 + postcss-load-config: 3.1.4(postcss@8.5.6) + postcss-safe-parser: 7.0.1(postcss@8.5.6) + semver: 7.7.2 + svelte-eslint-parser: 1.3.1(svelte@5.38.2) optionalDependencies: - svelte: 4.2.20 + svelte: 5.38.2 transitivePeerDependencies: - ts-node - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-scope@8.2.0: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.0: {} + eslint-visitor-keys@4.2.1: {} - eslint@9.11.0(jiti@1.21.7): + eslint@9.33.0(jiti@2.5.1): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.11.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.18.0 - '@eslint/eslintrc': 3.3.0 - '@eslint/js': 9.11.0 - '@eslint/plugin-kit': 0.2.7 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.3.1 + '@eslint/core': 0.15.2 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.33.0 + '@eslint/plugin-kit': 0.3.5 + '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.3.1 - '@nodelib/fs.walk': 1.2.8 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1 escape-string-regexp: 4.0.0 - eslint-scope: 8.2.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -4004,37 +4549,34 @@ snapshots: ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 optionalDependencies: - jiti: 1.21.7 + jiti: 2.5.1 transitivePeerDependencies: - supports-color esm-env@1.2.2: {} - espree@10.3.0: + espree@10.4.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) - eslint-visitor-keys: 4.2.0 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 - espree@9.6.1: - dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) - eslint-visitor-keys: 3.4.3 + esprima@4.0.1: {} esquery@1.6.0: dependencies: estraverse: 5.3.0 + esrap@2.1.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -4043,11 +4585,82 @@ snapshots: estree-walker@2.0.2: {} - estree-walker@3.0.3: + esutils@2.0.3: {} + + etag@1.8.1: {} + + eventsource-parser@3.0.5: {} + + eventsource@3.0.7: dependencies: - '@types/estree': 1.0.6 + eventsource-parser: 3.0.5 - esutils@2.0.3: {} + execa@5.1.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@9.6.0: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.2.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + + express-rate-limit@7.5.1(express@5.1.0): + dependencies: + express: 5.1.0 + + express@5.1.0: + dependencies: + accepts: 2.0.0 + body-parser: 2.2.0 + content-disposition: 1.0.0 + content-type: 1.0.5 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 2.1.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: 2.0.0 + mime-types: 3.0.1 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: 1.3.3 + proxy-addr: 2.0.7 + qs: 6.14.0 + range-parser: 1.2.1 + router: 2.2.0 + send: 1.2.0 + serve-static: 2.2.0 + statuses: 2.0.2 + type-is: 2.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend-shallow@2.0.1: + dependencies: + is-extendable: 0.1.1 extend@3.0.2: {} @@ -4065,13 +4678,22 @@ snapshots: fast-levenshtein@2.0.6: {} - fastq@1.19.0: + fastq@1.19.1: dependencies: reusify: 1.1.0 - fdir@6.4.3(picomatch@4.0.2): + fdir@6.5.0(picomatch@4.0.3): optionalDependencies: - picomatch: 4.0.2 + picomatch: 4.0.3 + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 file-entry-cache@8.0.0: dependencies: @@ -4081,6 +4703,17 @@ snapshots: dependencies: to-regex-range: 5.0.1 + finalhandler@2.1.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -4093,16 +4726,19 @@ snapshots: flatted@3.3.3: {} - focus-trap@7.6.4: + formdata-polyfill@4.0.10: dependencies: - tabbable: 6.2.0 + fetch-blob: 3.2.0 - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 + forwarded@0.2.0: {} + + fresh@2.0.0: {} - fraction.js@4.3.7: {} + fs-extra@11.3.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.0 + universalify: 2.0.1 fsevents@2.3.3: optional: true @@ -4111,10 +4747,47 @@ snapshots: fuse.js@7.1.0: {} + fuzzysort@3.1.0: {} + + fzf@0.5.2: {} + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} + get-east-asian-width@1.3.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-own-enumerable-keys@1.0.0: {} + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@6.0.1: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + get-tsconfig@4.10.1: + dependencies: + resolve-pkg-maps: 1.0.0 + github-slugger@2.0.0: {} glob-parent@5.1.2: @@ -4125,49 +4798,40 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.4.5: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - - globals@11.12.0: {} - globals@14.0.0: {} - globals@15.9.0: {} + globals@16.3.0: {} - globalyzer@0.1.0: {} + gopd@1.2.0: {} - globrex@0.1.2: {} + graceful-fs@4.2.11: {} graphemer@1.4.0: {} + graphql@16.11.0: {} + + 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@4.0.0: {} + has-symbols@1.1.0: {} + hasown@2.0.2: dependencies: function-bind: 1.1.2 - hast-util-from-html@2.0.3: - dependencies: - '@types/hast': 3.0.4 - devlop: 1.1.0 - hast-util-from-parse5: 8.0.3 - parse5: 7.2.1 - vfile: 6.0.3 - vfile-message: 4.0.2 - hast-util-from-parse5@8.0.3: dependencies: '@types/hast': 3.0.4 '@types/unist': 3.0.3 devlop: 1.1.0 hastscript: 9.0.1 - property-information: 7.0.0 + property-information: 7.1.0 vfile: 6.0.3 vfile-location: 5.0.3 web-namespaces: 2.0.1 @@ -4184,6 +4848,22 @@ snapshots: dependencies: '@types/hast': 3.0.4 + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.0 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + hast-util-to-html@9.0.5: dependencies: '@types/hast': 3.0.4 @@ -4193,11 +4873,21 @@ snapshots: hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.0 - property-information: 7.0.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 + hast-util-to-parse5@8.0.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-string@3.0.1: dependencies: '@types/hast': 3.0.4 @@ -4211,13 +4901,40 @@ snapshots: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 - property-information: 7.0.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 + headers-polyfill@4.0.3: {} + html-void-elements@3.0.0: {} + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + human-signals@8.0.1: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + ignore@5.3.2: {} + ignore@7.0.5: {} + immediate@3.0.6: {} import-fresh@3.3.1: @@ -4225,22 +4942,22 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-meta-resolve@4.1.0: {} - imurmurhash@0.1.4: {} inherits@2.0.4: {} - is-arrayish@0.2.1: {} + inline-style-parser@0.2.4: {} - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 + ipaddr.js@1.9.1: {} + + is-arrayish@0.2.1: {} is-core-module@2.16.1: dependencies: hasown: 2.0.2 + is-extendable@0.1.1: {} + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -4249,36 +4966,53 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-interactive@2.0.0: {} + is-module@1.0.0: {} + is-node-process@1.2.0: {} + is-number@7.0.0: {} - is-path-inside@3.0.3: {} + is-obj@3.0.0: {} is-plain-obj@4.1.0: {} + is-promise@4.0.0: {} + is-reference@1.2.1: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 is-reference@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 + + is-regexp@3.1.0: {} + + is-stream@2.0.1: {} + + is-stream@4.0.1: {} + + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.1.0: {} isarray@1.0.0: {} isexe@2.0.0: {} - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 + isexe@3.1.1: {} - jiti@1.21.7: {} + jiti@2.5.1: {} 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 @@ -4295,6 +5029,12 @@ snapshots: json5@2.2.3: {} + jsonfile@6.2.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + jszip@3.10.1: dependencies: lie: 3.3.0 @@ -4306,9 +5046,13 @@ snapshots: dependencies: json-buffer: 3.0.1 + kind-of@6.0.3: {} + + kleur@3.0.3: {} + kleur@4.1.5: {} - known-css-properties@0.34.0: {} + known-css-properties@0.37.0: {} levn@0.4.1: dependencies: @@ -4319,136 +5063,95 @@ snapshots: dependencies: immediate: 3.0.6 - lilconfig@2.1.0: {} + lightningcss-darwin-arm64@1.30.1: + optional: true - lilconfig@3.1.3: {} + lightningcss-darwin-x64@1.30.1: + optional: true - lines-and-columns@1.2.4: {} + lightningcss-freebsd-x64@1.30.1: + optional: true - locate-character@3.0.0: {} + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true - lodash.castarray@4.4.0: {} + lightningcss-linux-x64-gnu@1.30.1: + optional: true - lodash.isplainobject@4.0.6: {} + lightningcss-linux-x64-musl@1.30.1: + optional: true - lodash.merge@4.6.2: {} + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 - lodash@4.17.21: {} + lilconfig@2.1.0: {} - longest-streak@3.1.0: {} + lines-and-columns@1.2.4: {} - loupe@3.1.3: {} + locate-character@3.0.0: {} - lower-case@2.0.2: + locate-path@6.0.0: dependencies: - tslib: 2.7.0 + p-locate: 5.0.0 - lru-cache@10.4.3: {} + lodash.merge@4.6.2: {} - lru-cache@5.1.1: + log-symbols@6.0.0: dependencies: - yallist: 3.1.1 + chalk: 5.6.0 + is-unicode-supported: 1.3.0 - lucide-svelte@0.525.0(svelte@4.2.20): + lru-cache@5.1.1: dependencies: - svelte: 4.2.20 + yallist: 3.1.1 magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 - markdown-table@3.0.4: {} - - mdast-util-find-and-replace@3.0.2: - dependencies: - '@types/mdast': 4.0.4 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + math-intrinsics@1.1.0: {} mdast-util-from-markdown@2.0.2: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.1 + micromark: 4.0.2 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-decode-string: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color - mdast-util-gfm-autolink-literal@2.0.1: - dependencies: - '@types/mdast': 4.0.4 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.2 - micromark-util-character: 2.1.1 - - mdast-util-gfm-footnote@2.1.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - micromark-util-normalize-identifier: 2.0.1 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-strikethrough@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-table@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - markdown-table: 3.0.4 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-task-list-item@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm@3.1.0: - dependencies: - mdast-util-from-markdown: 2.0.2 - mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.1.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-phrasing@4.1.0: - dependencies: - '@types/mdast': 4.0.4 - unist-util-is: 6.0.0 - mdast-util-to-hast@13.2.0: dependencies: '@types/hast': 3.0.4 @@ -4461,43 +5164,25 @@ snapshots: unist-util-visit: 5.0.0 vfile: 6.0.3 - mdast-util-to-markdown@2.1.2: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.1.0 - mdast-util-to-string: 4.0.0 - micromark-util-classify-character: 2.0.1 - micromark-util-decode-string: 2.0.1 - unist-util-visit: 5.0.0 - zwitch: 2.0.4 - mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.4 mdn-data@2.0.28: {} - mdn-data@2.0.30: {} - mdn-data@2.12.2: {} - mdsvex@0.12.5(svelte@4.2.20): - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 2.0.11 - prism-svelte: 0.4.7 - prismjs: 1.29.0 - svelte: 4.2.20 - unist-util-visit: 2.0.3 - vfile-message: 2.0.4 + media-typer@1.1.0: {} + + merge-descriptors@2.0.0: {} + + merge-stream@2.0.0: {} merge2@1.4.1: {} - micromark-core-commonmark@2.0.2: + micromark-core-commonmark@2.0.3: dependencies: - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 micromark-factory-destination: 2.0.1 micromark-factory-label: 2.0.1 @@ -4510,104 +5195,46 @@ snapshots: micromark-util-html-tag-name: 2.0.1 micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.0.4 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 - - micromark-extension-gfm-autolink-literal@2.1.0: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 - - micromark-extension-gfm-footnote@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.2 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 - - micromark-extension-gfm-strikethrough@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 - - micromark-extension-gfm-table@2.1.1: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 - - micromark-extension-gfm-tagfilter@2.0.0: - dependencies: - micromark-util-types: 2.0.1 - - micromark-extension-gfm-task-list-item@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 - - micromark-extension-gfm@3.0.0: - dependencies: - micromark-extension-gfm-autolink-literal: 2.1.0 - micromark-extension-gfm-footnote: 2.1.0 - micromark-extension-gfm-strikethrough: 2.1.0 - micromark-extension-gfm-table: 2.1.1 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.1.0 - micromark-util-combine-extensions: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-label@2.0.1: dependencies: devlop: 1.1.0 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-space@2.0.1: dependencies: micromark-util-character: 2.1.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-title@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-factory-whitespace@2.0.1: dependencies: micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-character@2.1.1: dependencies: micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-chunked@2.0.1: dependencies: @@ -4617,12 +5244,12 @@ snapshots: dependencies: micromark-util-character: 2.1.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-combine-extensions@2.0.1: dependencies: micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-decode-numeric-character-reference@2.0.2: dependencies: @@ -4630,7 +5257,7 @@ snapshots: micromark-util-decode-string@2.0.1: dependencies: - decode-named-character-reference: 1.0.2 + decode-named-character-reference: 1.2.0 micromark-util-character: 2.1.1 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 @@ -4645,7 +5272,7 @@ snapshots: micromark-util-resolve-all@2.0.1: dependencies: - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-sanitize-uri@2.0.1: dependencies: @@ -4653,24 +5280,24 @@ snapshots: micromark-util-encode: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@2.0.4: + micromark-util-subtokenize@2.1.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.1 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 micromark-util-symbol@2.0.1: {} - micromark-util-types@2.0.1: {} + micromark-util-types@2.0.2: {} - micromark@4.0.1: + micromark@4.0.2: dependencies: '@types/debug': 4.1.12 - debug: 4.4.0 - decode-named-character-reference: 1.0.2 + debug: 4.4.1 + decode-named-character-reference: 1.2.0 devlop: 1.1.0 - micromark-core-commonmark: 2.0.2 + micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 micromark-util-character: 2.1.1 micromark-util-chunked: 2.0.1 @@ -4680,9 +5307,9 @@ snapshots: micromark-util-normalize-identifier: 2.0.1 micromark-util-resolve-all: 2.0.1 micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.0.4 + micromark-util-subtokenize: 2.1.0 micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 transitivePeerDependencies: - supports-color @@ -4691,19 +5318,43 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + mime-db@1.54.0: {} + + mime-types@3.0.1: + dependencies: + mime-db: 1.54.0 + + mimic-fn@2.1.0: {} + + mimic-function@5.0.1: {} + + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 + + minimist@1.2.8: {} minipass@7.1.2: {} - mode-watcher@0.5.1(svelte@4.2.20): + minizlib@3.0.2: + dependencies: + minipass: 7.1.2 + + mkdirp@3.0.1: {} + + mode-watcher@1.1.0(svelte@5.38.2): dependencies: - svelte: 4.2.20 + runed: 0.25.0(svelte@5.38.2) + svelte: 5.38.2 + svelte-toolbelt: 0.7.1(svelte@5.38.2) mri@1.2.0: {} @@ -4711,28 +5362,57 @@ snapshots: ms@2.1.3: {} - mz@2.7.0: + msw@2.10.5(@types/node@24.3.0)(typescript@5.9.2): dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 + '@bundled-es-modules/cookie': 2.0.1 + '@bundled-es-modules/statuses': 1.0.1 + '@bundled-es-modules/tough-cookie': 0.1.6 + '@inquirer/confirm': 5.1.16(@types/node@24.3.0) + '@mswjs/interceptors': 0.39.6 + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.6 + graphql: 16.11.0 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + strict-event-emitter: 0.5.1 + type-fest: 4.41.0 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - '@types/node' - nanoid@3.3.8: {} + mute-stream@2.0.0: {} - nanoid@5.1.2: {} + nanoid@3.3.11: {} natural-compare@1.4.0: {} - no-case@3.0.4: + negotiator@1.0.0: {} + + node-domexception@1.0.0: {} + + node-fetch@3.3.2: dependencies: - lower-case: 2.0.2 - tslib: 2.7.0 + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 node-releases@2.0.19: {} - normalize-path@3.0.0: {} + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 - normalize-range@0.1.2: {} + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 nth-check@2.1.1: dependencies: @@ -4740,7 +5420,25 @@ snapshots: object-assign@4.1.1: {} - object-hash@3.0.0: {} + object-inspect@1.13.4: {} + + object-treeify@1.1.33: {} + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 oniguruma-parser@0.12.1: {} @@ -4759,15 +5457,33 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@8.2.0: + dependencies: + chalk: 5.6.0 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + outvariant@1.4.3: {} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 + p-limit@6.2.0: + dependencies: + yocto-queue: 1.2.1 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - package-json-from-dist@1.0.1: {} + package-manager-detector@1.3.0: {} pako@1.0.11: {} @@ -4777,137 +5493,130 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.26.2 + '@babel/code-frame': 7.27.1 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-numeric-range@1.3.0: {} + parse-ms@4.0.0: {} - parse5@7.2.1: + parse5@7.3.0: dependencies: - entities: 4.5.0 + entities: 6.0.1 - path-exists@4.0.0: {} + parseurl@1.3.3: {} - path-key@3.1.1: {} + path-browserify@1.0.1: {} - path-parse@1.0.7: {} + path-exists@4.0.0: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 + path-key@3.1.1: {} - path-type@4.0.0: {} + path-key@4.0.0: {} - pathe@1.1.2: {} + path-parse@1.0.7: {} - pathval@2.0.0: {} + path-to-regexp@6.3.0: {} - periscopic@3.1.0: - dependencies: - '@types/estree': 1.0.6 - estree-walker: 3.0.3 - is-reference: 3.0.3 + path-to-regexp@8.2.0: {} picocolors@1.1.1: {} picomatch@2.3.1: {} - picomatch@4.0.2: {} - - pify@2.3.0: {} + picomatch@4.0.3: {} - pirates@4.0.6: {} + pkce-challenge@5.0.0: {} - postcss-import@15.1.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.10 - - postcss-js@4.0.1(postcss@8.5.3): - dependencies: - camelcase-css: 2.0.1 - postcss: 8.5.3 + pluralize@8.0.0: {} - postcss-load-config@3.1.4(postcss@8.5.3): + postcss-load-config@3.1.4(postcss@8.5.6): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-load-config@4.0.2(postcss@8.5.3): + postcss-safe-parser@7.0.1(postcss@8.5.6): dependencies: - lilconfig: 3.1.3 - yaml: 2.7.0 - optionalDependencies: - postcss: 8.5.3 - - postcss-nested@6.2.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - postcss-selector-parser: 6.1.2 - - postcss-safe-parser@6.0.0(postcss@8.5.3): - dependencies: - postcss: 8.5.3 - - postcss-scss@4.0.9(postcss@8.5.3): - dependencies: - postcss: 8.5.3 + postcss: 8.5.6 - postcss-selector-parser@6.0.10: + postcss-scss@4.0.9(postcss@8.5.6): dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 + postcss: 8.5.6 - postcss-selector-parser@6.1.2: + postcss-selector-parser@7.1.0: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-value-parser@4.2.0: {} - - postcss@8.5.3: + postcss@8.5.6: dependencies: - nanoid: 3.3.8 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 prelude-ls@1.2.1: {} - prettier-plugin-svelte@3.2.6(prettier@3.3.3)(svelte@4.2.20): + prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.38.2): dependencies: - prettier: 3.3.3 - svelte: 4.2.20 + prettier: 3.6.2 + svelte: 5.38.2 - prettier-plugin-tailwindcss@0.6.6(prettier-plugin-svelte@3.2.6(prettier@3.3.3)(svelte@4.2.20))(prettier@3.3.3): + prettier-plugin-tailwindcss@0.6.14(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.38.2))(prettier@3.6.2): dependencies: - prettier: 3.3.3 + prettier: 3.6.2 optionalDependencies: - prettier-plugin-svelte: 3.2.6(prettier@3.3.3)(svelte@4.2.20) + prettier-plugin-svelte: 3.4.0(prettier@3.6.2)(svelte@5.38.2) - prettier@3.3.3: {} + prettier@3.6.2: {} - prism-svelte@0.4.7: {} - - prismjs@1.29.0: {} + pretty-ms@9.2.0: + dependencies: + parse-ms: 4.0.0 process-nextick-args@2.0.1: {} - property-information@7.0.0: {} + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + property-information@6.5.0: {} + + property-information@7.1.0: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + psl@1.15.0: + dependencies: + punycode: 2.3.1 punycode@2.3.1: {} + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + querystringify@2.2.0: {} + queue-microtask@1.2.3: {} - read-cache@1.0.0: + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + range-parser@1.2.1: {} + + raw-body@3.0.0: dependencies: - pify: 2.3.0 + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 readable-stream@2.3.8: dependencies: @@ -4919,12 +5628,16 @@ snapshots: string_decoder: 1.1.1 util-deprecate: 1.0.2 - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - readdirp@4.1.2: {} + recast@0.23.11: + dependencies: + ast-types: 0.16.1 + esprima: 4.0.1 + source-map: 0.6.1 + tiny-invariant: 1.3.3 + tslib: 2.8.1 + regex-recursion@6.0.2: dependencies: regex-utilities: 2.3.0 @@ -4944,21 +5657,11 @@ snapshots: unified: 11.0.5 unist-util-visit: 5.0.0 - rehype-parse@9.0.1: + rehype-raw@7.0.0: dependencies: '@types/hast': 3.0.4 - hast-util-from-html: 2.0.3 - unified: 11.0.5 - - rehype-pretty-code@0.12.6(shikiji@0.10.2): - dependencies: - '@types/hast': 3.0.4 - hast-util-to-string: 3.0.1 - parse-numeric-range: 1.3.0 - rehype-parse: 9.0.1 - shikiji: 0.10.2 - unified: 11.0.5 - unist-util-visit: 5.0.0 + hast-util-raw: 9.1.0 + vfile: 6.0.3 rehype-slug@6.0.0: dependencies: @@ -4974,27 +5677,16 @@ snapshots: hast-util-to-html: 9.0.5 unified: 11.0.5 - remark-gfm@4.0.1: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-gfm: 3.1.0 - micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color - remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 mdast-util-from-markdown: 2.0.2 - micromark-util-types: 2.0.1 + micromark-util-types: 2.0.2 unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-rehype@11.1.1: + remark-rehype@11.1.2: dependencies: '@types/hast': 3.0.4 '@types/mdast': 4.0.4 @@ -5002,56 +5694,86 @@ snapshots: unified: 11.0.5 vfile: 6.0.3 - remark-stringify@11.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-to-markdown: 2.1.2 - unified: 11.0.5 - require-directory@2.1.1: {} + requires-port@1.0.0: {} + resolve-from@4.0.0: {} + resolve-pkg-maps@1.0.0: {} + resolve@1.22.10: dependencies: is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + reusify@1.1.0: {} - rollup@4.34.8: + rollup@4.46.4: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.34.8 - '@rollup/rollup-android-arm64': 4.34.8 - '@rollup/rollup-darwin-arm64': 4.34.8 - '@rollup/rollup-darwin-x64': 4.34.8 - '@rollup/rollup-freebsd-arm64': 4.34.8 - '@rollup/rollup-freebsd-x64': 4.34.8 - '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 - '@rollup/rollup-linux-arm-musleabihf': 4.34.8 - '@rollup/rollup-linux-arm64-gnu': 4.34.8 - '@rollup/rollup-linux-arm64-musl': 4.34.8 - '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 - '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 - '@rollup/rollup-linux-riscv64-gnu': 4.34.8 - '@rollup/rollup-linux-s390x-gnu': 4.34.8 - '@rollup/rollup-linux-x64-gnu': 4.34.8 - '@rollup/rollup-linux-x64-musl': 4.34.8 - '@rollup/rollup-win32-arm64-msvc': 4.34.8 - '@rollup/rollup-win32-ia32-msvc': 4.34.8 - '@rollup/rollup-win32-x64-msvc': 4.34.8 + '@rollup/rollup-android-arm-eabi': 4.46.4 + '@rollup/rollup-android-arm64': 4.46.4 + '@rollup/rollup-darwin-arm64': 4.46.4 + '@rollup/rollup-darwin-x64': 4.46.4 + '@rollup/rollup-freebsd-arm64': 4.46.4 + '@rollup/rollup-freebsd-x64': 4.46.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.46.4 + '@rollup/rollup-linux-arm-musleabihf': 4.46.4 + '@rollup/rollup-linux-arm64-gnu': 4.46.4 + '@rollup/rollup-linux-arm64-musl': 4.46.4 + '@rollup/rollup-linux-loongarch64-gnu': 4.46.4 + '@rollup/rollup-linux-ppc64-gnu': 4.46.4 + '@rollup/rollup-linux-riscv64-gnu': 4.46.4 + '@rollup/rollup-linux-riscv64-musl': 4.46.4 + '@rollup/rollup-linux-s390x-gnu': 4.46.4 + '@rollup/rollup-linux-x64-gnu': 4.46.4 + '@rollup/rollup-linux-x64-musl': 4.46.4 + '@rollup/rollup-win32-arm64-msvc': 4.46.4 + '@rollup/rollup-win32-ia32-msvc': 4.46.4 + '@rollup/rollup-win32-x64-msvc': 4.46.4 fsevents: 2.3.3 + router@2.2.0: + dependencies: + debug: 4.4.1 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.2.0 + transitivePeerDependencies: + - supports-color + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - rxjs@7.8.2: + runed@0.23.4(svelte@5.38.2): + dependencies: + esm-env: 1.2.2 + svelte: 5.38.2 + + runed@0.25.0(svelte@5.38.2): + dependencies: + esm-env: 1.2.2 + svelte: 5.38.2 + + runed@0.28.0(svelte@5.38.2): + dependencies: + esm-env: 1.2.2 + svelte: 5.38.2 + + runed@0.29.2(svelte@5.38.2): dependencies: - tslib: 2.7.0 + esm-env: 1.2.2 + svelte: 5.38.2 sade@1.8.1: dependencies: @@ -5059,63 +5781,164 @@ snapshots: safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + sax@1.4.1: {} + section-matter@1.0.0: + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + semver@6.3.1: {} - semver@7.7.1: {} + semver@7.7.2: {} + + send@1.2.0: + dependencies: + debug: 4.4.1 + encodeurl: 2.0.0 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 2.0.0 + http-errors: 2.0.0 + mime-types: 3.0.1 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.2 + transitivePeerDependencies: + - supports-color + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + serve-static@2.2.0: + dependencies: + encodeurl: 2.0.0 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 1.2.0 + transitivePeerDependencies: + - supports-color set-cookie-parser@2.7.1: {} setimmediate@1.0.5: {} + setprototypeof@1.2.0: {} + + shadcn@3.0.0(@types/node@24.3.0)(typescript@5.9.2): + dependencies: + '@antfu/ni': 25.0.0 + '@babel/core': 7.28.3 + '@babel/parser': 7.28.3 + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.3) + '@dotenvx/dotenvx': 1.49.0 + '@modelcontextprotocol/sdk': 1.17.4 + commander: 14.0.0 + cosmiconfig: 9.0.0(typescript@5.9.2) + dedent: 1.6.0 + deepmerge: 4.3.1 + diff: 8.0.2 + execa: 9.6.0 + fast-glob: 3.3.3 + fs-extra: 11.3.1 + fuzzysort: 3.1.0 + https-proxy-agent: 7.0.6 + kleur: 4.1.5 + msw: 2.10.5(@types/node@24.3.0)(typescript@5.9.2) + node-fetch: 3.3.2 + ora: 8.2.0 + postcss: 8.5.6 + prompts: 2.4.2 + recast: 0.23.11 + stringify-object: 5.0.0 + ts-morph: 26.0.0 + tsconfig-paths: 4.2.0 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - typescript + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} - shell-quote@1.8.2: {} - - shiki@3.7.0: + shiki@3.12.0: dependencies: - '@shikijs/core': 3.7.0 - '@shikijs/engine-javascript': 3.7.0 - '@shikijs/engine-oniguruma': 3.7.0 - '@shikijs/langs': 3.7.0 - '@shikijs/themes': 3.7.0 - '@shikijs/types': 3.7.0 + '@shikijs/core': 3.12.0 + '@shikijs/engine-javascript': 3.12.0 + '@shikijs/engine-oniguruma': 3.12.0 + '@shikijs/langs': 3.12.0 + '@shikijs/themes': 3.12.0 + '@shikijs/types': 3.12.0 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - shikiji-core@0.10.2: {} + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 - shikiji@0.10.2: + side-channel@1.1.0: dependencies: - shikiji-core: 0.10.2 + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 - siginfo@2.0.0: {} + signal-exit@3.0.7: {} signal-exit@4.1.0: {} - sirv@2.0.4: + sirv@3.0.1: dependencies: - '@polka/url': 1.0.0-next.28 + '@polka/url': 1.0.0-next.29 mrmime: 2.0.1 totalist: 3.0.1 - snake-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.7.0 + sisteransi@1.0.5: {} source-map-js@1.2.1: {} + source-map@0.6.1: {} + space-separated-tokens@2.0.2: {} - stackback@0.0.2: {} + sprintf-js@1.0.3: {} + + statuses@2.0.1: {} - std-env@3.8.0: {} + statuses@2.0.2: {} + + stdin-discarder@0.2.2: {} + + strict-event-emitter@0.5.1: {} string-width@4.2.3: dependencies: @@ -5123,10 +5946,10 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: + string-width@7.2.0: dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 strip-ansi: 7.1.0 string_decoder@1.1.1: @@ -5138,93 +5961,98 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + stringify-object@5.0.0: + dependencies: + get-own-enumerable-keys: 1.0.0 + is-obj: 3.0.0 + is-regexp: 3.1.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 strip-ansi@7.1.0: dependencies: - ansi-regex: 6.1.0 + ansi-regex: 6.2.0 + + strip-bom-string@1.0.0: {} + + strip-bom@3.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-final-newline@4.0.0: {} strip-json-comments@3.1.1: {} - sucrase@3.35.0: + style-to-object@1.0.9: dependencies: - '@jridgewell/gen-mapping': 0.3.8 - commander: 4.1.1 - glob: 10.4.5 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 + inline-style-parser: 0.2.4 supports-color@7.2.0: dependencies: has-flag: 4.0.0 - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.0.9(picomatch@4.0.2)(svelte@4.2.20)(typescript@5.6.2): + svelte-check@4.3.1(picomatch@4.0.3)(svelte@5.38.2)(typescript@5.9.2): dependencies: - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/trace-mapping': 0.3.30 chokidar: 4.0.3 - fdir: 6.4.3(picomatch@4.0.2) + fdir: 6.5.0(picomatch@4.0.3) picocolors: 1.1.1 sade: 1.8.1 - svelte: 4.2.20 - typescript: 5.6.2 + svelte: 5.38.2 + typescript: 5.9.2 transitivePeerDependencies: - picomatch - svelte-eslint-parser@0.41.1(svelte@4.2.20): + svelte-eslint-parser@1.3.1(svelte@5.38.2): dependencies: - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - postcss: 8.5.3 - postcss-scss: 4.0.9(postcss@8.5.3) + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + postcss: 8.5.6 + postcss-scss: 4.0.9(postcss@8.5.6) + postcss-selector-parser: 7.1.0 optionalDependencies: - svelte: 4.2.20 + svelte: 5.38.2 - svelte-hmr@0.16.0(svelte@4.2.20): + svelte-sonner@1.0.5(svelte@5.38.2): dependencies: - svelte: 4.2.20 + runed: 0.28.0(svelte@5.38.2) + svelte: 5.38.2 - svelte-sonner@0.3.28(svelte@4.2.20): + svelte-toolbelt@0.7.1(svelte@5.38.2): dependencies: - svelte: 4.2.20 + clsx: 2.1.1 + runed: 0.23.4(svelte@5.38.2) + style-to-object: 1.0.9 + svelte: 5.38.2 - svelte@4.2.20: + svelte-toolbelt@0.9.3(svelte@5.38.2): dependencies: - '@ampproject/remapping': 2.3.0 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - '@types/estree': 1.0.6 - acorn: 8.14.0 + clsx: 2.1.1 + runed: 0.29.2(svelte@5.38.2) + style-to-object: 1.0.9 + svelte: 5.38.2 + + svelte@5.38.2: + dependencies: + '@jridgewell/remapping': 2.3.5 + '@jridgewell/sourcemap-codec': 1.5.5 + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.15.0) + '@types/estree': 1.0.8 + acorn: 8.15.0 aria-query: 5.3.2 axobject-query: 4.1.0 - code-red: 1.0.4 - css-tree: 2.3.1 - estree-walker: 3.0.3 + clsx: 2.1.1 + esm-env: 1.2.2 + esrap: 2.1.0 is-reference: 3.0.3 locate-character: 3.0.0 magic-string: 0.30.17 - periscopic: 3.1.0 - - sveltekit-search-params@3.0.0(@sveltejs/kit@2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)))(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)))(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)): - dependencies: - '@sveltejs/kit': 2.5.28(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)))(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)) - '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.20)(vite@5.4.7(@types/node@22.5.5)) - svelte: 4.2.20 - transitivePeerDependencies: - - supports-color - - vite - - svg-parser@2.0.4: {} + zimmerframe: 1.1.2 svgo@4.0.0: dependencies: @@ -5238,109 +6066,112 @@ snapshots: tabbable@6.2.0: {} - tailwind-merge@2.5.4: {} + tailwind-merge@3.0.2: {} - tailwind-merge@2.6.0: {} - - tailwind-variants@0.3.1(tailwindcss@3.4.17): - dependencies: - tailwind-merge: 2.5.4 - tailwindcss: 3.4.17 + tailwind-merge@3.3.1: {} - tailwindcss@3.4.17: + tailwind-variants@1.0.0(tailwindcss@4.1.12): 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.3 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.7 - lilconfig: 3.1.3 - micromatch: 4.0.8 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.1.1 - postcss: 8.5.3 - postcss-import: 15.1.0(postcss@8.5.3) - postcss-js: 4.0.1(postcss@8.5.3) - postcss-load-config: 4.0.2(postcss@8.5.3) - postcss-nested: 6.2.0(postcss@8.5.3) - postcss-selector-parser: 6.1.2 - resolve: 1.22.10 - sucrase: 3.35.0 - transitivePeerDependencies: - - ts-node + tailwind-merge: 3.0.2 + tailwindcss: 4.1.12 - text-table@0.2.0: {} + tailwindcss@4.1.12: {} - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 + tapable@2.2.2: {} - tiny-glob@0.2.9: + tar@7.4.3: dependencies: - globalyzer: 0.1.0 - globrex: 0.1.2 - - tinybench@2.9.0: {} - - tinyexec@0.3.2: {} + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 - tinypool@1.0.2: {} + tiny-invariant@1.3.3: {} - tinyrainbow@1.2.0: {} + tinyexec@1.0.1: {} - tinyspy@3.0.2: {} + tinyglobby@0.2.14: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 to-regex-range@5.0.1: dependencies: is-number: 7.0.0 + toidentifier@1.0.1: {} + totalist@3.0.1: {} - tree-kill@1.2.2: {} + tough-cookie@4.1.4: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 trim-lines@3.0.1: {} trough@2.2.0: {} - ts-api-utils@1.4.3(typescript@5.6.2): + ts-api-utils@2.1.0(typescript@5.9.2): dependencies: - typescript: 5.6.2 + typescript: 5.9.2 - ts-interface-checker@0.1.13: {} + ts-morph@26.0.0: + dependencies: + '@ts-morph/common': 0.27.0 + code-block-writer: 13.0.3 - tslib@2.7.0: {} + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 tslib@2.8.1: {} + tsx@4.20.5: + dependencies: + esbuild: 0.25.9 + get-tsconfig: 4.10.1 + optionalDependencies: + fsevents: 2.3.3 + + tw-animate-css@1.3.7: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.6.0(eslint@9.11.0(jiti@1.21.7))(typescript@5.6.2): + type-fest@0.21.3: {} + + type-fest@4.41.0: {} + + type-is@2.0.1: dependencies: - '@typescript-eslint/eslint-plugin': 8.6.0(@typescript-eslint/parser@8.6.0(eslint@9.11.0(jiti@1.21.7))(typescript@5.6.2))(eslint@9.11.0(jiti@1.21.7))(typescript@5.6.2) - '@typescript-eslint/parser': 8.6.0(eslint@9.11.0(jiti@1.21.7))(typescript@5.6.2) - '@typescript-eslint/utils': 8.6.0(eslint@9.11.0(jiti@1.21.7))(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.1 + + typescript-eslint@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2): + dependencies: + '@typescript-eslint/eslint-plugin': 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + eslint: 9.33.0(jiti@2.5.1) + typescript: 5.9.2 transitivePeerDependencies: - - eslint - supports-color - typescript@5.6.2: {} + typescript@5.9.2: {} - uncrypto@0.1.3: {} + undici-types@7.10.0: {} - undici-types@6.19.8: {} + unicorn-magic@0.3.0: {} unified@11.0.5: dependencies: @@ -5352,8 +6183,6 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 - unist-util-is@4.1.0: {} - unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.3 @@ -5362,39 +6191,30 @@ snapshots: dependencies: '@types/unist': 3.0.3 - unist-util-stringify-position@2.0.3: - dependencies: - '@types/unist': 2.0.11 - unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.3 - unist-util-visit-parents@3.1.1: - dependencies: - '@types/unist': 2.0.11 - unist-util-is: 4.1.0 - unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.3 unist-util-is: 6.0.0 - unist-util-visit@2.0.3: - dependencies: - '@types/unist': 2.0.11 - unist-util-is: 4.1.0 - unist-util-visit-parents: 3.1.1 - unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.3 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - update-browserslist-db@1.1.2(browserslist@4.24.4): + universalify@0.2.0: {} + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + update-browserslist-db@1.1.3(browserslist@4.25.3): dependencies: - browserslist: 4.24.4 + browserslist: 4.25.3 escalade: 3.2.0 picocolors: 1.1.1 @@ -5402,19 +6222,21 @@ snapshots: dependencies: punycode: 2.3.1 + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + util-deprecate@1.0.2: {} + vary@1.1.2: {} + vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 vfile: 6.0.3 - vfile-message@2.0.4: - dependencies: - '@types/unist': 2.0.11 - unist-util-stringify-position: 2.0.3 - - vfile-message@4.0.2: + vfile-message@4.0.3: dependencies: '@types/unist': 3.0.3 unist-util-stringify-position: 4.0.0 @@ -5422,104 +6244,65 @@ snapshots: vfile@6.0.3: dependencies: '@types/unist': 3.0.3 - vfile-message: 4.0.2 - - vite-node@2.1.1(@types/node@22.5.5): - dependencies: - cac: 6.7.14 - debug: 4.4.0 - pathe: 1.1.2 - vite: 5.4.7(@types/node@22.5.5) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser + vfile-message: 4.0.3 - vite@5.4.7(@types/node@22.5.5): + vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1): dependencies: - esbuild: 0.21.5 - postcss: 8.5.3 - rollup: 4.34.8 + esbuild: 0.25.9 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.46.4 + tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 22.5.5 + '@types/node': 24.3.0 fsevents: 2.3.3 + jiti: 2.5.1 + lightningcss: 1.30.1 + tsx: 4.20.5 + yaml: 2.8.1 - vitefu@0.2.5(vite@5.4.7(@types/node@22.5.5)): - optionalDependencies: - vite: 5.4.7(@types/node@22.5.5) - - vitest@2.1.1(@types/node@22.5.5): - dependencies: - '@vitest/expect': 2.1.1 - '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.7(@types/node@22.5.5)) - '@vitest/pretty-format': 2.1.9 - '@vitest/runner': 2.1.1 - '@vitest/snapshot': 2.1.1 - '@vitest/spy': 2.1.1 - '@vitest/utils': 2.1.1 - chai: 5.2.0 - debug: 4.4.0 - magic-string: 0.30.17 - pathe: 1.1.2 - std-env: 3.8.0 - tinybench: 2.9.0 - tinyexec: 0.3.2 - tinypool: 1.0.2 - tinyrainbow: 1.2.0 - vite: 5.4.7(@types/node@22.5.5) - vite-node: 2.1.1(@types/node@22.5.5) - why-is-node-running: 2.3.0 + vitefu@1.1.1(vite@7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1)): optionalDependencies: - '@types/node': 22.5.5 - transitivePeerDependencies: - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser + vite: 7.1.3(@types/node@24.3.0)(jiti@2.5.1)(lightningcss@1.30.1)(tsx@4.20.5)(yaml@2.8.1) web-namespaces@2.0.1: {} + web-streams-polyfill@3.3.3: {} + which@2.0.2: dependencies: isexe: 2.0.0 - why-is-node-running@2.3.0: + which@4.0.0: dependencies: - siginfo: 2.0.0 - stackback: 0.0.2 + isexe: 3.1.1 word-wrap@1.2.5: {} - wrap-ansi@7.0.0: + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: + wrap-ansi@7.0.0: dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} y18n@5.0.8: {} yallist@3.1.1: {} + yallist@5.0.0: {} + yaml@1.10.2: {} - yaml@2.7.0: {} + yaml@2.8.1: {} yargs-parser@21.1.1: {} @@ -5535,4 +6318,20 @@ snapshots: yocto-queue@0.1.0: {} + yocto-queue@1.2.1: {} + + yoctocolors-cjs@2.1.3: {} + + yoctocolors@2.1.2: {} + + zimmerframe@1.1.2: {} + + zod-to-json-schema@3.24.6(zod@3.25.76): + dependencies: + zod: 3.25.76 + + zod@3.25.76: {} + + zod@4.1.4: {} + zwitch@2.0.4: {} diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index ba8073047..000000000 --- a/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - plugins: { - tailwindcss: {}, - autoprefixer: {} - } -}; diff --git a/prettier.config.mjs b/prettier.config.mjs index 22e72d33a..eda4b3090 100644 --- a/prettier.config.mjs +++ b/prettier.config.mjs @@ -1,12 +1,15 @@ -/** @type {import("prettier").Config} */ -const config = { - useTabs: false, - singleQuote: true, - trailingComma: 'none', - printWidth: 100, - plugins: ['prettier-plugin-svelte', 'prettier-plugin-tailwindcss'], - pluginSearchDirs: ['.'], - overrides: [{ files: '*.svelte', options: { parser: 'svelte' } }] +/** @type {import('prettier').Config & import('prettier-plugin-tailwindcss').PluginOptions} */ +const prettierConfig = { + plugins: ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"], + tailwindStylesheet: "./src/styles/globals.css", + overrides: [ + { + files: "*.svelte", + options: { + parser: "svelte", + }, + }, + ], }; -export default config; +export default prettierConfig; diff --git a/src/app.d.ts b/src/app.d.ts index 899c7e8fc..520c4217a 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -1,10 +1,11 @@ -// See https://kit.svelte.dev/docs/types#app +// See https://svelte.dev/docs/kit/types#app.d.ts // for information about these interfaces declare global { namespace App { // interface Error {} // interface Locals {} // interface PageData {} + // interface PageState {} // interface Platform {} } } diff --git a/src/app.html b/src/app.html index b8690e0ab..4d0cad581 100644 --- a/src/app.html +++ b/src/app.html @@ -8,31 +8,74 @@ - - + + - + - - + + - + - - + + - + + + + + + + + - A beautiful library with SVG logos - Svgl + A beautiful library with SVG logos - SVGL %sveltekit.head% -
%sveltekit.body%
+
%sveltekit.body%
diff --git a/src/components/codeBlock.svelte b/src/components/codeBlock.svelte new file mode 100644 index 000000000..73b75e2b1 --- /dev/null +++ b/src/components/codeBlock.svelte @@ -0,0 +1,67 @@ + + +
+ + {#if Icon} + + {/if} + + {code} + +
diff --git a/src/components/container.svelte b/src/components/container.svelte index e97f2732a..814dda2f7 100644 --- a/src/components/container.svelte +++ b/src/components/container.svelte @@ -1,3 +1,11 @@ -
- + + +
+ {@render children?.()}
diff --git a/src/components/documentSettings.svelte b/src/components/documentSettings.svelte new file mode 100644 index 000000000..5501fcfb2 --- /dev/null +++ b/src/components/documentSettings.svelte @@ -0,0 +1,116 @@ + + +{#snippet LinkItem({ href, icon, name }: AiOption)} + + {#snippet child({ props })} + {@const Icon = icon} +
+
+ + {name} + +
+
+ {/snippet} + +{/snippet} + +
+ + + + + + + + {@render LinkItem({ + href: rawUrl, + icon: Markdown, + name: "View as Markdown", + })} + {#each aiOptions as option (option.name)} + {@render LinkItem(option)} + {/each} + + + +
diff --git a/src/components/downloadSvg.svelte b/src/components/downloadSvg.svelte deleted file mode 100644 index cb784a6dd..000000000 --- a/src/components/downloadSvg.svelte +++ /dev/null @@ -1,298 +0,0 @@ - - -{#if typeof svgInfo.route === 'string' && svgInfo.wordmark === undefined} - -{:else} - - - - - - - Download {svgInfo.title} SVG - This logo has multiple options to download: - -
- {#if typeof svgInfo.route === 'string'} -
- {svgInfo.title} - -
- {:else} -
- {svgInfo.title} - - - - - -
- {/if} - - {#if typeof svgInfo.wordmark === 'string' && svgInfo.wordmark !== undefined} -
- {svgInfo.title} - -
- {/if} - - {#if typeof svgInfo.wordmark !== 'string' && svgInfo.wordmark !== undefined} -
- {svgInfo.title} - - - - - -
- {/if} -
- -

- Remember to request permission from the creators for the use of the SVG. Modification is - not allowed. -

-
-
-
-{/if} diff --git a/src/components/endpoints.svelte b/src/components/endpoints.svelte deleted file mode 100644 index 3548f981f..000000000 --- a/src/components/endpoints.svelte +++ /dev/null @@ -1,34 +0,0 @@ - - -
-
-

- {method} -

-
-

{title}

-

{description}

-
-
- -
diff --git a/src/components/extension.svelte b/src/components/extension.svelte new file mode 100644 index 000000000..fba351b4c --- /dev/null +++ b/src/components/extension.svelte @@ -0,0 +1,66 @@ + + +
+
+ +

{data.name}

+

+ {data.description} +

+
+ +
diff --git a/src/components/githubLink.svelte b/src/components/githubLink.svelte new file mode 100644 index 000000000..7d7481304 --- /dev/null +++ b/src/components/githubLink.svelte @@ -0,0 +1,40 @@ + + + + + + {stars >= 1000 ? `${(stars / 1000).toFixed(1)}k` : stars.toLocaleString()} + + diff --git a/src/components/grid.svelte b/src/components/grid.svelte index e7553d2c0..ad35050e5 100644 --- a/src/components/grid.svelte +++ b/src/components/grid.svelte @@ -1,5 +1,24 @@ + +
- + {@render children?.()}
diff --git a/src/components/headerLogoLink.svelte b/src/components/headerLogoLink.svelte deleted file mode 100644 index 2cf34e743..000000000 --- a/src/components/headerLogoLink.svelte +++ /dev/null @@ -1,54 +0,0 @@ - - - - - -
- - -
-
-
- - copyToClipboard()}> - - Copy as SVG - - openUrl('https://github.com/pheralb/svgl')}> - - Repository - - - - - v4.6.1 - - -
diff --git a/src/components/icons/angularIcon.svelte b/src/components/icons/angularIcon.svelte deleted file mode 100644 index ca36b3cf7..000000000 --- a/src/components/icons/angularIcon.svelte +++ /dev/null @@ -1,48 +0,0 @@ - - - - - diff --git a/src/components/icons/githubIcon.svelte b/src/components/icons/githubIcon.svelte deleted file mode 100644 index 8e8dc0067..000000000 --- a/src/components/icons/githubIcon.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - - - diff --git a/src/components/icons/logo.svelte b/src/components/icons/logo.svelte deleted file mode 100644 index 01fe48904..000000000 --- a/src/components/icons/logo.svelte +++ /dev/null @@ -1,60 +0,0 @@ - diff --git a/src/components/icons/raycastIcon.svelte b/src/components/icons/raycastIcon.svelte deleted file mode 100644 index 5b5a2df79..000000000 --- a/src/components/icons/raycastIcon.svelte +++ /dev/null @@ -1,22 +0,0 @@ - - - - - diff --git a/src/components/icons/reactIcon.svelte b/src/components/icons/reactIcon.svelte deleted file mode 100644 index 0d72163d9..000000000 --- a/src/components/icons/reactIcon.svelte +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - diff --git a/src/components/icons/svelteIcon.svelte b/src/components/icons/svelteIcon.svelte deleted file mode 100644 index f6d97d582..000000000 --- a/src/components/icons/svelteIcon.svelte +++ /dev/null @@ -1,19 +0,0 @@ - - - diff --git a/src/components/icons/vueIcon.svelte b/src/components/icons/vueIcon.svelte deleted file mode 100644 index 874834954..000000000 --- a/src/components/icons/vueIcon.svelte +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/src/components/icons/webComponentIcon.svelte b/src/components/icons/webComponentIcon.svelte deleted file mode 100644 index 5f2e920e9..000000000 --- a/src/components/icons/webComponentIcon.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - diff --git a/src/components/layout/header.svelte b/src/components/layout/header.svelte new file mode 100644 index 000000000..37da3f078 --- /dev/null +++ b/src/components/layout/header.svelte @@ -0,0 +1,72 @@ + + +
+ +
diff --git a/src/components/layout/showCategories.svelte b/src/components/layout/showCategories.svelte new file mode 100644 index 000000000..c1aab5dee --- /dev/null +++ b/src/components/layout/showCategories.svelte @@ -0,0 +1,40 @@ + + +{#each categories.sort() as category (category)} + +

{category}

+ + {categoryCounts[category]} + +
+{/each} diff --git a/src/components/layout/showSidebarLinks.svelte b/src/components/layout/showSidebarLinks.svelte new file mode 100644 index 000000000..5d2e263c3 --- /dev/null +++ b/src/components/layout/showSidebarLinks.svelte @@ -0,0 +1,108 @@ + + + + +

Home

+
+ +
+ +

Favorites

+
+ {#if favoritesCount > 0} + + {favoritesCount} + + {/if} +
+ + +

API

+
+ + +

shadcn/ui

+
+ + +

Extensions

+
+ + +

Submit SVG

+
+ + +

GitHub Repository

+
diff --git a/src/components/layout/sidebar.svelte b/src/components/layout/sidebar.svelte new file mode 100644 index 000000000..fbbf47052 --- /dev/null +++ b/src/components/layout/sidebar.svelte @@ -0,0 +1,30 @@ + + +
+ +
+ +
+
diff --git a/src/components/layout/sidebarBadgeClasses.ts b/src/components/layout/sidebarBadgeClasses.ts new file mode 100644 index 000000000..ee6d95b7c --- /dev/null +++ b/src/components/layout/sidebarBadgeClasses.ts @@ -0,0 +1,6 @@ +import { cn } from "@/utils/cn"; + +export const sidebarBadgeClasses = cn( + "animate-in zoom-in-20 fade-in", + "rounded-lg border border-neutral-300 bg-white px-2 py-0.5 font-mono text-xs font-medium text-neutral-600 shadow-sm dark:border-neutral-800 dark:bg-neutral-900 dark:text-neutral-400 drop-shadow", +); diff --git a/src/components/layout/sidebarItemClasses.ts b/src/components/layout/sidebarItemClasses.ts new file mode 100644 index 000000000..324f94cc1 --- /dev/null +++ b/src/components/layout/sidebarItemClasses.ts @@ -0,0 +1,13 @@ +import { cn } from "@/utils/cn"; + +export const sidebarItemClasses = { + base: cn( + "rounded-md px-2 py-1.5 h-8", + "flex w-full items-center justify-between space-x-3 text-sm", + "text-neutral-600 dark:text-neutral-400", + "hover:text-black dark:hover:text-white", + ), + active: cn( + "rounded-lg shadow-sm text-black dark:text-white border border-neutral-200 bg-white font-medium dark:border-neutral-800 dark:bg-neutral-800", + ), +}; diff --git a/src/components/layout/sidebarMobileMenu.svelte b/src/components/layout/sidebarMobileMenu.svelte new file mode 100644 index 000000000..9bc4851a8 --- /dev/null +++ b/src/components/layout/sidebarMobileMenu.svelte @@ -0,0 +1,42 @@ + + + + + + Open Menu + + + + + +

svgl

+
+
+ +
+
diff --git a/src/components/logos/angular.svelte b/src/components/logos/angular.svelte new file mode 100644 index 000000000..537cf727b --- /dev/null +++ b/src/components/logos/angular.svelte @@ -0,0 +1,67 @@ + + + + diff --git a/src/components/icons/astroIcon.svelte b/src/components/logos/astro.svelte similarity index 87% rename from src/components/icons/astroIcon.svelte rename to src/components/logos/astro.svelte index 3ab32deb1..06886d245 100644 --- a/src/components/icons/astroIcon.svelte +++ b/src/components/logos/astro.svelte @@ -1,14 +1,14 @@ + import type { IconProps } from "@/types/icon"; + + let props: IconProps = $props(); + + + + + + + + + + + + + + + diff --git a/src/components/logos/claude.svelte b/src/components/logos/claude.svelte new file mode 100644 index 000000000..e951084f8 --- /dev/null +++ b/src/components/logos/claude.svelte @@ -0,0 +1,17 @@ + + + + + diff --git a/src/components/logos/github.svelte b/src/components/logos/github.svelte new file mode 100644 index 000000000..2c2be58be --- /dev/null +++ b/src/components/logos/github.svelte @@ -0,0 +1,20 @@ + + + + diff --git a/src/components/logos/markdown.svelte b/src/components/logos/markdown.svelte new file mode 100644 index 000000000..8ad00f41b --- /dev/null +++ b/src/components/logos/markdown.svelte @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/src/components/logos/npm.svelte b/src/components/logos/npm.svelte new file mode 100644 index 000000000..8437d1d36 --- /dev/null +++ b/src/components/logos/npm.svelte @@ -0,0 +1,18 @@ + + + + + + diff --git a/src/components/logos/openai.svelte b/src/components/logos/openai.svelte new file mode 100644 index 000000000..ae4702710 --- /dev/null +++ b/src/components/logos/openai.svelte @@ -0,0 +1,18 @@ + + + + + diff --git a/src/components/logos/pnpm.svelte b/src/components/logos/pnpm.svelte new file mode 100644 index 000000000..426ad8a19 --- /dev/null +++ b/src/components/logos/pnpm.svelte @@ -0,0 +1,101 @@ + + + + + + diff --git a/src/components/logos/react.svelte b/src/components/logos/react.svelte new file mode 100644 index 000000000..0a7de38c3 --- /dev/null +++ b/src/components/logos/react.svelte @@ -0,0 +1,27 @@ + + + diff --git a/src/components/logos/shadcn.svelte b/src/components/logos/shadcn.svelte new file mode 100644 index 000000000..f9ccc88fc --- /dev/null +++ b/src/components/logos/shadcn.svelte @@ -0,0 +1,21 @@ + + + + + + diff --git a/src/components/logos/svelte.svelte b/src/components/logos/svelte.svelte new file mode 100644 index 000000000..ce36e3c0e --- /dev/null +++ b/src/components/logos/svelte.svelte @@ -0,0 +1,20 @@ + + + diff --git a/src/components/logos/svgl.svelte b/src/components/logos/svgl.svelte new file mode 100644 index 000000000..51c1a75c1 --- /dev/null +++ b/src/components/logos/svgl.svelte @@ -0,0 +1,18 @@ + + + + diff --git a/src/components/icons/xIcon.svelte b/src/components/logos/twitter.svelte similarity index 64% rename from src/components/icons/xIcon.svelte rename to src/components/logos/twitter.svelte index d5881800d..d74debbff 100644 --- a/src/components/icons/xIcon.svelte +++ b/src/components/logos/twitter.svelte @@ -1,19 +1,18 @@ + diff --git a/src/components/logos/v0.svelte b/src/components/logos/v0.svelte new file mode 100644 index 000000000..2581d22b2 --- /dev/null +++ b/src/components/logos/v0.svelte @@ -0,0 +1,19 @@ + + + + + diff --git a/src/components/logos/vue.svelte b/src/components/logos/vue.svelte new file mode 100644 index 000000000..d621c285f --- /dev/null +++ b/src/components/logos/vue.svelte @@ -0,0 +1,23 @@ + + + diff --git a/src/components/logos/webComponents.svelte b/src/components/logos/webComponents.svelte new file mode 100644 index 000000000..24e18bbc0 --- /dev/null +++ b/src/components/logos/webComponents.svelte @@ -0,0 +1,24 @@ + + + diff --git a/src/components/logos/yarn.svelte b/src/components/logos/yarn.svelte new file mode 100644 index 000000000..c19c38a05 --- /dev/null +++ b/src/components/logos/yarn.svelte @@ -0,0 +1,22 @@ + + + + + + diff --git a/src/components/modeToggle.svelte b/src/components/modeToggle.svelte new file mode 100644 index 000000000..b4d959ce7 --- /dev/null +++ b/src/components/modeToggle.svelte @@ -0,0 +1,41 @@ + + +Toggle theme + diff --git a/src/components/navbar.svelte b/src/components/navbar.svelte deleted file mode 100644 index c4c23d80e..000000000 --- a/src/components/navbar.svelte +++ /dev/null @@ -1,105 +0,0 @@ - - - diff --git a/src/components/notFound.svelte b/src/components/notFound.svelte deleted file mode 100644 index ea198cd46..000000000 --- a/src/components/notFound.svelte +++ /dev/null @@ -1,29 +0,0 @@ - - -
- -

Couldn't find the Icon

-

"{notFoundTerm}"

- -
diff --git a/src/components/pageCard.svelte b/src/components/pageCard.svelte new file mode 100644 index 000000000..bae893897 --- /dev/null +++ b/src/components/pageCard.svelte @@ -0,0 +1,34 @@ + + +
+
+
+ {@render children?.()} +
+
+
diff --git a/src/components/pageHeader.svelte b/src/components/pageHeader.svelte new file mode 100644 index 000000000..49648aec2 --- /dev/null +++ b/src/components/pageHeader.svelte @@ -0,0 +1,22 @@ + + +
+ {@render children?.()} +
diff --git a/src/components/search.svelte b/src/components/search.svelte index 15585c144..da58891ba 100644 --- a/src/components/search.svelte +++ b/src/components/search.svelte @@ -1,77 +1,83 @@ -
-
-
-
- -
+
+ + + {#if !searchValue} +
+ + K
- - {#if searchTerm.length > 0} -
- -
- {:else} -
-
- - K -
-
- {/if} -
+ {/if}
diff --git a/src/components/settings/options/optimizeSvgs.svelte b/src/components/settings/options/optimizeSvgs.svelte new file mode 100644 index 000000000..19e5bfe80 --- /dev/null +++ b/src/components/settings/options/optimizeSvgs.svelte @@ -0,0 +1,19 @@ + + +
+ + +
diff --git a/src/components/settings/options/selectPkgManager.svelte b/src/components/settings/options/selectPkgManager.svelte new file mode 100644 index 000000000..02fc2074c --- /dev/null +++ b/src/components/settings/options/selectPkgManager.svelte @@ -0,0 +1,46 @@ + + + + + {#if managers[pkg]} + {@const { Icon, label } = managers[pkg]} +
+ + {label} +
+ {/if} +
+ + {#each Object.entries(managers) as [value, { Icon, label }] (value)} + settingsStore.setPackageManager(value as PackageManager)} + > + + {label} + + {/each} + +
diff --git a/src/components/settings/settingsCard.svelte b/src/components/settings/settingsCard.svelte new file mode 100644 index 000000000..ccddd872c --- /dev/null +++ b/src/components/settings/settingsCard.svelte @@ -0,0 +1,19 @@ + + +
+

{title}

+

+ {description} +

+ {@render children?.()} +
diff --git a/src/components/settings/settingsMenu.svelte b/src/components/settings/settingsMenu.svelte new file mode 100644 index 000000000..c61acc994 --- /dev/null +++ b/src/components/settings/settingsMenu.svelte @@ -0,0 +1,61 @@ + + + + + + + + + Settings + Customize your preferences. + + +
+ + + + + + +
+ + + + Save + + +
+
diff --git a/src/components/svgCard.svelte b/src/components/svgCard.svelte deleted file mode 100644 index c567d4ed3..000000000 --- a/src/components/svgCard.svelte +++ /dev/null @@ -1,239 +0,0 @@ - - -
- - {#if wordmarkSvg == true && svgInfo.wordmark !== undefined} - {svgInfo.title} - {svgInfo.title} - {:else} - {svgInfo.title} - {svgInfo.title} - {/if} - -
-

- {svgInfo.title} -

-
- {#if Array.isArray(svgInfo.category)} - {#each svgInfo.category.slice(0, maxVisibleCategories) as c, index} - {c} - {/each} - - {#if svgInfo.category.length > maxVisibleCategories} - (moreTagsOptions = isOpen)} - > - - {#if moreTagsOptions} - - {:else} - - {/if} - - -

More tags:

- {#each svgInfo.category.slice(maxVisibleCategories) as c} - - - {c} - - {/each} -
-
- {/if} - {:else} - - {svgInfo.category} - - {/if} -
-
- -
- {#if isInFigma} - - {/if} - - {#if wordmarkSvg && svgInfo.wordmark !== undefined} - - {:else} - - {/if} - - { - const dark = document.documentElement.classList.contains('dark'); - return dark; - }} - /> - - - - - {#if svgInfo.wordmark !== undefined} - - {/if} - {#if svgInfo.brandUrl !== undefined} - - - - {/if} -
-
diff --git a/src/components/svgs/addToFavorite.svelte b/src/components/svgs/addToFavorite.svelte new file mode 100644 index 000000000..a933148c8 --- /dev/null +++ b/src/components/svgs/addToFavorite.svelte @@ -0,0 +1,41 @@ + + + diff --git a/src/components/svgs/copyShadcnCommand.svelte b/src/components/svgs/copyShadcnCommand.svelte new file mode 100644 index 000000000..e8c46e1cd --- /dev/null +++ b/src/components/svgs/copyShadcnCommand.svelte @@ -0,0 +1,59 @@ + + + + diff --git a/src/components/copySvg.svelte b/src/components/svgs/copySvg.svelte similarity index 50% rename from src/components/copySvg.svelte rename to src/components/svgs/copySvg.svelte index 6bfda42ad..28261bd16 100644 --- a/src/components/copySvg.svelte +++ b/src/components/svgs/copySvg.svelte @@ -1,76 +1,98 @@ - (optionsOpen = isOpen)}> + {#if optionsOpen} - + {:else if isLoading} - + {:else} - + {/if} - - Source -
+ +
+ Source + + + +
+
- + - + - + - + - + - - + +
+ +
- + +
+
+ + +
+
+
- - +
+
- + - +
+
- - +
+
- +
+
- +
+
- +
@@ -506,8 +576,8 @@ class="mt-1 flex w-full items-center text-center text-[12px] text-neutral-600 dark:text-neutral-400" >

- Remember to request permission from the creators for the use of the SVG. Modification is not - allowed. + Please ensure you have permission from the creators before using the + SVG. Modifications are not permitted.

diff --git a/src/components/svgs/downloadSvg.svelte b/src/components/svgs/downloadSvg.svelte new file mode 100644 index 000000000..75d39d382 --- /dev/null +++ b/src/components/svgs/downloadSvg.svelte @@ -0,0 +1,321 @@ + + +{#if typeof svgInfo.route === "string" && svgInfo.wordmark === undefined} + +{:else} + + + + + + + Download {svgInfo.title} SVGs + + This logo has multiple options to download: + + +
+ {#if typeof svgInfo.route === "string"} +
+ {svgInfo.title} + +
+ {:else} +
+ {svgInfo.title} + + + + + +
+ {/if} + + {#if typeof svgInfo.wordmark === "string" && svgInfo.wordmark !== undefined} +
+ {svgInfo.title} + +
+ {/if} + + {#if typeof svgInfo.wordmark !== "string" && svgInfo.wordmark !== undefined} +
+ {svgInfo.title} + + + + + +
+ {/if} +
+ +
+

+ Please ensure you have permission from the creators before using the + SVG. Modifications are not permitted. +

+
+
+
+
+{/if} diff --git a/src/components/svgs/sortSvgs.svelte b/src/components/svgs/sortSvgs.svelte new file mode 100644 index 000000000..434809a0f --- /dev/null +++ b/src/components/svgs/sortSvgs.svelte @@ -0,0 +1,51 @@ + + + diff --git a/src/components/svgs/svgCard.svelte b/src/components/svgs/svgCard.svelte new file mode 100644 index 000000000..3d97a4697 --- /dev/null +++ b/src/components/svgs/svgCard.svelte @@ -0,0 +1,237 @@ + + +
+ +
+ {#if svgInfo.brandUrl !== undefined} + + + + {/if} + +
+ + {#if wordmarkSvg && svgInfo.wordmark !== undefined} + {svgInfo.title} + {svgInfo.title} + {:else} + {svgInfo.title} + {svgInfo.title} + {/if} + +
+

+ {svgInfo.title} +

+
+ {#if Array.isArray(svgInfo.category)} + {#each svgInfo.category.slice(0, maxVisibleCategories) as c (c)} + + {c} + + {/each} + {#if svgInfo.category.length > maxVisibleCategories} + (moreTagsOptions = isOpen)} + > + + {#if moreTagsOptions} + + {:else} + + {/if} + + +

More tags

+ {#each svgInfo.category.slice(maxVisibleCategories) as c (c)} + + + {c} + + {/each} +
+
+ {/if} + {:else} + + {svgInfo.category} + + {/if} +
+
+ +
+ {#if wordmarkSvg && svgInfo.wordmark !== undefined} + + {:else} + + {/if} + + mode.current === "dark"} /> + + + + + {#if svgInfo.wordmark !== undefined} + + {/if} +
+
diff --git a/src/components/svgs/svgNotFound.svelte b/src/components/svgs/svgNotFound.svelte new file mode 100644 index 000000000..6a86d9d35 --- /dev/null +++ b/src/components/svgs/svgNotFound.svelte @@ -0,0 +1,57 @@ + + +
+ +

SVG not found

+ {#if category} +

+ "{svgTitle}" not found in "{category}" category +

+ {:else} +

+ "{svgTitle}" not found +

+ {/if} +
+ {#if category || searchGlobally} + + + Search globally + + {/if} + + Request SVG + + + + Submit SVG + + +
+
diff --git a/src/components/tableOfContents/tableOfContents.svelte b/src/components/tableOfContents/tableOfContents.svelte new file mode 100644 index 000000000..aadae7643 --- /dev/null +++ b/src/components/tableOfContents/tableOfContents.svelte @@ -0,0 +1,28 @@ + + +
+ {#each toc as tocItem (tocItem.id)} + + {tocItem.text} + + {/each} +
diff --git a/src/components/tableOfContents/toc.types.ts b/src/components/tableOfContents/toc.types.ts new file mode 100644 index 000000000..e6547acf0 --- /dev/null +++ b/src/components/tableOfContents/toc.types.ts @@ -0,0 +1,6 @@ +import type { ToCItem } from "@/markdown/generateToC"; + +export interface TableOfContentsProps { + toc: ToCItem[]; + className?: string; +} diff --git a/src/components/theme.svelte b/src/components/theme.svelte deleted file mode 100644 index cbfb0d328..000000000 --- a/src/components/theme.svelte +++ /dev/null @@ -1,14 +0,0 @@ - - - diff --git a/src/components/transition.svelte b/src/components/transition.svelte deleted file mode 100644 index 4c94fb1f5..000000000 --- a/src/components/transition.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - -{#key pathname} -
- -
-{/key} diff --git a/src/components/ui/badge/badge.svelte b/src/components/ui/badge/badge.svelte new file mode 100644 index 000000000..dac875253 --- /dev/null +++ b/src/components/ui/badge/badge.svelte @@ -0,0 +1,35 @@ + + + + + + {@render children?.()} + diff --git a/src/components/ui/badge/badge.variants.ts b/src/components/ui/badge/badge.variants.ts new file mode 100644 index 000000000..9052aa6a5 --- /dev/null +++ b/src/components/ui/badge/badge.variants.ts @@ -0,0 +1,34 @@ +import { tv } from "tailwind-variants"; + +const badgeVariants = tv({ + base: "inline-flex items-center cursor-default gap-1.5 font-medium rounded-full border transition-colors hover:text-black dark:hover:text-white ease-in-out", + variants: { + variant: { + default: + "bg-neutral-100 text-neutral-800 border-neutral-200 dark:bg-neutral-800 dark:text-neutral-100 dark:border-neutral-700", + primary: + "bg-neutral-800 text-neutral-50 border-neutral-700 dark:bg-neutral-700 dark:text-neutral-50 dark:border-neutral-600", + secondary: + "bg-neutral-200 text-neutral-700 border-neutral-300 dark:bg-neutral-700 dark:text-neutral-200 dark:border-neutral-600", + success: + "bg-green-100 text-green-800 border-green-200 dark:bg-green-900 dark:text-green-100 dark:border-green-800", + warning: + "bg-amber-100 text-amber-800 border-amber-200 dark:bg-amber-900 dark:text-amber-100 dark:border-amber-800", + danger: + "bg-red-100 text-red-800 border-red-200 dark:bg-red-900 dark:text-red-100 dark:border-red-800", + outline: + "bg-transparent border border-neutral-300 text-neutral-700 dark:border-neutral-800 dark:text-neutral-400", + }, + size: { + sm: "text-xs px-2 py-0.5", + md: "text-sm px-2.5 py-0.5", + lg: "text-base px-3 py-1", + }, + }, + defaultVariants: { + variant: "default", + size: "sm", + }, +}); + +export { badgeVariants }; diff --git a/src/components/ui/badge/index.ts b/src/components/ui/badge/index.ts new file mode 100644 index 000000000..36c78f762 --- /dev/null +++ b/src/components/ui/badge/index.ts @@ -0,0 +1,2 @@ +export { default as Badge } from "./badge.svelte"; +export { badgeVariants } from "./badge.variants"; diff --git a/src/components/ui/button/button.svelte b/src/components/ui/button/button.svelte new file mode 100644 index 000000000..001239a83 --- /dev/null +++ b/src/components/ui/button/button.svelte @@ -0,0 +1,60 @@ + + + + +{#if href} + + {@render children?.()} + +{:else} + +{/if} diff --git a/src/components/ui/button/button.variants.ts b/src/components/ui/button/button.variants.ts new file mode 100644 index 000000000..b013d3346 --- /dev/null +++ b/src/components/ui/button/button.variants.ts @@ -0,0 +1,34 @@ +import { tv } from "tailwind-variants"; + +const buttonVariants = tv({ + base: "inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-neutral-300 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 dark:focus-visible:ring-neutral-700", + variants: { + variant: { + default: + "bg-neutral-900 text-neutral-50 shadow hover:bg-neutral-900/90 dark:bg-neutral-800 dark:text-neutral-50 dark:hover:bg-neutral-800/70", + radial: + "bg-radial-[at_52%_-52%] **:[text-shadow:0_1px_0_var(--color-neutral-950)] border-neutral-950 from-neutral-950/70 to-neutral-950/95 text-white inset-shadow-2xs inset-shadow-white/25 border text-sm shadow-md shadow-neutral-950/30 ring-0 transition-[filter] duration-200 hover:brightness-125 active:brightness-95 dark:bg-white dark:text-neutral-50 dark:shadow-none dark:border-0", + destructive: + "bg-red-500 text-neutral-50 shadow-sm hover:bg-red-500/90 dark:bg-red-900 dark:text-neutral-50 dark:hover:bg-red-900/90", + outline: + "border border-neutral-200 bg-white hover:bg-neutral-100 hover:text-neutral-900 dark:border-neutral-800 dark:bg-neutral-900 dark:hover:bg-neutral-800 dark:hover:text-neutral-50 hover:border-neutral-300 dark:hover:border-neutral-700 shadow-none", + secondary: + "bg-neutral-100 text-neutral-900 shadow-sm hover:bg-neutral-100/80 dark:bg-neutral-800 dark:text-neutral-50 dark:hover:bg-neutral-800/80", + ghost: + "hover:bg-neutral-100 hover:text-neutral-900 dark:hover:bg-neutral-800 dark:hover:text-neutral-50", + link: "text-neutral-900 underline-offset-4 hover:underline dark:text-neutral-50", + }, + 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 { buttonVariants }; diff --git a/src/components/ui/button/index.ts b/src/components/ui/button/index.ts new file mode 100644 index 000000000..83b96ae86 --- /dev/null +++ b/src/components/ui/button/index.ts @@ -0,0 +1,17 @@ +import Root, { + type ButtonProps, + type ButtonSize, + type ButtonVariant, +} from "./button.svelte"; + +import { buttonVariants } from "./button.variants"; + +export { + Root, + type ButtonProps as Props, + Root as Button, + buttonVariants, + type ButtonProps, + type ButtonSize, + type ButtonVariant, +}; diff --git a/src/components/ui/collapsible/collapsible-content.svelte b/src/components/ui/collapsible/collapsible-content.svelte new file mode 100644 index 000000000..6c9f34ea1 --- /dev/null +++ b/src/components/ui/collapsible/collapsible-content.svelte @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/collapsible/collapsible-trigger.svelte b/src/components/ui/collapsible/collapsible-trigger.svelte new file mode 100644 index 000000000..ab2ce1f34 --- /dev/null +++ b/src/components/ui/collapsible/collapsible-trigger.svelte @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/collapsible/collapsible.svelte b/src/components/ui/collapsible/collapsible.svelte new file mode 100644 index 000000000..ac14155fb --- /dev/null +++ b/src/components/ui/collapsible/collapsible.svelte @@ -0,0 +1,16 @@ + + + diff --git a/src/components/ui/collapsible/index.ts b/src/components/ui/collapsible/index.ts new file mode 100644 index 000000000..296a91b0c --- /dev/null +++ b/src/components/ui/collapsible/index.ts @@ -0,0 +1,13 @@ +import Root from "./collapsible.svelte"; +import Trigger from "./collapsible-trigger.svelte"; +import Content from "./collapsible-content.svelte"; + +export { + Root, + Content, + Trigger, + // + Root as Collapsible, + Content as CollapsibleContent, + Trigger as CollapsibleTrigger, +}; diff --git a/src/components/ui/dialog/dialog-close.svelte b/src/components/ui/dialog/dialog-close.svelte new file mode 100644 index 000000000..a0b8586c3 --- /dev/null +++ b/src/components/ui/dialog/dialog-close.svelte @@ -0,0 +1,8 @@ + + + diff --git a/src/components/ui/dialog/dialog-content.svelte b/src/components/ui/dialog/dialog-content.svelte new file mode 100644 index 000000000..6dfed298b --- /dev/null +++ b/src/components/ui/dialog/dialog-content.svelte @@ -0,0 +1,50 @@ + + + + + + {@render children?.()} + {#if showCloseButton} + + + Close + + {/if} + + diff --git a/src/components/ui/dialog/dialog-description.svelte b/src/components/ui/dialog/dialog-description.svelte new file mode 100644 index 000000000..522d06a24 --- /dev/null +++ b/src/components/ui/dialog/dialog-description.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/components/ui/dialog/dialog-footer.svelte b/src/components/ui/dialog/dialog-footer.svelte new file mode 100644 index 000000000..c527ad654 --- /dev/null +++ b/src/components/ui/dialog/dialog-footer.svelte @@ -0,0 +1,24 @@ + + +
+ {@render children?.()} +
diff --git a/src/components/ui/dialog/dialog-header.svelte b/src/components/ui/dialog/dialog-header.svelte new file mode 100644 index 000000000..45cd4c8e0 --- /dev/null +++ b/src/components/ui/dialog/dialog-header.svelte @@ -0,0 +1,21 @@ + + +
+ {@render children?.()} +
diff --git a/src/components/ui/dialog/dialog-overlay.svelte b/src/components/ui/dialog/dialog-overlay.svelte new file mode 100644 index 000000000..3af871d6f --- /dev/null +++ b/src/components/ui/dialog/dialog-overlay.svelte @@ -0,0 +1,20 @@ + + + diff --git a/src/components/ui/dialog/dialog-title.svelte b/src/components/ui/dialog/dialog-title.svelte new file mode 100644 index 000000000..8a8d2359b --- /dev/null +++ b/src/components/ui/dialog/dialog-title.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/components/ui/dialog/dialog-trigger.svelte b/src/components/ui/dialog/dialog-trigger.svelte new file mode 100644 index 000000000..f7ae9b4e4 --- /dev/null +++ b/src/components/ui/dialog/dialog-trigger.svelte @@ -0,0 +1,8 @@ + + + diff --git a/src/components/ui/dialog/index.ts b/src/components/ui/dialog/index.ts new file mode 100644 index 000000000..07515e7d4 --- /dev/null +++ b/src/components/ui/dialog/index.ts @@ -0,0 +1,37 @@ +import { Dialog as DialogPrimitive } from "bits-ui"; + +import Title from "./dialog-title.svelte"; +import Footer from "./dialog-footer.svelte"; +import Header from "./dialog-header.svelte"; +import Overlay from "./dialog-overlay.svelte"; +import Content from "./dialog-content.svelte"; +import Description from "./dialog-description.svelte"; +import Trigger from "./dialog-trigger.svelte"; +import Close from "./dialog-close.svelte"; + +const Root = DialogPrimitive.Root; +const Portal = DialogPrimitive.Portal; + +export { + Root, + Title, + Portal, + Footer, + Header, + Trigger, + Overlay, + Content, + Description, + Close, + // + Root as Dialog, + Title as DialogTitle, + Portal as DialogPortal, + Footer as DialogFooter, + Header as DialogHeader, + Trigger as DialogTrigger, + Overlay as DialogOverlay, + Content as DialogContent, + Description as DialogDescription, + Close as DialogClose, +}; diff --git a/src/components/ui/dropdown-menu/dropdown-menu-content.svelte b/src/components/ui/dropdown-menu/dropdown-menu-content.svelte new file mode 100644 index 000000000..d0d9864eb --- /dev/null +++ b/src/components/ui/dropdown-menu/dropdown-menu-content.svelte @@ -0,0 +1,27 @@ + + + + + diff --git a/src/components/ui/dropdown-menu/dropdown-menu-group.svelte b/src/components/ui/dropdown-menu/dropdown-menu-group.svelte new file mode 100644 index 000000000..2473b77ba --- /dev/null +++ b/src/components/ui/dropdown-menu/dropdown-menu-group.svelte @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/dropdown-menu/dropdown-menu-item.svelte b/src/components/ui/dropdown-menu/dropdown-menu-item.svelte new file mode 100644 index 000000000..4287a08be --- /dev/null +++ b/src/components/ui/dropdown-menu/dropdown-menu-item.svelte @@ -0,0 +1,27 @@ + + + diff --git a/src/components/ui/dropdown-menu/dropdown-menu-label.svelte b/src/components/ui/dropdown-menu/dropdown-menu-label.svelte new file mode 100644 index 000000000..a32cf9402 --- /dev/null +++ b/src/components/ui/dropdown-menu/dropdown-menu-label.svelte @@ -0,0 +1,25 @@ + + +
+ {@render children?.()} +
diff --git a/src/components/ui/dropdown-menu/dropdown-menu-separator.svelte b/src/components/ui/dropdown-menu/dropdown-menu-separator.svelte new file mode 100644 index 000000000..cd8cb1ee0 --- /dev/null +++ b/src/components/ui/dropdown-menu/dropdown-menu-separator.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte b/src/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte new file mode 100644 index 000000000..fc78b7343 --- /dev/null +++ b/src/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte @@ -0,0 +1,24 @@ + + + + {@render children?.()} + diff --git a/src/components/ui/dropdown-menu/dropdown-menu-trigger.svelte b/src/components/ui/dropdown-menu/dropdown-menu-trigger.svelte new file mode 100644 index 000000000..a52fb993c --- /dev/null +++ b/src/components/ui/dropdown-menu/dropdown-menu-trigger.svelte @@ -0,0 +1,14 @@ + + + diff --git a/src/components/ui/dropdown-menu/index.ts b/src/components/ui/dropdown-menu/index.ts new file mode 100644 index 000000000..06eafa0db --- /dev/null +++ b/src/components/ui/dropdown-menu/index.ts @@ -0,0 +1,33 @@ +import { DropdownMenu as DropdownMenuPrimitive } from "bits-ui"; + +import Item from "./dropdown-menu-item.svelte"; +import Label from "./dropdown-menu-label.svelte"; +import Group from "./dropdown-menu-group.svelte"; +import Trigger from "./dropdown-menu-trigger.svelte"; +import Content from "./dropdown-menu-content.svelte"; +import Shortcut from "./dropdown-menu-shortcut.svelte"; +import Separator from "./dropdown-menu-separator.svelte"; + +const Sub = DropdownMenuPrimitive.Sub; +const Root = DropdownMenuPrimitive.Root; + +export { + Content, + Root as DropdownMenu, + Content as DropdownMenuContent, + Group as DropdownMenuGroup, + Item as DropdownMenuItem, + Separator as DropdownMenuSeparator, + Shortcut as DropdownMenuShortcut, + Label as DropdownMenuLabel, + Sub as DropdownMenuSub, + Trigger as DropdownMenuTrigger, + Group, + Item, + Root, + Separator, + Shortcut, + Sub, + Trigger, + Label, +}; diff --git a/src/components/ui/input/index.ts b/src/components/ui/input/index.ts new file mode 100644 index 000000000..8e038bd8d --- /dev/null +++ b/src/components/ui/input/index.ts @@ -0,0 +1,4 @@ +import Root from "./input.svelte"; +import { inputStyles } from "./input.styles"; + +export { Root, Root as Input, inputStyles }; diff --git a/src/components/ui/input/input.styles.ts b/src/components/ui/input/input.styles.ts new file mode 100644 index 000000000..3fd20ba08 --- /dev/null +++ b/src/components/ui/input/input.styles.ts @@ -0,0 +1,7 @@ +import { cn } from "@/utils/cn"; + +export const inputStyles = cn( + "flex h-9 w-full min-w-0 rounded-md border border-neutral-200 bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none selection:bg-neutral-900 selection:text-neutral-50 file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-neutral-950 placeholder:text-neutral-500 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:border-neutral-800 dark:bg-neutral-200/30 dark:dark:bg-neutral-800/30 dark:selection:bg-neutral-50 dark:selection:text-neutral-900 dark:file:text-neutral-50 dark:placeholder:text-neutral-400", + "focus-visible:border-neutral-950 focus-visible:ring-[3px] focus-visible:ring-neutral-950/50 dark:focus-visible:border-neutral-300 dark:focus-visible:ring-neutral-300/50", + "aria-invalid:border-red-500 aria-invalid:ring-red-500/20 dark:aria-invalid:border-red-900 dark:aria-invalid:ring-red-900/20 dark:dark:aria-invalid:ring-red-900/40", +); diff --git a/src/components/ui/input/input.svelte b/src/components/ui/input/input.svelte new file mode 100644 index 000000000..5136823f8 --- /dev/null +++ b/src/components/ui/input/input.svelte @@ -0,0 +1,38 @@ + + + diff --git a/src/components/ui/moving-icons/boxes-icon.svelte b/src/components/ui/moving-icons/boxes-icon.svelte new file mode 100644 index 000000000..d11fd9bfa --- /dev/null +++ b/src/components/ui/moving-icons/boxes-icon.svelte @@ -0,0 +1,96 @@ + + + + + diff --git a/src/components/ui/moving-icons/house-icon.svelte b/src/components/ui/moving-icons/house-icon.svelte new file mode 100644 index 000000000..f23e9709a --- /dev/null +++ b/src/components/ui/moving-icons/house-icon.svelte @@ -0,0 +1,88 @@ + + + + + diff --git a/src/components/ui/moving-icons/send-icon.svelte b/src/components/ui/moving-icons/send-icon.svelte new file mode 100644 index 000000000..4b6d6492f --- /dev/null +++ b/src/components/ui/moving-icons/send-icon.svelte @@ -0,0 +1,88 @@ + + + + + diff --git a/src/ui/popover/index.ts b/src/components/ui/popover/index.ts similarity index 52% rename from src/ui/popover/index.ts rename to src/components/ui/popover/index.ts index ad14bcd07..5eba297cf 100644 --- a/src/ui/popover/index.ts +++ b/src/components/ui/popover/index.ts @@ -1,7 +1,7 @@ -import { Popover as PopoverPrimitive } from 'bits-ui'; -import Content from './popover-content.svelte'; +import { Popover as PopoverPrimitive } from "bits-ui"; +import Content from "./popover-content.svelte"; +import Trigger from "./popover-trigger.svelte"; const Root = PopoverPrimitive.Root; -const Trigger = PopoverPrimitive.Trigger; const Close = PopoverPrimitive.Close; export { @@ -9,8 +9,9 @@ export { Content, Trigger, Close, + // Root as Popover, Content as PopoverContent, Trigger as PopoverTrigger, - Close as PopoverClose + Close as PopoverClose, }; diff --git a/src/components/ui/popover/popover-content.svelte b/src/components/ui/popover/popover-content.svelte new file mode 100644 index 000000000..ee4735bc5 --- /dev/null +++ b/src/components/ui/popover/popover-content.svelte @@ -0,0 +1,29 @@ + + + + + diff --git a/src/components/ui/popover/popover-trigger.svelte b/src/components/ui/popover/popover-trigger.svelte new file mode 100644 index 000000000..e20f5a0e3 --- /dev/null +++ b/src/components/ui/popover/popover-trigger.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/components/ui/select/index.ts b/src/components/ui/select/index.ts new file mode 100644 index 000000000..5bf44e747 --- /dev/null +++ b/src/components/ui/select/index.ts @@ -0,0 +1,25 @@ +import { Select as SelectPrimitive } from "bits-ui"; + +import Group from "./select-group.svelte"; +import Label from "./select-label.svelte"; +import Item from "./select-item.svelte"; +import Content from "./select-content.svelte"; +import Trigger from "./select-trigger.svelte"; + +const Root = SelectPrimitive.Root; + +export { + Root, + Group, + Label, + Item, + Content, + Trigger, + // + Root as Select, + Group as SelectGroup, + Label as SelectLabel, + Item as SelectItem, + Content as SelectContent, + Trigger as SelectTrigger, +}; diff --git a/src/components/ui/select/select-content.svelte b/src/components/ui/select/select-content.svelte new file mode 100644 index 000000000..d3ee61e1c --- /dev/null +++ b/src/components/ui/select/select-content.svelte @@ -0,0 +1,38 @@ + + + + + + {@render children?.()} + + + diff --git a/src/components/ui/select/select-group.svelte b/src/components/ui/select/select-group.svelte new file mode 100644 index 000000000..ac75b867f --- /dev/null +++ b/src/components/ui/select/select-group.svelte @@ -0,0 +1,8 @@ + + + diff --git a/src/components/ui/select/select-item.svelte b/src/components/ui/select/select-item.svelte new file mode 100644 index 000000000..9b95ae4c2 --- /dev/null +++ b/src/components/ui/select/select-item.svelte @@ -0,0 +1,40 @@ + + + + {#snippet children({ selected, highlighted })} + + {#if selected} + + {/if} + + {#if childrenProp} + {@render childrenProp({ selected, highlighted })} + {:else} + {label || value} + {/if} + {/snippet} + diff --git a/src/components/ui/select/select-label.svelte b/src/components/ui/select/select-label.svelte new file mode 100644 index 000000000..58a7efef1 --- /dev/null +++ b/src/components/ui/select/select-label.svelte @@ -0,0 +1,24 @@ + + +
+ {@render children?.()} +
diff --git a/src/components/ui/select/select-trigger.svelte b/src/components/ui/select/select-trigger.svelte new file mode 100644 index 000000000..241bac088 --- /dev/null +++ b/src/components/ui/select/select-trigger.svelte @@ -0,0 +1,28 @@ + + + + {@render children?.()} + + diff --git a/src/components/ui/separator/index.ts b/src/components/ui/separator/index.ts new file mode 100644 index 000000000..82442d2cd --- /dev/null +++ b/src/components/ui/separator/index.ts @@ -0,0 +1,7 @@ +import Root from "./separator.svelte"; + +export { + Root, + // + Root as Separator, +}; diff --git a/src/components/ui/separator/separator.svelte b/src/components/ui/separator/separator.svelte new file mode 100644 index 000000000..44bfd63f9 --- /dev/null +++ b/src/components/ui/separator/separator.svelte @@ -0,0 +1,20 @@ + + + diff --git a/src/components/ui/sheet/index.ts b/src/components/ui/sheet/index.ts new file mode 100644 index 000000000..ffa765d8e --- /dev/null +++ b/src/components/ui/sheet/index.ts @@ -0,0 +1,36 @@ +import { Dialog as SheetPrimitive } from "bits-ui"; +import Trigger from "./sheet-trigger.svelte"; +import Close from "./sheet-close.svelte"; +import Overlay from "./sheet-overlay.svelte"; +import Content from "./sheet-content.svelte"; +import Header from "./sheet-header.svelte"; +import Footer from "./sheet-footer.svelte"; +import Title from "./sheet-title.svelte"; +import Description from "./sheet-description.svelte"; + +const Root = SheetPrimitive.Root; +const Portal = SheetPrimitive.Portal; + +export { + Root, + Close, + Trigger, + Portal, + Overlay, + Content, + Header, + Footer, + Title, + Description, + // + Root as Sheet, + Close as SheetClose, + Trigger as SheetTrigger, + Portal as SheetPortal, + Overlay as SheetOverlay, + Content as SheetContent, + Header as SheetHeader, + Footer as SheetFooter, + Title as SheetTitle, + Description as SheetDescription, +}; diff --git a/src/components/ui/sheet/sheet-close.svelte b/src/components/ui/sheet/sheet-close.svelte new file mode 100644 index 000000000..3edf36804 --- /dev/null +++ b/src/components/ui/sheet/sheet-close.svelte @@ -0,0 +1,8 @@ + + + diff --git a/src/components/ui/sheet/sheet-content.svelte b/src/components/ui/sheet/sheet-content.svelte new file mode 100644 index 000000000..918a5c78f --- /dev/null +++ b/src/components/ui/sheet/sheet-content.svelte @@ -0,0 +1,45 @@ + + + + + + {@render children?.()} + + + Close + + + diff --git a/src/components/ui/sheet/sheet-description.svelte b/src/components/ui/sheet/sheet-description.svelte new file mode 100644 index 000000000..92a785b25 --- /dev/null +++ b/src/components/ui/sheet/sheet-description.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/components/ui/sheet/sheet-footer.svelte b/src/components/ui/sheet/sheet-footer.svelte new file mode 100644 index 000000000..294fb5e72 --- /dev/null +++ b/src/components/ui/sheet/sheet-footer.svelte @@ -0,0 +1,21 @@ + + +
+ {@render children?.()} +
diff --git a/src/components/ui/sheet/sheet-header.svelte b/src/components/ui/sheet/sheet-header.svelte new file mode 100644 index 000000000..570da7987 --- /dev/null +++ b/src/components/ui/sheet/sheet-header.svelte @@ -0,0 +1,21 @@ + + +
+ {@render children?.()} +
diff --git a/src/components/ui/sheet/sheet-overlay.svelte b/src/components/ui/sheet/sheet-overlay.svelte new file mode 100644 index 000000000..45faf9d8a --- /dev/null +++ b/src/components/ui/sheet/sheet-overlay.svelte @@ -0,0 +1,20 @@ + + + diff --git a/src/components/ui/sheet/sheet-title.svelte b/src/components/ui/sheet/sheet-title.svelte new file mode 100644 index 000000000..174722e6c --- /dev/null +++ b/src/components/ui/sheet/sheet-title.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/components/ui/sheet/sheet-trigger.svelte b/src/components/ui/sheet/sheet-trigger.svelte new file mode 100644 index 000000000..417d73f69 --- /dev/null +++ b/src/components/ui/sheet/sheet-trigger.svelte @@ -0,0 +1,8 @@ + + + diff --git a/src/components/ui/sheet/sheet.variants.ts b/src/components/ui/sheet/sheet.variants.ts new file mode 100644 index 000000000..a09f5d8df --- /dev/null +++ b/src/components/ui/sheet/sheet.variants.ts @@ -0,0 +1,22 @@ +import { tv, type VariantProps } from "tailwind-variants"; + +const sheetVariants = tv({ + base: "bg-white dark:bg-neutral-900 border-neutral-200 dark:border-neutral-800 data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500", + variants: { + side: { + top: "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b", + bottom: + "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t", + left: "data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm", + right: + "data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm", + }, + }, + defaultVariants: { + side: "left", + }, +}); + +type Side = VariantProps["side"]; + +export { sheetVariants, type Side }; diff --git a/src/components/ui/sonner/index.ts b/src/components/ui/sonner/index.ts new file mode 100644 index 000000000..1ad9f4a2a --- /dev/null +++ b/src/components/ui/sonner/index.ts @@ -0,0 +1 @@ +export { default as Toaster } from "./sonner.svelte"; diff --git a/src/components/ui/sonner/sonner.svelte b/src/components/ui/sonner/sonner.svelte new file mode 100644 index 000000000..354493fe1 --- /dev/null +++ b/src/components/ui/sonner/sonner.svelte @@ -0,0 +1,31 @@ + + + diff --git a/src/components/ui/switch/index.ts b/src/components/ui/switch/index.ts new file mode 100644 index 000000000..284485969 --- /dev/null +++ b/src/components/ui/switch/index.ts @@ -0,0 +1,3 @@ +import Root from "./switch.svelte"; + +export { Root, Root as Switch }; diff --git a/src/components/ui/switch/switch.svelte b/src/components/ui/switch/switch.svelte new file mode 100644 index 000000000..5bb7c10e1 --- /dev/null +++ b/src/components/ui/switch/switch.svelte @@ -0,0 +1,31 @@ + + + + + diff --git a/src/components/ui/tabs/index.ts b/src/components/ui/tabs/index.ts new file mode 100644 index 000000000..4c728b6e3 --- /dev/null +++ b/src/components/ui/tabs/index.ts @@ -0,0 +1,16 @@ +import Root from "./tabs.svelte"; +import Content from "./tabs-content.svelte"; +import List from "./tabs-list.svelte"; +import Trigger from "./tabs-trigger.svelte"; + +export { + Root, + Content, + List, + Trigger, + // + Root as Tabs, + Content as TabsContent, + List as TabsList, + Trigger as TabsTrigger, +}; diff --git a/src/components/ui/tabs/tabs-content.svelte b/src/components/ui/tabs/tabs-content.svelte new file mode 100644 index 000000000..fd30df3d5 --- /dev/null +++ b/src/components/ui/tabs/tabs-content.svelte @@ -0,0 +1,17 @@ + + + diff --git a/src/components/ui/tabs/tabs-list.svelte b/src/components/ui/tabs/tabs-list.svelte new file mode 100644 index 000000000..7106cf17e --- /dev/null +++ b/src/components/ui/tabs/tabs-list.svelte @@ -0,0 +1,20 @@ + + + diff --git a/src/components/ui/tabs/tabs-trigger.svelte b/src/components/ui/tabs/tabs-trigger.svelte new file mode 100644 index 000000000..7ccc56c1d --- /dev/null +++ b/src/components/ui/tabs/tabs-trigger.svelte @@ -0,0 +1,20 @@ + + + diff --git a/src/components/ui/tabs/tabs.svelte b/src/components/ui/tabs/tabs.svelte new file mode 100644 index 000000000..981c4b856 --- /dev/null +++ b/src/components/ui/tabs/tabs.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/components/warning.svelte b/src/components/warning.svelte deleted file mode 100644 index dd3e224a0..000000000 --- a/src/components/warning.svelte +++ /dev/null @@ -1,45 +0,0 @@ - - -{#if !warning && !initialValue} -
-
- -

- All SVGs include links to the respective products or companies that own them. Please contact the owner directly if you need to use their logo. - If you are the owner of an SVG and would like it removed, - create an issue on GitHub. -

-
- -
-{/if} diff --git a/src/components/warningMessage.svelte b/src/components/warningMessage.svelte new file mode 100644 index 000000000..573243625 --- /dev/null +++ b/src/components/warningMessage.svelte @@ -0,0 +1,41 @@ + + +{#if !$warningStore} +
+
+ +

+ Each SVG includes a link to its respective product. Permission must be + obtained before using a logo. For removal requests, + + please open an issue on GitHub + . +

+
+ +
+{/if} diff --git a/src/data/extensions.ts b/src/data/extensions.ts index e2502f58d..0a846f386 100644 --- a/src/data/extensions.ts +++ b/src/data/extensions.ts @@ -1,87 +1,147 @@ -import type { Extension } from '@/types/extensions'; +import type { Extension } from "@/types/extensions"; export const extensions: Extension[] = [ { - name: 'SVGL for Raycast', - description: 'Search SVG logos via svgl using Raycast.', - url: 'https://www.raycast.com/1weiho/svgl', - image: 'https://github.com/pheralb/svgl/raw/main/static/library/raycast.svg', + name: "SVGL CLI", + description: "A CLI for easily adding SVG icons to your project.", + url: "https://github.com/sujjeee/svgls", + image: + "https://raw.githubusercontent.com/pheralb/svgl/refs/heads/main/static/images/logo.svg", created_by: { - name: '1weiho', - socialUrl: 'https://x.com/1weiho' - } + name: "sujjeee", + socialUrl: "https://x.com/sujjeeee", + }, }, { - name: 'SVGL for PowerToys', - description: 'Search & copy SVG logos in PowerToys Run.', - url: 'https://svgl.sameerjs.com/', - image: 'https://github.com/pheralb/svgl/raw/main/static/library/powertoys.svg', + name: "SVGL for React", + description: + "An open-source NPM package that offers a SVGL Logos for React.", + url: "https://github.com/ridemountainpig/svgl-react", + image: + "https://raw.githubusercontent.com/pheralb/svgl/refs/heads/main/static/library/react_light.svg", created_by: { - name: 'SameerJS6', - socialUrl: 'https://svgl.sameerjs.com/' - } + name: "ridemountainpig", + socialUrl: "https://x.com/ridemountainpig", + }, }, { - name: 'SVGL for React', + name: "SVGL for Framer", description: - 'An open-source NPM package that offers a collection of high-quality SVGL logos for React.', - url: 'https://github.com/ridemountainpig/svgl-react?tab=readme-ov-file', + "Import colorful SVG logos, fast and easy using our plugin for Framer.", + url: "https://www.framer.com/marketplace/plugins/svgl/", + image: + "https://raw.githubusercontent.com/pheralb/svgl/refs/heads/main/static/library/framer.svg", + created_by: { + name: "Krishna Singh", + socialUrl: "https://x.com/krishnasinghdev", + }, + }, + { + name: "SVGL for Vue", + description: "An open-source NPM package that offers a SVGL Logos for Vue.", + url: "https://github.com/ridemountainpig/svgl-vue", + image: + "https://raw.githubusercontent.com/pheralb/svgl/refs/heads/main/static/library/vue.svg", + created_by: { + name: "selemondev", + socialUrl: "https://x.com/selemondev", + }, + }, + { + name: "SVGL for Svelte", + description: + "An open-source NPM package that offers a SVGL Logos for Svelte.", + url: "https://github.com/ridemountainpig/svgl-svelte", + image: "https://github.com/pheralb/svgl/raw/main/static/library/svelte.svg", + created_by: { + name: "selemondev", + socialUrl: "https://x.com/selemondev", + }, + }, + { + name: "SVGL for Figma", + description: "Add svgs from svgl to your Figma project.", + url: "https://www.figma.com/community/plugin/1320306989350693206/svgl", + image: "https://github.com/pheralb/svgl/raw/main/static/library/figma.svg", + created_by: { + name: "quilljou", + socialUrl: "https://x.com/quillzhou", + }, + }, + { + name: "SVGL for PowerToys", + description: "Search & copy SVG logos in PowerToys Run.", + url: "https://svgl.sameerjs.com/", image: - 'https://raw.githubusercontent.com/pheralb/svgl/0d4514c9521688e76c6a1b426f3054a424d96aa5/static/library/react_dark.svg', + "https://github.com/pheralb/svgl/raw/main/static/library/powertoys.svg", created_by: { - name: 'ridemountainpig', - socialUrl: 'https://twitter.com/ridemountainpig' - } + name: "SameerJS6", + socialUrl: "https://x.com/Sameerjs6", + }, }, { - name: 'SVGL Badges', - description: 'A beautiful badges with svgl SVG logos.', - url: 'https://svgl-badge.vercel.app/', + name: "SVGL for Raycast", + description: "Search SVG logos via svgl.", + url: "https://www.raycast.com/1weiho/svgl", image: - 'https://camo.githubusercontent.com/b516f0f725ad1827dd854f16ec08626569d02ab827cd06b4f42163e519b813c7/68747470733a2f2f7376676c2d62616467652e76657263656c2e6170702f6170692f4c6962726172792f5376676c3f7468656d653d6c69676874', + "https://github.com/pheralb/svgl/raw/main/static/library/raycast.svg", created_by: { - name: 'ridemountainpig', - socialUrl: 'https://twitter.com/ridemountainpig' - } + name: "1weiho", + socialUrl: "https://x.com/1weiho", + }, }, { - name: 'Magic', - description: 'AI extension for Cursor & other IDEs.', - url: 'https://21st.dev/magic', - image: 'https://github.com/serafimcloud/21st/blob/main/apps/web/public/icon.png?raw=true', + name: "SVGL for Visual Studio Code", + description: "SVGL directly in your VSCode.", + url: "https://marketplace.visualstudio.com/items?itemName=EsteveSegura.svgl", + image: "https://github.com/pheralb/svgl/raw/main/static/library/vscode.svg", created_by: { - name: 'serafim', - socialUrl: 'https://x.com/serafimcloud' - } + name: "girlazote", + socialUrl: "https://x.com/girlazote", + }, }, { - name: 'svgls', - description: 'A CLI for easily adding SVG icons to your project.', - url: 'https://github.com/sujjeee/svgls', - image: 'https://github.com/pheralb/svgl/raw/main/static/library/svgl.svg', + name: "SVGL Badge", + description: "A beautiful badges with SVGL SVGs logos.", + url: "https://svgl-badge.vercel.app/", + image: + "https://camo.githubusercontent.com/b516f0f725ad1827dd854f16ec08626569d02ab827cd06b4f42163e519b813c7/68747470733a2f2f7376676c2d62616467652e76657263656c2e6170702f6170692f4c6962726172792f5376676c3f7468656d653d6c69676874", created_by: { - name: 'Sujjeee', - socialUrl: 'https://twitter.com/sujjeeee' - } + name: "ridemountainpig", + socialUrl: "https://x.com/ridemountainpig", + }, }, { - name: 'SVGL for Figma', - description: 'Add svgs from svgl to your Figma project.', - url: 'https://www.figma.com/community/plugin/1320306989350693206/svgl', - image: 'https://github.com/pheralb/svgl/raw/main/static/library/figma.svg', + name: "SVGL on Magic by 21st", + description: "Integrate company logos and icons via SVGL on Magic.", + url: "https://21st.dev/magic", + image: + "https://github.com/serafimcloud/21st/raw/main/apps/web/public/icon.png?raw=true", created_by: { - name: 'Quill', - socialUrl: 'https://x.com/quillzhou' - } + name: "serafimcloud", + socialUrl: "https://x.com/serafimcloud", + }, }, { - name: 'SVGL for VSCode', - description: 'SVGL directly in your VSCode.', - url: 'https://marketplace.visualstudio.com/items?itemName=EsteveSegura.svgl', - image: 'https://github.com/pheralb/svgl/blob/main/static/library/vscode.svg', + name: "SVGL for PowerShell", + description: "PowerShell extension to quickly get svgl logos anywhere.", + url: "https://github.com/spaansba/SVGL-PowerShell", + image: + "https://github.com/pheralb/svgl/raw/main/static/library/powershell.svg", + created_by: { + name: "Bart Spaans", + socialUrl: "https://bsky.app/profile/bartspaans.bsky.social", + }, + }, + { + name: "SVGL for Flow Launcher", + description: "Search & copy SVG logos in Flow Launcher.", + url: "https://github.com/spaansba/SVGL-Flow-Launcher", + image: + "https://github.com/pheralb/svgl/raw/main/static/library/FlowLauncher.svg", created_by: { - name: 'GiR', - socialUrl: 'https://x.com/girlazote' - } - } + name: "AF_Askar", + socialUrl: "https://x.com/Askar_AF", + }, + }, ]; diff --git a/src/data/index.ts b/src/data/index.ts index 371056219..297e644a6 100644 --- a/src/data/index.ts +++ b/src/data/index.ts @@ -1,23 +1,44 @@ -import type { iSVG } from '@/types/svg'; -import { svgs } from './svgs'; +import type { iSVG, ThemeOptions } from "@/types/svg"; +import type { Category } from "@/types/categories"; +import type { Extension } from "@/types/extensions"; + +import { svgs } from "@/data/svgs"; +import { extensions } from "@/data/extensions"; export const svgsData = svgs.map((svg: iSVG, index: number) => { return { id: index, ...svg }; -}); +}) as iSVG[]; + +export const extensionsData = extensions.map((extension, index) => { + return { id: index, ...extension }; +}) as Extension[]; -export const getCategories = () => { +export const getCategories = (): Category[] => { const categories = svgs - .flatMap((svg) => (Array.isArray(svg.category) ? svg.category : [svg.category])) + .flatMap((svg) => + Array.isArray(svg.category) ? svg.category : [svg.category], + ) .filter((category, index, array) => array.indexOf(category) === index); return categories; }; -export const getCategoriesForDirectory = () => { - const categories = svgs - .flatMap((svg) => (Array.isArray(svg.category) ? svg.category : [svg.category])) - .filter((category, index, array) => array.indexOf(category) === index) - .map((category) => ({ - slug: category.toLowerCase() - })); - return categories; +export const getSvgsByCategory = (category: string): iSVG[] => + svgsData.filter((svg: iSVG) => { + if (Array.isArray(svg.category)) { + return svg.category.some( + (categoryItem) => categoryItem.toLowerCase() === category.toLowerCase(), + ); + } else { + return svg.category.toLowerCase() === category.toLowerCase(); + } + }); + +interface GetSvgImgUrl { + url: string | ThemeOptions; + isDark: boolean; +} + +export const getSvgImgUrl = ({ url, isDark }: GetSvgImgUrl) => { + if (typeof url === "string") return url; + return isDark ? url.dark : url.light; }; diff --git a/src/data/svgs.ts b/src/data/svgs.ts index 811fecbc1..b26f93857 100644 --- a/src/data/svgs.ts +++ b/src/data/svgs.ts @@ -1,4001 +1,3990 @@ -import type { iSVG } from '@/types/svg'; +import type { iSVG } from "@/types/svg"; export const svgs: iSVG[] = [ { - title: 'Google Classroom', - category: ['Google', 'Education'], - route: '/library/google-classroom.svg', - url: 'https://edu.google.com/workspace-for-education/products/classroom/', - brandUrl: 'https://developers.google.com/workspace/classroom/brand' + title: "Google Classroom", + category: ["Google", "Education"], + route: "/library/google-classroom.svg", + url: "https://edu.google.com/workspace-for-education/products/classroom/", + brandUrl: "https://developers.google.com/workspace/classroom/brand", }, { - title: 'Kimi', - category: 'AI', - route: '/library/kimi.svg', - url: 'https://kimi.ai/' + title: "Kimi", + category: "AI", + route: "/library/kimi.svg", + url: "https://kimi.ai/", }, { - title: 'Perspective', - category: 'Software', + title: "Perspective", + category: "Software", route: { - light: '/library/perspective-light.svg', - dark: '/library/perspective-dark.svg' + light: "/library/perspective-light.svg", + dark: "/library/perspective-dark.svg", }, wordmark: { - light: '/library/perspective-wordmark-light.svg', - dark: '/library/perspective-wordmark-dark.svg' + light: "/library/perspective-wordmark-light.svg", + dark: "/library/perspective-wordmark-dark.svg", }, - url: 'https://perspective.co/' + url: "https://perspective.co/", }, { - title: 'Windsurf', - category: ['Software', 'AI'], + title: "Windsurf", + category: ["Software", "AI"], route: { - light: '/library/windsurf-light.svg', - dark: '/library/windsurf-dark.svg' + light: "/library/windsurf-light.svg", + dark: "/library/windsurf-dark.svg", }, wordmark: { - light: '/library/windsurf-wordmark-light.svg', - dark: '/library/windsurf-wordmark-dark.svg' + light: "/library/windsurf-wordmark-light.svg", + dark: "/library/windsurf-wordmark-dark.svg", }, - url: 'https://windsurf.com/editor', - brandUrl: 'https://windsurf.com/brand' + url: "https://windsurf.com/editor", + brandUrl: "https://windsurf.com/brand", }, { - title: 'Mattermost', - category: 'Software', + title: "Mattermost", + category: "Software", route: { - light: '/library/mattermost-light.svg', - dark: '/library/mattermost-dark.svg' + light: "/library/mattermost-light.svg", + dark: "/library/mattermost-dark.svg", }, - url: 'http://mattermost.com/' + url: "http://mattermost.com/", }, { - title: 'Inngest', - category: 'Software', + title: "Inngest", + category: "Software", route: { - light: '/library/inngest-light.svg', - dark: '/library/inngest-dark.svg' + light: "/library/inngest-light.svg", + dark: "/library/inngest-dark.svg", }, - url: 'https://inngest.com/' + url: "https://inngest.com/", }, { - title: 'daisyUI', - category: 'Library', - route: '/library/daisyui.svg', - url: 'https://daisyui.com/' + title: "daisyUI", + category: "Library", + route: "/library/daisyui.svg", + url: "https://daisyui.com/", }, { - title: 'PayPal', - category: 'Payment', - route: '/library/paypal.svg', - wordmark: '/library/paypal-wordmark.svg', - url: 'https://paypal.com' + title: "PayPal", + category: "Payment", + route: "/library/paypal.svg", + wordmark: "/library/paypal-wordmark.svg", + url: "https://paypal.com", }, { - title: 'Google Drive', - category: 'Google', - route: '/library/drive.svg', - url: 'https://www.google.com/drive/' + title: "Google Drive", + category: "Google", + route: "/library/drive.svg", + url: "https://www.google.com/drive/", }, { - title: 'Amazon Q', - category: 'AI', - route: '/library/amazon-q.svg', - url: 'https://aws.amazon.com/q' + title: "Amazon Q", + category: "AI", + route: "/library/amazon-q.svg", + url: "https://aws.amazon.com/q", }, { - title: 'Mulesoft', - category: 'Software', - route: '/library/mulesoft.svg', - url: 'https://www.mulesoft.com/' + title: "Mulesoft", + category: "Software", + route: "/library/mulesoft.svg", + url: "https://www.mulesoft.com/", }, { - title: 'UV', - category: 'Devtool', - route: '/library/uv.svg', - url: 'https://docs.astral.sh/uv/' + title: "UV", + category: "Devtool", + route: "/library/uv.svg", + url: "https://docs.astral.sh/uv/", }, { - title: 'Milanote', - category: 'Software', + title: "Milanote", + category: "Software", route: { - light: '/library/milanote-light.svg', - dark: '/library/milanote-dark.svg' + light: "/library/milanote-light.svg", + dark: "/library/milanote-dark.svg", }, wordmark: { - light: '/library/milanote-wordmark-light.svg', - dark: '/library/milanote-wordmark-dark.svg' + light: "/library/milanote-wordmark-light.svg", + dark: "/library/milanote-wordmark-dark.svg", }, - url: 'https://milanote.com' + url: "https://milanote.com", }, { - title: 'Together AI', - category: 'AI', + title: "Together AI", + category: "AI", route: { - light: '/library/togetherai_light.svg', - dark: '/library/togetherai_dark.svg' + light: "/library/togetherai_light.svg", + dark: "/library/togetherai_dark.svg", }, - url: 'https://www.together.ai/' + url: "https://www.together.ai/", }, { - title: 'Suno', - category: 'AI', - route: '/library/suno.svg', + title: "Suno", + category: "AI", + route: "/library/suno.svg", wordmark: { - light: '/library/suno_wordmark_light.svg', - dark: '/library/suno_wordmark_dark.svg' + light: "/library/suno_wordmark_light.svg", + dark: "/library/suno_wordmark_dark.svg", }, - url: 'https://suno.com/' + url: "https://suno.com/", }, { - title: 'Groq', - category: 'AI', - route: '/library/groq.svg', + title: "Groq", + category: "AI", + route: "/library/groq.svg", wordmark: { - light: '/library/groq_wordmark_light.svg', - dark: '/library/groq_wordmark_dark.svg' + light: "/library/groq_wordmark_light.svg", + dark: "/library/groq_wordmark_dark.svg", }, - url: 'https://groq.com/' + url: "https://groq.com/", }, { - title: 'Cohere', - category: 'AI', - route: '/library/cohere.svg', - wordmark: '/library/cohere_wordmark.svg', - url: 'https://cohere.com/' + title: "Cohere", + category: "AI", + route: "/library/cohere.svg", + wordmark: "/library/cohere_wordmark.svg", + url: "https://cohere.com/", }, { - title: 'Ollama', - category: 'AI', + title: "Ollama", + category: "AI", route: { - light: '/library/ollama_light.svg', - dark: '/library/ollama_dark.svg' + light: "/library/ollama_light.svg", + dark: "/library/ollama_dark.svg", }, - url: 'https://www.ollama.com/' + url: "https://www.ollama.com/", }, { - title: 'Cisco', - category: 'Software', + title: "Cisco", + category: "Software", route: { - light: '/library/cisco_light.svg', - dark: '/library/cisco_dark.svg' + light: "/library/cisco_light.svg", + dark: "/library/cisco_dark.svg", }, - url: 'https://www.cisco.com/' + url: "https://www.cisco.com/", }, { - title: 'Animate', - category: ['Software', 'Design'], - route: '/library/animate.svg', - url: 'https://www.adobe.com/products/animate' + title: "Animate", + category: ["Software", "Design"], + route: "/library/animate.svg", + url: "https://www.adobe.com/products/animate", }, { - title: 'Apollo.io', - category: 'Software', - route: '/library/apollo.io.svg', - url: 'https://www.apollo.io/' + title: "Apollo.io", + category: "Software", + route: "/library/apollo-io.svg", + url: "https://www.apollo.io/", }, { - title: 'Blender', - category: ['Software', 'Design'], - route: '/library/blender.svg', - url: 'https://blender.org/', - brandUrl: 'https://www.blender.org/about/logo/' + title: "Blender", + category: ["Software", "Design"], + route: "/library/blender.svg", + url: "https://blender.org/", + brandUrl: "https://www.blender.org/about/logo/", }, { - title: 'Lua', - category: 'Language', - route: '/library/lua.svg', - url: 'https://lua.org/' + title: "Lua", + category: "Language", + route: "/library/lua.svg", + url: "https://lua.org/", }, { - title: 'Mercado Pago', - category: 'Payment', - route: '/library/mercado-pago.svg', - wordmark: '/library/mercado-pago-wordmark.svg', - url: 'https://www.mercadopago.com/developers/' + title: "Mercado Pago", + category: "Payment", + route: "/library/mercado-pago.svg", + wordmark: "/library/mercado-pago-wordmark.svg", + url: "https://www.mercadopago.com/developers/", }, { - title: 'Basewell', - category: ['AI', 'Software'], - route: '/library/basewell.svg', - url: 'https://www.basewell.com/' + title: "Basewell", + category: ["AI", "Software"], + route: "/library/basewell.svg", + url: "https://www.basewell.com/", }, { - title: 'ahooks', - category: 'Library', - route: '/library/ahooks.svg', + title: "ahooks", + category: "Library", + route: "/library/ahooks.svg", wordmark: { - light: '/library/ahooks-wordmark-light.svg', - dark: '/library/ahooks-wordmark-dark.svg' + light: "/library/ahooks-wordmark-light.svg", + dark: "/library/ahooks-wordmark-dark.svg", }, - url: 'https://ahooks.js.org/' + url: "https://ahooks.js.org/", }, { - title: 'Discord', - category: 'Software', - route: '/library/discord.svg', - url: 'https://discord.com/', - brandUrl: 'https://discord.com/branding' + title: "Discord", + category: "Software", + route: "/library/discord.svg", + url: "https://discord.com/", + brandUrl: "https://discord.com/branding", }, { - title: 'Aliexpress', - category: 'Software', - route: '/library/aliexpress-icon.svg', - wordmark: '/library/aliexpress-logo.svg', - url: 'https://aliexpress.com/' + title: "Aliexpress", + category: "Software", + route: "/library/aliexpress-icon.svg", + wordmark: "/library/aliexpress-logo.svg", + url: "https://aliexpress.com/", }, { - title: 'Preact', - category: 'Library', - route: '/library/preact.svg', - url: 'https://preactjs.com/' + title: "Preact", + category: "Library", + route: "/library/preact.svg", + url: "https://preactjs.com/", }, { - title: 'React', - category: 'Library', + title: "React", + category: "Library", route: { - light: '/library/react_light.svg', - dark: '/library/react_dark.svg' + light: "/library/react_light.svg", + dark: "/library/react_dark.svg", }, wordmark: { - light: '/library/react_wordmark_light.svg', - dark: '/library/react_wordmark_dark.svg' + light: "/library/react_wordmark_light.svg", + dark: "/library/react_wordmark_dark.svg", }, - url: 'https://react.dev/' + url: "https://react.dev/", }, { - title: 'Svelte', - category: 'Library', - route: '/library/svelte.svg', - url: 'https://svelte.dev/' + title: "Svelte", + category: "Library", + route: "/library/svelte.svg", + url: "https://svelte.dev/", }, { - title: 'Vue', - category: 'Framework', - route: '/library/vue.svg', - url: 'https://vuejs.org/' + title: "Vue", + category: "Framework", + route: "/library/vue.svg", + url: "https://vuejs.org/", }, { - title: 'Vuetify', - category: 'Library', - route: '/library/vuetify.svg', - url: 'https://vuetifyjs.com/', - brandUrl: 'https://vuetifyjs.com/en/resources/brand-kit/' + title: "Vuetify", + category: "Library", + route: "/library/vuetify.svg", + url: "https://vuetifyjs.com/", + brandUrl: "https://vuetifyjs.com/en/resources/brand-kit/", }, { - title: 'Nuxt', - category: ['Framework', 'Nuxt'], - route: '/library/nuxt.svg', - url: 'https://nuxt.com/', + title: "Nuxt", + category: ["Framework", "Nuxt"], + route: "/library/nuxt.svg", + url: "https://nuxt.com/", wordmark: { - light: '/library/nuxt-wordmark-light.svg', - dark: '/library/nuxt-wordmark-dark.svg' + light: "/library/nuxt-wordmark-light.svg", + dark: "/library/nuxt-wordmark-dark.svg", }, - brandUrl: 'https://nuxt.com/design-kit' + brandUrl: "https://nuxt.com/design-kit", }, { - title: 'Nuxt UI', - category: ['Library', 'Nuxt'], - url: 'https://ui.nuxt.com/', + title: "Nuxt UI", + category: ["Library", "Nuxt"], + url: "https://ui.nuxt.com/", route: { - light: '/library/nuxt-ui-wordmark-light.svg', - dark: '/library/nuxt-ui-wordmark-dark.svg' + light: "/library/nuxt-ui-wordmark-light.svg", + dark: "/library/nuxt-ui-wordmark-dark.svg", }, - brandUrl: 'https://nuxt.com/design-kit' + brandUrl: "https://nuxt.com/design-kit", }, { - title: 'Nuxt Content', - category: ['Library', 'Nuxt'], - url: 'https://content.nuxt.com/', + title: "Nuxt Content", + category: ["Library", "Nuxt"], + url: "https://content.nuxt.com/", route: { - light: '/library/nuxt-content-wordmark-light.svg', - dark: '/library/nuxt-content-wordmark-dark.svg' + light: "/library/nuxt-content-wordmark-light.svg", + dark: "/library/nuxt-content-wordmark-dark.svg", }, - brandUrl: 'https://nuxt.com/design-kit' + brandUrl: "https://nuxt.com/design-kit", }, { - title: 'Nuxt Studio', - category: ['Library', 'Nuxt'], - url: 'https://studio.nuxt.com/', + title: "Nuxt Studio", + category: ["Library", "Nuxt"], + url: "https://studio.nuxt.com/", route: { - light: '/library/nuxt-studio-wordmark-light.svg', - dark: '/library/nuxt-studio-wordmark-dark.svg' + light: "/library/nuxt-studio-wordmark-light.svg", + dark: "/library/nuxt-studio-wordmark-dark.svg", }, - brandUrl: 'https://nuxt.com/design-kit' + brandUrl: "https://nuxt.com/design-kit", }, { - title: 'NuxtHub', - category: ['Library', 'Nuxt'], - url: 'https://hub.nuxt.com/', - route: '/library/nuxthub.svg', + title: "NuxtHub", + category: ["Library", "Nuxt"], + url: "https://hub.nuxt.com/", + route: "/library/nuxthub.svg", wordmark: { - light: '/library/nuxthub-wordmark-light.svg', - dark: '/library/nuxthub-wordmark-dark.svg' + light: "/library/nuxthub-wordmark-light.svg", + dark: "/library/nuxthub-wordmark-dark.svg", }, - brandUrl: 'https://nuxt.com/design-kit' + brandUrl: "https://nuxt.com/design-kit", }, { - title: 'Docus', - category: ['Software', 'Nuxt'], - url: 'https://docus.dev/', + title: "Docus", + category: ["Software", "Nuxt"], + url: "https://docus.dev/", route: { - light: '/library/docus-light.svg', - dark: '/library/docus-dark.svg' + light: "/library/docus-light.svg", + dark: "/library/docus-dark.svg", }, wordmark: { - light: '/library/docus-wordmark-light.svg', - dark: '/library/docus-wordmark-dark.svg' + light: "/library/docus-wordmark-light.svg", + dark: "/library/docus-wordmark-dark.svg", }, - brandUrl: 'https://nuxt.com/design-kit' + brandUrl: "https://nuxt.com/design-kit", }, { - title: 'Visual Studio Code', - category: 'Software', - route: '/library/vscode.svg', - url: 'https://code.visualstudio.com/', - brandUrl: 'https://code.visualstudio.com/brand' + title: "Visual Studio Code", + category: "Software", + route: "/library/vscode.svg", + url: "https://code.visualstudio.com/", + brandUrl: "https://code.visualstudio.com/brand", }, { - title: 'Ton', - category: 'Crypto', - route: '/library/ton.svg', - url: 'https://ton.org/' + title: "Ton", + category: "Crypto", + route: "/library/ton.svg", + url: "https://ton.org/", }, { - title: 'Locofy', - category: 'AI', - route: '/library/locofy.svg', - url: 'https://www.locofy.ai/' + title: "Locofy", + category: "AI", + route: "/library/locofy.svg", + url: "https://www.locofy.ai/", }, { - title: 'Runway', - category: 'AI', - route: '/library/runway.svg', - url: 'https://runwayml.com/' + title: "Runway", + category: "AI", + route: "/library/runway.svg", + url: "https://runwayml.com/", }, { - title: 'Yarn', - category: 'Software', - route: '/library/yarn.svg', - url: 'https://yarnpkg.com/' + title: "Yarn", + category: "Software", + route: "/library/yarn.svg", + url: "https://yarnpkg.com/", }, { - title: 'JWT', - category: ['Library', 'Authentication'], - route: '/library/jwt.svg', - url: 'https://jwt.io/' + title: "JWT", + category: ["Library", "Authentication"], + route: "/library/jwt.svg", + url: "https://jwt.io/", }, { - title: 'Strapi', - category: 'CMS', - route: '/library/strapi.svg', - url: 'https://strapi.io/', - brandUrl: 'https://handbook.strapi.io/strapi-brand-book-2022' + title: "Strapi", + category: "CMS", + route: "/library/strapi.svg", + url: "https://strapi.io/", + brandUrl: "https://handbook.strapi.io/strapi-brand-book-2022", }, { - title: 'Figma', - category: 'Design', - route: '/library/figma.svg', - url: 'https://www.figma.com/', - brandUrl: 'https://www.figma.com/using-the-figma-brand/' + title: "Figma", + category: "Design", + route: "/library/figma.svg", + url: "https://www.figma.com/", + brandUrl: "https://www.figma.com/using-the-figma-brand/", }, { - title: 'Spotify', - category: 'Music', - route: '/library/spotify.svg', - wordmark: '/library/spotify_wordmark.svg', - url: 'https://www.spotify.com/' + title: "Spotify", + category: "Music", + route: "/library/spotify.svg", + wordmark: "/library/spotify_wordmark.svg", + url: "https://www.spotify.com/", }, { - title: 'WorkOS', - category: ['Software', 'Authentication'], + title: "WorkOS", + category: ["Software", "Authentication"], route: { - light: '/library/workos.svg', - dark: '/library/workos-light.svg' + light: "/library/workos.svg", + dark: "/library/workos-light.svg", }, - url: 'https://workos.com/' + url: "https://workos.com/", }, { - title: 'Whop', - category: 'Marketplace', + title: "Whop", + category: "Marketplace", route: { - light: '/library/whop.svg', - dark: '/library/whop-light.svg' + light: "/library/whop.svg", + dark: "/library/whop-light.svg", }, - url: 'https://whop.com/' + url: "https://whop.com/", }, { - title: 'Postman', - category: 'Software', - route: '/library/postman.svg', - url: 'https://www.getpostman.com/' + title: "Postman", + category: "Software", + route: "/library/postman.svg", + url: "https://www.getpostman.com/", }, { - title: 'Discord.js', - category: 'Library', - route: '/library/djs.svg', - url: 'https://discord.js.org/' + title: "Discord.js", + category: "Library", + route: "/library/djs.svg", + url: "https://discord.js.org/", }, { - title: 'OpenSea', - category: 'Crypto', - route: '/library/opensea.svg', - url: 'https://opensea.io/' + title: "OpenSea", + category: "Crypto", + route: "/library/opensea.svg", + url: "https://opensea.io/", }, { - title: 'Algolia', - category: 'Library', - route: '/library/algolia.svg', - url: 'https://www.algolia.com/' + title: "Algolia", + category: "Library", + route: "/library/algolia.svg", + url: "https://www.algolia.com/", }, { - title: 'Bootstrap', - category: 'Framework', - route: '/library/bootstrap.svg', - url: 'https://getbootstrap.com/', - brandUrl: 'https://getbootstrap.com/docs/4.0/about/brand/' + title: "Bootstrap", + category: "Framework", + route: "/library/bootstrap.svg", + url: "https://getbootstrap.com/", + brandUrl: "https://getbootstrap.com/docs/4.0/about/brand/", }, { - title: 'Facebook', - category: 'Social', - route: '/library/facebook.svg', - url: 'https://www.facebook.com/', - brandUrl: 'https://about.meta.com/brand/resources/facebook/logo/' + title: "Facebook", + category: "Social", + route: "/library/facebook.svg", + url: "https://www.facebook.com/", + brandUrl: "https://about.meta.com/brand/resources/facebook/logo/", }, { - title: 'Twitter', - category: 'Social', - route: '/library/twitter.svg', - url: 'https://twitter.com/' + title: "Twitter", + category: "Social", + route: "/library/twitter.svg", + url: "https://twitter.com/", }, { - title: 'Esbuild', - category: 'Compiler', - route: '/library/esbuild.svg', - url: 'https://esbuild.github.io/' + title: "Esbuild", + category: "Compiler", + route: "/library/esbuild.svg", + url: "https://esbuild.github.io/", }, { - title: 'Deno', - category: 'Library', + title: "Deno", + category: "Library", route: { - light: '/library/deno.svg', - dark: '/library/deno_dark.svg' + light: "/library/deno.svg", + dark: "/library/deno_dark.svg", }, wordmark: { - light: '/library/deno_wordmark.svg', - dark: '/library/deno_wordmark_dark.svg' + light: "/library/deno_wordmark.svg", + dark: "/library/deno_wordmark_dark.svg", }, - brandUrl: 'https://deno.com/brand', - url: 'https://deno.com/' + brandUrl: "https://deno.com/brand", + url: "https://deno.com/", }, { - title: 'Gatsby', - category: 'Framework', - route: '/library/gatsby.svg', - url: 'https://www.gatsbyjs.org/' + title: "Gatsby", + category: "Framework", + route: "/library/gatsby.svg", + url: "https://www.gatsbyjs.org/", }, { - title: 'NPM', - category: 'Software', - route: '/library/npm.svg', - url: 'https://www.npmjs.com/' + title: "NPM", + category: "Software", + url: "https://www.npmjs.com/", + route: "/library/npm.svg", + wordmark: "/library/npm-wordmark.svg", }, { - title: 'Nuget', - category: 'Software', - route: '/library/nuget.svg', - url: 'https://www.nuget.org/' + title: "Nuget", + category: "Software", + route: "/library/nuget.svg", + url: "https://www.nuget.org/", }, { - title: 'Homebrew', - category: 'Software', - route: '/library/homebrew.svg', - url: 'https://brew.sh/' + title: "Homebrew", + category: "Software", + route: "/library/homebrew.svg", + url: "https://brew.sh/", }, { - title: 'Sublime Text', - category: 'Software', - route: '/library/sublimetext.svg', - url: 'https://www.sublimetext.com/' + title: "Sublime Text", + category: "Software", + route: "/library/sublimetext.svg", + url: "https://www.sublimetext.com/", }, { - title: 'Turborepo', - category: ['Library', 'Vercel', 'Monorepo'], - route: '/library/turborepo.svg', - url: 'https://turborepo.org/' + title: "Turborepo", + category: ["Library", "Vercel", "Monorepo"], + route: "/library/turborepo.svg", + url: "https://turborepo.org/", + shadcnCommand: "shadcn@canary add https://svgl.app/r/vercel.json", }, { - title: 'Tailwind CSS', - category: 'Framework', - route: '/library/tailwindcss.svg', + title: "Tailwind CSS", + category: "Framework", + route: "/library/tailwindcss.svg", wordmark: { - light: '/library/tailwindcss-wordmark.svg', - dark: '/library/tailwindcss-wordmark-dark.svg' + light: "/library/tailwindcss-wordmark.svg", + dark: "/library/tailwindcss-wordmark-dark.svg", }, - brandUrl: 'https://tailwindcss.com/brand', - url: 'https://tailwindcss.com/' + brandUrl: "https://tailwindcss.com/brand", + url: "https://tailwindcss.com/", }, { - title: 'Styled Components', - category: 'Library', - route: '/library/styledcomponents.svg', - url: 'https://styled-components.com/' + title: "Styled Components", + category: "Library", + route: "/library/styledcomponents.svg", + url: "https://styled-components.com/", }, { - title: 'Angular', - category: 'Framework', - route: '/library/angular.svg', - url: 'https://angular.dev/', - brandUrl: 'https://angular.dev/press-kit' + title: "Angular", + category: "Framework", + route: "/library/angular.svg", + url: "https://angular.dev/", + brandUrl: "https://angular.dev/press-kit", }, { - title: 'Blitz', - category: 'Framework', - route: '/library/blitzjs.svg', - url: 'https://blitzjs.com/' + title: "Blitz", + category: "Framework", + route: "/library/blitzjs.svg", + url: "https://blitzjs.com/", }, { - title: 'Lit', - category: 'Library', - route: '/library/lit.svg', - url: 'https://lit.dev/' + title: "Lit", + category: "Library", + route: "/library/lit.svg", + url: "https://lit.dev/", }, { - title: 'Atom', - category: 'Software', - route: '/library/atom.svg', - url: 'https://atom.io/' + title: "Atom", + category: "Software", + route: "/library/atom.svg", + url: "https://atom.io/", }, { - title: 'YouTube', - category: ['Google', 'Social'], - route: '/library/youtube.svg', - wordmark: '/library/youtube-wordmark.svg', - url: 'https://www.youtube.com/' + title: "YouTube", + category: ["Google", "Social"], + route: "/library/youtube.svg", + wordmark: "/library/youtube-wordmark.svg", + url: "https://www.youtube.com/", }, { - title: 'Astro', - category: 'Framework', + title: "Astro", + category: "Framework", route: { - light: '/library/astro.svg', - dark: '/library/astro_dark.svg' + light: "/library/astro.svg", + dark: "/library/astro_dark.svg", }, - url: 'https://astro.build/', - brandUrl: 'https://astro.build/press/' + url: "https://astro.build/", + brandUrl: "https://astro.build/press/", }, { - title: 'Google', - category: 'Google', - route: '/library/google.svg', - wordmark: '/library/google-wordmark.svg', - url: 'https://www.google.com/' + title: "Google", + category: "Google", + route: "/library/google.svg", + wordmark: "/library/google-wordmark.svg", + url: "https://www.google.com/", }, { - title: 'Framer', - category: 'Software', + title: "Framer", + category: "Software", route: { - light: '/library/framer.svg', - dark: '/library/framer_dark.svg' + light: "/library/framer.svg", + dark: "/library/framer_dark.svg", }, - url: 'https://framer.com/' + url: "https://framer.com/", }, { - title: 'Netflix', - category: 'Entertainment', - route: '/library/netflix.svg', - url: 'https://www.netflix.com/', - brandUrl: 'https://brand.netflix.com/en/assets/logos' + title: "Netflix", + category: "Entertainment", + route: "/library/netflix.svg", + url: "https://www.netflix.com/", + brandUrl: "https://brand.netflix.com/en/assets/logos", }, { - title: 'Firefox', - category: 'Browser', - route: '/library/firefox.svg', - url: 'https://www.mozilla.org/en-US/firefox/', - brandUrl: 'https://mozilla.design/firefox/' + title: "Firefox", + category: "Browser", + route: "/library/firefox.svg", + url: "https://www.mozilla.org/en-US/firefox/", + brandUrl: "https://mozilla.design/firefox/", }, { - title: 'LinkedIn', - category: 'Social', - route: '/library/linkedin.svg', - url: 'https://www.linkedin.com/', - brandUrl: 'https://brand.linkedin.com/' + title: "LinkedIn", + category: "Social", + route: "/library/linkedin.svg", + url: "https://www.linkedin.com/", + brandUrl: "https://brand.linkedin.com/", }, { - title: 'Telegram', - category: 'Social', - route: '/library/telegram.svg', - url: 'https://web.telegram.org/' + title: "Telegram", + category: "Social", + route: "/library/telegram.svg", + url: "https://web.telegram.org/", }, { - title: 'Matrix', - category: 'Social', + title: "Matrix", + category: "Social", route: { - light: '/library/matrix-light.svg', - dark: '/library/matrix-dark.svg' + light: "/library/matrix-light.svg", + dark: "/library/matrix-dark.svg", }, - url: 'https://matrix.org/' + url: "https://matrix.org/", }, { - title: 'WhatsApp', - category: 'Social', - route: '/library/whatsapp.svg', - url: 'https://web.whatsapp.com/' + title: "WhatsApp", + category: "Social", + route: "/library/whatsapp.svg", + url: "https://web.whatsapp.com/", }, { - title: 'Headless UI', - category: 'Library', - route: '/library/headlessui.svg', - url: 'https://headlessui.dev/' + title: "Headless UI", + category: "Library", + route: "/library/headlessui.svg", + url: "https://headlessui.dev/", }, { - title: 'Kotlin', - category: 'Language', - route: '/library/kotlin.svg', - url: 'https://kotlinlang.org/' + title: "Kotlin", + category: "Language", + route: "/library/kotlin.svg", + url: "https://kotlinlang.org/", }, { - title: 'Storybook', - category: 'Software', - route: '/library/storybook.svg', - url: 'https://storybook.js.org/' + title: "Storybook", + category: "Software", + route: "/library/storybook.svg", + url: "https://storybook.js.org/", }, { - title: 'Netlify', - category: 'Hosting', - route: '/library/netlify.svg', - url: 'https://www.netlify.com/' + title: "Netlify", + category: "Hosting", + route: "/library/netlify.svg", + url: "https://www.netlify.com/", }, { - title: 'Solidjs', - category: 'Framework', - route: '/library/solidjs.svg', - url: 'https://www.solidjs.com/' + title: "Solidjs", + category: "Framework", + route: "/library/solidjs.svg", + url: "https://www.solidjs.com/", }, { - title: 'MongoDB', - category: 'Database', - route: '/library/mongodb.svg', - wordmark: '/library/mongodb-wordmark.svg', - url: 'https://www.mongodb.com/', - brandUrl: 'https://www.mongodb.com/company/newsroom/brand-resources' + title: "MongoDB", + category: "Database", + route: "/library/mongodb.svg", + wordmark: "/library/mongodb-wordmark.svg", + url: "https://www.mongodb.com/", + brandUrl: "https://www.mongodb.com/company/newsroom/brand-resources", }, { - title: 'Moon', - category: 'Framework', - route: '/library/moon.svg', - url: 'https://moonjs.org/' + title: "Moon", + category: "Framework", + route: "/library/moon.svg", + url: "https://moonjs.org/", }, { - title: 'Payload CMS', - category: 'CMS', + title: "Payload CMS", + category: "CMS", route: { - light: '/library/payload.svg', - dark: '/library/payload_dark.svg' + light: "/library/payload.svg", + dark: "/library/payload_dark.svg", }, - url: 'https://payloadcms.com' + url: "https://payloadcms.com", }, { - title: 'Fly', - category: 'Hosting', - route: '/library/fly.svg', - url: 'https://fly.io', - brandUrl: 'https://fly.io/docs/about/brand/' + title: "Fly", + category: "Hosting", + route: "/library/fly.svg", + url: "https://fly.io", + brandUrl: "https://fly.io/docs/about/brand/", }, { - title: 'LearnThis', - category: 'Education', - route: '/library/learnthis.svg', - url: 'https://learnthisacademy.com' + title: "LearnThis", + category: "Education", + route: "/library/learnthis.svg", + url: "https://learnthisacademy.com", }, { - title: 'Visual Studio', - category: 'Software', - route: '/library/visual-studio.svg', - url: 'https://visualstudio.microsoft.com' + title: "Visual Studio", + category: "Software", + route: "/library/visual-studio.svg", + url: "https://visualstudio.microsoft.com", }, { - title: 'Chakra UI', - category: 'Library', - route: '/library/chakra-ui.svg', - url: 'https://chakra-ui.com' + title: "Chakra UI", + category: "Library", + route: "/library/chakra-ui.svg", + url: "https://chakra-ui.com", }, { - title: 'Express.js', - category: 'Framework', + title: "Express.js", + category: "Framework", route: { - light: '/library/expressjs.svg', - dark: '/library/expressjs_dark.svg' + light: "/library/expressjs.svg", + dark: "/library/expressjs_dark.svg", }, - url: 'https://expressjs.com' + url: "https://expressjs.com", }, { - title: 'Fastify', - category: 'Framework', + title: "Fastify", + category: "Framework", route: { - light: '/library/fastify.svg', - dark: '/library/fastify_dark.svg' + light: "/library/fastify.svg", + dark: "/library/fastify_dark.svg", }, - url: 'https://www.fastify.io' + url: "https://www.fastify.io", }, { - title: 'JavaScript', - category: 'Language', - route: '/library/javascript.svg', - url: 'https://developer.mozilla.org/docs/Web/JavaScript' + title: "JavaScript", + category: "Language", + route: "/library/javascript.svg", + url: "https://developer.mozilla.org/docs/Web/JavaScript", }, { - title: 'jQuery', - category: 'Library', + title: "jQuery", + category: "Library", route: { - light: '/library/jquery.svg', - dark: '/library/jquery_dark.svg' + light: "/library/jquery.svg", + dark: "/library/jquery_dark.svg", }, - url: 'https://jquery.com' + url: "https://jquery.com", }, { - title: 'Rapid API', - category: 'Software', - route: '/library/rapidapi.svg', - url: 'https://rapidapi.com' + title: "Rapid API", + category: "Software", + route: "/library/rapidapi.svg", + url: "https://rapidapi.com", }, { - title: 'TypeScript', - category: 'Language', - route: '/library/typescript.svg', - url: 'https://www.typescriptlang.org' + title: "TypeScript", + category: "Language", + route: "/library/typescript.svg", + url: "https://www.typescriptlang.org", }, { - title: 'Bun', - category: 'Library', - route: '/library/bun.svg', - url: 'https://bun.sh', - brandUrl: 'https://bun.sh/press-kit' + title: "Bun", + category: "Library", + route: "/library/bun.svg", + url: "https://bun.sh", + brandUrl: "https://bun.sh/press-kit", }, { - title: 'BuildShip', - category: 'AI', - route: '/library/buildship.svg', - url: 'https://buildship.com/' + title: "BuildShip", + category: "AI", + route: "/library/buildship.svg", + url: "https://buildship.com/", }, { - title: 'Twilio', - category: ['Software', 'Authentication'], - route: '/library/twilio.svg', - url: 'https://twilio.com' + title: "Twilio", + category: ["Software", "Authentication"], + route: "/library/twilio.svg", + url: "https://twilio.com", }, { - title: 'Arc', - category: 'Social', + title: "Arc", + category: "Social", route: { - light: '/library/arc.svg', - dark: '/library/arc_dark.svg' + light: "/library/arc.svg", + dark: "/library/arc_dark.svg", }, - url: 'https://arc.dev' + url: "https://arc.dev", }, { - title: 'Arc', - category: 'Software', + title: "Arc", + category: "Software", route: { - light: '/library/arc_fintech_light.svg', - dark: '/library/arc_fintech_dark.svg' + light: "/library/arc_fintech_light.svg", + dark: "/library/arc_fintech_dark.svg", }, - url: 'https://arc.tech' + url: "https://arc.tech", }, { - title: 'Qwik', - category: 'Framework', - route: '/library/qwik.svg', - url: 'https://qwik.builder.io/' + title: "Qwik", + category: "Framework", + route: "/library/qwik.svg", + url: "https://qwik.builder.io/", }, { - title: 'Coinbase', - category: 'Crypto', - route: '/library/coinbase.svg', + title: "Coinbase", + category: "Crypto", + route: "/library/coinbase.svg", wordmark: { - light: '/library/coinbase-wordmark-light.svg', - dark: '/library/coinbase-wordmark-dark.svg' + light: "/library/coinbase-wordmark-light.svg", + dark: "/library/coinbase-wordmark-dark.svg", }, - url: 'https://www.coinbase.com/' + url: "https://www.coinbase.com/", }, { - title: 'Authy', - category: ['Software', 'Authentication'], - route: '/library/authy.svg', - url: 'https://authy.com/' + title: "Authy", + category: ["Software", "Authentication"], + route: "/library/authy.svg", + url: "https://authy.com/", }, { - title: 'NestJS', - category: 'Framework', - route: '/library/nestjs.svg', - url: 'https://nestjs.com/' + title: "NestJS", + category: "Framework", + route: "/library/nestjs.svg", + url: "https://nestjs.com/", }, { - title: 'GitHub Copilot', - category: 'Software', + title: "GitHub Copilot", + category: "Software", route: { - light: '/library/copilot.svg', - dark: '/library/copilot_dark.svg' + light: "/library/copilot.svg", + dark: "/library/copilot_dark.svg", }, - url: 'https://github.com/features/copilot' + url: "https://github.com/features/copilot", }, { - title: 'Railway', - category: 'Software', + title: "Railway", + category: "Software", route: { - light: '/library/railway.svg', - dark: '/library/railway_dark.svg' + light: "/library/railway.svg", + dark: "/library/railway_dark.svg", }, - url: 'https://railway.app/' + url: "https://railway.app/", }, { - title: 'Docusaurus', - category: 'Software', - route: '/library/docusaurus.svg', - url: 'https://docusaurus.io/' + title: "Docusaurus", + category: "Software", + route: "/library/docusaurus.svg", + url: "https://docusaurus.io/", }, { - title: 'Twitch', - category: 'Entertainment', - route: '/library/twitch.svg', - url: 'https://twitch.tv' + title: "Twitch", + category: "Entertainment", + route: "/library/twitch.svg", + url: "https://twitch.tv", }, { - title: 'GoDaddy', - category: 'Hosting', + title: "GoDaddy", + category: "Hosting", route: { - light: '/library/godaddy.svg', - dark: '/library/godaddy_dark.svg' + light: "/library/godaddy.svg", + dark: "/library/godaddy_dark.svg", }, - url: 'https://www.godaddy.com/' + url: "https://www.godaddy.com/", }, { - title: 'Udemy', - category: 'Education', + title: "Udemy", + category: "Education", route: { - light: '/library/udemy.svg', - dark: '/library/udemy_dark.svg' + light: "/library/udemy.svg", + dark: "/library/udemy_dark.svg", }, - url: 'https://www.udemy.com/' + url: "https://www.udemy.com/", }, { - title: 'GraphQL', - category: 'Language', - route: '/library/graphql.svg', - url: 'https://graphql.org/' + title: "GraphQL", + category: "Language", + route: "/library/graphql.svg", + url: "https://graphql.org/", }, { - title: 'Grok', - category: 'AI', + title: "Grok", + category: "AI", route: { - light: '/library/grok-light.svg', - dark: '/library/grok-dark.svg' + light: "/library/grok-light.svg", + dark: "/library/grok-dark.svg", }, wordmark: { - light: '/library/grok-wordmark-light.svg', - dark: '/library/grok-wordmark-dark.svg' + light: "/library/grok-wordmark-light.svg", + dark: "/library/grok-wordmark-dark.svg", }, - url: 'https://grok.com/' + url: "https://grok.com/", }, { - title: 'GitLab', - category: 'Software', - route: '/library/gitlab.svg', - url: 'https://gitlab.com/' + title: "GitLab", + category: "Software", + route: "/library/gitlab.svg", + url: "https://gitlab.com/", }, { - title: 'Prisma', - category: 'Software', + title: "Prisma", + category: "Software", route: { - light: '/library/prisma.svg', - dark: '/library/prisma_dark.svg' + light: "/library/prisma.svg", + dark: "/library/prisma_dark.svg", }, - url: 'https://prisma.io/' + url: "https://prisma.io/", }, { - title: 'Go', - category: 'Language', + title: "Go", + category: "Language", route: { - light: '/library/golang.svg', - dark: '/library/golang_dark.svg' + light: "/library/golang.svg", + dark: "/library/golang_dark.svg", }, - url: 'https://go.dev/' + url: "https://go.dev/", }, { - title: 'Platzi', - category: 'Education', - route: '/library/platzi.svg', - url: 'https://platzi.com/' + title: "Platzi", + category: "Education", + route: "/library/platzi.svg", + url: "https://platzi.com/", }, { - title: 'Coursera', - category: 'Education', - route: '/library/coursera.svg', - url: 'https://www.coursera.org/' + title: "Coursera", + category: "Education", + route: "/library/coursera.svg", + url: "https://www.coursera.org/", }, { - title: 'Udacity', - category: 'Education', - route: '/library/udacity.svg', - url: 'https://www.udacity.com/' + title: "Udacity", + category: "Education", + route: "/library/udacity.svg", + url: "https://www.udacity.com/", }, { - title: 'Kubernetes', - category: 'Software', - route: '/library/kubernetes.svg', - url: 'https://kubernetes.io/' + title: "Kubernetes", + category: "Software", + route: "/library/kubernetes.svg", + url: "https://kubernetes.io/", }, { - title: 'Docker', - category: 'Software', - route: '/library/docker.svg', - url: 'https://www.docker.com/', - brandUrl: 'https://www.docker.com/company/newsroom/media-resources/' + title: "Docker", + category: "Software", + route: "/library/docker.svg", + url: "https://www.docker.com/", + brandUrl: "https://www.docker.com/company/newsroom/media-resources/", }, { - title: 'Amazon Web Services', - category: 'Software', + title: "Amazon Web Services", + category: "Software", route: { - light: '/library/aws_light.svg', - dark: '/library/aws_dark.svg' + light: "/library/aws_light.svg", + dark: "/library/aws_dark.svg", }, - url: 'https://aws.amazon.com/' + url: "https://aws.amazon.com/", }, { - title: 'Microsoft Azure', - category: 'Software', - route: '/library/azure.svg', - url: 'https://azure.microsoft.com/' + title: "Microsoft Azure", + category: "Software", + route: "/library/azure.svg", + url: "https://azure.microsoft.com/", }, { - title: 'Heroku', - category: 'Software', - route: '/library/heroku.svg', - url: 'https://www.heroku.com/' + title: "Heroku", + category: "Software", + route: "/library/heroku.svg", + url: "https://www.heroku.com/", }, { - title: 'JetBrains', - category: 'Software', - route: '/library/jetbrains.svg', - url: 'https://www.jetbrains.com/', - brandUrl: 'https://www.jetbrains.com/company/brand/' + title: "JetBrains", + category: "Software", + route: "/library/jetbrains.svg", + url: "https://www.jetbrains.com/", + brandUrl: "https://www.jetbrains.com/company/brand/", }, { - title: 'JetBrains Rider', - category: 'Software', - route: '/library/rider.svg', - url: 'https://www.jetbrains.com/rider/' + title: "JetBrains Rider", + category: "Software", + route: "/library/rider.svg", + url: "https://www.jetbrains.com/rider/", }, { - title: 'PlanetScale', - category: 'Database', + title: "PlanetScale", + category: "Database", route: { - light: '/library/planetscale.svg', - dark: '/library/planetscale_dark.svg' + light: "/library/planetscale.svg", + dark: "/library/planetscale_dark.svg", }, - url: 'https://planetscale.com/' + url: "https://planetscale.com/", }, { - title: 'Playwright', - category: 'Framework', - route: '/library/playwright.svg', - url: 'https://playwright.dev/' + title: "Playwright", + category: "Framework", + route: "/library/playwright.svg", + url: "https://playwright.dev/", }, { - title: 'Atlassian', - category: 'Software', - route: '/library/atlassian.svg', - url: 'https://www.atlassian.com/' + title: "Atlassian", + category: "Software", + route: "/library/atlassian.svg", + url: "https://www.atlassian.com/", }, { - title: 'Discourse', - category: 'Software', - route: '/library/discourse.svg', - url: 'https://discourse.org/' + title: "Discourse", + category: "Software", + route: "/library/discourse.svg", + url: "https://discourse.org/", }, { - title: 'Ember', - category: 'Framework', - route: '/library/ember.svg', - url: 'https://emberjs.com/' + title: "Ember", + category: "Framework", + route: "/library/ember.svg", + url: "https://emberjs.com/", }, { - title: 'Expo', - category: 'Software', - route: '/library/expo.svg', - url: 'https://expo.dev/' + title: "Expo", + category: "Software", + route: "/library/expo.svg", + url: "https://expo.dev/", }, { - title: 'Flutter', - category: 'Framework', - route: '/library/flutter.svg', - url: 'https://flutter.dev/', - brandUrl: 'https://flutter.dev/brand' + title: "Flutter", + category: "Framework", + route: "/library/flutter.svg", + url: "https://flutter.dev/", + brandUrl: "https://flutter.dev/brand", }, { - title: 'Auth0', - category: ['Library', 'Authentication'], - route: '/library/auth0.svg', - url: 'https://auth0.com/' + title: "Auth0", + category: ["Library", "Authentication"], + route: "/library/auth0.svg", + url: "https://auth0.com/", }, { - title: 'Fresh', - category: 'Framework', - route: '/library/fresh.svg', - url: 'https://fresh.deno.dev/' + title: "Fresh", + category: "Framework", + route: "/library/fresh.svg", + url: "https://fresh.deno.dev/", }, { - title: 'Git', - category: 'Software', - route: '/library/git.svg', - url: 'https://git-scm.com/' + title: "Git", + category: "Software", + route: "/library/git.svg", + url: "https://git-scm.com/", }, { - title: 'Hostgator', - category: 'Hosting', - route: '/library/hostgator.svg', - url: 'https://www.hostgator.com/' + title: "Hostgator", + category: "Hosting", + route: "/library/hostgator.svg", + url: "https://www.hostgator.com/", }, { - title: 'IntelliJ IDEA', - category: 'Software', - route: '/library/intellijidea.svg', - url: 'https://www.jetbrains.com/idea/' + title: "IntelliJ IDEA", + category: "Software", + route: "/library/intellijidea.svg", + url: "https://www.jetbrains.com/idea/", }, { - title: 'Jasmine', - category: 'Framework', - route: '/library/jasmine.svg', - url: 'https://jasmine.github.io/' + title: "Jasmine", + category: "Framework", + route: "/library/jasmine.svg", + url: "https://jasmine.github.io/", }, { - title: 'Java', - category: 'Language', - route: '/library/java.svg', - url: 'https://www.java.com/' + title: "Java", + category: "Language", + route: "/library/java.svg", + url: "https://www.java.com/", }, { - title: 'Jest', - category: 'Framework', - route: '/library/jest.svg', - url: 'https://jestjs.io/' + title: "Jest", + category: "Framework", + route: "/library/jest.svg", + url: "https://jestjs.io/", }, { - title: 'JetBrains', - category: 'Software', - route: '/library/jetbrainsSolid.svg', - url: 'https://www.jetbrains.com/' + title: "JetBrains", + category: "Software", + route: "/library/jetbrainsSolid.svg", + url: "https://www.jetbrains.com/", }, { - title: 'KrakenJS', - category: 'Framework', - route: '/library/krakenjs.svg', - url: 'https://krakenjs.com/' + title: "KrakenJS", + category: "Framework", + route: "/library/krakenjs.svg", + url: "https://krakenjs.com/", }, { - title: 'Laravel', - category: 'Framework', - route: '/library/laravel.svg', - url: 'https://laravel.com/' + title: "Laravel", + category: "Framework", + route: "/library/laravel.svg", + url: "https://laravel.com/", }, { - title: 'MariaDB', - category: 'Database', - route: '/library/mariadb.svg', - url: 'https://mariadb.org/' + title: "MariaDB", + category: "Database", + route: "/library/mariadb.svg", + url: "https://mariadb.org/", }, { - title: 'Material UI', - category: 'Framework', - route: '/library/materialui.svg', - url: 'https://mui.com/' + title: "Material UI", + category: "Framework", + route: "/library/materialui.svg", + url: "https://mui.com/", }, { - title: 'MySQL', - category: 'Database', - route: '/library/mysql.svg', - url: 'https://www.mysql.com/' + title: "MySQL", + category: "Database", + route: "/library/mysql.svg", + url: "https://www.mysql.com/", }, { - title: 'Parcel', - category: 'Compiler', - route: '/library/parcel.svg', - url: 'https://parceljs.org/' + title: "Parcel", + category: "Compiler", + route: "/library/parcel.svg", + url: "https://parceljs.org/", }, { - title: 'PM2', - category: 'Framework', - route: '/library/pm2.svg', - url: 'https://pm2.io/' + title: "PM2", + category: "Framework", + route: "/library/pm2.svg", + url: "https://pm2.io/", }, { - title: 'PostgreSQL', - category: 'Database', - route: '/library/postgresql.svg', - url: 'https://www.postgresql.org/' + title: "PostgreSQL", + category: "Database", + route: "/library/postgresql.svg", + url: "https://www.postgresql.org/", }, { - title: 'React Query', - category: 'Framework', - route: '/library/reactquery.svg', - url: 'https://tanstack.com/query/v4' + title: "React Query", + category: "Framework", + route: "/library/reactquery.svg", + url: "https://tanstack.com/query/v4", }, { - title: 'Devto', - category: 'Community', + title: "Devto", + category: "Community", route: { - light: '/library/devto-light.svg', - dark: '/library/devto-dark.svg' + light: "/library/devto-light.svg", + dark: "/library/devto-dark.svg", }, - url: 'https://dev.to/' + url: "https://dev.to/", }, { - title: 'Redis', - category: 'Database', - route: '/library/redis.svg', - url: 'https://redis.io/' + title: "Redis", + category: "Database", + route: "/library/redis.svg", + url: "https://redis.io/", }, { - title: 'RedwoodJS', - category: 'Framework', - route: '/library/redwoodjs.svg', - url: 'https://redwoodjs.com/' + title: "RedwoodJS", + category: "Framework", + route: "/library/redwoodjs.svg", + url: "https://redwoodjs.com/", }, { - title: 'Ruby', - category: 'Language', - route: '/library/ruby.svg', - url: 'https://www.ruby-lang.org/' + title: "Ruby", + category: "Language", + route: "/library/ruby.svg", + url: "https://www.ruby-lang.org/", }, { - title: 'Scala', - category: 'Language', - route: '/library/scala.svg', - url: 'https://www.scala-lang.org/' + title: "Scala", + category: "Language", + route: "/library/scala.svg", + url: "https://www.scala-lang.org/", }, { - title: 'Sequelize', - category: 'Framework', - route: '/library/sequelize.svg', - url: 'https://sequelize.org/' + title: "Sequelize", + category: "Framework", + route: "/library/sequelize.svg", + url: "https://sequelize.org/", }, { - title: 'Spinnaker', - category: 'Software', - route: '/library/spinnaker.svg', - url: 'https://spinnaker.io/' + title: "Spinnaker", + category: "Software", + route: "/library/spinnaker.svg", + url: "https://spinnaker.io/", }, { - title: 'SQLite', - category: 'Database', - route: '/library/sqlite.svg', - url: 'https://www.sqlite.org/' + title: "SQLite", + category: "Database", + route: "/library/sqlite.svg", + url: "https://www.sqlite.org/", }, { - title: 'Swagger', - category: 'Software', - route: '/library/swagger.svg', - url: 'https://swagger.io/' + title: "Swagger", + category: "Software", + route: "/library/swagger.svg", + url: "https://swagger.io/", }, { - title: 'Swift', - category: 'Language', - route: '/library/swift.svg', - url: 'https://swift.org/' + title: "Swift", + category: "Language", + route: "/library/swift.svg", + url: "https://swift.org/", }, { - title: 'TypeORM', - category: 'Database', - route: '/library/typeorm.svg', - url: 'https://typeorm.io/' + title: "TypeORM", + category: "Database", + route: "/library/typeorm.svg", + url: "https://typeorm.io/", }, { - title: 'Unity', - category: 'Software', + title: "Unity", + category: "Software", route: { - light: '/library/unity.svg', - dark: '/library/unity_dark.svg' + light: "/library/unity.svg", + dark: "/library/unity_dark.svg", }, - url: 'https://unity.com/' + url: "https://unity.com/", }, { - title: 'Vim', - category: 'Software', - route: '/library/vim.svg', - url: 'https://www.vim.org/' + title: "Vim", + category: "Software", + route: "/library/vim.svg", + url: "https://www.vim.org/", }, { - title: 'Pocketbase', - category: 'Database', - route: '/library/pocket-base.svg', - url: 'https://pocketbase.io/' + title: "Pocketbase", + category: "Database", + route: "/library/pocket-base.svg", + url: "https://pocketbase.io/", }, { - title: 'OpenBootcamp', - category: 'Education', - route: '/library/openbootcamp.svg', - url: 'https://open-bootcamp.com/' + title: "OpenBootcamp", + category: "Education", + route: "/library/openbootcamp.svg", + url: "https://open-bootcamp.com/", }, { - title: 'Digital Ocean', - category: 'Software', - route: '/library/digitalocean.svg', - url: 'https://www.digitalocean.com/' + title: "Digital Ocean", + category: "Software", + route: "/library/digitalocean.svg", + url: "https://www.digitalocean.com/", }, { - title: 'Disney+', - category: 'Entertainment', - route: '/library/disneyplus.svg', - url: 'https://www.disneyplus.com/' + title: "Disney+", + category: "Entertainment", + route: "/library/disneyplus.svg", + url: "https://www.disneyplus.com/", }, { - title: 'React Router', - category: 'Library', - route: '/library/reactrouter.svg', - url: 'https://reactrouter.com/en/main' + title: "React Router", + category: "Library", + route: "/library/reactrouter.svg", + url: "https://reactrouter.com/en/main", }, { - title: 'AMP', - category: 'Library', - route: '/library/amp.svg', - url: 'https://amp.dev/' + title: "AMP", + category: "Library", + route: "/library/amp.svg", + url: "https://amp.dev/", }, { - title: 'Developer Student Club', - category: 'Community', - route: '/library/gdsc.svg', - url: 'https://gdsc.community.dev/' + title: "Developer Student Club", + category: "Community", + route: "/library/gdsc.svg", + url: "https://gdsc.community.dev/", }, { - title: 'Brave Browser', - category: 'Browser', - route: '/library/brave.svg', - url: 'https://brave.com/', - brandUrl: 'https://brave.com/brave-branding-assets/' + title: "Brave Browser", + category: "Browser", + route: "/library/brave.svg", + url: "https://brave.com/", + brandUrl: "https://brave.com/brave-branding-assets/", }, { - title: 'Eclipse IDE', - category: 'Software', - route: '/library/eclipse.svg', - url: 'https://www.eclipse.org/' + title: "Eclipse IDE", + category: "Software", + route: "/library/eclipse.svg", + url: "https://www.eclipse.org/", }, { - title: 'Three.js', - category: 'Library', + title: "Three.js", + category: "Library", route: { - light: '/library/threejs-light.svg', - dark: '/library/threejs-dark.svg' + light: "/library/threejs-light.svg", + dark: "/library/threejs-dark.svg", }, - url: 'https://threejs.org/' + url: "https://threejs.org/", }, { - title: 'HTML5', - category: 'Language', - route: '/library/html5.svg', - url: 'https://es.wikipedia.org/wiki/HTML5' + title: "HTML5", + category: "Language", + route: "/library/html5.svg", + url: "https://es.wikipedia.org/wiki/HTML5", }, { - title: 'CSS (New)', - category: 'Language', - route: '/library/css.svg', - url: 'https://es.wikipedia.org/wiki/CSS' + title: "CSS (New)", + category: "Language", + route: "/library/css.svg", + url: "https://es.wikipedia.org/wiki/CSS", }, { - title: 'CSS', - category: 'Language', - route: '/library/css_old.svg', - url: 'https://es.wikipedia.org/wiki/CSS' + title: "CSS", + category: "Language", + route: "/library/css_old.svg", + url: "https://es.wikipedia.org/wiki/CSS", }, { - title: 'midudev', - category: 'Community', - route: '/library/midudev.svg', - url: 'https://midu.dev' + title: "midudev", + category: "Community", + route: "/library/midudev.svg", + url: "https://midu.dev", }, { - title: 'Apple', - category: 'Software', + title: "Apple", + category: "Software", route: { - light: '/library/apple.svg', - dark: '/library/apple_dark.svg' + light: "/library/apple.svg", + dark: "/library/apple_dark.svg", }, - url: 'https://www.apple.com' + url: "https://www.apple.com", }, { - title: 'Windows', - category: 'Software', - route: '/library/windows.svg', - url: 'https://www.microsoft.com/windows' + title: "Windows", + category: "Software", + route: "/library/windows.svg", + url: "https://www.microsoft.com/windows", }, { - title: 'Python', - category: 'Language', - route: '/library/python.svg', - url: 'https://www.python.org/' + title: "Python", + category: "Language", + route: "/library/python.svg", + url: "https://www.python.org/", }, { - title: 'Solidity', - category: 'Language', - route: '/library/solidity.svg', - url: 'https://soliditylang.org/' + title: "Solidity", + category: "Language", + route: "/library/solidity.svg", + url: "https://soliditylang.org/", }, { - title: 'Turbopack', - category: 'Software', - route: '/library/turbopack.svg', - url: 'https://turbo.build/' + title: "Turbopack", + category: "Software", + route: "/library/turbopack.svg", + url: "https://turbo.build/", }, { - title: 'Builder', - category: 'CMS', - route: '/library/builder.svg', - url: 'https://builder.io/' + title: "Builder", + category: "CMS", + route: "/library/builder.svg", + url: "https://builder.io/", }, { - title: 'Babel', - category: 'Compiler', - route: '/library/babel.svg', - url: 'https://babeljs.io/' + title: "Babel", + category: "Compiler", + route: "/library/babel.svg", + url: "https://babeljs.io/", }, { - title: 'Surrealdb', - category: 'Database', - route: '/library/surrealdb.svg', - url: 'https://surrealdb.com/' + title: "Surrealdb", + category: "Database", + route: "/library/surrealdb.svg", + url: "https://surrealdb.com/", }, { - title: 'Jetbrains Space', - category: 'Software', - route: '/library/jetbrains-space.svg', - url: 'https://www.jetbrains.com/space/' + title: "Jetbrains Space", + category: "Software", + route: "/library/jetbrains-space.svg", + url: "https://www.jetbrains.com/space/", }, { - title: 'Stimulus', - category: 'Framework', - route: '/library/stimulus.svg', - url: 'https://stimulus.hotwired.dev/' + title: "Stimulus", + category: "Framework", + route: "/library/stimulus.svg", + url: "https://stimulus.hotwired.dev/", }, { - title: 'WindiCSS', - category: 'Framework', - route: '/library/windicss.svg', - url: 'https://windicss.org/' + title: "WindiCSS", + category: "Framework", + route: "/library/windicss.svg", + url: "https://windicss.org/", }, { - title: 'Mastodon', - category: 'Social', - route: '/library/mastodon.svg', - url: 'https://joinmastodon.org/' + title: "Mastodon", + category: "Social", + route: "/library/mastodon.svg", + url: "https://joinmastodon.org/", }, { - title: 'Upstash', - category: 'Database', - route: '/library/upstash.svg', - url: 'https://upstash.com/', - brandUrl: 'https://upstash.com/brand' + title: "Upstash", + category: "Database", + route: "/library/upstash.svg", + url: "https://upstash.com/", + brandUrl: "https://upstash.com/brand", }, { - title: 'Storyblok', - category: 'CMS', - route: '/library/storyblok.svg', - url: 'https://www.storyblok.com/' + title: "Storyblok", + category: "CMS", + route: "/library/storyblok.svg", + url: "https://www.storyblok.com/", }, { - title: 'Cloudflare Workers', - category: 'Software', - route: '/library/cloudflare-workers.svg', - url: 'https://workers.cloudflare.com/' + title: "Cloudflare Workers", + category: "Software", + route: "/library/cloudflare-workers.svg", + url: "https://workers.cloudflare.com/", }, { - title: 'Cloudflare', - category: 'Software', - route: '/library/cloudflare.svg', - url: 'https://www.cloudflare.com/' + title: "Cloudflare", + category: "Software", + route: "/library/cloudflare.svg", + url: "https://www.cloudflare.com/", }, { - title: 'Bing', - category: 'Browser', - route: '/library/bing.svg', - url: 'https://www.bing.com/' + title: "Bing", + category: "Browser", + route: "/library/bing.svg", + url: "https://www.bing.com/", }, { - title: 'Cloudinary', - category: 'Software', - route: '/library/cloudinary.svg', - url: 'https://cloudinary.com/' + title: "Cloudinary", + category: "Software", + route: "/library/cloudinary.svg", + url: "https://cloudinary.com/", }, { - title: 'Dart', - category: 'Language', - route: '/library/dart.svg', - url: 'https://dart.dev/' + title: "Dart", + category: "Language", + route: "/library/dart.svg", + url: "https://dart.dev/", }, { - title: 'hCaptcha', - category: 'Software', - route: '/library/hcaptcha.svg', - url: 'https://www.hcaptcha.com/' + title: "hCaptcha", + category: "Software", + route: "/library/hcaptcha.svg", + url: "https://www.hcaptcha.com/", }, { - title: 'Appwrite', - category: 'Software', - route: '/library/appwrite.svg', - url: 'https://appwrite.io/' + title: "Appwrite", + category: "Software", + route: "/library/appwrite.svg", + url: "https://appwrite.io/", }, { - title: 'Loom', - category: 'Software', - route: '/library/loom.svg', - url: 'https://www.loom.com/' + title: "Loom", + category: "Software", + route: "/library/loom.svg", + url: "https://www.loom.com/", }, { - title: 'Hulu', - category: 'Entertainment', + title: "Hulu", + category: "Entertainment", route: { - light: '/library/hulu.svg', - dark: '/library/hulu-dark.svg' + light: "/library/hulu.svg", + dark: "/library/hulu-dark.svg", }, - url: 'https://www.hulu.com/' + url: "https://www.hulu.com/", }, { - title: 'Stackblitz', - category: 'Software', - route: '/library/stackblitz.svg', - url: 'https://stackblitz.com/' + title: "Stackblitz", + category: "Software", + route: "/library/stackblitz.svg", + url: "https://stackblitz.com/", }, { - title: 'Binance', - category: 'Crypto', - route: '/library/binance.svg', - url: 'https://binance.com/' + title: "Binance", + category: "Crypto", + route: "/library/binance.svg", + url: "https://binance.com/", }, { - title: 'Messenger', - category: 'Social', - route: '/library/messenger.svg', - url: 'https://www.messenger.com/' + title: "Messenger", + category: "Social", + route: "/library/messenger.svg", + url: "https://www.messenger.com/", }, { - title: 'NHost', - category: 'Hosting', - route: '/library/nhost.svg', - url: 'https://nhost.io/' + title: "NHost", + category: "Hosting", + route: "/library/nhost.svg", + url: "https://nhost.io/", }, { - title: 'Medusa', - category: 'Software', - route: '/library/medusa.svg', - url: 'https://medusajs.com/' + title: "Medusa", + category: "Software", + route: "/library/medusa.svg", + url: "https://medusajs.com/", }, { - title: 'WordPress', - category: ['Software', 'CMS'], - route: '/library/wordpress.svg', - url: 'https://wordpress.org/', - brandUrl: 'https://wordpress.org/about/logos/' + title: "WordPress", + category: ["Software", "CMS"], + route: "/library/wordpress.svg", + url: "https://wordpress.org/", + brandUrl: "https://wordpress.org/about/logos/", }, { - title: 'Microsoft', - category: 'Software', - route: '/library/microsoft.svg', - url: 'https://www.microsoft.com/' + title: "Microsoft", + category: "Software", + route: "/library/microsoft.svg", + url: "https://www.microsoft.com/", }, { - title: 'Elementor', - category: 'Software', - route: '/library/elementor.svg', - url: 'https://elementor.com/' + title: "Elementor", + category: "Software", + route: "/library/elementor.svg", + url: "https://elementor.com/", }, { - title: 'Kick', - category: 'Entertainment', + title: "Kick", + category: "Entertainment", route: { - light: '/library/kick-light.svg', - dark: '/library/kick-dark.svg' + light: "/library/kick-light.svg", + dark: "/library/kick-dark.svg", }, - url: 'https://kick.com/' + url: "https://kick.com/", }, { - title: 'Prime video', - category: 'Entertainment', - route: '/library/prime-video.svg', - url: 'https://primevideo.com/' + title: "Prime video", + category: "Entertainment", + route: "/library/prime-video.svg", + url: "https://primevideo.com/", }, { - title: 'Chrome', - category: 'Browser', - route: '/library/chrome.svg', - url: 'https://chrome.com/' + title: "Chrome", + category: "Browser", + route: "/library/chrome.svg", + url: "https://chrome.com/", }, { - title: 'RxJS', - category: 'Library', - route: '/library/rxjs.svg', - url: 'https://rxjs.dev/' + title: "RxJS", + category: "Library", + route: "/library/rxjs.svg", + url: "https://rxjs.dev/", }, { - title: 'Electron', - category: 'Library', - route: '/library/electron.svg', - url: 'https://www.electronjs.org' + title: "Electron", + category: "Library", + route: "/library/electron.svg", + url: "https://www.electronjs.org", }, { - title: 'Redux', - category: 'Library', - route: '/library/redux.svg', - url: 'https://redux.js.org/' + title: "Redux", + category: "Library", + route: "/library/redux.svg", + url: "https://redux.js.org/", }, { - title: 'Trust Wallet', - category: 'Crypto', - route: '/library/trust.svg', - url: 'https://trustwallet.com/' + title: "Trust Wallet", + category: "Crypto", + route: "/library/trust.svg", + url: "https://trustwallet.com/", }, { - title: 'Php', - category: 'Language', + title: "Php", + category: "Language", route: { - light: '/library/php.svg', - dark: '/library/php_dark.svg' + light: "/library/php.svg", + dark: "/library/php_dark.svg", }, - url: 'https://www.php.net/' + url: "https://www.php.net/", }, { - title: 'Hugo', - category: 'Framework', - route: '/library/hugo.svg', - url: 'https://gohugo.io/' + title: "Hugo", + category: "Framework", + route: "/library/hugo.svg", + url: "https://gohugo.io/", }, { - title: 'Sass', - category: 'Language', - route: '/library/sass.svg', - url: 'https://sass-lang.com/' + title: "Sass", + category: "Language", + route: "/library/sass.svg", + url: "https://sass-lang.com/", }, { - title: 'Arc', - category: 'Browser', - route: '/library/arc_browser.svg', - url: 'https://arc.net/' + title: "Arc", + category: "Browser", + route: "/library/arc_browser.svg", + url: "https://arc.net/", }, { - title: 'Pinia', - category: 'Library', - route: '/library/pinia.svg', - url: 'https://pinia.vuejs.org/' + title: "Pinia", + category: "Library", + route: "/library/pinia.svg", + url: "https://pinia.vuejs.org/", }, { - title: 'Neon', - category: 'Database', - route: '/library/neon.svg', - url: 'https://neon.tech/' + title: "Neon", + category: "Database", + route: "/library/neon.svg", + url: "https://neon.tech/", }, { - title: 'Infojobs', - category: 'Social', - route: '/library/infojobs-logo.svg', - url: 'https://www.infojobs.net/' + title: "Infojobs", + category: "Social", + route: "/library/infojobs-logo.svg", + url: "https://www.infojobs.net/", }, { - title: 'Linear', - category: 'Software', - route: '/library/linear.svg', - url: 'https://linear.app/' + title: "Linear", + category: "Software", + route: "/library/linear.svg", + url: "https://linear.app/", }, { - title: 'Tor', - category: 'Browser', - route: '/library/tor.svg', - url: 'https://www.torproject.org/' + title: "Tor", + category: "Browser", + route: "/library/tor.svg", + url: "https://www.torproject.org/", }, { - title: 'Codesandbox', - category: 'Software', - route: '/library/codesandbox-square.svg', - url: 'https://codesandbox.io/' + title: "Codesandbox", + category: "Software", + route: "/library/codesandbox-square.svg", + url: "https://codesandbox.io/", }, { - title: 'Skype', - category: 'Social', - route: '/library/skype.svg', - url: 'https://www.skype.com/' + title: "Skype", + category: "Social", + route: "/library/skype.svg", + url: "https://www.skype.com/", }, { - title: 'Tauri', - category: 'Library', - route: '/library/tauri.svg', - url: 'https://tauri.app/' + title: "Tauri", + category: "Library", + route: "/library/tauri.svg", + url: "https://tauri.app/", }, { - title: 'WebKit', - category: 'Software', - route: '/library/webkit.svg', - url: 'https://webkit.org/' + title: "WebKit", + category: "Software", + route: "/library/webkit.svg", + url: "https://webkit.org/", }, { - title: 'DuckDuckGo', - category: ['Software', 'Browser'], - route: '/library/duckduckgo.svg', - wordmark: '/library/duckduckgo-wordmark.svg', - url: 'https://duckduckgo.com/' + title: "DuckDuckGo", + category: ["Software", "Browser"], + route: "/library/duckduckgo.svg", + wordmark: "/library/duckduckgo-wordmark.svg", + url: "https://duckduckgo.com/", }, { - title: 'Obsidian', - category: 'Software', - route: '/library/obsidian.svg', - url: 'https://obsidian.md/', - brandUrl: 'https://obsidian.md/brand' + title: "Obsidian", + category: "Software", + route: "/library/obsidian.svg", + url: "https://obsidian.md/", + brandUrl: "https://obsidian.md/brand", }, { - title: 'Zod', - category: 'Library', - route: '/library/zod.svg', - url: 'https://zod.dev/' + title: "Zod", + category: "Library", + route: "/library/zod.svg", + url: "https://zod.dev/", }, { - title: 'Valibot', - category: 'Library', - route: '/library/valibot.svg', + title: "Valibot", + category: "Library", + route: "/library/valibot.svg", wordmark: { - light: '/library/valibot-wordmark-light.svg', - dark: '/library/valibot-wordmark-dark.svg' + light: "/library/valibot-wordmark-light.svg", + dark: "/library/valibot-wordmark-dark.svg", }, - url: 'https://valibot.dev' + url: "https://valibot.dev", }, { - title: 'Dreamweaver', - category: 'Software', - route: '/library/dw.svg', - url: 'https://www.adobe.com/products/dreamweaver.html' + title: "Dreamweaver", + category: "Software", + route: "/library/dw.svg", + url: "https://www.adobe.com/products/dreamweaver.html", }, { - title: 'OpenAI', - category: 'AI', + title: "OpenAI", + category: "AI", route: { - light: '/library/openai.svg', - dark: '/library/openai_dark.svg' + light: "/library/openai.svg", + dark: "/library/openai_dark.svg", }, wordmark: { - light: '/library/openai_wordmark_light.svg', - dark: '/library/openai_wordmark_dark.svg' + light: "/library/openai_wordmark_light.svg", + dark: "/library/openai_wordmark_dark.svg", }, - url: 'https://openai.com/', - brandUrl: 'https://openai.com/brand/' + url: "https://openai.com/", + brandUrl: "https://openai.com/brand/", }, { - title: 'Threads', - category: 'Social', + title: "Threads", + category: "Social", route: { - light: '/library/threads.svg', - dark: '/library/threads_dark.svg' + light: "/library/threads.svg", + dark: "/library/threads_dark.svg", }, - url: 'https://threads.net/' + url: "https://threads.net/", }, { - title: 'Instagram', - category: 'Social', + title: "Instagram", + category: "Social", route: { - light: '/library/instagram.svg', - dark: '/library/instagram_dark.svg' + light: "/library/instagram.svg", + dark: "/library/instagram_dark.svg", }, - url: 'https://www.instagram.com/', - brandUrl: 'https://about.instagram.com/brand' + url: "https://www.instagram.com/", + brandUrl: "https://about.instagram.com/brand", }, { - title: 'VueUse', - category: 'Library', - route: '/library/vueuse.svg', - url: 'https://vueuse.org/' + title: "VueUse", + category: "Library", + route: "/library/vueuse.svg", + url: "https://vueuse.org/", }, { - title: 'Microsoft SQL Server ', - category: 'Database', - route: '/library/sql-server.svg', - url: 'https://www.microsoft.com/en-us/sql-server/' + title: "Microsoft SQL Server ", + category: "Database", + route: "/library/sql-server.svg", + url: "https://www.microsoft.com/en-us/sql-server/", }, { - title: 'Hono', - category: 'Framework', - route: '/library/hono.svg', - url: 'https://hono.dev/' + title: "Hono", + category: "Framework", + route: "/library/hono.svg", + url: "https://hono.dev/", }, { - title: 'Million', - category: 'Library', - route: '/library/million.svg', - url: 'https://million.dev/' + title: "Million", + category: "Library", + route: "/library/million.svg", + url: "https://million.dev/", }, { - title: 'PandaCSS', - category: 'Library', - route: '/library/pandacss.svg', - url: 'https://panda-css.com/' + title: "PandaCSS", + category: "Library", + route: "/library/pandacss.svg", + url: "https://panda-css.com/", }, { - title: 'Pulumi', - category: 'Software', - route: '/library/pulumi.svg', - url: 'https://www.pulumi.com/' + title: "Pulumi", + category: "Software", + route: "/library/pulumi.svg", + url: "https://www.pulumi.com/", }, { - title: 'FastAPI', - category: 'Framework', - route: '/library/fastapi.svg', - url: 'https://fastapi.tiangolo.com/' + title: "FastAPI", + category: "Framework", + route: "/library/fastapi.svg", + url: "https://fastapi.tiangolo.com/", }, { - title: 'Codium', - category: 'AI', - route: '/library/codium.svg', - url: 'https://www.codium.ai/' + title: "Codium", + category: "AI", + route: "/library/codium.svg", + url: "https://www.codium.ai/", }, { - title: 'Crossplane', - category: 'Framework', - route: '/library/crossplane.svg', - url: 'https://crossplane.io/' + title: "Crossplane", + category: "Framework", + route: "/library/crossplane.svg", + url: "https://crossplane.io/", }, { - title: 'Volta', - category: 'Software', + title: "Volta", + category: "Software", route: { - light: '/library/volta-dark.svg', - dark: '/library/volta-light.svg' + light: "/library/volta-dark.svg", + dark: "/library/volta-light.svg", }, - url: 'https://volta.net/' + url: "https://volta.net/", }, { - title: 'Typesense', - category: 'Software', - route: '/library/typesense.svg', - url: 'https://typesense.org/' + title: "Typesense", + category: "Software", + route: "/library/typesense.svg", + url: "https://typesense.org/", }, { - title: 'Bitcoin', - category: 'Crypto', - route: '/library/btc.svg', - url: 'https://bitcoin.org/' + title: "Bitcoin", + category: "Crypto", + route: "/library/btc.svg", + url: "https://bitcoin.org/", }, { - title: 'Ethereum', - category: 'Crypto', - route: '/library/eth.svg', - url: 'https://ethereum.org/' + title: "Ethereum", + category: "Crypto", + route: "/library/eth.svg", + url: "https://ethereum.org/", }, { - title: 'Solana', - category: 'Crypto', - route: '/library/sol.svg', - url: 'https://solana.com/' + title: "Solana", + category: "Crypto", + route: "/library/sol.svg", + url: "https://solana.com/", }, { - title: 'Dogecoin', - category: 'Crypto', - route: '/library/doge.svg', - url: 'https://dogecoin.com/' + title: "Dogecoin", + category: "Crypto", + route: "/library/doge.svg", + url: "https://dogecoin.com/", }, { - title: 'XRP', - category: 'Crypto', - route: '/library/xrp.svg', - url: 'https://xrpl.org/' + title: "XRP", + category: "Crypto", + route: "/library/xrp.svg", + url: "https://xrpl.org/", }, { - title: 'BNB', - category: 'Crypto', - route: '/library/bnb.svg', - url: 'https://www.bnbchain.org/' + title: "BNB", + category: "Crypto", + route: "/library/bnb.svg", + url: "https://www.bnbchain.org/", }, { - title: 'Link', - category: 'Crypto', - route: '/library/link.svg', + title: "Link", + category: "Crypto", + route: "/library/link.svg", wordmark: { - light: '/library/link-wordmark-light.svg', - dark: '/library/link-wordmark-dark.svg' + light: "/library/link-wordmark-light.svg", + dark: "/library/link-wordmark-dark.svg", }, - url: 'https://chain.link/' + url: "https://chain.link/", }, { - title: 'Polygon', - category: 'Crypto', - route: '/library/matic.svg', - url: 'https://polygon.technology/' + title: "Polygon", + category: "Crypto", + route: "/library/matic.svg", + url: "https://polygon.technology/", }, { - title: 'Algorand', - category: 'Crypto', - route: '/library/algorand.svg', - url: 'https://algorand.org/' + title: "Algorand", + category: "Crypto", + route: "/library/algorand.svg", + url: "https://algorand.org/", }, { - title: 'Tether', - category: 'Crypto', - route: '/library/tether.svg', - url: 'https://tether.to/' + title: "Tether", + category: "Crypto", + route: "/library/tether.svg", + url: "https://tether.to/", }, { - title: 'X (formerly Twitter)', - category: 'Social', + title: "X (formerly Twitter)", + category: "Social", route: { - light: '/library/x.svg', - dark: '/library/x_dark.svg' + light: "/library/x.svg", + dark: "/library/x_dark.svg", }, - url: 'https://x.com', - brandUrl: 'https://about.x.com/en/who-we-are/brand-toolkit' + url: "https://x.com", + brandUrl: "https://about.x.com/en/who-we-are/brand-toolkit", }, { - title: 'Adobe', - category: 'Design', - route: '/library/adobe.svg', - url: 'https://www.adobe.com/' + title: "Adobe", + category: "Design", + route: "/library/adobe.svg", + url: "https://www.adobe.com/", }, { - title: 'After Effects', - category: 'Design', - route: '/library/after-effects.svg', - url: 'https://www.adobe.com/products/aftereffects' + title: "After Effects", + category: "Design", + route: "/library/after-effects.svg", + url: "https://www.adobe.com/products/aftereffects", }, { - title: 'Canva', - category: 'Design', - route: '/library/canva.svg', - url: 'https://www.canva.com/' + title: "Canva", + category: "Design", + route: "/library/canva.svg", + url: "https://www.canva.com/", }, { - title: 'Illustrator', - category: 'Design', - route: '/library/illustrator.svg', - url: 'https://www.adobe.com/products/illustrator' + title: "Illustrator", + category: "Design", + route: "/library/illustrator.svg", + url: "https://www.adobe.com/products/illustrator", }, { - title: 'InDesign', - category: 'Design', - route: '/library/indesign.svg', - url: 'https://www.adobe.com/products/indesign' + title: "InDesign", + category: "Design", + route: "/library/indesign.svg", + url: "https://www.adobe.com/products/indesign", }, { - title: 'Lightroom', - category: 'Design', - route: '/library/lightroom.svg', - url: 'https://www.adobe.com/products/photoshop-lightroom' + title: "Lightroom", + category: "Design", + route: "/library/lightroom.svg", + url: "https://www.adobe.com/products/photoshop-lightroom", }, { - title: 'Photoshop', - category: 'Design', - route: '/library/photoshop.svg', - url: 'https://www.adobe.com/products/photoshop' + title: "Photoshop", + category: "Design", + route: "/library/photoshop.svg", + url: "https://www.adobe.com/products/photoshop", }, { - title: 'Premiere', - category: 'Design', - route: '/library/premiere.svg', - url: 'https://www.adobe.com/products/premiere' + title: "Premiere", + category: "Design", + route: "/library/premiere.svg", + url: "https://www.adobe.com/products/premiere", }, { - title: 'VK', - category: 'Social', - route: '/library/vk.svg', - url: 'https://vk.com' + title: "VK", + category: "Social", + route: "/library/vk.svg", + url: "https://vk.com", }, { - title: 'Hoppscotch', - category: 'Software', - route: '/library/hoppscotch.svg', - url: 'https://hoppscotch.com', - brandUrl: 'https://hoppscotch.com/brand' + title: "Hoppscotch", + category: "Software", + route: "/library/hoppscotch.svg", + url: "https://hoppscotch.com", + brandUrl: "https://hoppscotch.com/brand", }, { - title: 'Opera', - category: 'Browser', - route: '/library/opera.svg', - url: 'https://www.opera.com', - brandUrl: 'https://brand.opera.com/' + title: "Opera", + category: "Browser", + route: "/library/opera.svg", + url: "https://www.opera.com", + brandUrl: "https://brand.opera.com/", }, { - title: 'Salesforce', - category: 'Software', - route: '/library/salesforce.svg', - url: 'https://www.salesforce.com', - brandUrl: 'https://brand.salesforce.com/' + title: "Salesforce", + category: "Software", + route: "/library/salesforce.svg", + url: "https://www.salesforce.com", + brandUrl: "https://brand.salesforce.com/", }, { - title: 'Unreal Engine', - category: 'Software', + title: "Unreal Engine", + category: "Software", route: { - light: '/library/unreal_engine.svg', - dark: '/library/unreal_engine_dark.svg' + light: "/library/unreal_engine.svg", + dark: "/library/unreal_engine_dark.svg", }, - url: 'https://www.unrealengine.com/' + url: "https://www.unrealengine.com/", }, { - title: 'Godot Engine', - category: 'Software', - route: '/library/godot_engine.svg', - url: 'https://godotengine.org/' + title: "Godot Engine", + category: "Software", + route: "/library/godot_engine.svg", + url: "https://godotengine.org/", }, { - title: 'Datadog', - category: 'Software', - route: '/library/datadog.svg', - url: 'https://www.datadoghq.com/' + title: "Datadog", + category: "Software", + route: "/library/datadog.svg", + url: "https://www.datadoghq.com/", }, { - title: 'Tron', - category: 'Crypto', - route: '/library/tron.svg', - url: 'https://tron.network/' + title: "Tron", + category: "Crypto", + route: "/library/tron.svg", + url: "https://tron.network/", }, { - title: 'Randevum', - category: 'Software', - route: '/library/randevum.svg', - url: 'https://www.randevum.co' + title: "Randevum", + category: "Software", + route: "/library/randevum.svg", + url: "https://www.randevum.co", }, { - title: 'Chromium', - category: 'Browser', - route: '/library/chromium.svg', - url: 'https://www.chromium.org' + title: "Chromium", + category: "Browser", + route: "/library/chromium.svg", + url: "https://www.chromium.org", }, { - title: 'Edge', - category: 'Browser', - route: '/library/edge.svg', - url: 'https://www.microsoft.com/en-us/edge' + title: "Edge", + category: "Browser", + route: "/library/edge.svg", + url: "https://www.microsoft.com/en-us/edge", }, { - title: 'Safari', - category: 'Browser', - route: '/library/safari.svg', - url: 'https://www.apple.com/safari' + title: "Safari", + category: "Browser", + route: "/library/safari.svg", + url: "https://www.apple.com/safari", }, { - title: 'Vivaldi', - category: 'Browser', - route: '/library/vivaldi.svg', - url: 'https://vivaldi.com' + title: "Vivaldi", + category: "Browser", + route: "/library/vivaldi.svg", + url: "https://vivaldi.com", }, { - title: 'Beacon', - category: 'Software', - route: '/library/Beacon-Logo.svg', - url: 'https://www.beacon.com' + title: "Beacon", + category: "Software", + route: "/library/Beacon-Logo.svg", + url: "https://www.beacon.com", }, { - title: 'Affinity Designer', - category: 'Design', - route: '/library/affinity_designer.svg', - url: 'https://affinity.serif.com/en-us/designer/' + title: "Affinity Designer", + category: "Design", + route: "/library/affinity_designer.svg", + url: "https://affinity.serif.com/en-us/designer/", }, { - title: 'Affinity Photo', - category: 'Software', - route: '/library/affinity_photo.svg', - url: 'https://affinity.serif.com/en-us/photo/' + title: "Affinity Photo", + category: "Software", + route: "/library/affinity_photo.svg", + url: "https://affinity.serif.com/en-us/photo/", }, { - title: 'Affinity Publisher', - category: 'Software', - route: '/library/affinity_publisher.svg', - url: 'https://affinity.serif.com/en-us/publisher/' + title: "Affinity Publisher", + category: "Software", + route: "/library/affinity_publisher.svg", + url: "https://affinity.serif.com/en-us/publisher/", }, { - title: 'Roblox', - category: 'Software', + title: "Roblox", + category: "Software", route: { - dark: '/library/roblox.svg', - light: '/library/roblox_light.svg' + dark: "/library/roblox.svg", + light: "/library/roblox_light.svg", }, - url: 'https://www.roblox.com/' + url: "https://www.roblox.com/", }, { - title: 'Stately.ai', - category: 'Software', + title: "Stately.ai", + category: "Software", route: { - light: '/library/stately.svg', - dark: '/library/stately_dark.svg' + light: "/library/stately.svg", + dark: "/library/stately_dark.svg", }, - url: 'https://stately.ai/' + url: "https://stately.ai/", }, { - title: 'XState', - category: 'Library', + title: "XState", + category: "Library", route: { - light: '/library/xstate.svg', - dark: '/library/xstate_dark.svg' + light: "/library/xstate.svg", + dark: "/library/xstate_dark.svg", }, - url: 'https://github.com/statelyai/xstate' + url: "https://github.com/statelyai/xstate", }, { - title: 'Hashnode', - category: 'Social', - route: '/library/hashnode.svg', - url: 'https://hashnode.com' + title: "Hashnode", + category: "Social", + route: "/library/hashnode.svg", + url: "https://hashnode.com", }, { - title: 'Rowy', - category: 'CMS', - route: '/library/rowy.svg', - url: 'https://www.rowy.io/' + title: "Rowy", + category: "CMS", + route: "/library/rowy.svg", + url: "https://www.rowy.io/", }, { - title: 'Cal.com', - category: 'Software', + title: "Cal.com", + category: "Software", route: { - light: '/library/cal.svg', - dark: '/library/cal_dark.svg' + light: "/library/cal.svg", + dark: "/library/cal_dark.svg", }, - url: 'https://cal.com', - brandUrl: 'https://design.cal.com/' + url: "https://cal.com", + brandUrl: "https://design.cal.com/", }, { - title: 'Calendly', - category: 'Software', - route: '/library/calendly.svg', - url: 'https://calendly.com/' + title: "Calendly", + category: "Software", + route: "/library/calendly.svg", + url: "https://calendly.com/", }, { - title: 'Mintlify', - category: 'Software', - route: '/library/mintlify.svg', - url: 'https://mintlify.com/' + title: "Mintlify", + category: "Software", + route: "/library/mintlify.svg", + url: "https://mintlify.com/", }, { - title: 'Patreon', - category: 'Social', + title: "Patreon", + category: "Social", route: { - light: '/library/patreon.svg', - dark: '/library/patreon_dark.svg' + light: "/library/patreon.svg", + dark: "/library/patreon_dark.svg", }, - url: 'https://www.patreon.com/' + url: "https://www.patreon.com/", }, { - title: 'Peerlist', - category: 'Social', - route: '/library/peerlist.svg', - url: 'https://www.peerlist.io/' + title: "Peerlist", + category: "Social", + route: "/library/peerlist.svg", + url: "https://www.peerlist.io/", }, { - title: 'Product Hunt', - category: 'Software', - route: '/library/producthunt.svg', - url: 'https://www.producthunt.com/' + title: "Product Hunt", + category: "Software", + route: "/library/producthunt.svg", + url: "https://www.producthunt.com/", }, { - title: 'Remotion', - category: 'Framework', - route: '/library/remotion.svg', - url: 'https://www.remotion.dev/' + title: "Remotion", + category: "Framework", + route: "/library/remotion.svg", + url: "https://www.remotion.dev/", }, { - title: 'Warp', - category: 'Software', - route: '/library/warp.svg', - url: 'https://www.warp.dev/' + title: "Warp", + category: "Software", + route: "/library/warp.svg", + url: "https://www.warp.dev/", }, { - title: 'SST', - category: 'Framework', - route: '/library/sst.svg', - url: 'https://sst.dev/' + title: "SST", + category: "Framework", + route: "/library/sst.svg", + url: "https://sst.dev/", }, { - title: 'Documenso', - category: 'Software', + title: "Documenso", + category: "Software", route: { - light: '/library/documenso.svg', - dark: '/library/documenso_dark.svg' + light: "/library/documenso.svg", + dark: "/library/documenso_dark.svg", }, - url: 'https://documenso.com' + url: "https://documenso.com", }, { - title: 'Bash', - category: 'Language', + title: "Bash", + category: "Language", route: { - light: '/library/bash.svg', - dark: '/library/bash_dark.svg' + light: "/library/bash.svg", + dark: "/library/bash_dark.svg", }, - url: 'https://www.gnu.org/software/bash/' + url: "https://www.gnu.org/software/bash/", }, { - title: 'C', - category: 'Language', - route: '/library/c.svg', - url: 'https://en.wikipedia.org/wiki/C_(programming_language)' + title: "C", + category: "Language", + route: "/library/c.svg", + url: "https://en.wikipedia.org/wiki/C_(programming_language)", }, { - title: 'C++', - category: 'Language', - route: '/library/c-plusplus.svg', - url: 'https://en.wikipedia.org/wiki/C%2B%2B' + title: "C++", + category: "Language", + route: "/library/c-plusplus.svg", + url: "https://en.wikipedia.org/wiki/C%2B%2B", }, { - title: 'Cobol', - category: 'Language', - route: '/library/cobol.svg', - url: 'https://en.wikipedia.org/wiki/COBOL' + title: "Cobol", + category: "Language", + route: "/library/cobol.svg", + url: "https://en.wikipedia.org/wiki/COBOL", }, { - title: 'Fortran', - category: 'Language', - route: '/library/fortran.svg', - url: 'https://fortran-lang.org/' + title: "Fortran", + category: "Language", + route: "/library/fortran.svg", + url: "https://fortran-lang.org/", }, { - title: 'Haskell', - category: 'Language', - route: '/library/haskell.svg', - url: 'https://www.haskell.org/' + title: "Haskell", + category: "Language", + route: "/library/haskell.svg", + url: "https://www.haskell.org/", }, { - title: 'matlab', - category: 'Language', - route: '/library/matlab.svg', - url: 'https://www.mathworks.com/products/matlab.html' + title: "matlab", + category: "Language", + route: "/library/matlab.svg", + url: "https://www.mathworks.com/products/matlab.html", }, { - title: 'R', - category: 'Language', + title: "R", + category: "Language", route: { - light: '/library/r.svg', - dark: '/library/r_dark.svg' + light: "/library/r.svg", + dark: "/library/r_dark.svg", }, - url: 'https://www.r-project.org/' + url: "https://www.r-project.org/", }, { - title: 'Rust', - category: 'Language', + title: "Rust", + category: "Language", route: { - light: '/library/rust.svg', - dark: '/library/rust_dark.svg' + light: "/library/rust.svg", + dark: "/library/rust_dark.svg", }, - url: 'https://www.rust-lang.org/' + url: "https://www.rust-lang.org/", }, { - title: 'Zig', - category: 'Language', - route: '/library/zig.svg', - url: 'https://ziglang.org/' + title: "Zig", + category: "Language", + route: "/library/zig.svg", + url: "https://ziglang.org/", }, { - title: 'Instatus', - category: 'Software', + title: "Instatus", + category: "Software", route: { - light: '/library/instatus.svg', - dark: '/library/instatus_dark.svg' + light: "/library/instatus.svg", + dark: "/library/instatus_dark.svg", }, - url: 'https://instatus.com' + url: "https://instatus.com", }, { - title: 'Front', - category: 'Software', - route: '/library/front.svg', - url: 'https://front.com' + title: "Front", + category: "Software", + route: "/library/front.svg", + url: "https://front.com", }, { - title: 'Monero', - category: 'Crypto', - route: '/library/monero.svg', - url: 'https://www.getmonero.org/' + title: "Monero", + category: "Crypto", + route: "/library/monero.svg", + url: "https://www.getmonero.org/", }, { - title: 'Axiom', - category: 'Software', + title: "Axiom", + category: "Software", route: { - dark: '/library/axiom-dark.svg', - light: '/library/axiom-light.svg' + dark: "/library/axiom-dark.svg", + light: "/library/axiom-light.svg", }, wordmark: { - light: '/library/axiom-wordmark-light.svg', - dark: '/library/axiom-wordmark-dark.svg' + light: "/library/axiom-wordmark-light.svg", + dark: "/library/axiom-wordmark-dark.svg", }, - url: 'https://axiom.co/' + url: "https://axiom.co/", }, { - title: 'Django', - category: 'Framework', - route: '/library/django.svg', - url: 'https://www.djangoproject.com/', - brandUrl: 'https://www.djangoproject.com/community/logos/' + title: "Django", + category: "Framework", + route: "/library/django.svg", + url: "https://www.djangoproject.com/", + brandUrl: "https://www.djangoproject.com/community/logos/", }, { - title: 'Zeabur', - category: 'Hosting', + title: "Zeabur", + category: "Hosting", route: { - light: '/library/zeabur-light.svg', - dark: '/library/zeabur-dark.svg' + light: "/library/zeabur-light.svg", + dark: "/library/zeabur-dark.svg", }, wordmark: { - light: '/library/zeabur_wordmark_light.svg', - dark: '/library/zeabur_wordmark_dark.svg' + light: "/library/zeabur_wordmark_light.svg", + dark: "/library/zeabur_wordmark_dark.svg", }, - url: 'https://zeabur.com/' + url: "https://zeabur.com/", }, { - title: 'MetaMask', - category: 'Crypto', - route: '/library/metamask.svg', - url: 'https://metamask.io/' + title: "MetaMask", + category: "Crypto", + route: "/library/metamask.svg", + url: "https://metamask.io/", }, { - title: 'shadcn/ui', - category: 'Library', + title: "shadcn/ui", + category: "Library", route: { - light: '/library/shadcn-ui.svg', - dark: '/library/shadcn-ui_dark.svg' + light: "/library/shadcn-ui.svg", + dark: "/library/shadcn-ui_dark.svg", }, - url: 'https://ui.shadcn.com/' + url: "https://ui.shadcn.com/", }, { - title: 'putio', - category: 'Software', - route: '/library/putio.svg', - url: 'https://put.io/' + title: "putio", + category: "Software", + route: "/library/putio.svg", + url: "https://put.io/", }, { - title: 'Pinterest', - category: 'Social', - route: '/library/pinterest.svg', - url: 'https://pinterest.com/' + title: "Pinterest", + category: "Social", + route: "/library/pinterest.svg", + url: "https://pinterest.com/", }, { - title: 'Reflex', - category: 'Software', + title: "Reflex", + category: "Software", route: { - light: '/library/reflex-dark.svg', - dark: '/library/reflex-light.svg' + light: "/library/reflex-dark.svg", + dark: "/library/reflex-light.svg", }, - url: 'https://reflex.dev/' + url: "https://reflex.dev/", }, { - title: 'Stripe', - category: ['Software', 'Payment'], - route: '/library/stripe.svg', - url: 'https://stripe.com/' + title: "Stripe", + category: ["Software", "Payment"], + route: "/library/stripe.svg", + url: "https://stripe.com/", }, { - title: 'Linux', - category: 'Software', - route: '/library/linux.svg', - url: 'https://www.linux.org/' + title: "Linux", + category: "Software", + route: "/library/linux.svg", + url: "https://www.linux.org/", }, { - title: 'XD', - category: 'Design', - route: '/library/adobe-xd.svg', - url: 'https://www.adobe.com/products/xd' + title: "XD", + category: "Design", + route: "/library/adobe-xd.svg", + url: "https://www.adobe.com/products/xd", }, { - title: 'Axure', - category: 'Design', - route: '/library/axure.svg', - url: 'https://www.axure.com/' + title: "Axure", + category: "Design", + route: "/library/axure.svg", + url: "https://www.axure.com/", }, { - title: 'Penpot', - category: 'Design', + title: "Penpot", + category: "Design", route: { - light: '/library/penpot.svg', - dark: '/library/penpot_dark.svg' + light: "/library/penpot.svg", + dark: "/library/penpot_dark.svg", }, - url: 'https://penpot.app/' + url: "https://penpot.app/", }, { - title: 'Sketch', - category: 'Design', + title: "Sketch", + category: "Design", route: { - light: '/library/sketch_light.svg', - dark: '/library/sketch.svg' + light: "/library/sketch_light.svg", + dark: "/library/sketch.svg", }, - url: 'https://www.sketch.com/' + url: "https://www.sketch.com/", }, { - title: 'Gimp', - category: 'Design', - route: '/library/gimp.svg', - url: 'https://www.gimp.org/' + title: "Gimp", + category: "Design", + route: "/library/gimp.svg", + url: "https://www.gimp.org/", }, { - title: 'Ubuntu', - category: 'Software', - route: '/library/ubuntu.svg', - url: 'https://ubuntu.com/', - brandUrl: 'https://design.ubuntu.com/brand' + title: "Ubuntu", + category: "Software", + route: "/library/ubuntu.svg", + url: "https://ubuntu.com/", + brandUrl: "https://design.ubuntu.com/brand", }, { - title: 'Cypress', - category: 'Framework', - route: '/library/cypress.svg', - url: 'https://www.cypress.io/' + title: "Cypress", + category: "Framework", + route: "/library/cypress.svg", + url: "https://www.cypress.io/", }, { - title: 'Reddit', - category: 'Social', - route: '/library/reddit.svg', - url: 'https://www.reddit.com/', - brandUrl: 'https://redditinc.com/brand' + title: "Reddit", + category: "Social", + route: "/library/reddit.svg", + url: "https://www.reddit.com/", + brandUrl: "https://redditinc.com/brand", }, { - title: 'JetBrains WebStorm', - category: 'Software', - route: '/library/webstorm.svg', - url: 'https://www.jetbrains.com/webstorm/' + title: "JetBrains WebStorm", + category: "Software", + route: "/library/webstorm.svg", + url: "https://www.jetbrains.com/webstorm/", }, { - title: 'JetBrains PyCharm', - category: 'Software', - route: '/library/pycharm.svg', - url: 'https://www.jetbrains.com/pycharm/' + title: "JetBrains PyCharm", + category: "Software", + route: "/library/pycharm.svg", + url: "https://www.jetbrains.com/pycharm/", }, { - title: 'JetBrains Fleet', - category: 'Software', - route: '/library/fleet.svg', - url: 'https://www.jetbrains.com/fleet/' + title: "JetBrains Fleet", + category: "Software", + route: "/library/fleet.svg", + url: "https://www.jetbrains.com/fleet/", }, { - title: 'JetBrains RubyMine', - category: 'Software', - route: '/library/rubymine.svg', - url: 'https://www.jetbrains.com/ruby/' + title: "JetBrains RubyMine", + category: "Software", + route: "/library/rubymine.svg", + url: "https://www.jetbrains.com/ruby/", }, { - title: 'JetBrains PhpStorm', - category: 'Software', - route: '/library/phpstorm.svg', - url: 'https://www.jetbrains.com/phpstorm/' + title: "JetBrains PhpStorm", + category: "Software", + route: "/library/phpstorm.svg", + url: "https://www.jetbrains.com/phpstorm/", }, { - title: 'Monkeytype', - category: 'Software', - route: '/library/monkeytype.svg', + title: "Monkeytype", + category: "Software", + route: "/library/monkeytype.svg", wordmark: { - dark: '/library/monkeytype-wordmark-dark.svg', - light: '/library/monkeytype-wordmark-light.svg' + dark: "/library/monkeytype-wordmark-dark.svg", + light: "/library/monkeytype-wordmark-light.svg", }, - url: 'https://monkeytype.com/' + url: "https://monkeytype.com/", }, { - title: 'PyCharm', - category: 'Software', - route: '/library/pycharm.svg', - url: 'https://www.jetbrains.com/pycharm/' + title: "PyCharm", + category: "Software", + route: "/library/pycharm.svg", + url: "https://www.jetbrains.com/pycharm/", }, { - title: 'Shopify', - category: 'CMS', - route: '/library/shopify.svg', + title: "Shopify", + category: "CMS", + route: "/library/shopify.svg", wordmark: { - dark: '/library/shopify-wordmark-dark.svg', - light: '/library/shopify-wordmark-light.svg' + dark: "/library/shopify-wordmark-dark.svg", + light: "/library/shopify-wordmark-light.svg", }, - url: 'https://www.shopify.com', - brandUrl: 'https://www.shopify.com/brand-assets' + url: "https://www.shopify.com", + brandUrl: "https://www.shopify.com/brand-assets", }, { - title: 'Webflow', - category: 'CMS', - route: '/library/webflow.svg', + title: "Webflow", + category: "CMS", + route: "/library/webflow.svg", wordmark: { - dark: '/library/webflow-wordmark-dark.svg', - light: '/library/webflow-wordmark-light.svg' + dark: "/library/webflow-wordmark-dark.svg", + light: "/library/webflow-wordmark-light.svg", }, - url: 'https://www.webflow.com', - brandUrl: 'https://brand-at.webflow.io/resources' + url: "https://www.webflow.com", + brandUrl: "https://brand-at.webflow.io/resources", }, { - title: 'Sanity', - category: 'CMS', - route: { - dark: '/library/sanity-dark.svg', - light: '/library/sanity-light.svg' - }, - wordmark: { - dark: '/library/sanity-wordmark-dark.svg', - light: '/library/sanity-wordmark-light.svg' - }, - url: 'https://www.sanity.io' - }, - { - title: 'sky', - category: 'Entertainment', - route: '/library/sky.svg', - url: 'https://www.sky.com' + title: "sky", + category: "Entertainment", + route: "/library/sky.svg", + url: "https://www.sky.com", }, { - title: 'Airbnb', - category: 'Software', - route: '/library/airbnb.svg', - wordmark: '/library/airbnb-wordmark.svg', - url: 'https://www.airbnb.com' + title: "Airbnb", + category: "Software", + route: "/library/airbnb.svg", + wordmark: "/library/airbnb-wordmark.svg", + url: "https://www.airbnb.com", }, { - title: 'Uber', - category: 'Software', + title: "Uber", + category: "Software", route: { - light: '/library/uber_light.svg', - dark: '/library/uber_dark.svg' + light: "/library/uber_light.svg", + dark: "/library/uber_dark.svg", }, - url: 'https://www.uber.com', - brandUrl: 'https://brand.uber.com/' + url: "https://www.uber.com", + brandUrl: "https://brand.uber.com/", }, { - title: 'Gmail', - category: ['Google', 'Software'], - route: '/library/gmail.svg', - url: 'https://www.gmail.com' + title: "Gmail", + category: ["Google", "Software"], + route: "/library/gmail.svg", + url: "https://www.gmail.com", }, { - title: 'Outlook', - category: 'Software', - route: '/library/outlook.svg', - url: 'https://www.outlook.com' + title: "Outlook", + category: "Software", + route: "/library/outlook.svg", + url: "https://www.outlook.com", }, { - title: 'Slack', - category: 'Software', - route: '/library/slack.svg', - wordmark: '/library/slack-wordmark.svg', - url: 'https://www.slack.com' + title: "Slack", + category: "Software", + route: "/library/slack.svg", + wordmark: "/library/slack-wordmark.svg", + url: "https://www.slack.com", }, { - title: 'Snapchat', - category: 'Software', - route: '/library/snapchat.svg', - url: 'https://www.snapchat.com' + title: "Snapchat", + category: "Software", + route: "/library/snapchat.svg", + url: "https://www.snapchat.com", }, { - title: 'Ebay', - category: 'Software', - route: '/library/ebay.svg', - url: 'https://www.ebay.com' + title: "Ebay", + category: "Software", + route: "/library/ebay.svg", + url: "https://www.ebay.com", }, { - title: 'IBM', - category: 'Software', - route: '/library/ibm.svg', - url: 'https://www.ibm.com' + title: "IBM", + category: "Software", + route: "/library/ibm.svg", + url: "https://www.ibm.com", }, { - title: 'TrustPilot', - category: 'Software', - route: '/library/trustpilot.svg', - url: 'https://www.trustpilot.com' + title: "TrustPilot", + category: "Software", + route: "/library/trustpilot.svg", + url: "https://www.trustpilot.com", }, { - title: 'Raycast', - category: 'Software', - route: '/library/raycast.svg', + title: "Raycast", + category: "Software", + route: "/library/raycast.svg", wordmark: { - light: '/library/raycast-wordmark-light.svg', - dark: '/library/raycast-wordmark-dark.svg' + light: "/library/raycast-wordmark-light.svg", + dark: "/library/raycast-wordmark-dark.svg", }, - url: 'https://raycast.com/' + url: "https://raycast.com/", }, { - title: 'Flow Launcher', - category: ['Software', 'Devtool'], - route: '/library/FlowLauncher.svg', - url: 'https://www.flowlauncher.com/' + title: "Flow Launcher", + category: ["Software", "Devtool"], + route: "/library/FlowLauncher.svg", + url: "https://www.flowlauncher.com/", }, { - title: 'Hack The Box', - category: 'Cybersecurity', - route: '/library/hack-the-box.svg', + title: "Hack The Box", + category: "Cybersecurity", + route: "/library/hack-the-box.svg", wordmark: { - light: '/library/hack-the-box-wordmark-light.svg', - dark: '/library/hack-the-box-wordmark-dark.svg' + light: "/library/hack-the-box-wordmark-light.svg", + dark: "/library/hack-the-box-wordmark-dark.svg", }, - url: 'https://www.hackthebox.com/' + url: "https://www.hackthebox.com/", }, { - title: 'Procure', - category: 'Marketplace', - route: '/library/procure.svg', - url: 'https://procure.biz/' + title: "Procure", + category: "Marketplace", + route: "/library/procure.svg", + url: "https://procure.biz/", }, { - title: 'Julia', - category: 'Language', - route: '/library/julia.svg', - url: 'https://julialang.org/' + title: "Julia", + category: "Language", + route: "/library/julia.svg", + url: "https://julialang.org/", }, { - title: 'SWC', - category: 'Compiler', - route: '/library/swc.svg', - url: 'https://swc.rs/' + title: "SWC", + category: "Compiler", + route: "/library/swc.svg", + url: "https://swc.rs/", }, { - title: 'PlayStation', - category: 'Software', - route: '/library/playstation.svg', - url: 'https://www.playstation.com/' + title: "PlayStation", + category: "Software", + route: "/library/playstation.svg", + url: "https://www.playstation.com/", }, { - title: 'Xbox', - category: 'Software', - route: '/library/xbox.svg', - url: 'https://www.xbox.com/' + title: "Xbox", + category: "Software", + route: "/library/xbox.svg", + url: "https://www.xbox.com/", }, { - title: 'Cody', - category: 'AI', - route: '/library/cody.svg', - url: 'https://about.sourcegraph.com/' + title: "Cody", + category: "AI", + route: "/library/cody.svg", + url: "https://about.sourcegraph.com/", }, { - title: 'Sourcegraph', - category: 'AI', - route: '/library/sourcegraph.svg', - url: 'https://about.sourcegraph.com/' + title: "Sourcegraph", + category: "AI", + route: "/library/sourcegraph.svg", + url: "https://about.sourcegraph.com/", }, { - title: 'Perplexity AI', - category: 'AI', - route: '/library/perplexity.svg', + title: "Perplexity AI", + category: "AI", + route: "/library/perplexity.svg", wordmark: { - light: '/library/perplexity_wordmark_light.svg', - dark: '/library/perplexity_wordmark_dark.svg' + light: "/library/perplexity_wordmark_light.svg", + dark: "/library/perplexity_wordmark_dark.svg", }, - url: 'https://perplexity.ai/' + url: "https://perplexity.ai/", }, { - title: 'Spring', - category: 'Framework', - route: '/library/spring.svg', - url: 'https://spring.io/' + title: "Spring", + category: "Framework", + route: "/library/spring.svg", + url: "https://spring.io/", }, { - title: 'Directus', - category: 'CMS', - route: '/library/directus.svg', - url: 'https://directus.io/' + title: "Directus", + category: "CMS", + route: "/library/directus.svg", + url: "https://directus.io/", }, { - title: 'Pnpm', - category: 'Software', + title: "Pnpm", + category: "Software", route: { - light: '/library/pnpm.svg', - dark: '/library/pnpm_dark.svg' + light: "/library/pnpm.svg", + dark: "/library/pnpm_dark.svg", }, wordmark: { - light: '/library/pnpm_wordmark_light.svg', - dark: '/library/pnpm_wordmark_dark.svg' + light: "/library/pnpm_wordmark_light.svg", + dark: "/library/pnpm_wordmark_dark.svg", }, - url: 'https://pnpm.io/' + url: "https://pnpm.io/", }, { - title: 'Emacs', - category: 'Software', - route: '/library/emacs.svg', - url: 'https://www.gnu.org/software/emacs/' + title: "Emacs", + category: "Software", + route: "/library/emacs.svg", + url: "https://www.gnu.org/software/emacs/", }, { - title: 'Svgl', - category: 'Library', - route: '/library/svgl.svg', - url: 'https://svgl.app' + title: "Svgl", + category: "Library", + route: "/library/svgl.svg", + url: "https://svgl.app", }, { - title: 'Google Idx', - category: ['Software', 'Google'], - route: '/library/google-idx.svg', - url: 'https://idx.dev/' + title: "Google Idx", + category: ["Software", "Google"], + route: "/library/google-idx.svg", + url: "https://idx.dev/", }, { - title: 'Remix', - category: 'Framework', + title: "Remix", + category: "Framework", route: { - light: '/library/remix_light.svg', - dark: '/library/remix_dark.svg' + light: "/library/remix_light.svg", + dark: "/library/remix_dark.svg", }, wordmark: { - light: '/library/remix_wordmark_light.svg', - dark: '/library/remix_wordmark_dark.svg' + light: "/library/remix_wordmark_light.svg", + dark: "/library/remix_wordmark_dark.svg", }, - url: 'https://remix.run/', - brandUrl: 'https://remix.run/brand' + url: "https://remix.run/", + brandUrl: "https://remix.run/brand", }, { - title: 'Steam', - category: 'Software', - route: '/library/steam.svg', - url: 'https://store.steampowered.com/' + title: "Steam", + category: "Software", + route: "/library/steam.svg", + url: "https://store.steampowered.com/", }, { - title: 'Tabby', - category: 'Software', - route: '/library/tabby.svg', - url: 'https://tabby.sh/' + title: "Tabby", + category: "Software", + route: "/library/tabby.svg", + url: "https://tabby.sh/", }, { - title: '1Password', - category: 'Software', + title: "1Password", + category: "Software", route: { - light: '/library/1password-light.svg', - dark: '/library/1password-dark.svg' + light: "/library/1password-light.svg", + dark: "/library/1password-dark.svg", }, - url: 'https://1password.com' + url: "https://1password.com", }, { - title: 'Flask', - category: 'Framework', + title: "Flask", + category: "Framework", route: { - light: '/library/flask-light.svg', - dark: '/library/flask-dark.svg' + light: "/library/flask-light.svg", + dark: "/library/flask-dark.svg", }, wordmark: { - light: '/library/flask-wordmark-light.svg', - dark: '/library/flask-wordmark-dark.svg' + light: "/library/flask-wordmark-light.svg", + dark: "/library/flask-wordmark-dark.svg", }, - url: 'https://flask.palletsprojects.com/' + url: "https://flask.palletsprojects.com/", }, { - title: 'Alacritty', - category: 'Software', - route: '/library/alacritty.svg', - url: 'https://alacritty.org' + title: "Alacritty", + category: "Software", + route: "/library/alacritty.svg", + url: "https://alacritty.org", }, { - title: 'Qt', - category: 'Software', - route: '/library/qt.svg', - url: 'https://www.qt.io/' + title: "Qt", + category: "Software", + route: "/library/qt.svg", + url: "https://www.qt.io/", }, { - title: 'Bitwarden', - category: ['Software', 'Authentication'], - route: '/library/bitwarden.svg', - url: 'https://bitwarden.com/', - brandUrl: 'https://bitwarden.com/brand/' + title: "Bitwarden", + category: ["Software", "Authentication"], + route: "/library/bitwarden.svg", + url: "https://bitwarden.com/", + brandUrl: "https://bitwarden.com/brand/", }, { - title: 'Voicemod', - category: 'Entertainment', + title: "Voicemod", + category: "Entertainment", route: { - light: '/library/voicemod_light.svg', - dark: '/library/voicemod_dark.svg' + light: "/library/voicemod_light.svg", + dark: "/library/voicemod_dark.svg", }, - url: 'https://voicemod.net/' + url: "https://voicemod.net/", }, { - title: 'Neovim', - category: 'Software', - route: '/library/neovim.svg', - url: 'https://neovim.io/' + title: "Neovim", + category: "Software", + route: "/library/neovim.svg", + url: "https://neovim.io/", }, { - title: 'Pitch', - category: 'Design', - route: '/library/pitch.svg', - url: 'https://pitch.com' + title: "Pitch", + category: "Design", + route: "/library/pitch.svg", + url: "https://pitch.com", }, { - title: 'Biomejs', - category: 'Compiler', - route: '/library/biomejs.svg', - url: 'https://biomejs.dev/' + title: "Biomejs", + category: "Compiler", + route: "/library/biomejs.svg", + url: "https://biomejs.dev/", }, { - title: 'Gradio', - category: 'Software', - route: '/library/gradio.svg', - url: 'https://www.gradio.app/' + title: "Gradio", + category: "Software", + route: "/library/gradio.svg", + url: "https://www.gradio.app/", }, { - title: 'Meta', - category: 'Social', - route: '/library/meta.svg', - url: 'https://about.meta.com/es/', - brandUrl: 'https://about.meta.com/brand/resources/' + title: "Meta", + category: "Social", + route: "/library/meta.svg", + url: "https://about.meta.com/es/", + brandUrl: "https://about.meta.com/brand/resources/", }, { - title: 'Stability AI', - category: 'AI', - route: '/library/stability-ai.svg', - url: 'https://stability.ai/' + title: "Stability AI", + category: "AI", + route: "/library/stability-ai.svg", + url: "https://stability.ai/", }, { - title: 'Google PaLM', - category: ['AI', 'Google'], - route: '/library/google-palm.svg', - url: 'https://ai.google/discover/palm2/' + title: "Google PaLM", + category: ["AI", "Google"], + route: "/library/google-palm.svg", + url: "https://ai.google/discover/palm2/", }, { - title: 'Android', - category: 'Software', - route: '/library/android-icon.svg', - url: 'https://www.android.com/' + title: "Android", + category: "Software", + route: "/library/android-icon.svg", + url: "https://www.android.com/", }, { - title: 'Sentry', - category: 'Software', - route: '/library/sentry.svg', - url: 'https://sentry.io/', - brandUrl: 'https://sentry.io/branding/' + title: "Sentry", + category: "Software", + route: "/library/sentry.svg", + url: "https://sentry.io/", + brandUrl: "https://sentry.io/branding/", }, { - title: 'Grafana', - category: 'Software', - route: '/library/grafana.svg', - url: 'https://grafana.com/' + title: "Grafana", + category: "Software", + route: "/library/grafana.svg", + url: "https://grafana.com/", }, { - title: 'Notion', - category: 'Software', - route: '/library/notion.svg', - url: 'https://notion.so/' + title: "Notion", + category: "Software", + route: "/library/notion.svg", + url: "https://notion.so/", }, { - title: 'Litecoin', - category: 'Crypto', - route: '/library/litecoin.svg', - url: 'https://litecoin.org/' + title: "Litecoin", + category: "Crypto", + route: "/library/litecoin.svg", + url: "https://litecoin.org/", }, { - title: 'ElysiaJS', - category: 'Framework', - route: '/library/elysiajs.svg', - url: 'https://elysiajs.com/' + title: "ElysiaJS", + category: "Framework", + route: "/library/elysiajs.svg", + url: "https://elysiajs.com/", }, { - title: 'TensorFlow', - category: 'Library', - route: '/library/tensorflow.svg', - url: 'https://www.tensorflow.org/' + title: "TensorFlow", + category: "Library", + route: "/library/tensorflow.svg", + url: "https://www.tensorflow.org/", }, { - title: 'Midday', - category: 'AI', - route: '/library/midday.svg', - url: 'https://midday.ai/' + title: "Midday", + category: "AI", + route: "/library/midday.svg", + url: "https://midday.ai/", }, { - title: 'C#', - category: 'Language', - route: '/library/csharp.svg', - url: 'https://dotnet.microsoft.com/languages/csharp' + title: "C#", + category: "Language", + route: "/library/csharp.svg", + url: "https://dotnet.microsoft.com/languages/csharp", }, { - title: 'Replicate', - category: 'AI', + title: "Replicate", + category: "AI", route: { - light: '/library/replicate_light.svg', - dark: '/library/replicate_dark.svg' + light: "/library/replicate_light.svg", + dark: "/library/replicate_dark.svg", }, wordmark: { - light: '/library/replicate-wordmark_light.svg', - dark: '/library/replicate-wordmark_dark.svg' + light: "/library/replicate-wordmark_light.svg", + dark: "/library/replicate-wordmark_dark.svg", }, - url: 'https://replicate.com/' + url: "https://replicate.com/", }, { - title: 'Markdown', - category: 'Language', + title: "Markdown", + category: "Language", route: { - light: '/library/markdown-light.svg', - dark: '/library/markdown-dark.svg' + light: "/library/markdown-light.svg", + dark: "/library/markdown-dark.svg", }, - url: 'https://www.markdownguide.org/' + url: "https://www.markdownguide.org/", }, { - title: 'Radix UI', - category: 'Library', + title: "Radix UI", + category: "Library", route: { - light: '/library/radix-ui_light.svg', - dark: '/library/radix-ui_dark.svg' + light: "/library/radix-ui_light.svg", + dark: "/library/radix-ui_dark.svg", }, - url: 'https://www.radix-ui.com/' + url: "https://www.radix-ui.com/", }, { - title: 'Web.dev', - category: 'Education', - route: '/library/webdev.svg', - url: 'https://web.dev/' + title: "Web.dev", + category: "Education", + route: "/library/webdev.svg", + url: "https://web.dev/", }, { - title: 'SWR', - category: 'Library', + title: "SWR", + category: "Library", route: { - light: '/library/swr-light.svg', - dark: '/library/swr-dark.svg' + light: "/library/swr-light.svg", + dark: "/library/swr-dark.svg", }, - url: 'https://swr.vercel.app/' + url: "https://swr.vercel.app/", }, { - title: 'Refine', - category: 'Framework', + title: "Refine", + category: "Framework", route: { - light: '/library/refine_dark.svg', - dark: '/library/refine_light.svg' + light: "/library/refine_dark.svg", + dark: "/library/refine_light.svg", }, - url: 'https://refine.dev/' + url: "https://refine.dev/", }, { - title: 'Youtube Music', - category: ['Google', 'Music'], - route: '/library/youtube_music.svg', + title: "Youtube Music", + category: ["Google", "Music"], + route: "/library/youtube_music.svg", wordmark: { - light: '/library/youtube_music_wordmark_light.svg', - dark: '/library/youtube_music_wordmark_dark.svg' + light: "/library/youtube_music_wordmark_light.svg", + dark: "/library/youtube_music_wordmark_dark.svg", }, - url: 'https://music.youtube.com/' + url: "https://music.youtube.com/", }, { - title: 'TIDAL', - category: 'Music', + title: "TIDAL", + category: "Music", route: { - light: '/library/tidal_light.svg', - dark: '/library/tidal_dark.svg' + light: "/library/tidal_light.svg", + dark: "/library/tidal_dark.svg", }, wordmark: { - light: '/library/tidal_wordmark_light.svg', - dark: '/library/tidal_wordmark_dark.svg' + light: "/library/tidal_wordmark_light.svg", + dark: "/library/tidal_wordmark_dark.svg", }, - url: 'https://tidal.com/' + url: "https://tidal.com/", }, { - title: 'OBS', - category: 'Software', - route: '/library/obs.svg', - url: 'https://obsproject.com/' + title: "OBS", + category: "Software", + route: "/library/obs.svg", + url: "https://obsproject.com/", }, { - title: 'Stack Overflow', - category: 'Software', - route: '/library/stackoverflow.svg', - wordmark: '/library/stackoverflow_wordmark.svg', - url: 'https://stackoverflow.com/', - brandUrl: 'https://stackoverflow.design/brand/' + title: "Stack Overflow", + category: "Software", + route: "/library/stackoverflow.svg", + wordmark: "/library/stackoverflow_wordmark.svg", + url: "https://stackoverflow.com/", + brandUrl: "https://stackoverflow.design/brand/", }, { - title: 'TikTok', - category: 'Social', - route: '/library/tiktok.svg', - url: 'https://www.tiktok.com/' + title: "TikTok", + category: "Social", + route: "/library/tiktok.svg", + url: "https://www.tiktok.com/", }, { - title: 'Ngrok', - category: 'Software', + title: "Ngrok", + category: "Software", route: { - dark: '/library/ngrok-dark.svg', - light: '/library/ngrok-light.svg' + dark: "/library/ngrok-dark.svg", + light: "/library/ngrok-light.svg", }, - url: 'https://ngrok.com' + url: "https://ngrok.com", }, { - title: 'Lemon Squeezy', - category: 'Software', - route: '/library/lemonsqueezy.svg', - url: 'https://www.lemonsqueezy.com' + title: "Lemon Squeezy", + category: "Software", + route: "/library/lemonsqueezy.svg", + url: "https://www.lemonsqueezy.com", }, { - title: 'Asana', - category: 'Software', - route: '/library/asana-logo.svg', + title: "Asana", + category: "Software", + route: "/library/asana-logo.svg", wordmark: { - dark: '/library/asana-wordmark-dark.svg', - light: '/library/asana-wordmark-light.svg' + dark: "/library/asana-wordmark-dark.svg", + light: "/library/asana-wordmark-light.svg", }, - url: 'https://asana.com' + url: "https://asana.com", }, { - title: 'UpLeveled', - category: 'Education', - route: '/library/upleveled.svg', - wordmark: '/library/upleveled-wordmark.svg', - url: 'https://upleveled.io/' + title: "UpLeveled", + category: "Education", + route: "/library/upleveled.svg", + wordmark: "/library/upleveled-wordmark.svg", + url: "https://upleveled.io/", }, { - title: 'Zoom', - category: 'Software', - route: '/library/zoom.svg', - url: 'https://zoom.us/' + title: "Zoom", + category: "Software", + route: "/library/zoom.svg", + url: "https://zoom.us/", }, { - title: 'Tina', - category: 'CMS', - route: '/library/tina.svg', - wordmark: '/library/tina_wordmark.svg', - url: 'https://tina.io/' + title: "Tina", + category: "CMS", + route: "/library/tina.svg", + wordmark: "/library/tina_wordmark.svg", + url: "https://tina.io/", }, { - title: 'Next.js', - category: ['Framework', 'Vercel'], - route: '/library/nextjs_icon_dark.svg', + title: "Next.js", + category: ["Framework", "Vercel"], + route: "/library/nextjs_icon_dark.svg", wordmark: { - light: '/library/nextjs_logo_light.svg', - dark: '/library/nextjs_logo_dark.svg' + light: "/library/nextjs_logo_light.svg", + dark: "/library/nextjs_logo_dark.svg", }, - url: 'https://nextjs.org/' + url: "https://nextjs.org/", }, { - title: 'Mistral AI', - category: 'AI', - route: '/library/mistral-ai_logo.svg', - wordmark: '/library/mistral-ai_wordmark.svg', - url: 'https://mistral.ai/' + title: "Mistral AI", + category: "AI", + route: "/library/mistral-ai_logo.svg", + wordmark: "/library/mistral-ai_wordmark.svg", + url: "https://mistral.ai/", }, { - title: 'Hugging Face', - category: 'AI', - route: '/library/hugging_face.svg', - url: 'https://huggingface.co/', - brandUrl: 'https://huggingface.co/brand' + title: "Hugging Face", + category: "AI", + route: "/library/hugging_face.svg", + url: "https://huggingface.co/", + brandUrl: "https://huggingface.co/brand", }, { - title: 'Node.js', - category: 'Library', - route: '/library/nodejs.svg', - url: 'https://nodejs.org/', - brandUrl: 'https://nodejs.org/en/about/branding' + title: "Node.js", + category: "Library", + route: "/library/nodejs.svg", + url: "https://nodejs.org/", + brandUrl: "https://nodejs.org/en/about/branding", }, { - title: 'Raindrop.io', - category: 'Software', - route: '/library/raindrop.svg', - url: 'https://raindrop.io/' + title: "Raindrop.io", + category: "Software", + route: "/library/raindrop.svg", + url: "https://raindrop.io/", }, { - title: 'Microsoft Todo', - category: 'Software', - route: '/library/microsoft-todo.svg', - url: 'https://to-do.office.com/' + title: "Microsoft Todo", + category: "Software", + route: "/library/microsoft-todo.svg", + url: "https://to-do.office.com/", }, { - title: 'Manifest', - category: ['Software', 'AI', 'Database'], - route: '/library/manifest.svg', - url: 'https://manifest.build', - brandUrl: 'https://manifest.build/brand-assets' + title: "Manifest", + category: ["Software", "AI", "Database"], + route: "/library/manifest.svg", + url: "https://manifest.build", + brandUrl: "https://manifest.build/brand-assets", }, { - title: 'Supabase', - category: 'Database', - route: '/library/supabase.svg', - url: 'https://supabase.com/', + title: "Supabase", + category: "Database", + route: "/library/supabase.svg", + url: "https://supabase.com/", wordmark: { - light: '/library/supabase_wordmark_light.svg', - dark: '/library/supabase_wordmark_dark.svg' + light: "/library/supabase_wordmark_light.svg", + dark: "/library/supabase_wordmark_dark.svg", }, - brandUrl: 'https://supabase.com/brand-assets' + brandUrl: "https://supabase.com/brand-assets", }, { - title: 'Gleam', - category: 'Language', - route: '/library/gleam.svg', - url: 'https://gleam.run/' + title: "Gleam", + category: "Language", + route: "/library/gleam.svg", + url: "https://gleam.run/", }, { - title: 'Flowbite', - category: 'Framework', - route: '/library/flowbite.svg', - url: 'https://flowbite.com/' + title: "Flowbite", + category: "Framework", + route: "/library/flowbite.svg", + url: "https://flowbite.com/", }, { - title: 'Hume AI', - category: 'AI', - route: '/library/hume-ai.svg', - url: 'https://hume.ai/' + title: "Hume AI", + category: "AI", + route: "/library/hume-ai.svg", + url: "https://hume.ai/", }, { - title: 'Resend', - category: 'Software', - url: 'https://resend.com/', + title: "Resend", + category: "Software", + url: "https://resend.com/", route: { - light: '/library/resend-icon-black.svg', - dark: '/library/resend-icon-white.svg' + light: "/library/resend-icon-black.svg", + dark: "/library/resend-icon-white.svg", }, wordmark: { - light: '/library/resend-wordmark-black.svg', - dark: '/library/resend-wordmark-white.svg' + light: "/library/resend-wordmark-black.svg", + dark: "/library/resend-wordmark-white.svg", }, - brandUrl: 'https://resend.com/brand' + brandUrl: "https://resend.com/brand", }, { - title: 'Layers', - category: 'Design', + title: "Layers", + category: "Design", route: { - light: '/library/layers_light.svg', - dark: '/library/layers_dark.svg' + light: "/library/layers_light.svg", + dark: "/library/layers_dark.svg", }, - url: 'https://layers.to/' + url: "https://layers.to/", }, { - title: 'Exome', - category: 'Library', - route: '/library/exome.svg', - url: 'https://exome.dev/' + title: "Exome", + category: "Library", + route: "/library/exome.svg", + url: "https://exome.dev/", }, { - title: 'Poper', - category: 'AI', - route: '/library/poper.svg', - url: 'https://www.poper.ai' + title: "Poper", + category: "AI", + route: "/library/poper.svg", + url: "https://www.poper.ai", }, { - title: 'Dub', - category: 'Software', + title: "Dub", + category: "Software", route: { - light: '/library/dub.svg', - dark: '/library/dub_dark_logo.svg' + light: "/library/dub.svg", + dark: "/library/dub_dark_logo.svg", }, wordmark: { - light: '/library/dub_light_wordmark.svg', - dark: '/library/dub_dark_wordmark.svg' + light: "/library/dub_light_wordmark.svg", + dark: "/library/dub_dark_wordmark.svg", }, - url: 'https://dub.co', - brandUrl: 'https://dub.co/brand' + url: "https://dub.co", + brandUrl: "https://dub.co/brand", }, { - title: 'Turso', - category: ['Database', 'Software'], + title: "Turso", + category: ["Database", "Software"], route: { - light: '/library/turso-light.svg', - dark: '/library/turso-dark.svg' + light: "/library/turso-light.svg", + dark: "/library/turso-dark.svg", }, wordmark: { - light: '/library/turso-wordmark-light.svg', - dark: '/library/turso-wordmark-dark.svg' + light: "/library/turso-wordmark-light.svg", + dark: "/library/turso-wordmark-dark.svg", }, - url: 'https://turso.tech' + url: "https://turso.tech", }, { - title: 'RelaGit', - category: 'Software', + title: "RelaGit", + category: "Software", route: { - light: '/library/relagit-icon-light.svg', - dark: '/library/relagit-icon-dark.svg' + light: "/library/relagit-icon-light.svg", + dark: "/library/relagit-icon-dark.svg", }, wordmark: { - light: '/library/relagit-wordmark-light.svg', - dark: '/library/relagit-wordmark-dark.svg' + light: "/library/relagit-wordmark-light.svg", + dark: "/library/relagit-wordmark-dark.svg", }, - url: 'https://rela.dev' + url: "https://rela.dev", }, { - title: 'T3 Stack', - category: 'Framework', + title: "T3 Stack", + category: "Framework", route: { - light: '/library/t3-dark.svg', - dark: '/library/t3-light.svg' + light: "/library/t3-dark.svg", + dark: "/library/t3-light.svg", }, - url: 'https://create.t3.gg/' + url: "https://create.t3.gg/", }, { - title: 'Apple Music', - category: 'Music', - route: '/library/apple-music-icon.svg', + title: "Apple Music", + category: "Music", + route: "/library/apple-music-icon.svg", wordmark: { - light: '/library/apple-music-wordmark-light.svg', - dark: '/library/apple-music-wordmark-dark.svg' + light: "/library/apple-music-wordmark-light.svg", + dark: "/library/apple-music-wordmark-dark.svg", }, - url: 'https://music.apple.com/' + url: "https://music.apple.com/", }, { - title: 'YGeeker', - category: 'Software', - route: '/library/ygeeker.svg', - url: 'https://www.ygeeker.com' + title: "YGeeker", + category: "Software", + route: "/library/ygeeker.svg", + url: "https://www.ygeeker.com", }, { - title: 'PostCSS', - category: 'Compiler', - route: '/library/postcss.svg', - wordmark: '/library/postcss_wordmark.svg', - url: 'https://postcss.org/' + title: "PostCSS", + category: "Compiler", + route: "/library/postcss.svg", + wordmark: "/library/postcss_wordmark.svg", + url: "https://postcss.org/", }, { - title: 'SVG', - category: ['Language', 'Design'], - route: '/library/svg.svg', - wordmark: '/library/svg_wordmark.svg', - url: 'https://www.w3.org/TR/SVG/' + title: "SVG", + category: ["Language", "Design"], + route: "/library/svg.svg", + wordmark: "/library/svg_wordmark.svg", + url: "https://www.w3.org/TR/SVG/", }, { - title: 'Todoist', - category: 'Software', - route: '/library/todoist.svg', - wordmark: '/library/todoist-wordmark.svg', - url: 'https://todoist.com/' + title: "Todoist", + category: "Software", + route: "/library/todoist.svg", + wordmark: "/library/todoist-wordmark.svg", + url: "https://todoist.com/", }, { - title: 'Apidog', - category: 'Software', - route: '/library/apidog.svg', - url: 'https://apidog.com/' + title: "Apidog", + category: "Software", + route: "/library/apidog.svg", + url: "https://apidog.com/", }, { - title: 'Chart.js', - category: 'Library', - route: '/library/chartjs.svg', - url: 'https://www.chartjs.org/' + title: "Chart.js", + category: "Library", + route: "/library/chartjs.svg", + url: "https://www.chartjs.org/", }, { - title: 'JSON Schema', - category: 'Library', - route: '/library/json-schema.svg', - url: 'https://json-schema.org/' + title: "JSON Schema", + category: "Library", + route: "/library/json-schema.svg", + url: "https://json-schema.org/", }, { - title: 'v0', - category: 'Vercel', + title: "v0", + category: "Vercel", route: { - light: '/library/v0_light.svg', - dark: '/library/v0_dark.svg' + light: "/library/v0_light.svg", + dark: "/library/v0_dark.svg", }, - url: 'https://v0.dev/' + url: "https://v0.dev/", }, { - title: 'Bento', - category: 'Software', - route: '/library/bento.svg', - url: 'https://bento.me/home' + title: "Bento", + category: "Software", + route: "/library/bento.svg", + url: "https://bento.me/home", }, { - title: 'Firebase', - category: ['Hosting', 'Google'], - route: '/library/firebase.svg', - wordmark: '/library/firebase-wordmark.svg', - url: 'https://firebase.google.com/' + title: "Firebase", + category: ["Hosting", "Google"], + route: "/library/firebase.svg", + wordmark: "/library/firebase-wordmark.svg", + url: "https://firebase.google.com/", }, { - title: 'Prettier', - category: 'Library', + title: "Prettier", + category: "Library", route: { - light: '/library/prettier-icon-light.svg', - dark: '/library/prettier-icon-dark.svg' + light: "/library/prettier-icon-light.svg", + dark: "/library/prettier-icon-dark.svg", }, - url: 'https://prettier.io/' + url: "https://prettier.io/", }, { - title: 'Leap Wallet', - category: ['Crypto', 'Software', 'Payment'], - route: '/library/leap-wallet.svg', + title: "Leap Wallet", + category: ["Crypto", "Software", "Payment"], + route: "/library/leap-wallet.svg", wordmark: { - light: '/library/leap-wallet-wordmark-light.svg', - dark: '/library/leap-wallet-wordmark-dark.svg' + light: "/library/leap-wallet-wordmark-light.svg", + dark: "/library/leap-wallet-wordmark-dark.svg", }, - url: 'https://leapwallet.io/' + url: "https://leapwallet.io/", }, { - title: 'Nx', - category: ['Devtool', 'Monorepo'], + title: "Nx", + category: ["Devtool", "Monorepo"], route: { - light: '/library/nx_light.svg', - dark: '/library/nx_dark.svg' + light: "/library/nx_light.svg", + dark: "/library/nx_dark.svg", }, - url: 'https://nx.dev' + url: "https://nx.dev", }, { - title: 'Google Colaboratory', - category: ['Google', 'Software'], - route: '/library/Google_Colaboratory.svg', - url: 'https://colab.research.google.com/' + title: "Google Colaboratory", + category: ["Google", "Software"], + route: "/library/Google_Colaboratory.svg", + url: "https://colab.research.google.com/", }, { - title: 'Raspberry PI', - category: ['Hardware', 'Software'], - route: '/library/raspberry_pi.svg', - url: 'https://www.raspberrypi.com/' + title: "Raspberry PI", + category: ["Hardware", "Software"], + route: "/library/raspberry_pi.svg", + url: "https://www.raspberrypi.com/", }, { - title: 'Vite', - category: ['Devtool', 'VoidZero'], - route: '/library/vitejs.svg', - url: 'https://vitejs.dev' + title: "Vite", + category: ["Devtool", "VoidZero"], + route: "/library/vitejs.svg", + url: "https://vitejs.dev", }, { - title: 'Vitest', - category: ['Framework', 'VoidZero'], - route: '/library/vitest.svg', - url: 'https://vitest.dev/' + title: "Vitest", + category: ["Framework", "VoidZero"], + route: "/library/vitest.svg", + url: "https://vitest.dev/", }, { - title: 'Oxc', - category: ['Devtool', 'VoidZero'], - route: '/library/oxc.svg', - url: 'https://oxc.rs/' + title: "Oxc", + category: ["Devtool", "VoidZero"], + route: "/library/oxc.svg", + url: "https://oxc.rs/", }, { - title: 'Rolldown', - category: ['Compiler', 'VoidZero'], - route: '/library/rolldown.svg', - url: 'https://rolldown.rs/' + title: "Rolldown", + category: ["Compiler", "VoidZero"], + route: "/library/rolldown.svg", + url: "https://rolldown.rs/", }, { - title: 'ManzDev', - category: ['Community'], - route: '/library/manzdev.svg', - url: 'https://manz.dev/' + title: "ManzDev", + category: ["Community"], + route: "/library/manzdev.svg", + url: "https://manz.dev/", }, { - title: 'Afordin', - category: ['Community'], + title: "Afordin", + category: ["Community"], route: { - light: '/library/afordin-light.svg', - dark: '/library/afordin-dark.svg' + light: "/library/afordin-light.svg", + dark: "/library/afordin-dark.svg", }, - url: 'https://github.com/Afordin' + url: "https://github.com/Afordin", }, { - title: 'MediaWiki', - category: ['Software', 'CMS'], - route: '/library/mediawiki.svg', + title: "MediaWiki", + category: ["Software", "CMS"], + route: "/library/mediawiki.svg", wordmark: { - light: '/library/mediawiki-wordmark-light.svg', - dark: '/library/mediawiki-wordmark-dark.svg' + light: "/library/mediawiki-wordmark-light.svg", + dark: "/library/mediawiki-wordmark-dark.svg", }, - url: 'https://www.mediawiki.org/' + url: "https://www.mediawiki.org/", }, { - title: 'Carrd', - category: ['Social'], - route: '/library/carrd.svg', - url: 'https://carrd.co/' + title: "Carrd", + category: ["Social"], + route: "/library/carrd.svg", + url: "https://carrd.co/", }, { - title: 'Claude AI', - category: 'AI', - route: '/library/claude-ai-icon.svg', + title: "Claude AI", + category: "AI", + route: "/library/claude-ai-icon.svg", wordmark: { - light: '/library/claude-ai-wordmark-icon_light.svg', - dark: '/library/claude-ai-wordmark-icon_dark.svg' + light: "/library/claude-ai-wordmark-icon_light.svg", + dark: "/library/claude-ai-wordmark-icon_dark.svg", }, - url: 'https://claude.ai/' + url: "https://claude.ai/", }, { - title: 'UnoCSS', - category: 'Devtool', - route: '/library/unocss.svg', - url: 'https://unocss.dev/' + title: "UnoCSS", + category: "Devtool", + route: "/library/unocss.svg", + url: "https://unocss.dev/", }, { - title: 'tRPC', - category: 'Framework', - route: '/library/trpc.svg', + title: "tRPC", + category: "Framework", + route: "/library/trpc.svg", wordmark: { - light: '/library/trpc_wordmark_light.svg', - dark: 'library/trpc_wordmark_dark.svg' + light: "/library/trpc_wordmark_light.svg", + dark: "library/trpc_wordmark_dark.svg", }, - url: 'https://trpc.io/' + url: "https://trpc.io/", }, { - title: 'Bluesky', - category: 'Social', - route: '/library/bluesky.svg', - url: 'https://blueskyweb.xyz/' + title: "Bluesky", + category: "Social", + route: "/library/bluesky.svg", + url: "https://blueskyweb.xyz/", }, { - title: 'Drizzle ORM', - category: ['Library', 'Database'], + title: "Drizzle ORM", + category: ["Library", "Database"], route: { - light: '/library/drizzle-orm_light.svg', - dark: '/library/drizzle-orm_dark.svg' + light: "/library/drizzle-orm_light.svg", + dark: "/library/drizzle-orm_dark.svg", }, - url: 'https://orm.drizzle.team/' + url: "https://orm.drizzle.team/", }, { - title: 'daily.dev', - category: ['Social', 'Community'], + title: "daily.dev", + category: ["Social", "Community"], route: { - light: '/library/daily-dev-ligth.svg', - dark: '/library/daily-dev-dark.svg' + light: "/library/daily-dev-ligth.svg", + dark: "/library/daily-dev-dark.svg", }, - url: 'https://daily.dev/' + url: "https://daily.dev/", }, { - title: 'Polars', - category: 'Library', - route: '/library/polars-logo.svg', - url: 'https://pola.rs/' + title: "Polars", + category: "Library", + route: "/library/polars-logo.svg", + url: "https://pola.rs/", }, { - title: 'Zed', - category: 'Software', + title: "Zed", + category: "Software", route: { - light: '/library/zed-logo.svg', - dark: '/library/zed-logo_dark.svg' + light: "/library/zed-logo.svg", + dark: "/library/zed-logo_dark.svg", }, - url: 'https://zed.dev/' + url: "https://zed.dev/", }, { - title: 'Polar', - category: ['Software', 'Payment'], + title: "Polar", + category: ["Software", "Payment"], route: { - light: '/library/polar-sh_light.svg', - dark: '/library/polar-sh_dark.svg' + light: "/library/polar-sh_light.svg", + dark: "/library/polar-sh_dark.svg", }, - url: 'https://polar.sh/' + url: "https://polar.sh/", }, { - title: 'bolt', - category: 'Devtool', + title: "bolt", + category: "Devtool", route: { - light: '/library/bolt-new.svg', - dark: '/library/bolt-new_dark.svg' + light: "/library/bolt-new.svg", + dark: "/library/bolt-new_dark.svg", }, - url: 'https://bolt.new/' + url: "https://bolt.new/", }, { - title: 'JSON', - category: 'Language', - route: '/library/json.svg', - url: 'https://json.org/' + title: "JSON", + category: "Language", + route: "/library/json.svg", + url: "https://json.org/", }, { - title: 'nuqs', - category: 'Library', + title: "nuqs", + category: "Library", route: { - light: '/library/nuqs.svg', - dark: '/library/nuqs_dark.svg' + light: "/library/nuqs.svg", + dark: "/library/nuqs_dark.svg", }, wordmark: { - light: '/library/nuqs-wordmark.svg', - dark: '/library/nuqs-wordmark_dark.svg' + light: "/library/nuqs-wordmark.svg", + dark: "/library/nuqs-wordmark_dark.svg", }, - url: 'https://nuqs.47ng.com/' + url: "https://nuqs.47ng.com/", }, { - title: 'SoundCloud', - category: 'Music', + title: "SoundCloud", + category: "Music", route: { - light: '/library/soundcloud-logo.svg', - dark: '/library/soundcloud-logo_dark.svg' + light: "/library/soundcloud-logo.svg", + dark: "/library/soundcloud-logo_dark.svg", }, wordmark: { - light: '/library/soundcloud-wordmark.svg', - dark: 'library/soundcloud-wordmark_dark.svg' + light: "/library/soundcloud-wordmark.svg", + dark: "library/soundcloud-wordmark_dark.svg", }, - url: 'https://soundcloud.com/' + url: "https://soundcloud.com/", }, { - title: 'Mermaid', - category: ['Library'], + title: "Mermaid", + category: ["Library"], route: { - light: '/library/mermaid-logo-light.svg', - dark: '/library/mermaid-logo-dark.svg' + light: "/library/mermaid-logo-light.svg", + dark: "/library/mermaid-logo-dark.svg", }, - url: 'https://mermaid.js.org/' + url: "https://mermaid.js.org/", }, { - title: 'Home Assistant', - category: ['IoT', 'Software'], - route: '/library/home-assistant.svg', + title: "Home Assistant", + category: ["IoT", "Software"], + route: "/library/home-assistant.svg", wordmark: { - light: '/library/home-assistant-wordmark.svg', - dark: '/library/home-assistant-wordmark-dark.svg' + light: "/library/home-assistant-wordmark.svg", + dark: "/library/home-assistant-wordmark-dark.svg", }, - url: 'https://github.com/home-assistant/assets/tree/master/logo' + url: "https://github.com/home-assistant/assets/tree/master/logo", }, { - title: 'UXAnaRangel', - category: ['Community'], + title: "UXAnaRangel", + category: ["Community"], route: { - light: '/library/uxanarangel-light.svg', - dark: '/library/uxanarangel-dark.svg' + light: "/library/uxanarangel-light.svg", + dark: "/library/uxanarangel-dark.svg", }, - url: 'https://uxanarangel.com/' + url: "https://uxanarangel.com/", }, { - title: 'UXCorpRangel', - category: ['Community'], + title: "UXCorpRangel", + category: ["Community"], route: { - light: '/library/uxcorprangel-light.svg', - dark: '/library/uxcorprangel-dark.svg' + light: "/library/uxcorprangel-light.svg", + dark: "/library/uxcorprangel-dark.svg", }, - url: 'https://github.com/UXCorpRangel/' + url: "https://github.com/UXCorpRangel/", }, { - title: 'PostHog', - category: 'Devtool', - route: '/library/posthog.svg', + title: "PostHog", + category: "Devtool", + route: "/library/posthog.svg", wordmark: { - light: '/library/posthog-wordmark.svg', - dark: '/library/posthog-wordmark_dark.svg' + light: "/library/posthog-wordmark.svg", + dark: "/library/posthog-wordmark_dark.svg", }, - url: 'https://posthog.com/', - brandUrl: 'https://posthog.com/handbook/company/brand-assets' + url: "https://posthog.com/", + brandUrl: "https://posthog.com/handbook/company/brand-assets", }, { - title: 'PowerToys', - category: 'Software', - route: '/library/powertoys.svg', - url: 'https://learn.microsoft.com/en-us/windows/powertoys/' + title: "PowerToys", + category: "Software", + route: "/library/powertoys.svg", + url: "https://learn.microsoft.com/en-us/windows/powertoys/", }, { - title: 'PowerShell', - category: 'Language', - route: '/library/powershell.svg', - url: 'https://learn.microsoft.com/en-us/powershell/' + title: "PowerShell", + category: "Language", + route: "/library/powershell.svg", + url: "https://learn.microsoft.com/en-us/powershell/", }, { - title: 'Lottielab', - category: 'Design', - route: '/library/lottielab.svg', - url: 'https://www.lottielab.com/' + title: "Lottielab", + category: "Design", + route: "/library/lottielab.svg", + url: "https://www.lottielab.com/", }, { - title: 'TanStack', - category: ['Software', 'Library'], - route: '/library/tanstack.svg', - url: 'https://tanstack.com/' + title: "TanStack", + category: ["Software", "Library"], + route: "/library/tanstack.svg", + url: "https://tanstack.com/", }, { - title: 'TypeGPU', - category: ['Software', 'Library'], + title: "TypeGPU", + category: ["Software", "Library"], route: { - light: '/library/typegpu-light.svg', - dark: '/library/typegpu-dark.svg' + light: "/library/typegpu-light.svg", + dark: "/library/typegpu-dark.svg", }, wordmark: { - light: '/library/typegpu-wordmark-light.svg', - dark: '/library/typegpu-wordmark-dark.svg' + light: "/library/typegpu-wordmark-light.svg", + dark: "/library/typegpu-wordmark-dark.svg", }, - url: 'https://typegpu.com' + url: "https://typegpu.com", }, { - title: 'dotenv', - category: ['Config', 'Library', 'Devtool'], - route: '/library/dotenv.svg', - url: 'https://github.com/motdotla/dotenv' + title: "dotenv", + category: ["Config", "Library", "Devtool"], + route: "/library/dotenv.svg", + url: "https://github.com/motdotla/dotenv", }, { - title: 'dotenvx', - category: ['Secrets', 'Config', 'Devtool'], - route: '/library/dotenvx.svg', - url: 'https://dotenvx.com' + title: "dotenvx", + category: ["Secrets", "Config", "Devtool"], + route: "/library/dotenvx.svg", + url: "https://dotenvx.com", }, { - title: 'Motion', - category: 'Library', + title: "Motion", + category: "Library", route: { - light: '/library/motion.svg', - dark: '/library/motion_dark.svg' + light: "/library/motion.svg", + dark: "/library/motion_dark.svg", }, - url: 'https://motion.dev/' + url: "https://motion.dev/", }, { - title: 'Keycloak', - category: 'Authentication', - route: '/library/keycloak.svg', - url: 'https://keycloak.org' + title: "Keycloak", + category: "Authentication", + route: "/library/keycloak.svg", + url: "https://keycloak.org", }, { - title: 'DeepSeek', - category: 'AI', - route: '/library/deepseek.svg', - wordmark: '/library/deepseek_wordmark.svg', - url: 'https://deepseek.com/' + title: "DeepSeek", + category: "AI", + route: "/library/deepseek.svg", + wordmark: "/library/deepseek_wordmark.svg", + url: "https://deepseek.com/", }, { - title: 'Shiki', - category: 'Library', - route: '/library/shiki.svg', - url: 'https://shiki.style/' + title: "Shiki", + category: "Library", + route: "/library/shiki.svg", + url: "https://shiki.style/", }, { - title: 'Dropbox', - category: ['Hosting', 'Software'], - route: '/library/dropbox.svg', + title: "Dropbox", + category: ["Hosting", "Software"], + route: "/library/dropbox.svg", wordmark: { - light: '/library/dropbox_wordmark.svg', - dark: '/library/dropbox_wordmark_dark.svg' + light: "/library/dropbox_wordmark.svg", + dark: "/library/dropbox_wordmark_dark.svg", }, - url: 'https://www.dropbox.com/', - brandUrl: 'https://brand.dropbox.com/' + url: "https://www.dropbox.com/", + brandUrl: "https://brand.dropbox.com/", }, { - title: 'Open WebUI', - category: ['AI', 'Software'], - route: '/library/openwebui.svg', - url: 'https://openwebui.com/' + title: "Open WebUI", + category: ["AI", "Software"], + route: "/library/openwebui.svg", + url: "https://openwebui.com/", }, { - title: 'Base UI', - category: 'Library', + title: "Base UI", + category: "Library", route: { - light: '/library/base-ui.svg', - dark: '/library/base-ui-dark.svg' + light: "/library/base-ui.svg", + dark: "/library/base-ui-dark.svg", }, - url: 'https://base-ui.com/' + url: "https://base-ui.com/", }, { - title: 'Vercel', - category: ['Hosting', 'Vercel'], + title: "Vercel", + category: ["Hosting", "Vercel"], route: { - light: '/library/vercel.svg', - dark: '/library/vercel_dark.svg' + light: "/library/vercel.svg", + dark: "/library/vercel_dark.svg", }, wordmark: { - light: '/library/vercel_wordmark.svg', - dark: '/library/vercel_wordmark_dark.svg' + light: "/library/vercel_wordmark.svg", + dark: "/library/vercel_wordmark_dark.svg", }, - brandUrl: 'https://vercel.com/geist/brands', - url: 'https://vercel.com/' + brandUrl: "https://vercel.com/geist/brands", + url: "https://vercel.com/", }, { - title: 'Model Context Protocol', - category: ['AI', 'Framework'], + title: "Model Context Protocol", + category: ["AI", "Framework"], route: { - light: '/library/model-context-protocol-light.svg', - dark: '/library/model-context-protocol-dark.svg' + light: "/library/model-context-protocol-light.svg", + dark: "/library/model-context-protocol-dark.svg", }, wordmark: { - light: '/library/model-context-protocol-wordmark-light.svg', - dark: '/library/model-context-protocol-wordmark-dark.svg' + light: "/library/model-context-protocol-wordmark-light.svg", + dark: "/library/model-context-protocol-wordmark-dark.svg", }, - url: 'https://modelcontextprotocol.io/' + url: "https://modelcontextprotocol.io/", }, { - title: 'Socket.io', - category: 'Software', + title: "Socket.io", + category: "Software", route: { - dark: '/library/socketio-dark.svg', - light: '/library/socketio-light.svg' + dark: "/library/socketio-dark.svg", + light: "/library/socketio-light.svg", }, - url: 'https://socket.io/' + url: "https://socket.io/", }, { - title: 'Ant Design', - category: 'Library', - route: '/library/ant-design-dark-theme.svg', - url: 'https://ant.design/' + title: "Ant Design", + category: "Library", + route: "/library/ant-design-dark-theme.svg", + url: "https://ant.design/", }, { - title: 'VSCodium', - category: 'Software', - route: '/library/vscodium.svg', - url: 'https://vscodium.com/' + title: "VSCodium", + category: "Software", + route: "/library/vscodium.svg", + url: "https://vscodium.com/", }, { - title: 'Zen Browser', - category: 'Browser', + title: "Zen Browser", + category: "Browser", route: { - light: '/library/zen-browser-light.svg', - dark: '/library/zen-browser-dark.svg' + light: "/library/zen-browser-light.svg", + dark: "/library/zen-browser-dark.svg", }, wordmark: { - light: '/library/zen-browser-wordmark-light.svg', - dark: '/library/zen-browser-wordmark-dark.svg' + light: "/library/zen-browser-wordmark-light.svg", + dark: "/library/zen-browser-wordmark-dark.svg", }, - url: 'https://zen-browser.app/' + url: "https://zen-browser.app/", }, { - title: 'Gemini', - category: ['Google', 'AI'], - route: '/library/gemini.svg', - wordmark: '/library/gemini_wordmark.svg', - url: 'https://gemini.google.com/' + title: "Gemini", + category: ["Google", "AI"], + route: "/library/gemini.svg", + wordmark: "/library/gemini_wordmark.svg", + url: "https://gemini.google.com/", }, { - title: 'xAI (Grok)', - category: ['AI'], + title: "xAI (Grok)", + category: ["AI"], route: { - light: '/library/xai_light.svg', - dark: '/library/xai_dark.svg' + light: "/library/xai_light.svg", + dark: "/library/xai_dark.svg", }, - url: 'https://grok.com/' + url: "https://grok.com/", }, { - title: 'Qwen', - category: ['AI'], + title: "Qwen", + category: ["AI"], route: { - light: '/library/qwen_light.svg', - dark: '/library/qwen_dark.svg' + light: "/library/qwen_light.svg", + dark: "/library/qwen_dark.svg", }, - url: 'https://chat.qwenlm.ai/' + url: "https://chat.qwenlm.ai/", }, { - title: 'Inflection AI', - category: 'AI', + title: "Inflection AI", + category: "AI", route: { - light: '/library/inflectionai_light.svg', - dark: '/library/inflectionai_dark.svg' + light: "/library/inflectionai_light.svg", + dark: "/library/inflectionai_dark.svg", }, wordmark: { - light: '/library/inflectionai_wordmark_light.svg', - dark: '/library/inflectionai_wordmark_dark.svg' + light: "/library/inflectionai_wordmark_light.svg", + dark: "/library/inflectionai_wordmark_dark.svg", }, - url: 'https://inflection.ai/' + url: "https://inflection.ai/", }, { - title: 'D3.js', - category: 'Library', - route: '/library/D3.svg', - url: 'https://d3js.org/' + title: "D3.js", + category: "Library", + route: "/library/D3.svg", + url: "https://d3js.org/", }, { - title: 'Anthropic', - category: 'AI', + title: "Anthropic", + category: "AI", route: { - light: '/library/anthropic_black.svg', - dark: '/library/anthropic_white.svg' + light: "/library/anthropic_black.svg", + dark: "/library/anthropic_white.svg", }, wordmark: { - light: '/library/anthropic_black_wordmark.svg', - dark: '/library/anthropic_white_wordmark.svg' + light: "/library/anthropic_black_wordmark.svg", + dark: "/library/anthropic_white_wordmark.svg", }, - url: 'https://www.anthropic.com/' + url: "https://www.anthropic.com/", }, { - title: 'Replit', - category: 'AI', - route: '/library/replit.svg', + title: "Replit", + category: "AI", + route: "/library/replit.svg", wordmark: { - light: '/library/replit-wordmark-light.svg', - dark: '/library/replit-wordmark-dark.svg' + light: "/library/replit-wordmark-light.svg", + dark: "/library/replit-wordmark-dark.svg", }, - url: 'https://replit.com/', - brandUrl: 'https://replit.com/brandkit' + url: "https://replit.com/", + brandUrl: "https://replit.com/brandkit", }, { - title: 'Magic UI', - category: 'Library', - route: '/library/magicui.svg', - url: 'https://magicui.design/' + title: "Magic UI", + category: "Library", + route: "/library/magicui.svg", + url: "https://magicui.design/", }, { - title: 'Web Components', - category: 'Library', - route: '/library/webcomponents.svg', - url: 'https://www.webcomponents.org/' + title: "Web Components", + category: "Library", + route: "/library/webcomponents.svg", + url: "https://www.webcomponents.org/", }, { - title: 'Designali', - category: ['Software', 'Design'], - route: '/library/designali.svg', - url: 'https://designali.in' + title: "Designali", + category: ["Software", "Design"], + route: "/library/designali.svg", + url: "https://designali.in", }, { - title: 'CurseForge', - category: ['Marketplace', 'Community'], + title: "CurseForge", + category: ["Marketplace", "Community"], route: { - light: '/library/curseforge.svg', - dark: '/library/curseforge-dark.svg' + light: "/library/curseforge.svg", + dark: "/library/curseforge-dark.svg", }, wordmark: { - light: '/library/curseforge-wordmark.svg', - dark: '/library/curseforge-wordmark-dark.svg' + light: "/library/curseforge-wordmark.svg", + dark: "/library/curseforge-wordmark-dark.svg", }, - url: 'https://curseforge.com/', + url: "https://curseforge.com/", brandUrl: - 'https://www.figma.com/file/YYn36CxVpcT6aPKDXIH9JG/CurseForge-Brandbook?type=design&node-id=0-1&t=dvC0gPtyP36PQdsi-0' + "https://www.figma.com/file/YYn36CxVpcT6aPKDXIH9JG/CurseForge-Brandbook?type=design&node-id=0-1&t=dvC0gPtyP36PQdsi-0", }, { - title: 'Cursor', - category: ['Software'], - route: { - light: '/library/cursor_light.svg', - dark: '/library/cursor_dark.svg' - }, + title: "Ghostty", + category: ["Software"], + route: "/library/ghostty.svg", wordmark: { - light: '/library/cursor_wordmark_light.svg', - dark: '/library/cursor_wordmark_dark.svg' + dark: "/library/ghostty_wordmark_dark.svg", + light: "/library/ghostty_wordmark_light.svg", }, - url: 'https://www.cursor.com' + url: "https://ghostty.org/", }, { - title: 'Ghostty', - category: ['Software'], - route: '/library/ghostty.svg', - wordmark: { - dark: '/library/ghostty_wordmark_dark.svg', - light: '/library/ghostty_wordmark_light.svg' - }, - url: 'https://ghostty.org/' - }, - { - title: 'Better Auth', - category: ['Authentication', 'Library'], + title: "Better Auth", + category: ["Authentication", "Library"], route: { - light: '/library/better-auth_light.svg', - dark: '/library/better-auth_dark.svg' + light: "/library/better-auth_light.svg", + dark: "/library/better-auth_dark.svg", }, wordmark: { - dark: '/library/better-auth_wordmark_dark.svg', - light: '/library/better-auth_wordmark_light.svg' + dark: "/library/better-auth_wordmark_dark.svg", + light: "/library/better-auth_wordmark_light.svg", }, - url: 'https://www.better-auth.com/' + url: "https://www.better-auth.com/", }, { - title: 'Buy Me a Coffee', - category: ['Software'], - route: '/library/bmc.svg', - brandUrl: 'https://buymeacoffee.com/brand', - url: 'https://buymeacoffee.com/' + title: "Buy Me a Coffee", + category: ["Software"], + route: "/library/bmc.svg", + brandUrl: "https://buymeacoffee.com/brand", + url: "https://buymeacoffee.com/", }, { - title: 'GitHub', - category: 'Software', + title: "GitHub", + category: "Software", route: { - light: '/library/github_light.svg', - dark: '/library/github_dark.svg' + light: "/library/github_light.svg", + dark: "/library/github_dark.svg", }, wordmark: { - light: '/library/github_wordmark_light.svg', - dark: '/library/github_wordmark_dark.svg' + light: "/library/github_wordmark_light.svg", + dark: "/library/github_wordmark_dark.svg", }, - url: 'https://github.com/', - brandUrl: 'https://brand.github.com/' + url: "https://github.com/", + brandUrl: "https://brand.github.com/", }, { - title: 'Firebase Studio', - category: ['AI', 'Google'], - route: '/library/firebase-studio.svg', - url: 'https://firebase.studio/' + title: "Firebase Studio", + category: ["AI", "Google"], + route: "/library/firebase-studio.svg", + url: "https://firebase.studio/", }, { - title: 'Dingocoin', - category: 'Crypto', - route: '/library/dingocoin.svg', - url: 'https://dingocoin.com/' + title: "Dingocoin", + category: "Crypto", + route: "/library/dingocoin.svg", + url: "https://dingocoin.com/", }, { - title: 'HeroUI', - category: 'Library', + title: "HeroUI", + category: "Library", route: { - light: '/library/heroui_black.svg', - dark: '/library/heroui_light.svg' + light: "/library/heroui_black.svg", + dark: "/library/heroui_light.svg", }, - url: 'https://www.heroui.com/' + url: "https://www.heroui.com/", }, { - title: 'Convex', - category: ['Database', 'Software'], - route: '/library/convex.svg', + title: "Convex", + category: ["Database", "Software"], + route: "/library/convex.svg", wordmark: { - light: '/library/convex_wordmark_light.svg', - dark: '/library/convex_wordmark_dark.svg' + light: "/library/convex_wordmark_light.svg", + dark: "/library/convex_wordmark_dark.svg", }, - url: 'https://www.convex.dev/' + url: "https://www.convex.dev/", }, { - title: 'Clerk', - category: ['Software', 'Authentication'], + title: "Clerk", + category: ["Software", "Authentication"], route: { - light: '/library/clerk-light.svg', - dark: '/library/clerk-dark.svg' + light: "/library/clerk-light.svg", + dark: "/library/clerk-dark.svg", }, wordmark: { - light: '/library/clerk-wordmark-light.svg', - dark: '/library/clerk-wordmark-dark.svg' + light: "/library/clerk-wordmark-light.svg", + dark: "/library/clerk-wordmark-dark.svg", }, - url: 'https://clerk.com/', - brandUrl: 'https://clerk.com/design' + url: "https://clerk.com/", + brandUrl: "https://clerk.com/design", }, { - title: 'Terraform', - category: ['Software', 'Language', 'IaC'], - route: '/library/terraform.svg', - url: 'https://terraform.io', - brandUrl: 'https://brand.hashicorp.com' + title: "Terraform", + category: ["Software", "Language", "IaC"], + route: "/library/terraform.svg", + url: "https://terraform.io", + brandUrl: "https://brand.hashicorp.com", }, { - title: 'Rspack', - category: 'Compiler', - route: '/library/rspack.svg', - url: 'https://rspack.rs/' + title: "Rspack", + category: "Compiler", + route: "/library/rspack.svg", + url: "https://rspack.rs/", }, { - title: 'Rsbuild', - category: ['Devtool', 'Compiler'], - route: '/library/rsbuild.svg', - url: 'https://rsbuild.rs' + title: "Rsbuild", + category: ["Devtool", "Compiler"], + route: "/library/rsbuild.svg", + url: "https://rsbuild.rs", }, { - title: 'React Wheel Picker', - category: 'Library', + title: "React Wheel Picker", + category: "Library", route: { - light: '/library/react-wheel-picker_light.svg', - dark: '/library/react-wheel-picker_dark.svg' + light: "/library/react-wheel-picker_light.svg", + dark: "/library/react-wheel-picker_dark.svg", }, - url: 'https://react-wheel-picker.chanhdai.com' + url: "https://react-wheel-picker.chanhdai.com", }, { - title: 'cPanel', - category: 'Software', - route: '/library/cP_orange.svg', - wordmark: '/library/cPanel_orange_wordmark.svg', - url: 'https://cpanel.net/', - brandUrl: 'https://cpanel.net/company/cpanel-brand-guide/' + title: "cPanel", + category: "Software", + route: "/library/cP_orange.svg", + wordmark: "/library/cPanel_orange_wordmark.svg", + url: "https://cpanel.net/", + brandUrl: "https://cpanel.net/company/cpanel-brand-guide/", }, { - title: 'Lovable', - category: 'AI', - route: '/library/lovable.svg', - url: 'https://lovable.dev/', - brandUrl: 'https://lovable.dev/brand' + title: "Lovable", + category: "AI", + route: "/library/lovable.svg", + url: "https://lovable.dev/", + brandUrl: "https://lovable.dev/brand", }, { - title: 'Mocha', - category: 'AI', + title: "Mocha", + category: "AI", route: { - light: '/library/mocha-light.svg', - dark: '/library/mocha-dark.svg' + light: "/library/mocha-light.svg", + dark: "/library/mocha-dark.svg", }, wordmark: { - light: '/library/mocha-light_wordmark.svg', - dark: '/library/mocha-dark_wordmark.svg' + light: "/library/mocha-light_wordmark.svg", + dark: "/library/mocha-dark_wordmark.svg", }, - url: 'https://getmocha.com/' + url: "https://getmocha.com/", }, { - title: 'OpenRouter', - category: 'AI', + title: "OpenRouter", + category: "AI", route: { - light: '/library/openrouter_light.svg', - dark: '/library/openrouter_dark.svg' + light: "/library/openrouter_light.svg", + dark: "/library/openrouter_dark.svg", }, - url: 'https://openrouter.ai/' + url: "https://openrouter.ai/", }, { - title: 'OpenHunts', - category: ['Platform', 'Community'], - route: '/library/openhunts.svg', - url: 'https://openhunts.com' + title: "OpenHunts", + category: ["Community"], + route: "/library/openhunts.svg", + url: "https://openhunts.com", }, { - title: 'Kokonut UI', - category: 'Library', + title: "Kokonut UI", + category: "Library", route: { - light: '/library/kokonutui-light.svg', - dark: '/library/kokonutui-dark.svg' + light: "/library/kokonutui-light.svg", + dark: "/library/kokonutui-dark.svg", }, - url: 'https://kokonutui.com/' + url: "https://kokonutui.com/", }, { - title: 'Google Cloud', - category: ['Google', 'Hosting'], - route: '/library/google-cloud.svg', - url: 'https://cloud.google.com/' + title: "Google Cloud", + category: ["Google", "Hosting"], + route: "/library/google-cloud.svg", + url: "https://cloud.google.com/", }, { - title: 'Zulip', - category: ['Software', 'Social'], - route: '/library/zulip.svg', - wordmark: '/library/zulip-wordmark.svg', - url: 'https://zulip.com/', + title: "Zulip", + category: ["Software", "Social"], + route: "/library/zulip.svg", + wordmark: "/library/zulip-wordmark.svg", + url: "https://zulip.com/", brandUrl: - 'https://github.com/zulip/zulip/tree/bd29fb3e2691daef570ba5661351922a16782dd2/static/images/logo' + "https://github.com/zulip/zulip/tree/bd29fb3e2691daef570ba5661351922a16782dd2/static/images/logo", }, { - title: 'Effect TS', - category: 'Library', + title: "Effect TS", + category: "Library", route: { - light: '/library/effect_light.svg', - dark: '/library/effect_dark.svg' + light: "/library/effect_light.svg", + dark: "/library/effect_dark.svg", }, - url: 'https://effect.website/', + url: "https://effect.website/", brandUrl: - 'https://sparkling-lancer-5bd.notion.site/Effect-logo-guidelines-14280adbc6354eaa8bd173e1bc0128a4' + "https://sparkling-lancer-5bd.notion.site/Effect-logo-guidelines-14280adbc6354eaa8bd173e1bc0128a4", }, { - title: 'Ark UI', - category: 'Library', - route: '/library/ark-ui.svg', - url: 'https://ark-ui.com/' + title: "Ark UI", + category: "Library", + route: "/library/ark-ui.svg", + url: "https://ark-ui.com/", }, { - title: 'Mantine', - category: 'Library', - route: '/library/mantine.svg', - url: 'https://mantine.dev' + title: "Mantine", + category: "Library", + route: "/library/mantine.svg", + url: "https://mantine.dev", }, { - title: 'ESLint', - category: 'Library', - route: '/library/eslint.svg', - url: 'https://eslint.org/' + title: "ESLint", + category: "Library", + route: "/library/eslint.svg", + url: "https://eslint.org/", }, { - title: 'Apache Kafka', - category: 'Analytics', - route: '/library/apache-kafka-logo.svg', + title: "Apache Kafka", + category: "Analytics", + route: "/library/apache-kafka-logo.svg", wordmark: { - light: '/library/apache-kafka-wordmark-light.svg', - dark: '/library/apache-kafka-wordmark-dark.svg' + light: "/library/apache-kafka-wordmark-light.svg", + dark: "/library/apache-kafka-wordmark-dark.svg", }, - url: 'https://kafka.apache.org/', - brandUrl: 'https://kafka.apache.org/brand' + url: "https://kafka.apache.org/", + brandUrl: "https://kafka.apache.org/brand", }, { - title: 'PlainSignal', - category: 'Analytics', - route: '/library/plainsignal.svg', - url: 'https://plainsignal.com/' + title: "PlainSignal", + category: "Analytics", + route: "/library/plainsignal.svg", + url: "https://plainsignal.com/", }, { - title: 'Heptabase', - category: 'Software', - route: '/library/heptabase.svg', - url: 'https://heptabase.com/' + title: "Heptabase", + category: "Software", + route: "/library/heptabase.svg", + url: "https://heptabase.com/", }, { - title: 'UnJS', - category: 'Library', - route: '/library/unjs.svg', - url: 'https://unjs.io/' + title: "UnJS", + category: "Library", + route: "/library/unjs.svg", + url: "https://unjs.io/", }, { - title: 'PowerSync', - category: ['Sync Engine', 'Database', 'Library'], - route: '/library/powersync.svg', + title: "PowerSync", + category: ["Sync Engine", "Database", "Library"], + route: "/library/powersync.svg", wordmark: { - light: '/library/powersync-wordmark-light.svg', - dark: '/library/powersync-wordmark-dark.svg' + light: "/library/powersync-wordmark-light.svg", + dark: "/library/powersync-wordmark-dark.svg", }, - url: 'https://powersync.com/' + url: "https://powersync.com/", }, { - title: 'n8n', - category: ['Platform', 'Automation', 'AI'], - route: '/library/n8n.svg', + title: "n8n", + category: ["Platform", "Automation", "AI"], + route: "/library/n8n.svg", wordmark: { - dark: '/library/n8n-wordmark-dark.svg', - light: '/library/n8n-wordmark-light.svg' + dark: "/library/n8n-wordmark-dark.svg", + light: "/library/n8n-wordmark-light.svg", }, - url: 'https://n8n.io/' + url: "https://n8n.io/", }, { - title: 'Kibo UI', - category: 'Library', + title: "Kibo UI", + category: "Library", route: { - light: '/library/kibo-ui-light.svg', - dark: '/library/kibo-ui-dark.svg' + light: "/library/kibo-ui-light.svg", + dark: "/library/kibo-ui-dark.svg", }, - url: 'https://kibo-ui.com/' + url: "https://kibo-ui.com/", }, { - title: 'Ahrefs', - category: 'Platform', - route: '/library/ahrefs.svg', + title: "Ahrefs", + category: "Platform", + route: "/library/ahrefs.svg", wordmark: { - dark: '/library/ahrefs-wordmark-dark.svg', - light: '/library/ahrefs-wordmark-light.svg' + dark: "/library/ahrefs-wordmark-dark.svg", + light: "/library/ahrefs-wordmark-light.svg", }, - url: 'https://ahrefs.com/', - brandUrl: 'https://ahrefs.com/logo' + url: "https://ahrefs.com/", + brandUrl: "https://ahrefs.com/logo", }, { - title: 'Google Maps', - category: 'Google', - route: '/library/googleMaps.svg', - url: 'https://www.google.com/maps/' + title: "Google Maps", + category: "Google", + route: "/library/googleMaps.svg", + url: "https://www.google.com/maps/", }, { - title: 'WebGL', - category: 'Library', + title: "WebGL", + category: "Library", route: { - light: '/library/webgl.svg', - dark: '/library/webgl_dark.svg' + light: "/library/webgl.svg", + dark: "/library/webgl_dark.svg", }, - url: 'https://www.khronos.org/webgl/', - brandUrl: 'https://www.khronos.org/legal/trademarks/' + url: "https://www.khronos.org/webgl/", + brandUrl: "https://www.khronos.org/legal/trademarks/", }, { - title: 'Intello', - category: 'Platform', + title: "Intello", + category: "Platform", route: { - light: '/library/intello-light.svg', - dark: '/library/intello-dark.svg' + light: "/library/intello-dark.svg", + dark: "/library/intello-light.svg", }, wordmark: { - light: '/library/intello-wordmark-light.svg', - dark: '/library/intello-wordmark-dark.svg' + light: "/library/intello_wordmark_dark.svg", + dark: "/library/intello_wordmark_light.svg", }, - url: 'https://intelloai.com/' + url: "https://intelloai.com/", }, { - title: 'Kilo Code', - category: ['AI', 'Devtool'], + title: "Kilo Code", + category: ["AI", "Devtool"], route: { - light: '/library/kilocode-light.svg', - dark: '/library/kilocode-dark.svg' + light: "/library/kilocode-light.svg", + dark: "/library/kilocode-dark.svg", }, - url: 'https://kilocode.ai/' - } + url: "https://kilocode.ai/", + }, + { + title: "Cursor", + category: ["Software"], + route: { + light: "/library/cursor_light.svg", + dark: "/library/cursor_dark.svg", + }, + wordmark: { + light: "/library/cursor_wordmark_light.svg", + dark: "/library/cursor_wordmark_dark.svg", + }, + url: "https://www.cursor.com", + }, ]; diff --git a/src/docs/api.md b/src/docs/api.md index 26fd155d5..2f1a676f4 100644 --- a/src/docs/api.md +++ b/src/docs/api.md @@ -3,11 +3,6 @@ title: API Reference description: The API reference is a detailed documentation of all the endpoints available in the SVGL API. --- - - ## Introduction SVGL API is a RESTFul API that allows you to get all the information of the SVGs that are in the repository. @@ -16,32 +11,25 @@ SVGL API is a RESTFul API that allows you to get all the information of the SVGs The API is currently open to everyone and does not require any authentication. However, to prevent abusive use of the API, there is a limit to the number of requests. - - Don't use the API for create the same product as SVGL. The API is intended to be used for extensions, plugins, or other tools that can help the community. - +> Don't use the API for create the same product as SVGL. The API is intended to be used for extensions, plugins, or other tools that can help the community. -## Base URL +## Base URLs -The base URL for the API is: +SVGs URL: ```bash https://api.svgl.app -# or -https://api.svgl.app/categories ``` -## Typescript usage +Categories URL: -- For categories: - -```ts -export interface Category { - category: string; - total: number; -} +```bash +https://api.svgl.app/categories ``` -- For SVGs: +## Typescript + +You can use the following types for the SVG responses: ```ts export type ThemeOptions = { @@ -49,29 +37,27 @@ export type ThemeOptions = { light: string; }; -export interface iSVG { - id?: number; +export interface SVG { + id: number; title: string; - category: tCategory | tCategory[]; + category: string | string[]; route: string | ThemeOptions; + url: string; wordmark?: string | ThemeOptions; brandUrl?: string; - url: string; } ``` -- `tCategory` is a large list of categories that can be found [here](https://github.com/pheralb/svgl/blob/main/src/types/categories.ts#L1). +> If you need types for the `category`, you can find them [here](https://github.com/pheralb/svgl/blob/main/src/types/categories.ts). Change the type of `category` to `Category | Category[]`. ## Endpoints - +### Get all SVGs ```bash https://api.svgl.app ``` -

- ```json // Returns: [ @@ -86,16 +72,12 @@ https://api.svgl.app ] ``` -
- - +### Get all SVGs with limit ```bash https://api.svgl.app?limit=10 ``` -

- ```json // Returns: [ @@ -110,16 +92,12 @@ https://api.svgl.app?limit=10 ] ``` -
- - +### Get SVGs by category ```bash https://api.svgl.app/category/software ``` -

- ```json // Returns: [ @@ -134,83 +112,86 @@ https://api.svgl.app/category/software ] ``` -The list of categories is available [here](https://github.com/pheralb/svgl/blob/main/src/types/categories.ts) (except for the _all_ category). +> The list of categories is available [here](https://github.com/pheralb/svgl/blob/main/src/types/categories.ts). -
+### Get the SVG code - +Optimized SVG using [svgo](https://github.com/svg/svgo): ```bash https://api.svgl.app/svg/adobe.svg ``` -

+No optimized SVG: + +```bash +https://api.svgl.app/svg/adobe.svg?no-optimize +``` ```html -// Returns: - - - - - - - - - - - + + + + + + + + + + + + ``` -
- - +### Search SVG by title ```bash -https://api.svgl.app/categories +https://api.svgl.app?search=axiom ``` -

- ```json // Returns: [ { + "id": 267, + "title": "Axiom", "category": "Software", - "total": 97 - }, - { - "category": "Library", - "total": 25 - }, - ... + "route": { + "light": "https://svgl.app/axiom-light.svg", + "dark": "https://svgl.app/axiom-dark.svg" + }, + "url": "https://axiom.co/" + } ] ``` -
- - +### Get the list of categories ```bash -https://api.svgl.app?search=axiom +https://api.svgl.app/categories ``` -

- ```json // Returns: [ { - "id": 267, - "title": "Axiom", "category": "Software", - "route": { - "light": "https://svgl.app/axiom-light.svg", - "dark": "https://svgl.app/axiom-dark.svg" - }, - "url": "https://axiom.co/" + "total": 97 + }, + { + "category": "Library", + "total": 25 } + //... ] ``` - -
diff --git a/src/docs/shadcn-ui.md b/src/docs/shadcn-ui.md new file mode 100644 index 000000000..f6dd927cc --- /dev/null +++ b/src/docs/shadcn-ui.md @@ -0,0 +1,96 @@ +--- +title: shadcn/ui +description: How to use shadcn/ui to add SVGs to your project. +--- + +## shadcn/ui + +SVGL v5 support [shadcn/ui](https://ui.shadcn.com/) registry 🎉, so you can easily add SVGs to your project using [their CLI](https://ui.shadcn.com/docs/cli). Add the registry config once and you will be able to install any SVG in **`.tsx`** using `npm`, `yarn`, `bun` or `pnpm`. + +## Add registry + +Add the SVGL registry to your `components.json` file: + +```json +{ + "registries": { + "@svgl": "https://svgl.app/r/{name}.json" + } +} +``` + +[shadcn/ui Namespaces](https://ui.shadcn.com/docs/registry/namespace) documentation. + +## Usage + +Add SVGs using the [shadcn/ui CLI](https://ui.shadcn.com/docs/cli/installation): + +```bash +npx shadcn@latest add @svgl/sanity +# or +pnpm dlx shadcn@latest add @svgl/sanity +# or +yarn dlx shadcn@latest add @svgl/sanity +# or +bunx shadcn@latest add @svgl/sanity +``` + +Add multiple SVGs at once: + +```bash +pnpm dlx shadcn@latest add @svgl/sanity @svgl/github @svgl/supabase @svgl/vercel +``` + +## MCP Server + +You can use the [shadcn MCP server](https://ui.shadcn.com/docs/mcp) to browse, search, and add React SVGs from SVGL registry: + +### Prerequisites + +You need to have `@svgl` in your `components.json` file: + +```json +{ + "registries": { + "@svgl": "https://svgl.app/r/{name}.json" + } +} +``` + +### Quick Start + +**With Claude Code**: + +```bash +pnpm dlx shadcn@latest mcp init --client claude +``` + +Then, restart Claude Code. You can use `/mcp` command in Claude Code to debug the MCP server. + +**With Cursor**: + +```bash +pnpm dlx shadcn@latest mcp init --client cursor +``` + +Then, open Cursor Settings and Enable the MCP server for shadcn. + +**With VSCode**: + +```bash +pnpm dlx shadcn@latest mcp init --client vscode +``` + +Then, open `.vscode/mcp.json` and click Start next to the shadcn server. + +### Example Prompts + +Here are some example prompts you can use to add SVGs from SVGL registry: + +``` +Can you add the "GitHub" SVG from SVGL registry? +``` + +``` +Please add React, Svelte and Vue SVGs from SVGL registry. +``` diff --git a/src/figma/code.ts b/src/figma/code.ts index 52f3208be..94093d55b 100644 --- a/src/figma/code.ts +++ b/src/figma/code.ts @@ -1,37 +1,40 @@ -declare const SITE_URL: string +declare const SITE_URL: string; figma.showUI(``, { width: 400, height: 700, -}) - +}); figma.ui.onmessage = async (message, props) => { if (!SITE_URL.includes(props.origin)) { - return + return; } switch (message.type) { - case 'EVAL': { - const fn = eval.call(null, message.code) + case "EVAL": { + const fn = eval.call(null, message.code); try { - const result = await fn(figma, message.params) + const result = await fn(figma, message.params); figma.ui.postMessage({ - type: 'EVAL_RESULT', + type: "EVAL_RESULT", result, id: message.id, - }) + }); } catch (e) { figma.ui.postMessage({ - type: 'EVAL_REJECT', - error: typeof e === 'string' ? e : e && typeof e === 'object' && 'message' in e ? e.message : null, + type: "EVAL_REJECT", + error: + typeof e === "string" + ? e + : e && typeof e === "object" && "message" in e + ? e.message + : null, id: message.id, - }) + }); } - break + break; } } -} - +}; diff --git a/src/figma/copy-to-clipboard.ts b/src/figma/copy-to-clipboard.ts index 0bc3849c5..1257f9643 100644 --- a/src/figma/copy-to-clipboard.ts +++ b/src/figma/copy-to-clipboard.ts @@ -7,20 +7,20 @@ export function copyToClipboard(value: string) { // @ts-ignore window.copy(value); } else { - const area = document.createElement('textarea'); + const area = document.createElement("textarea"); document.body.appendChild(area); area.value = value; // area.focus(); area.select(); - const result = document.execCommand('copy'); + const result = document.execCommand("copy"); document.body.removeChild(area); if (!result) { throw new Error(); } } - } catch (e) { - console.error(`Unable to copy the value: ${value}`); + } catch (error) { + console.error(`Unable to copy the value: ${value} - Error: ${error}`); return false; } return true; -} \ No newline at end of file +} diff --git a/src/figma/figma-api.ts b/src/figma/figma-api.ts index abaf8f88e..fca4fe142 100644 --- a/src/figma/figma-api.ts +++ b/src/figma/figma-api.ts @@ -23,7 +23,7 @@ * ``` */ class FigmaAPI { - private id = 0 + private id = 0; /** * Run a function in the Figma plugin context. The function cannot reference @@ -31,50 +31,64 @@ class FigmaAPI { * serializable. If you need to pass in variables, you can do so by passing * them as the second parameter. */ - run(fn: (figma: PluginAPI, params: U) => Promise | T, params?: U): Promise { + run( + fn: (figma: PluginAPI, params: U) => Promise | T, + params?: U, + ): Promise { return new Promise((resolve, reject) => { - const id = this.id++ + const id = this.id++; const cb = (event: MessageEvent) => { - if (event.origin !== 'https://www.figma.com' && event.origin !== 'https://staging.figma.com') { - return + if ( + event.origin !== "https://www.figma.com" && + event.origin !== "https://staging.figma.com" + ) { + return; } - if (event.data.pluginMessage?.type === 'EVAL_RESULT') { + if (event.data.pluginMessage?.type === "EVAL_RESULT") { if (event.data.pluginMessage.id === id) { - window.removeEventListener('message', cb) - resolve(event.data.pluginMessage.result) + window.removeEventListener("message", cb); + resolve(event.data.pluginMessage.result); } } - if (event.data.pluginMessage?.type === 'EVAL_REJECT') { + if (event.data.pluginMessage?.type === "EVAL_REJECT") { if (event.data.pluginMessage.id === id) { - window.removeEventListener('message', cb) - const message = event.data.pluginMessage.error - reject(new Error(typeof message === 'string' ? message : 'An error occurred in FigmaAPI.run()')) + window.removeEventListener("message", cb); + const message = event.data.pluginMessage.error; + reject( + new Error( + typeof message === "string" + ? message + : "An error occurred in FigmaAPI.run()", + ), + ); } } - } - window.addEventListener('message', cb) + }; + window.addEventListener("message", cb); const msg = { pluginMessage: { - type: 'EVAL', + type: "EVAL", code: fn.toString(), id, params, }, - pluginId: '*', - } + pluginId: "*", + }; - ;['https://www.figma.com', 'https://staging.figma.com'].forEach((origin) => { + ["https://www.figma.com", "https://staging.figma.com"].forEach( + (origin) => { try { - parent.postMessage(msg, origin) + parent.postMessage(msg, origin); } catch (e) { - console.error(e) + console.error(e); } - }) - }) + }, + ); + }); } } -export const figmaAPI = new FigmaAPI() +export const figmaAPI = new FigmaAPI(); diff --git a/src/figma/insert-svg.ts b/src/figma/insert-svg.ts index 847f1f0f8..b0cce4241 100644 --- a/src/figma/insert-svg.ts +++ b/src/figma/insert-svg.ts @@ -1,22 +1,22 @@ -import { figmaAPI } from './figma-api' +import { figmaAPI } from "./figma-api"; export async function insertSVG(svgString: string) { - if (!svgString) return + if (!svgString) return; figmaAPI.run( async (figma, { svgString }: { svgString: string }) => { - const node = figma.createNodeFromSvg(svgString) - const selectedNode = figma.currentPage.selection[0] + const node = figma.createNodeFromSvg(svgString); + const selectedNode = figma.currentPage.selection[0]; if (selectedNode) { - node.x = selectedNode.x + selectedNode.width + 20 - node.y = selectedNode.y + node.x = selectedNode.x + selectedNode.width + 20; + node.y = selectedNode.y; } - figma.currentPage.appendChild(node) - figma.currentPage.selection = [node] - figma.viewport.scrollAndZoomIntoView([node]) + figma.currentPage.appendChild(node); + figma.currentPage.selection = [node]; + figma.viewport.scrollAndZoomIntoView([node]); }, { svgString }, - ) + ); } diff --git a/src/globals.ts b/src/globals.ts new file mode 100644 index 000000000..8d79a6a90 --- /dev/null +++ b/src/globals.ts @@ -0,0 +1,14 @@ +export const globals = { + githubUrl: "https://github.com/pheralb/svgl", + apiGithub: { + url: "https://ungh.cc/repos/pheralb/svgl", + fallback: 5000, + }, + twitterUrl: "https://x.com/pheralb_", + submitUrl: + "https://github.com/pheralb/svgl?tab=readme-ov-file#-getting-started", + requestSvgUrl: + "https://github.com/pheralb/svgl/issues/new?template=request-svg.yml", + registryUrl: "https://svgl.app/r/", + v0Url: "https://v0.dev/chat/api/open?url=", +}; diff --git a/src/index.test.ts b/src/index.test.ts deleted file mode 100644 index bf8c59021..000000000 --- a/src/index.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { describe, it, expect } from 'vitest'; -import { svgs } from './data/svgs'; - -describe('Get svgs by category', () => { - it('should have a category named "Social"', () => { - expect(svgs.find((svg) => svg.category === 'Social')).toBeDefined(); - }); -}); - -describe('Get a specific svg', () => { - it('should have a svg named "Discord"', () => { - expect(svgs.find((svg) => svg.title === 'Discord')).toBeDefined(); - }); -}); diff --git a/src/markdown/generateToC.ts b/src/markdown/generateToC.ts new file mode 100644 index 000000000..4d538bf67 --- /dev/null +++ b/src/markdown/generateToC.ts @@ -0,0 +1,39 @@ +import GithubSlugger from "github-slugger"; + +type ToCItem = { + id: number; + level: number; + text: string; + slug: string; +}; + +const getTableOfContents = (markdown: string): ToCItem[] => { + const slugger = new GithubSlugger(); + const regXHeader = /(?:^|\n)(?#+)\s+(?.+)/g; + + // Delete # from code blocks and inline code: + let clean = markdown.replace(//gi, ""); + clean = clean.replace(//gi, ""); + + return Array.from(clean.matchAll(regXHeader)) + .map((match, idx): ToCItem | null => { + const groups = match.groups; + if ( + groups && + typeof groups.flag === "string" && + typeof groups.content === "string" && + groups.flag.length > 1 + ) { + return { + id: idx, + level: groups.flag.length, + text: groups.content, + slug: slugger.slug(groups.content), + }; + } + return null; + }) + .filter((x): x is ToCItem => x !== null); +}; + +export { getTableOfContents, type ToCItem }; diff --git a/src/markdown/rehypeCopyBtn.ts b/src/markdown/rehypeCopyBtn.ts new file mode 100644 index 000000000..79a8fb553 --- /dev/null +++ b/src/markdown/rehypeCopyBtn.ts @@ -0,0 +1,126 @@ +import type { UnistNode, UnistTree } from "@/types/unist"; + +import { visit } from "unist-util-visit"; +import { cn } from "@/utils/cn"; + +export const rehypeCopyBtn = () => { + return (tree: UnistTree) => { + visit(tree, "element", (node: UnistNode, index, parent) => { + if (node.tagName === "pre" && parent && typeof index === "number") { + const iconSize = 14; + const copyIcon = { + type: "element", + tagName: "svg", + properties: { + xmlns: "http://www.w3.org/2000/svg", + width: iconSize, + height: iconSize, + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + strokeWidth: "2", + strokeLinecap: "round", + strokeLinejoin: "round", + style: "display: inline;", + }, + children: [ + { + type: "element", + tagName: "rect", + properties: { + width: iconSize, + height: iconSize, + x: "8", + y: "8", + rx: "2", + ry: "2", + }, + children: [], + }, + { + type: "element", + tagName: "path", + properties: { + d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2", + }, + children: [], + }, + ], + }; + const successIcon = { + type: "element", + tagName: "svg", + properties: { + xmlns: "http://www.w3.org/2000/svg", + width: iconSize, + height: iconSize, + viewBox: "0 0 24 24", + fill: "none", + stroke: "currentColor", + strokeWidth: "2", + strokeLinecap: "round", + strokeLinejoin: "round", + class: "hidden", + }, + children: [ + { + type: "element", + tagName: "path", + properties: { + d: "M18 6 7 17l-5-5", + }, + children: [], + }, + { + type: "element", + tagName: "path", + properties: { + d: "m22 10-7.5 7.5L13 16", + }, + children: [], + }, + ], + }; + const copyButton = { + type: "element", + tagName: "button", + title: "Copy code to clipboard", + "aria-label": "Copy code to clipboard", + properties: { + type: "button", + title: "Copy code to clipboard", + class: cn( + "cursor-pointer z-40 absolute top-[1px] right-[1px] px-1.5 py-0.5 rounded-bl-md", + "border-b border-l border-neutral-200 dark:border-neutral-800", + "transition-colors text-neutral-500 dark:text-neutral-400 hover:text-black dark:hover:text-white", + ), + onclick: ` + const button = this; + const copyIcon = button.querySelector('svg:first-child'); + const successIcon = button.querySelector('svg:last-child'); + const codeBlock = button.nextElementSibling; + navigator.clipboard.writeText(codeBlock.innerText).then(() => { + copyIcon.style.display = 'none'; + successIcon.style.display = 'inline'; + setTimeout(() => { + copyIcon.style.display = 'inline'; + successIcon.style.display = 'none'; + }, 2000); + }).catch((err) => { + console.error('Error copying:', err); + }); + `, + }, + children: [copyIcon, successIcon], + }; + const wrapper = { + type: "element", + tagName: "div", + properties: { class: "relative" }, + children: [copyButton, node], + }; + parent.children[index] = wrapper; + } + }); + }; +}; diff --git a/src/markdown/rehypeExternalLinks.ts b/src/markdown/rehypeExternalLinks.ts new file mode 100644 index 000000000..ccd399e84 --- /dev/null +++ b/src/markdown/rehypeExternalLinks.ts @@ -0,0 +1,18 @@ +import type { UnistNode, UnistTree } from "@/types/unist"; +import { visit } from "unist-util-visit"; + +const APP_DOMAIN = "svgl.app"; + +export const rehypeExternalLinks = () => { + return (tree: UnistTree) => { + visit(tree, "element", (node: UnistNode) => { + if (node.tagName === "a" && node.properties?.href) { + const href = String(node.properties.href); + if (!href.includes(APP_DOMAIN)) { + node.properties.target = "_blank"; + node.properties.rel = "noopener noreferrer"; + } + } + }); + }; +}; diff --git a/src/routes/+error.svelte b/src/routes/+error.svelte deleted file mode 100644 index ba651864b..000000000 --- a/src/routes/+error.svelte +++ /dev/null @@ -1,5 +0,0 @@ - diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index d1ea79abf..8cefd583f 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,107 +1,23 @@ - -
- -
- - - - - -
-
+ +
+ + {@render children?.()} + diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 2921958ed..a28f932ce 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,104 +1,75 @@ @@ -106,66 +77,88 @@ clearSearch()} - placeholder={`Search ${allSvgs.length} logos...`} + searchValue={searchTerm} + onSearch={handleSearch} + placeholder="Search..." /> - -
0 && 'justify-between')}> - {#if searchTerm.length > 0} - - {/if} - +

+ {filteredSvgs.length} + logos +

{/if} - {sorted ? 'Sort by latest' : 'Sort A-Z'} - -
- - {#each displaySvgs as svg} - - {/each} - - {#if filteredSvgs.length > maxDisplay && !showAll} -
-
+
+ { + sorted = value; + searchSvgs(); }} - > -
- - Load All SVGs - - ({filteredSvgs.length - maxDisplay} more) - -
- + /> + {#if showAll && filteredSvgs.length > maxDisplay} + + {/if}
+ + {#if browser} + {/if} - {#if filteredSvgs.length === 0} - - {/if} -
+ + + {#each displaySvgs as svg (svg.id)} + + {/each} + + {#if !showAll && filteredSvgs.length > maxDisplay} +
+ +
+ {/if} + {#if filteredSvgs.length === 0} + + {/if} +
+ diff --git a/src/routes/+page.ts b/src/routes/+page.ts new file mode 100644 index 000000000..a7f6899fa --- /dev/null +++ b/src/routes/+page.ts @@ -0,0 +1,33 @@ +import type { iSVG } from "@/types/svg"; +import type { Load } from "@sveltejs/kit"; + +import { svgsData } from "@/data"; +import { searchSvgsWithFuse } from "@/utils/searchWithFuse"; + +export const load: Load = ({ url }) => { + const searchParam = url.searchParams.get("search") || ""; + const sortParam = url.searchParams.get("sort") === "alphabetical"; + const latestSorted = [...svgsData].sort((a, b) => b.id! - a.id!); + const alphabeticallySorted = [...svgsData].sort((a, b) => + a.title.localeCompare(b.title), + ); + + let filteredSvgs: iSVG[] = []; + + if (!searchParam) { + filteredSvgs = sortParam ? alphabeticallySorted : latestSorted; + } else { + const baseData = sortParam ? alphabeticallySorted : latestSorted; + filteredSvgs = searchSvgsWithFuse(baseData) + .search(searchParam) + .map((result) => result.item); + } + + return { + searchTerm: searchParam, + sorted: sortParam, + initialSvgs: filteredSvgs, + latestSorted, + alphabeticallySorted, + }; +}; diff --git a/src/routes/api/+page.server.ts b/src/routes/api/+page.server.ts new file mode 100644 index 000000000..85d93f8e5 --- /dev/null +++ b/src/routes/api/+page.server.ts @@ -0,0 +1,5 @@ +import { redirect } from "@sveltejs/kit"; + +export const load = async () => { + return redirect(307, "/docs/api"); +}; diff --git a/src/routes/api/+page.svelte b/src/routes/api/+page.svelte deleted file mode 100644 index 5bbf46b6c..000000000 --- a/src/routes/api/+page.svelte +++ /dev/null @@ -1,50 +0,0 @@ - - - - {data.meta.title} - SVGL - - - - - -
-
-
-

- API Reference -

- - -
- v1 -
-
-
-

- The API reference is a detailed documentation of all the endpoints available in the API. -

-
-
- -
- -
diff --git a/src/routes/api/+page.ts b/src/routes/api/+page.ts deleted file mode 100644 index 88129b93e..000000000 --- a/src/routes/api/+page.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { error } from '@sveltejs/kit'; - -export async function load() { - try { - const documentTitle = 'api'; - const post = await import(`../../docs/${documentTitle}.md`); - return { - content: post.default, - meta: post.metadata - }; - } catch (e) { - throw error(404, `Could not find this page`); - } -} diff --git a/src/routes/api/docs/[...slug]/+server.ts b/src/routes/api/docs/[...slug]/+server.ts new file mode 100644 index 000000000..a33237cab --- /dev/null +++ b/src/routes/api/docs/[...slug]/+server.ts @@ -0,0 +1,15 @@ +import type { RequestEvent } from "@sveltejs/kit"; +import { error } from "@sveltejs/kit"; +import { allDocs } from "content-collections"; + +export const GET = async ({ params }: RequestEvent) => { + const document = allDocs.find((doc) => doc._meta.path === params.slug); + if (!document) { + throw error(404, `Could not find ${params.slug}`); + } + return new Response(document.content, { + headers: { + "Content-Type": "text/markdown; charset=utf-8", + }, + }); +}; diff --git a/src/routes/api/svgs/svgr/+server.ts b/src/routes/api/svgs/svgr/+server.ts index 711b4a1a1..27439238e 100644 --- a/src/routes/api/svgs/svgr/+server.ts +++ b/src/routes/api/svgs/svgr/+server.ts @@ -1,37 +1,37 @@ -import type { RequestEvent } from '../$types'; +import type { RequestEvent } from "@sveltejs/kit"; +import { json, redirect } from "@sveltejs/kit"; -import { transform } from '@svgr/core'; -import { json, redirect } from '@sveltejs/kit'; - -import { ratelimit } from '@/server/redis'; - -// SVGR Plugins: -import svgrJSX from '@svgr/plugin-jsx'; +import { optimizeSvg } from "@/utils/optimizeSvg"; +import { parseReactSvgContent } from "@/utils/parseReactSvgContent"; export const GET = async () => { - return redirect(301, 'https://svgl.app/api'); + return redirect(301, "https://svgl.app/api"); }; export const POST = async ({ request }: RequestEvent) => { try { const body = await request.json(); - const svgCode = body.code; + let svgCode = body.code; const typescript = body.typescript; - const name = body.name.replace(/[^a-zA-Z0-9]/g, ''); + const name = body.name.replace(/[^a-zA-Z0-9]/g, ""); + const shouldOptimize = body.optimize !== false; - const jsCode = await transform( - svgCode, - { - plugins: [svgrJSX], - icon: true, - typescript: typescript - }, - { componentName: name } - ); + if (shouldOptimize) { + svgCode = optimizeSvg({ svgCode }); + } - return json({ data: jsCode }, { status: 200 }); + const code = await parseReactSvgContent({ + componentName: name, + svgCode: svgCode, + typescript, + }); + + return json({ data: code }, { status: 200 }); } catch (error) { - return json({ error: `⚠️ api/svgs/svgr - Error: ${error}` }, { status: 500 }); + return json( + { error: `⚠️ api/svgs/svgr - Error: ${error}` }, + { status: 500 }, + ); } }; diff --git a/src/routes/directory/+page.server.ts b/src/routes/directory/+page.server.ts new file mode 100644 index 000000000..8f4d59c3b --- /dev/null +++ b/src/routes/directory/+page.server.ts @@ -0,0 +1,5 @@ +import { redirect } from "@sveltejs/kit"; + +export const load = async () => { + return redirect(307, "/"); +}; diff --git a/src/routes/directory/[category]/+page.svelte b/src/routes/directory/[category]/+page.svelte new file mode 100644 index 000000000..36bd291c2 --- /dev/null +++ b/src/routes/directory/[category]/+page.svelte @@ -0,0 +1,139 @@ + + + + {directoryData.category} SVG logos - Svgl + + + + + + +
+ + + + {#if searchTerm} + + {:else} + + {/if} +

+ {directoryData.category} +

+ - + {#if !searchTerm} +

+ {data.initialSvgs.length} SVGs +

+ {:else} +

+ {filteredSvgs.length} + search results +

+ {/if} +
+ { + sorted = value; + searchSvgs(); + }} + /> +
+ + + {#each filteredSvgs as svg (svg.id)} + + {/each} + + {#if filteredSvgs.length === 0} + + {/if} + +
diff --git a/src/routes/directory/[category]/+page.ts b/src/routes/directory/[category]/+page.ts new file mode 100644 index 000000000..ddf7184e0 --- /dev/null +++ b/src/routes/directory/[category]/+page.ts @@ -0,0 +1,43 @@ +import type { PageLoad } from "./$types"; +import type { iSVG } from "@/types/svg"; + +import { error } from "@sveltejs/kit"; +import { getSvgsByCategory } from "@/data"; +import { searchSvgsWithFuse } from "@/utils/searchWithFuse"; + +export const load: PageLoad = (async ({ params, url }) => { + const { category } = params; + const searchParam = url.searchParams.get("search") || ""; + const sortParam = url.searchParams.get("sort") === "alphabetical"; + + const svgsByCategory = getSvgsByCategory(category); + + if (!svgsByCategory.length) { + throw error(404, "Category not found"); + } + + let filteredSvgs: iSVG[] = []; + const latestSorted = [...svgsByCategory].sort((a, b) => b.id! - a.id!); + const alphabeticallySorted = [...svgsByCategory].sort((a, b) => + a.title.localeCompare(b.title), + ); + const formatCategory = category.charAt(0).toUpperCase() + category.slice(1); + + if (!searchParam) { + filteredSvgs = sortParam ? alphabeticallySorted : latestSorted; + } else { + const baseData = sortParam ? alphabeticallySorted : latestSorted; + filteredSvgs = searchSvgsWithFuse(baseData) + .search(searchParam) + .map((result) => result.item); + } + + return { + category: formatCategory, + searchTerm: searchParam, + sorted: sortParam, + initialSvgs: filteredSvgs, + latestSorted, + alphabeticallySorted, + }; +}) satisfies PageLoad; diff --git a/src/routes/directory/[slug]/+layout.svelte b/src/routes/directory/[slug]/+layout.svelte deleted file mode 100644 index a34aa3624..000000000 --- a/src/routes/directory/[slug]/+layout.svelte +++ /dev/null @@ -1,16 +0,0 @@ - - - - -
- - View all -
-
-
- diff --git a/src/routes/directory/[slug]/+page.svelte b/src/routes/directory/[slug]/+page.svelte deleted file mode 100644 index a307d95f8..000000000 --- a/src/routes/directory/[slug]/+page.svelte +++ /dev/null @@ -1,67 +0,0 @@ - - - - {category} logos - Svgl - - - - clearSearch()} - placeholder={`Search ${filteredSvgs.length} ${category} logos...`} - /> - - {#each filteredSvgs as svg} - - {/each} - - {#if filteredSvgs.length === 0} - - {/if} - diff --git a/src/routes/directory/[slug]/+page.ts b/src/routes/directory/[slug]/+page.ts deleted file mode 100644 index 68dd97c5d..000000000 --- a/src/routes/directory/[slug]/+page.ts +++ /dev/null @@ -1,32 +0,0 @@ -import type { PageLoad, EntryGenerator } from './$types'; -import type { iSVG } from '@/types/svg'; - -import { error } from '@sveltejs/kit'; -import { svgs } from '@/data/svgs'; -import { getCategoriesForDirectory } from '@/data'; - -export const entries: EntryGenerator = () => { - const categories = getCategoriesForDirectory(); - return categories; -}; - -export const load = (async ({ params }) => { - const { slug } = params; - - const svgsByCategory = svgs.filter((svg: iSVG) => { - if (Array.isArray(svg.category)) { - return svg.category.some((categoryItem) => categoryItem.toLowerCase() === slug.toLowerCase()); - } else { - return svg.category.toLowerCase() === slug.toLowerCase(); - } - }); - - if (svgsByCategory.length === 0) { - throw error(404, 'Category not found'); - } - - return { - category: slug, - svgs: svgsByCategory - }; -}) satisfies PageLoad; diff --git a/src/routes/docs/+page.server.ts b/src/routes/docs/+page.server.ts new file mode 100644 index 000000000..8f4d59c3b --- /dev/null +++ b/src/routes/docs/+page.server.ts @@ -0,0 +1,5 @@ +import { redirect } from "@sveltejs/kit"; + +export const load = async () => { + return redirect(307, "/"); +}; diff --git a/src/routes/docs/[...slug]/+page.svelte b/src/routes/docs/[...slug]/+page.svelte new file mode 100644 index 000000000..2da3aa387 --- /dev/null +++ b/src/routes/docs/[...slug]/+page.svelte @@ -0,0 +1,83 @@ + + + + {data.document.title} - Svgl + + + + + +
+ +

+ {document.title} +

+
+ +
+ + + On this page + + + + + + +
+ +
{@html document.html}
+
+ +
+
diff --git a/src/routes/docs/[...slug]/+page.ts b/src/routes/docs/[...slug]/+page.ts new file mode 100644 index 000000000..e6e5bdb0a --- /dev/null +++ b/src/routes/docs/[...slug]/+page.ts @@ -0,0 +1,14 @@ +import type { PageLoad } from "./$types"; + +import { error } from "@sveltejs/kit"; +import { allDocs } from "content-collections"; + +export const load: PageLoad = async ({ params }) => { + const document = allDocs.find((doc) => doc._meta.path == params.slug); + if (!document) { + error(404, `Could not find ${params.slug}`); + } + return { + document, + }; +}; diff --git a/src/routes/extensions/+page.svelte b/src/routes/extensions/+page.svelte new file mode 100644 index 000000000..6f3ad11ae --- /dev/null +++ b/src/routes/extensions/+page.svelte @@ -0,0 +1,124 @@ + + + + Extensions - Svgl + + + + + +
+ +

Extensions

+
+
+
+

+ Extensions +

+
+

+ Integrate SVGL with your favorite tools and apps to streamline your + workflow. Created by the community. +

+ +
+
+ +
+ +
+ + {#each filteredExtensions as extension (extension.id)} + + {/each} + +
+
diff --git a/src/routes/extensions/+page.ts b/src/routes/extensions/+page.ts new file mode 100644 index 000000000..a78a65ddb --- /dev/null +++ b/src/routes/extensions/+page.ts @@ -0,0 +1,22 @@ +import type { Load } from "@sveltejs/kit"; + +import { extensionsData } from "@/data"; +import { searchExtensionsWithFuse } from "@/utils/searchWithFuse"; + +export const load: Load = ({ url }) => { + const searchParam = url.searchParams.get("search") || ""; + let filteredExtensions = [...extensionsData]; + + if (searchParam) { + const fuseSearch = searchExtensionsWithFuse(extensionsData); + filteredExtensions = fuseSearch + .search(searchParam) + .map((result) => result.item); + } + + return { + searchTerm: searchParam, + initialExtensions: filteredExtensions, + allExtensions: extensionsData, + }; +}; diff --git a/src/routes/favorites/+page.svelte b/src/routes/favorites/+page.svelte new file mode 100644 index 000000000..94d30504b --- /dev/null +++ b/src/routes/favorites/+page.svelte @@ -0,0 +1,142 @@ + + + + Favorites - Svgl + + + + + + + +
+ {#if searchTerm} + + {:else} + + {/if} +

Favorites

+ {#if favoritesCount > 0} + - + {#if !searchTerm} + {favoritesCount} SVGs + {:else} +

+ {filteredFavorites.length} + search results +

+ {/if} + {/if} +
+ {#if favoritesCount > 0} + + {/if} +
+ + + {#each filteredFavorites as svg (svg.id)} + + {/each} + + {#if filteredFavorites.length === 0 && searchTerm} + + {/if} + {#if filteredFavorites.length === 0 && !searchTerm && favoritesCount === 0} +
+ +

No favorites yet

+

+ Start adding SVGs to your favorites by clicking the heart icon on any + SVG. +

+ + + Browse SVGs + +
+ {/if} +
+
diff --git a/src/server/redis.ts b/src/server/redis.ts deleted file mode 100644 index 8badea2a8..000000000 --- a/src/server/redis.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Redis } from '@upstash/redis'; -import { Ratelimit } from '@upstash/ratelimit'; -import { UPSTASH_REDIS_TOKEN, UPSTASH_REDIS_URL, SVGL_API_REQUESTS } from '$env/static/private'; - -const cleanUrl = UPSTASH_REDIS_URL.replace(/^['"]|['"]$/g, '').trim(); - -const redis = new Redis({ - url: cleanUrl, - token: UPSTASH_REDIS_TOKEN -}); - -export const ratelimit = new Ratelimit({ - redis: redis, - limiter: Ratelimit.slidingWindow(Number(SVGL_API_REQUESTS), '60s'), - analytics: true -}); diff --git a/src/stores/favorites.store.ts b/src/stores/favorites.store.ts new file mode 100644 index 000000000..55e048925 --- /dev/null +++ b/src/stores/favorites.store.ts @@ -0,0 +1,148 @@ +import type { iSVG } from "@/types/svg"; +import { svgs } from "@/data/svgs"; + +import { writable } from "svelte/store"; +import { browser } from "$app/environment"; + +const localStorageKey = "svgl_favorites"; + +function createFavoritesStore() { + const validateFavorites = (favorites: iSVG[]): iSVG[] => { + return favorites.filter((favorite) => { + const existsInSvgs = svgs.some((svg) => { + return ( + svg.title === favorite.title && + JSON.stringify(svg.route) === JSON.stringify(favorite.route) + ); + }); + return existsInSvgs; + }); + }; + + const loadFavorites = (): iSVG[] => { + if (browser) { + try { + const stored = localStorage.getItem(localStorageKey); + if (stored) { + const storedFavorites: iSVG[] = JSON.parse(stored); + const validatedFavorites = validateFavorites(storedFavorites); + if (validatedFavorites.length !== storedFavorites.length) { + localStorage.setItem( + localStorageKey, + JSON.stringify(validatedFavorites), + ); + } + return validatedFavorites; + } + return []; + } catch (error) { + console.error("❌ stores/favorites - Error loading favorites:", error); + return []; + } + } + return []; + }; + + const saveFavorites = (favorites: iSVG[]) => { + if (browser) { + try { + localStorage.setItem(localStorageKey, JSON.stringify(favorites)); + } catch (error) { + console.error("❌ stores/favorites - Error saving favorites:", error); + } + } + }; + + const { subscribe, set, update } = writable(loadFavorites()); + + return { + subscribe, + + // Add SVG to favorites: + addToFavorites: (item: iSVG) => + update((favorites) => { + const exists = favorites.some( + (fav) => + fav.title === item.title && + JSON.stringify(fav.route) === JSON.stringify(item.route), + ); + if (!exists) { + const newFavorites = [...favorites, item]; + saveFavorites(newFavorites); + return newFavorites; + } + return favorites; + }), + + // Delete SVG from favorites: + removeFromFavorites: (item: iSVG) => + update((favorites) => { + const newFavorites = favorites.filter( + (fav) => + !( + fav.title === item.title && + JSON.stringify(fav.route) === JSON.stringify(item.route) + ), + ); + saveFavorites(newFavorites); + return newFavorites; + }), + + // Toggle (add/remove) SVG from favorites: + toggleFavorite: (item: iSVG) => + update((favorites) => { + const exists = favorites.some( + (fav) => + fav.title === item.title && + JSON.stringify(fav.route) === JSON.stringify(item.route), + ); + + let newFavorites; + if (exists) { + newFavorites = favorites.filter( + (fav) => + !( + fav.title === item.title && + JSON.stringify(fav.route) === JSON.stringify(item.route) + ), + ); + } else { + newFavorites = [...favorites, item]; + } + + saveFavorites(newFavorites); + return newFavorites; + }), + + // Check if SVG is in favorites: + isFavorite: (item: iSVG, currentFavorites: iSVG[]) => { + return currentFavorites.some( + (fav) => + fav.title === item.title && + JSON.stringify(fav.route) === JSON.stringify(item.route), + ); + }, + + // Clear favorites: + clearFavorites: () => { + set([]); + saveFavorites([]); + }, + + getCount: (currentFavorites: iSVG[]) => currentFavorites.length, + + validateAndCleanup: () => { + update((favorites) => { + const validatedFavorites = validateFavorites(favorites); + if (validatedFavorites.length !== favorites.length) { + saveFavorites(validatedFavorites); + } + return validatedFavorites; + }); + }, + }; +} + +const favoritesStore = createFavoritesStore(); + +export default favoritesStore; diff --git a/src/stores/settings.store.ts b/src/stores/settings.store.ts new file mode 100644 index 000000000..58ee6ab5d --- /dev/null +++ b/src/stores/settings.store.ts @@ -0,0 +1,94 @@ +import { writable } from "svelte/store"; +import { browser } from "$app/environment"; + +type PackageManager = "npm" | "pnpm" | "yarn" | "bun"; + +interface Settings { + packageManager: PackageManager; + optimizeSvgs: boolean; +} + +const localStorageKey = "svgl_settings"; +const defaultSettings: Settings = { + packageManager: "pnpm", + optimizeSvgs: true, +}; + +function getInitialSettings(): Settings { + if (browser) { + try { + const stored = localStorage.getItem(localStorageKey); + if (stored) { + const parsedSettings = JSON.parse(stored) as Partial; + return { + packageManager: parsedSettings.packageManager + ? parsedSettings.packageManager + : defaultSettings.packageManager, + optimizeSvgs: + typeof parsedSettings.optimizeSvgs === "boolean" + ? parsedSettings.optimizeSvgs + : defaultSettings.optimizeSvgs, + }; + } + } catch (error) { + console.error("Error parsing settings from localStorage:", error); + } + } + return defaultSettings; +} + +function createSettingsStore() { + const { subscribe, set, update } = writable(getInitialSettings()); + + return { + subscribe, + + // Update package manager + setPackageManager: (packageManager: PackageManager) => { + update((settings) => { + const newSettings = { ...settings, packageManager }; + if (browser) { + localStorage.setItem(localStorageKey, JSON.stringify(newSettings)); + } + return newSettings; + }); + }, + + // Update optimize SVGs setting + setOptimizeSvgs: (optimizeSvgs: boolean) => { + update((settings) => { + const newSettings = { ...settings, optimizeSvgs }; + if (browser) { + localStorage.setItem(localStorageKey, JSON.stringify(newSettings)); + } + return newSettings; + }); + }, + + // Update multiple settings at once + updateSettings: (newSettings: Partial) => { + update((settings) => { + const updatedSettings = { ...settings, ...newSettings }; + if (browser) { + localStorage.setItem( + localStorageKey, + JSON.stringify(updatedSettings), + ); + } + return updatedSettings; + }); + }, + + // Reset to default settings + reset: () => { + set(defaultSettings); + if (browser) { + localStorage.setItem(localStorageKey, JSON.stringify(defaultSettings)); + } + }, + }; +} + +const settingsStore = createSettingsStore(); + +export { settingsStore, type PackageManager, type Settings }; diff --git a/src/stores/warning.store.ts b/src/stores/warning.store.ts new file mode 100644 index 000000000..c9b1286b8 --- /dev/null +++ b/src/stores/warning.store.ts @@ -0,0 +1,23 @@ +import { writable } from "svelte/store"; +import { browser } from "$app/environment"; + +const localStorageKey = "svgl_warning"; + +function getInitialWarningState(): boolean { + if (browser) { + const stored = localStorage.getItem(localStorageKey); + return stored === "true"; + } + return false; +} + +const warningStore = writable(getInitialWarningState()); + +function acceptWarning() { + warningStore.set(true); + if (browser) { + localStorage.setItem(localStorageKey, "true"); + } +} + +export { warningStore, acceptWarning }; diff --git a/src/styles/app.css b/src/styles/app.css deleted file mode 100644 index 0f54e63a6..000000000 --- a/src/styles/app.css +++ /dev/null @@ -1,83 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@layer base { - :root { - --sb-track-color: rgb(229 229 229 / 0.5); - --sb-thumb-color: #d4d4d4; - --sb-size: 10px; - } - - .dark { - --sb-track-color: #171717; - --sb-thumb-color: #404040; - --sb-size: 10px; - } -} - -@layer base { - body, - nav { - scrollbar-color: var(--sb-thumb-color) transparent; - } - - body::-webkit-scrollbar { - width: var(--sb-size); - } - - body::-webkit-scrollbar-track { - background: var(--sb-track-color); - } - - body::-webkit-scrollbar-thumb { - background: var(--sb-thumb-color); - } - - aside::-webkit-scrollbar { - width: var(--sb-size); - } - - aside::-webkit-scrollbar-track { - background: var(--sb-track-color); - } - - aside::-webkit-scrollbar-thumb { - background: var(--sb-thumb-color); - } - - nav::-webkit-scrollbar { - width: var(--sb-size); - } - - nav::-webkit-scrollbar-track { - background: var(--sb-track-color); - } - - nav::-webkit-scrollbar-thumb { - background: var(--sb-thumb-color); - } -} - -@font-face { - font-family: 'InterVariable'; - src: url('/fonts/InterVariable.woff2') format('woff2'); - font-weight: 100 900; - font-display: swap; - font-style: normal; -} - -@font-face { - font-family: 'GeistMono'; - src: url('/fonts/GeistMonoVariableVF.woff2') format('woff2'); - font-display: swap; -} - -html.dark .shiki, -html.dark .shiki span { - color: var(--shiki-dark) !important; - background-color: transparent !important; - font-style: var(--shiki-dark-font-style) !important; - font-weight: var(--shiki-dark-font-weight) !important; - text-decoration: var(--shiki-dark-text-decoration) !important; -} diff --git a/src/styles/globals.css b/src/styles/globals.css new file mode 100644 index 000000000..8a9fe14ef --- /dev/null +++ b/src/styles/globals.css @@ -0,0 +1,60 @@ +@import "tailwindcss"; + +/* Plugins */ +@import "tw-animate-css"; + +/* Dark Mode */ +@custom-variant dark (&:is(.dark *)); + +/* Fonts */ +@font-face { + font-family: "Geist"; + src: url("/fonts/Geist.woff2") format("woff2"); + font-weight: 100 900; + font-display: swap; + font-style: normal; +} + +@font-face { + font-family: "GeistMono"; + src: url("/fonts/GeistMono.woff2") format("woff2"); + font-weight: 100 900; + font-display: swap; + font-style: normal; +} + +@theme { + --font-sans: + "Geist", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", + "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-mono: + "GeistMono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, + "Liberation Mono", "Courier New", monospace, "Apple Color Emoji"; +} + +/* Shiki light/dark mode */ +html.dark .shiki, +html.dark .shiki span { + color: var(--shiki-dark) !important; + background-color: transparent !important; +} + +/* Shiki Line Numbers */ +code { + counter-reset: step; + counter-increment: step 0; +} + +code:has(.line:nth-child(2)) .line::before { + content: counter(step); + counter-increment: step; + width: 0.5rem; + margin-right: 1.5rem; + margin-left: 0.3rem; + display: inline-block; + text-align: right; +} + +code:has(.line:nth-child(2)) .line::before { + @apply font-mono text-xs text-neutral-400 dark:text-neutral-600; +} diff --git a/src/styles/markdown.css b/src/styles/markdown.css new file mode 100644 index 000000000..344bdfb9d --- /dev/null +++ b/src/styles/markdown.css @@ -0,0 +1,77 @@ +@import "./globals.css"; + +.markdown { + @apply max-w-full text-neutral-950 dark:text-neutral-50; + + /* Headings */ + + & h1:not(.not-markdown h1) { + @apply scroll-m-20 text-center text-3xl font-semibold text-balance; + } + + & h2:not(.not-markdown h2) { + @apply mt-10 mb-3 scroll-m-20 border-b border-neutral-200 pb-1.5 text-2xl font-semibold first:mt-0 dark:border-neutral-800; + } + + & h3:not(.not-markdown h3) { + @apply scroll-m-20 text-xl font-semibold [&:not(:first-child)]:mt-8 [&:not(:first-child)]:mb-3; + } + + & h4:not(.not-markdown h4) { + @apply scroll-m-20 text-lg font-medium; + } + + /* Paragraphs */ + + & p:not(.not-markdown p) { + @apply mb-1.5 leading-7 [&:not(:first-child)]:mt-4; + } + + /* Links */ + + & a:not(.not-markdown a) { + @apply font-medium underline underline-offset-4 transition-opacity hover:opacity-80; + } + + /* Blockquotes */ + + & blockquote:not(.not-markdown blockquote) { + @apply mt-6 border-l-2 border-neutral-300 pl-6 text-neutral-900 dark:border-neutral-700 dark:text-neutral-100; + } + + /* Tables */ + + & table:not(.not-markdown table) { + @apply w-full; + } + + & tr:not(.not-markdown tr) { + @apply m-0 border-t p-0 even:bg-neutral-200 dark:even:bg-neutral-800; + } + + & th:not(.not-markdown th) { + @apply border px-4 py-2 text-left font-bold [&[align=center]]:text-center [&[align=right]]:text-right; + } + + & td:not(.not-markdown td) { + @apply border px-4 py-2 text-left [&[align=center]]:text-center [&[align=right]]:text-right; + } + + /* Lists */ + + & list:not(.not-markdown list) { + @apply my-6 ml-6 list-disc [&>li]:mt-2; + } + + /* Inline Code */ + + & code:not(pre > code):not(.not-markdown code) { + @apply relative rounded bg-neutral-200/50 px-[0.3rem] py-[0.2rem] font-mono text-sm dark:bg-neutral-800/50; + } + + /* Code block */ + + & pre:not(.not-markdown pre) { + @apply mt-2 overflow-y-auto rounded-md border border-neutral-200 bg-white p-2 text-sm drop-shadow-xs dark:border-neutral-800 dark:bg-neutral-950; + } +} diff --git a/src/templates/getAngularCode.ts b/src/templates/getAngularCode.ts index 938b2d3e3..6ef9ea29f 100644 --- a/src/templates/getAngularCode.ts +++ b/src/templates/getAngularCode.ts @@ -6,7 +6,7 @@ interface AngularComponentParams { export function getAngularCode(params: AngularComponentParams): string { const updatedSvgContent = params.svgContent.replace( /]*)>/, - `` + ``, ); return ` diff --git a/src/templates/getAstroCode.ts b/src/templates/getAstroCode.ts index 7b4c797e5..a4b0ed09c 100644 --- a/src/templates/getAstroCode.ts +++ b/src/templates/getAstroCode.ts @@ -2,13 +2,13 @@ interface AstroComponentParams { svgContent: string; } -export function getAstroCode({ svgContent }: AstroComponentParams): string { - const cleanedSvg = svgContent - .replace(/\s*(width|height)="[^"]*"/gi, '') - .replace(/\s*(width|height)='[^']*'/gi, '') - .replace(/\s*(width|height)=\{[^}]*\}/gi, '') - .replace(/]*)>/i, (match, attrs) => { - const cleanedAttrs = attrs.replace(/\s*\{?\.\.\.Astro\.props\}?\s*/i, ''); +export function getAstroCode(params: AstroComponentParams): string { + const cleanedSvg = params.svgContent + .replace(/\s*(width|height)="[^"]*"/gi, "") + .replace(/\s*(width|height)='[^']*'/gi, "") + .replace(/\s*(width|height)=\{[^}]*\}/gi, "") + .replace(/]*)>/i, (_, attrs) => { + const cleanedAttrs = attrs.replace(/\s*\{?\.\.\.Astro\.props\}?\s*/i, ""); return ``; }); diff --git a/src/templates/getReactCode.ts b/src/templates/getReactCode.ts index b7f3cb567..91e2f2386 100644 --- a/src/templates/getReactCode.ts +++ b/src/templates/getReactCode.ts @@ -5,15 +5,15 @@ interface ReactComponentParams { } export const getReactCode = async ( - params: ReactComponentParams + params: ReactComponentParams, ): Promise<{ data?: string; error?: string }> => { try { - const getCode = await fetch('/api/svgs/svgr', { - method: 'POST', + const getCode = await fetch("/api/svgs/svgr", { + method: "POST", headers: { - 'Content-Type': 'application/json' + "Content-Type": "application/json", }, - body: JSON.stringify(params) + body: JSON.stringify(params), }); const data = await getCode.json(); return data; diff --git a/src/templates/getSource.ts b/src/templates/getSource.ts index f51741d4a..7c250cf71 100644 --- a/src/templates/getSource.ts +++ b/src/templates/getSource.ts @@ -1,9 +1,14 @@ +import { optimizeSvg } from "@/utils/optimizeSvg"; + interface SourceParams { url: string | undefined; + optimize?: boolean; } export const getSource = async (params: SourceParams) => { - const response = await fetch(params.url || ''); + const response = await fetch(params.url || ""); const content = await response.text(); - return content; + if (!params.optimize) return content; + const optimizedContent = optimizeSvg({ svgCode: content }); + return optimizedContent; }; diff --git a/src/templates/getSvelteCode.ts b/src/templates/getSvelteCode.ts index 3ae93443c..732b2ca81 100644 --- a/src/templates/getSvelteCode.ts +++ b/src/templates/getSvelteCode.ts @@ -1,4 +1,4 @@ -import { parseSvgContent } from '@/utils/parseSvgContent'; +import { parseSvgContent } from "@/utils/parseSvgContent"; interface SvelteComponentParams { lang: string; @@ -6,8 +6,11 @@ interface SvelteComponentParams { } export const getSvelteCode = (params: SvelteComponentParams) => { - const { templateContent, componentStyle } = parseSvgContent(params.content, 'Svelte'); - return ` + const { templateContent, componentStyle } = parseSvgContent( + params.content, + "Svelte", + ); + return ` ${templateContent} ${componentStyle} diff --git a/src/templates/getVueCode.ts b/src/templates/getVueCode.ts index 2a8c9b706..31a9dcb77 100644 --- a/src/templates/getVueCode.ts +++ b/src/templates/getVueCode.ts @@ -1,4 +1,4 @@ -import { parseSvgContent } from '@/utils/parseSvgContent'; +import { parseSvgContent } from "@/utils/parseSvgContent"; interface VueComponentParams { lang: string; @@ -6,8 +6,11 @@ interface VueComponentParams { } export const getVueCode = (params: VueComponentParams) => { - const { templateContent, componentStyle } = parseSvgContent(params.content, 'Vue'); - return ` + const { templateContent, componentStyle } = parseSvgContent( + params.content, + "Vue", + ); + return ` diff --git a/src/types/categories.ts b/src/types/categories.ts index ddfd89545..71f30a3f2 100644 --- a/src/types/categories.ts +++ b/src/types/categories.ts @@ -1,38 +1,37 @@ -export type tCategory = - | 'All' - | 'AI' - | 'Software' - | 'Hardware' - | 'Library' - | 'Hosting' - | 'Framework' - | 'Devtool' - | 'Monorepo' - | 'CMS' - | 'Database' - | 'Compiler' - | 'Crypto' - | 'Cybersecurity' - | 'Social' - | 'Entertainment' - | 'Browser' - | 'Language' - | 'Education' - | 'Design' - | 'Community' - | 'Marketplace' - | 'Music' - | 'Vercel' - | 'Google' - | 'Payment' - | 'VoidZero' - | 'Authentication' - | 'IoT' - | 'Config' - | 'Secrets' - | 'IaC' - | 'Analytics' - | 'Sync Engine' - | 'Platform' - | 'Automation' - | 'Nuxt'; +export type Category = + | "AI" + | "Software" + | "Hardware" + | "Library" + | "Hosting" + | "Framework" + | "Devtool" + | "Monorepo" + | "CMS" + | "Database" + | "Compiler" + | "Crypto" + | "Cybersecurity" + | "Social" + | "Entertainment" + | "Browser" + | "Language" + | "Education" + | "Design" + | "Community" + | "Marketplace" + | "Music" + | "Vercel" + | "Google" + | "Payment" + | "VoidZero" + | "Authentication" + | "IoT" + | "Config" + | "Secrets" + | "IaC" + | "Analytics" + | "Sync Engine" + | "Platform" + | "Automation" + | "Nuxt"; diff --git a/src/types/components.ts b/src/types/components.ts new file mode 100644 index 000000000..bf0a087f8 --- /dev/null +++ b/src/types/components.ts @@ -0,0 +1,11 @@ +export type WithoutChild = T extends { child?: unknown } + ? Omit + : T; + +export type WithoutChildren = T extends { children?: unknown } + ? Omit + : T; +export type WithoutChildrenOrChild = WithoutChildren>; +export type WithElementRef = T & { + ref?: U | null; +}; diff --git a/src/types/extensions.ts b/src/types/extensions.ts index 13a9dd187..41d023b12 100644 --- a/src/types/extensions.ts +++ b/src/types/extensions.ts @@ -1,4 +1,5 @@ export interface Extension { + id?: number; name: string; description: string; created_by: { diff --git a/src/types/svg.ts b/src/types/svg.ts index 6402e5b8e..76df3e052 100644 --- a/src/types/svg.ts +++ b/src/types/svg.ts @@ -1,4 +1,4 @@ -import type { tCategory } from './categories'; +import type { Category } from "./categories"; export type ThemeOptions = { dark: string; @@ -8,9 +8,10 @@ export type ThemeOptions = { export interface iSVG { id?: number; title: string; - category: tCategory | tCategory[]; + category: Category | Category[]; route: string | ThemeOptions; wordmark?: string | ThemeOptions; brandUrl?: string; + shadcnCommand?: string; url: string; } diff --git a/src/types/unist.ts b/src/types/unist.ts new file mode 100644 index 000000000..ea5f38f5d --- /dev/null +++ b/src/types/unist.ts @@ -0,0 +1,18 @@ +export interface UnistNode { + type: string; + name?: string; + tagName?: string; + value?: string; + properties?: Record; + attributes?: { + name: string; + value: unknown; + type?: string; + }[]; + children?: UnistNode[]; +} + +export interface UnistTree { + type: string; + children: UnistNode[]; +} diff --git a/src/ui/alert/alert-component.svelte b/src/ui/alert/alert-component.svelte deleted file mode 100644 index faff441df..000000000 --- a/src/ui/alert/alert-component.svelte +++ /dev/null @@ -1,36 +0,0 @@ - - -
- {#if icons[type]} - - {/if} -
- -
-
diff --git a/src/ui/context-menu/context-menu-checkbox-item.svelte b/src/ui/context-menu/context-menu-checkbox-item.svelte deleted file mode 100644 index 60e90fcce..000000000 --- a/src/ui/context-menu/context-menu-checkbox-item.svelte +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - diff --git a/src/ui/context-menu/context-menu-content.svelte b/src/ui/context-menu/context-menu-content.svelte deleted file mode 100644 index 9a992e67b..000000000 --- a/src/ui/context-menu/context-menu-content.svelte +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/src/ui/context-menu/context-menu-item.svelte b/src/ui/context-menu/context-menu-item.svelte deleted file mode 100644 index a54eb2e5c..000000000 --- a/src/ui/context-menu/context-menu-item.svelte +++ /dev/null @@ -1,31 +0,0 @@ - - - - - diff --git a/src/ui/context-menu/context-menu-label.svelte b/src/ui/context-menu/context-menu-label.svelte deleted file mode 100644 index 08bfde7a6..000000000 --- a/src/ui/context-menu/context-menu-label.svelte +++ /dev/null @@ -1,19 +0,0 @@ - - - - - diff --git a/src/ui/context-menu/index.ts b/src/ui/context-menu/index.ts deleted file mode 100644 index 9acf93336..000000000 --- a/src/ui/context-menu/index.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { ContextMenu as ContextMenuPrimitive } from 'bits-ui'; - -import Item from './context-menu-item.svelte'; -import Label from './context-menu-label.svelte'; -import Content from './context-menu-content.svelte'; -import CheckboxItem from './context-menu-checkbox-item.svelte'; - -const Sub = ContextMenuPrimitive.Sub; -const Root = ContextMenuPrimitive.Root; -const Trigger = ContextMenuPrimitive.Trigger; -const Group = ContextMenuPrimitive.Group; - -export { - Sub, - Root, - Item, - Label, - Group, - Trigger, - Content, - CheckboxItem, - // - Root as ContextMenu, - Sub as ContextMenuSub, - Item as ContextMenuItem, - Label as ContextMenuLabel, - Group as ContextMenuGroup, - Content as ContextMenuContent, - Trigger as ContextMenuTrigger, - CheckboxItem as ContextMenuCheckboxItem -}; diff --git a/src/ui/dialog/dialog-content.svelte b/src/ui/dialog/dialog-content.svelte deleted file mode 100644 index 2a83cc4c9..000000000 --- a/src/ui/dialog/dialog-content.svelte +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - Close - - - diff --git a/src/ui/dialog/dialog-description.svelte b/src/ui/dialog/dialog-description.svelte deleted file mode 100644 index 89cd2716f..000000000 --- a/src/ui/dialog/dialog-description.svelte +++ /dev/null @@ -1,13 +0,0 @@ - - - - - diff --git a/src/ui/dialog/dialog-footer.svelte b/src/ui/dialog/dialog-footer.svelte deleted file mode 100644 index ee5263ff2..000000000 --- a/src/ui/dialog/dialog-footer.svelte +++ /dev/null @@ -1,16 +0,0 @@ - - -
- -
diff --git a/src/ui/dialog/dialog-header.svelte b/src/ui/dialog/dialog-header.svelte deleted file mode 100644 index 24329732c..000000000 --- a/src/ui/dialog/dialog-header.svelte +++ /dev/null @@ -1,13 +0,0 @@ - - -
- -
diff --git a/src/ui/dialog/dialog-overlay.svelte b/src/ui/dialog/dialog-overlay.svelte deleted file mode 100644 index fb1314fb6..000000000 --- a/src/ui/dialog/dialog-overlay.svelte +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/src/ui/dialog/dialog-portal.svelte b/src/ui/dialog/dialog-portal.svelte deleted file mode 100644 index 45112b792..000000000 --- a/src/ui/dialog/dialog-portal.svelte +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/src/ui/dialog/dialog-title.svelte b/src/ui/dialog/dialog-title.svelte deleted file mode 100644 index a4b54aa15..000000000 --- a/src/ui/dialog/dialog-title.svelte +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/src/ui/dialog/index.ts b/src/ui/dialog/index.ts deleted file mode 100644 index 676a771eb..000000000 --- a/src/ui/dialog/index.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Dialog as DialogPrimitive } from 'bits-ui'; - -const Root = DialogPrimitive.Root; -const Trigger = DialogPrimitive.Trigger; - -import Title from './dialog-title.svelte'; -import Portal from './dialog-portal.svelte'; -import Footer from './dialog-footer.svelte'; -import Header from './dialog-header.svelte'; -import Overlay from './dialog-overlay.svelte'; -import Content from './dialog-content.svelte'; -import Description from './dialog-description.svelte'; - -export { - Root, - Title, - Portal, - Footer, - Header, - Trigger, - Overlay, - Content, - Description, - // - Root as Dialog, - Title as DialogTitle, - Portal as DialogPortal, - Footer as DialogFooter, - Header as DialogHeader, - Trigger as DialogTrigger, - Overlay as DialogOverlay, - Content as DialogContent, - Description as DialogDescription -}; diff --git a/src/ui/popover/popover-content.svelte b/src/ui/popover/popover-content.svelte deleted file mode 100644 index 796ce5647..000000000 --- a/src/ui/popover/popover-content.svelte +++ /dev/null @@ -1,29 +0,0 @@ - - - - - diff --git a/src/ui/styles.ts b/src/ui/styles.ts deleted file mode 100644 index ecbda48fe..000000000 --- a/src/ui/styles.ts +++ /dev/null @@ -1,14 +0,0 @@ -export const buttonStyles = - 'flex items-center space-x-2 relative h-10 rounded-full border border-neutral-200 dark:border-neutral-800 bg-transparent px-4 text-neutral-950 dark:text-white hover:bg-neutral-200/50 dark:hover:bg-neutral-800/50 focus:outline-none focus:ring-1 focus:ring-neutral-300 dark:focus:ring-neutral-700 transition-colors duration-100 disabled:opacity-50 disabled:cursor-not-allowed'; - -export const inputStyles = - 'w-full border-b border-neutral-300 bg-white p-3 px-11 placeholder-neutral-500 focus:outline-none focus:ring-1 focus:ring-neutral-300 dark:border-neutral-800 dark:bg-neutral-900 dark:focus:ring-neutral-700'; - -export const badgeStyles = - 'inline-flex items-center px-2.5 py-0.5 rounded-full font-medium bg-neutral-100 dark:bg-neutral-800/50 border border-neutral-200 dark:border-neutral-800 text-neutral-600 dark:text-neutral-400 text-xs font-mono hover:underline hover:bg-neutral-200 dark:hover:bg-neutral-700/50 transition-colors duration-100'; - -export const sidebarItemStyles = - 'flex w-full items-center space-x-3 justify-between rounded-md p-2 transition-none duration-100 text-neutral-600 hover:text-dark dark:hover:text-white dark:text-neutral-400 hover:bg-neutral-200 dark:hover:bg-neutral-700/40 text-sm'; - -export const sidebarCategoryCountStyles = - 'px-2.5 py-0.5 rounded-full font-medium bg-neutral-100 dark:bg-neutral-800/50 border border-neutral-200 dark:border-neutral-800 text-neutral-600 dark:text-neutral-400 text-xs font-mono'; diff --git a/src/ui/tabs/index.ts b/src/ui/tabs/index.ts deleted file mode 100644 index dfafad271..000000000 --- a/src/ui/tabs/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Tabs as TabsPrimitive } from 'bits-ui'; -import Content from './tabs-content.svelte'; -import List from './tabs-list.svelte'; -import Trigger from './tabs-trigger.svelte'; - -const Root = TabsPrimitive.Root; - -export { - Root, - Content, - List, - Trigger, - // - Root as Tabs, - Content as TabsContent, - List as TabsList, - Trigger as TabsTrigger -}; diff --git a/src/ui/tabs/tabs-content.svelte b/src/ui/tabs/tabs-content.svelte deleted file mode 100644 index 59dfe267f..000000000 --- a/src/ui/tabs/tabs-content.svelte +++ /dev/null @@ -1,21 +0,0 @@ - - - - - diff --git a/src/ui/tabs/tabs-list.svelte b/src/ui/tabs/tabs-list.svelte deleted file mode 100644 index cbbcd82d6..000000000 --- a/src/ui/tabs/tabs-list.svelte +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/src/ui/tabs/tabs-trigger.svelte b/src/ui/tabs/tabs-trigger.svelte deleted file mode 100644 index 3295a6f2b..000000000 --- a/src/ui/tabs/tabs-trigger.svelte +++ /dev/null @@ -1,25 +0,0 @@ - - - - - diff --git a/src/utils/clipboard.ts b/src/utils/clipboard.ts index d3de08b27..eb9ec4bb4 100644 --- a/src/utils/clipboard.ts +++ b/src/utils/clipboard.ts @@ -1,15 +1,3 @@ -const MIMETYPE = 'text/plain'; - -export const clipboard = async (content: string) => { - try { - const clipboardItem = new ClipboardItem({ - [MIMETYPE]: new Blob([content], { type: MIMETYPE }) - }); - - setTimeout(async () => { - await navigator.clipboard.write([clipboardItem]); - }, 200); - } catch (error) { - await navigator.clipboard.writeText(content); - } +export const clipboard = (content: string) => { + navigator.clipboard.writeText(content); }; diff --git a/src/utils/cn.ts b/src/utils/cn.ts index 2819a830d..a5ef19350 100644 --- a/src/utils/cn.ts +++ b/src/utils/cn.ts @@ -1,5 +1,5 @@ -import { clsx, type ClassValue } from 'clsx'; -import { twMerge } from 'tailwind-merge'; +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); diff --git a/src/utils/download.ts b/src/utils/download.ts new file mode 100644 index 000000000..2271f1315 --- /dev/null +++ b/src/utils/download.ts @@ -0,0 +1,23 @@ +type MimeType = "image/svg+xml" | "application/zip"; + +interface Download { + content: string | Blob; + filename: string; + mimeType: MimeType; +} + +export const download = ({ content, filename, mimeType }: Download) => { + const blob = + typeof content === "string" + ? new Blob([content], { type: mimeType }) + : content; + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = filename; + a.style.display = "none"; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); +}; diff --git a/src/utils/downloadSvg.ts b/src/utils/downloadSvg.ts new file mode 100644 index 000000000..d326f3404 --- /dev/null +++ b/src/utils/downloadSvg.ts @@ -0,0 +1,102 @@ +import type { iSVG } from "@/types/svg"; + +import JSZip from "jszip"; +import { download } from "@/utils/download"; +import { getSource } from "@/templates/getSource"; +import { getPrefixFromSvgUrl, prefixSvgIds } from "@/utils/prefixSvgIds"; + +interface DownloadResult { + success: boolean; + message: string; +} + +interface DownloadSvg { + url: string; +} + +interface DownloadAllVariants { + svgInfo: iSVG; + lightRoute: string; + darkRoute: string; + isWordmark?: boolean; +} + +export const downloadSvg = async ({ + url, +}: DownloadSvg): Promise => { + try { + let content = await getSource({ + url: url, + }); + if (url) { + content = prefixSvgIds(content, getPrefixFromSvgUrl(url)); + } + download({ + content: content || "", + filename: url?.split("/").pop() || "", + mimeType: "image/svg+xml", + }); + return { + success: true, + message: "SVG downloaded successfully", + }; + } catch (error) { + console.error("❌ utils/downloadSvg - Error downloading SVG:", error); + return { + success: false, + message: "Error downloading SVG", + }; + } +}; + +export const downloadAllVariants = async ({ + svgInfo, + lightRoute, + darkRoute, + isWordmark, +}: DownloadAllVariants): Promise => { + try { + const zip = new JSZip(); + + let lightSvg = await getSource({ + url: lightRoute, + }); + let darkSvg = await getSource({ + url: darkRoute, + }); + + lightSvg = prefixSvgIds( + lightSvg, + svgInfo.title.toLowerCase() + (isWordmark ? "_wordmark_light" : "_light"), + ); + darkSvg = prefixSvgIds( + darkSvg, + svgInfo.title.toLowerCase() + (isWordmark ? "_wordmark_dark" : "_dark"), + ); + + if (isWordmark) { + zip.file(`${svgInfo.title}_wordmark_light.svg`, lightSvg); + zip.file(`${svgInfo.title}_wordmark_dark.svg`, darkSvg); + } else { + zip.file(`${svgInfo.title}_light.svg`, lightSvg); + zip.file(`${svgInfo.title}_dark.svg`, darkSvg); + } + + zip.generateAsync({ type: "blob" }).then((content) => { + download({ + content, + filename: isWordmark + ? `${svgInfo.title}_wordmark_light_dark.zip` + : `${svgInfo.title}_light_dark.zip`, + mimeType: "application/zip", + }); + }); + return true; + } catch (error) { + console.error( + "❌ utils/downloadSvg - Error downloading all variants:", + error, + ); + return false; + } +}; diff --git a/src/utils/flyAndScale.ts b/src/utils/flyAndScale.ts deleted file mode 100644 index 360580eab..000000000 --- a/src/utils/flyAndScale.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { cubicOut } from 'svelte/easing'; -import type { TransitionConfig } from 'svelte/transition'; - -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/src/utils/getStarsRepository.ts b/src/utils/getStarsRepository.ts deleted file mode 100644 index 5331086b9..000000000 --- a/src/utils/getStarsRepository.ts +++ /dev/null @@ -1,10 +0,0 @@ -export async function fetchGitHubStars() { - const res = await fetch('https://api.github.com/repos/pheralb/svgl'); - const response = await res.json(); - const starsFormated = - response.stargazers_count > 1000 - ? `${(response.stargazers_count / 1000).toFixed(1)}K` - : response.stargazers_count; - - return starsFormated; -} diff --git a/src/utils/optimizeSvg.ts b/src/utils/optimizeSvg.ts new file mode 100644 index 000000000..7a3046ebe --- /dev/null +++ b/src/utils/optimizeSvg.ts @@ -0,0 +1,37 @@ +import { optimize } from "svgo/browser"; + +interface OptimizeSvg { + svgCode: string; +} + +export const optimizeSvg = ({ svgCode }: OptimizeSvg) => { + const svgo = optimize(svgCode, { + multipass: true, + plugins: [ + "removeDimensions", + "removeXMLNS", + "removeDoctype", + "removeComments", + "removeStyleElement", + "cleanupAttrs", + "cleanupEnableBackground", + "cleanupIds", + "minifyStyles", + "removeDoctype", + "removeDesc", + "removeEmptyAttrs", + "removeEmptyText", + "removeHiddenElems", + "removeNonInheritableGroupAttrs", + "removeUnknownsAndDefaults", + "removeUselessDefs", + "removeUselessStrokeAndFill", + "removeXMLProcInst", + { + name: "removeAttrs", + params: { attrs: "(data-name|id|class)" }, + }, + ], + }); + return svgo.data; +}; diff --git a/src/utils/parseReactSvgContent.ts b/src/utils/parseReactSvgContent.ts new file mode 100644 index 000000000..d477c19b4 --- /dev/null +++ b/src/utils/parseReactSvgContent.ts @@ -0,0 +1,46 @@ +import { format } from "prettier"; + +interface ParseReactSvgOptions { + componentName: string; + svgCode: string; + typescript: boolean; +} + +export const parseReactSvgContent = async ({ + componentName, + svgCode, + typescript, +}: ParseReactSvgOptions) => { + const reactifiedSvg = svgCode + .replace(") => (\n ${reactifiedSvg}\n);\n\n` + + `export { ${componentName} };`; + } else { + structuredCode = `const ${componentName} = (props) => (\n ${reactifiedSvg}\n);\n\nexport { ${componentName} };`; + } + + const formatted = await format(structuredCode, { + parser: typescript ? "typescript" : "babel", + semi: true, + singleQuote: false, + trailingComma: "es5", + }); + + return formatted; +}; diff --git a/src/utils/parseSvgContent.ts b/src/utils/parseSvgContent.ts index 6bfaba4ad..3cf57a27f 100644 --- a/src/utils/parseSvgContent.ts +++ b/src/utils/parseSvgContent.ts @@ -1,26 +1,27 @@ -export const parseSvgContent = (content: string, framework: 'Vue' | 'Svelte') => { - if (content.includes(']*\?>/i, ''); +export const parseSvgContent = ( + content: string, + framework: "Vue" | "Svelte", +) => { + if (content.includes("]*\?>/i, ""); } - // Regular expression to match ` - : ''; + ? `\n${styles.join("\n")}\n` + : ""; return { componentStyle, - templateContent + templateContent, }; }; diff --git a/src/utils/parseSvgFilename.ts b/src/utils/parseSvgFilename.ts new file mode 100644 index 000000000..a6af45716 --- /dev/null +++ b/src/utils/parseSvgFilename.ts @@ -0,0 +1,49 @@ +interface ParseSvgFilename { + file: string; + log?: boolean; + firstUpperCase?: boolean; +} + +export const parseSvgFilename = (params: ParseSvgFilename): string => { + const { file, log, firstUpperCase = false } = params; + const name = file.replace(/\.svg$/i, ""); + + let component = name + .replace(/[-_\s]+(.)?/g, (_, char) => (char ? char.toUpperCase() : "")) + .replace(/^(.)/, (char) => + firstUpperCase ? char.toUpperCase() : char.toLowerCase(), + ); + + if (/^\d/.test(component)) { + if (log) { + console.log( + `\n - [⚠️] Component name starts with a number: ${component}`, + ); + } + component = "Icon" + component; + } + + const reserved = new Set([ + "default", + "class", + "function", + "var", + "export", + "import", + "extends", + "new", + "delete", + "enum", + "package", + ]); + if (reserved.has(component)) { + if (log) { + console.log( + `\n - [⚠️] Component name is a reserved keyword: ${component}`, + ); + } + component = "Icon" + component[0].toUpperCase() + component.slice(1); + } + + return component; +}; diff --git a/src/utils/prefixSvgIds.ts b/src/utils/prefixSvgIds.ts index db5f6d619..bcdc58997 100644 --- a/src/utils/prefixSvgIds.ts +++ b/src/utils/prefixSvgIds.ts @@ -1,21 +1,20 @@ -import { optimize } from 'svgo'; +import { optimize } from "svgo/browser"; export const getPrefixFromSvgUrl = (svgUrl: string) => { - return svgUrl.split('/').pop()!.replace('.svg', '').split('-').join('_'); + return svgUrl.split("/").pop()!.replace(".svg", "").split("-").join("_"); }; export const prefixSvgIds = (content: string, prefix: string): string => { const result = optimize(content, { plugins: [ { - name: 'prefixIds', + name: "prefixIds", params: { - prefix - } - } + prefix, + }, + }, ], - multipass: false + multipass: false, }); - return (result as { data: string }).data; }; diff --git a/src/utils/searchParams.ts b/src/utils/searchParams.ts new file mode 100644 index 000000000..c42cc2024 --- /dev/null +++ b/src/utils/searchParams.ts @@ -0,0 +1,40 @@ +import { page } from "$app/state"; +import { goto } from "$app/navigation"; +import { SvelteURLSearchParams } from "svelte/reactivity"; + +interface SearchParams { + params: Record; +} + +const getParamValue = (key: string): string | null => { + const params = new SvelteURLSearchParams(page.url.searchParams); + return params.get(key); +}; + +const addParams = ({ params }: SearchParams) => { + const searchParams = new SvelteURLSearchParams(page.url.searchParams); + Object.entries(params).forEach(([key, value]) => { + if (value) { + searchParams.set(key, value); + } else { + searchParams.delete(key); + } + }); + goto(`?${searchParams.toString()}`, { + keepFocus: true, + noScroll: true, + replaceState: true, + }); +}; + +const deleteParam = (key: string) => { + const params = new SvelteURLSearchParams(page.url.searchParams); + params.delete(key); + goto(`?${params.toString()}`, { + keepFocus: true, + noScroll: true, + replaceState: true, + }); +}; + +export { getParamValue, addParams, deleteParam }; diff --git a/src/utils/searchWithFuse.ts b/src/utils/searchWithFuse.ts new file mode 100644 index 000000000..578fc8187 --- /dev/null +++ b/src/utils/searchWithFuse.ts @@ -0,0 +1,23 @@ +import type { Extension } from "@/types/extensions"; +import type { iSVG } from "@/types/svg"; +import Fuse from "fuse.js"; + +export const searchSvgsWithFuse = (svgsData: iSVG[]) => { + return new Fuse(svgsData, { + keys: ["title"], + threshold: 0.35, + ignoreLocation: true, + isCaseSensitive: false, + shouldSort: true, + }); +}; + +export const searchExtensionsWithFuse = (extensionsData: Extension[]) => { + return new Fuse(extensionsData, { + keys: ["name", "description"], + threshold: 0.35, + ignoreLocation: true, + isCaseSensitive: false, + shouldSort: true, + }); +}; diff --git a/src/utils/shiki.ts b/src/utils/shiki.ts new file mode 100644 index 000000000..6f299de5c --- /dev/null +++ b/src/utils/shiki.ts @@ -0,0 +1,46 @@ +import type { RehypeShikiOptions } from "@shikijs/rehype"; +import { + type HighlighterCore, + type RegexEngine, + createHighlighterCore, +} from "shiki/core"; +import { createJavaScriptRegexEngine } from "shiki/engine/javascript"; + +// Themes: +import githubLight from "@shikijs/themes/github-light"; +import githubDark from "@shikijs/themes/github-dark"; + +// Languages: +import html from "@shikijs/langs/html"; +import ts from "@shikijs/langs/ts"; +import bash from "@shikijs/langs/bash"; +import json from "@shikijs/langs/json"; + +let jsEngine: RegexEngine | null = null; +let highlighter: Promise | null = null; + +// Engine: +const getShikiEngine = (): RegexEngine => { + jsEngine ??= createJavaScriptRegexEngine(); + return jsEngine; +}; + +// Rehype options for Shiki: +const rehypeShikiOptions: RehypeShikiOptions = { + themes: { + light: "github-light", + dark: "github-dark", + }, + langs: [bash, ts, json, html], +}; + +const shikiHighlighter = async (): Promise => { + highlighter ??= createHighlighterCore({ + themes: [githubLight, githubDark], + langs: [bash, ts, json, html], + engine: getShikiEngine(), + }); + return highlighter; +}; + +export { shikiHighlighter, rehypeShikiOptions }; diff --git a/static/fonts/Geist.woff2 b/static/fonts/Geist.woff2 new file mode 100644 index 000000000..d101f19f4 Binary files /dev/null and b/static/fonts/Geist.woff2 differ diff --git a/static/fonts/GeistMono.woff2 b/static/fonts/GeistMono.woff2 new file mode 100644 index 000000000..b96b7d486 Binary files /dev/null and b/static/fonts/GeistMono.woff2 differ diff --git a/static/fonts/GeistMonoVariableVF.woff2 b/static/fonts/GeistMonoVariableVF.woff2 deleted file mode 100644 index dc6d19861..000000000 Binary files a/static/fonts/GeistMonoVariableVF.woff2 and /dev/null differ diff --git a/static/fonts/InterVariable.woff2 b/static/fonts/InterVariable.woff2 deleted file mode 100644 index 22a12b04e..000000000 Binary files a/static/fonts/InterVariable.woff2 and /dev/null differ diff --git a/static/images/banner.png b/static/images/banner.png deleted file mode 100644 index 7dfdd6637..000000000 Binary files a/static/images/banner.png and /dev/null differ diff --git a/static/images/banner_corner.png b/static/images/banner_corner.png deleted file mode 100644 index c02d597ba..000000000 Binary files a/static/images/banner_corner.png and /dev/null differ diff --git a/static/images/hero-pattern_dark.svg b/static/images/hero-pattern_dark.svg deleted file mode 100644 index 177d128b9..000000000 --- a/static/images/hero-pattern_dark.svg +++ /dev/null @@ -1,271 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/images/hero-pattern_light.svg b/static/images/hero-pattern_light.svg deleted file mode 100644 index 5bbe1cc43..000000000 --- a/static/images/hero-pattern_light.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/images/icons/icon-192x192.png b/static/images/icons/icon-192x192.png index b313355cf..02a258558 100644 Binary files a/static/images/icons/icon-192x192.png and b/static/images/icons/icon-192x192.png differ diff --git a/static/images/icons/icon-256x256.png b/static/images/icons/icon-256x256.png index 00ea3a8d3..1e4e5249a 100644 Binary files a/static/images/icons/icon-256x256.png and b/static/images/icons/icon-256x256.png differ diff --git a/static/images/icons/icon-384x384.png b/static/images/icons/icon-384x384.png index bcba72eb5..770f93775 100644 Binary files a/static/images/icons/icon-384x384.png and b/static/images/icons/icon-384x384.png differ diff --git a/static/images/icons/icon-512x512.png b/static/images/icons/icon-512x512.png index abd8c5021..6abc6f948 100644 Binary files a/static/images/icons/icon-512x512.png and b/static/images/icons/icon-512x512.png differ diff --git a/static/images/logo.png b/static/images/logo.png deleted file mode 100644 index bf9ac353f..000000000 Binary files a/static/images/logo.png and /dev/null differ diff --git a/static/images/logo.svg b/static/images/logo.svg deleted file mode 100644 index 4a2fc7dd4..000000000 --- a/static/images/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/images/logo_ico.ico b/static/images/logo_ico.ico deleted file mode 100644 index 65f0d13bb..000000000 Binary files a/static/images/logo_ico.ico and /dev/null differ diff --git a/static/images/readme.png b/static/images/readme.png deleted file mode 100644 index 4554d3fbf..000000000 Binary files a/static/images/readme.png and /dev/null differ diff --git a/static/images/screenshot_dark.png b/static/images/screenshot_dark.png new file mode 100644 index 000000000..2fae026df Binary files /dev/null and b/static/images/screenshot_dark.png differ diff --git a/static/images/screenshot_light-2.png b/static/images/screenshot_light-2.png new file mode 100644 index 000000000..10fbb8c50 Binary files /dev/null and b/static/images/screenshot_light-2.png differ diff --git a/static/images/screenshot_light.png b/static/images/screenshot_light.png new file mode 100644 index 000000000..64857725f Binary files /dev/null and b/static/images/screenshot_light.png differ diff --git a/static/images/svgl.svg b/static/images/svgl.svg deleted file mode 100644 index 8f08f5856..000000000 --- a/static/images/svgl.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/static/images/svgl_ico.ico b/static/images/svgl_ico.ico new file mode 100644 index 000000000..9d08e14f5 Binary files /dev/null and b/static/images/svgl_ico.ico differ diff --git a/static/images/svgl_png.png b/static/images/svgl_png.png new file mode 100644 index 000000000..b5664ac30 Binary files /dev/null and b/static/images/svgl_png.png differ diff --git a/static/images/svgl_svg.svg b/static/images/svgl_svg.svg new file mode 100644 index 000000000..ea19eadc0 --- /dev/null +++ b/static/images/svgl_svg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/library/apache-kafka-wordmark-dark.svg b/static/library/apache-kafka-wordmark-dark.svg index 8bd63967c..9c4ebd9c9 100644 --- a/static/library/apache-kafka-wordmark-dark.svg +++ b/static/library/apache-kafka-wordmark-dark.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/static/library/apache-kafka-wordmark-light.svg b/static/library/apache-kafka-wordmark-light.svg index f3d2eb207..4c2a29e3b 100644 --- a/static/library/apache-kafka-wordmark-light.svg +++ b/static/library/apache-kafka-wordmark-light.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/static/library/apollo.io.svg b/static/library/apollo-io.svg similarity index 100% rename from static/library/apollo.io.svg rename to static/library/apollo-io.svg diff --git a/static/library/cursor_dark.svg b/static/library/cursor_dark.svg index 48439facb..10d50ca84 100644 --- a/static/library/cursor_dark.svg +++ b/static/library/cursor_dark.svg @@ -1 +1,12 @@ -Cursor \ No newline at end of file + + + + + + + + \ No newline at end of file diff --git a/static/library/cursor_light.svg b/static/library/cursor_light.svg index abadee508..635d3ccdc 100644 --- a/static/library/cursor_light.svg +++ b/static/library/cursor_light.svg @@ -1 +1,12 @@ -Cursor \ No newline at end of file + + + + + + + + \ No newline at end of file diff --git a/static/library/cursor_wordmark_dark.svg b/static/library/cursor_wordmark_dark.svg index f350a70db..a3deeca95 100644 --- a/static/library/cursor_wordmark_dark.svg +++ b/static/library/cursor_wordmark_dark.svg @@ -1 +1,17 @@ -Cursor \ No newline at end of file + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/library/cursor_wordmark_light.svg b/static/library/cursor_wordmark_light.svg index 5bbb75b99..c2daa3e28 100644 --- a/static/library/cursor_wordmark_light.svg +++ b/static/library/cursor_wordmark_light.svg @@ -1 +1,17 @@ -Cursor \ No newline at end of file + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/library/intello-wordmark-dark.svg b/static/library/intello_wordmark_dark.svg similarity index 100% rename from static/library/intello-wordmark-dark.svg rename to static/library/intello_wordmark_dark.svg diff --git a/static/library/Intello-wordmark-light.svg b/static/library/intello_wordmark_light.svg similarity index 100% rename from static/library/Intello-wordmark-light.svg rename to static/library/intello_wordmark_light.svg diff --git a/static/library/manifest.svg b/static/library/manifest.svg index f6d77c775..2afb8f6fd 100644 --- a/static/library/manifest.svg +++ b/static/library/manifest.svg @@ -1 +1 @@ - + diff --git a/static/library/npm-wordmark.svg b/static/library/npm-wordmark.svg new file mode 100644 index 000000000..edd7e8352 --- /dev/null +++ b/static/library/npm-wordmark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/static/library/npm.svg b/static/library/npm.svg index edd7e8352..cc69e90ab 100644 --- a/static/library/npm.svg +++ b/static/library/npm.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/static/library/svgl.svg b/static/library/svgl.svg index d44006445..376ea8f5f 100644 --- a/static/library/svgl.svg +++ b/static/library/svgl.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/static/manifest.json b/static/manifest.json index d80e1f41d..34581b463 100644 --- a/static/manifest.json +++ b/static/manifest.json @@ -1,11 +1,11 @@ { - "theme_color": "#161616", - "background_color": "#161616", + "theme_color": "#232323", + "background_color": "#232323", "display": "standalone", "scope": "/", "start_url": "/", - "name": "Svgl", - "short_name": "Svgl", + "name": "SVGL", + "short_name": "SVGL", "description": "A beautiful library with SVG logos", "icons": [ { diff --git a/svelte.config.js b/svelte.config.js index d030e201a..ea08c2b00 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -1,25 +1,20 @@ -import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; +import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; -// ☁️ Adapter: -import adapter from '@sveltejs/adapter-node'; +// Adapter: +import adapter from "@sveltejs/adapter-node"; -// 📦 Extensions: -import { mdsvex } from 'mdsvex'; - -// 📄 Markdown Config: -import { mdsvexOptions } from './markdown.config.js'; - -// 🧡 Svelte config: /** @type {import('@sveltejs/kit').Config} */ const config = { - extensions: ['.svelte', '.md'], - preprocess: [vitePreprocess(), mdsvex(mdsvexOptions)], + extensions: [".svelte", ".svx"], + preprocess: [vitePreprocess()], kit: { adapter: adapter(), alias: { - '@': './src/*' - } - } + "@/*": "./src/*", + "@/lib/*": "./src/lib/*", + "content-collections": "./.content-collections/generated", + }, + }, }; export default config; diff --git a/tailwind.config.ts b/tailwind.config.ts deleted file mode 100644 index fa16311ad..000000000 --- a/tailwind.config.ts +++ /dev/null @@ -1,71 +0,0 @@ -import type { Config } from 'tailwindcss'; - -// Plugins: -import plugin from 'tailwindcss/plugin'; -import defaultTheme from 'tailwindcss/defaultTheme'; -import twTypography from '@tailwindcss/typography'; - -const config = { - darkMode: 'class', - content: ['./src/**/*.{html,js,svelte,ts}'], - theme: { - extend: { - typography: { - DEFAULT: { - css: { - 'code::before': { - content: '""' - }, - 'code::after': { - content: '""' - }, - 'h1 a': { - 'text-decoration': 'none' - }, - 'h2 a': { - 'text-decoration': 'none' - }, - blockquote: { - 'font-style': 'normal' - } - } - }, - quoteless: { - css: { - 'blockquote p:first-of-type::before': { content: 'none' }, - 'blockquote p:first-of-type::after': { content: 'none' } - } - } - }, - colors: { - dark: '#161616', - light: '#f5f5f5' - }, - fontFamily: { - sans: ['InterVariable', ...defaultTheme.fontFamily.sans], - mono: ['GeistMono', ...defaultTheme.fontFamily.mono] - }, - fontSize: { - mini: '14px' - } - } - }, - plugins: [ - twTypography, - ({ addUtilities }) => { - addUtilities({ - '.text-balance': { - 'text-wrap': 'balance' - } - }); - }, - plugin(function ({ addVariant }) { - addVariant( - 'prose-inline-code', - '&.prose :where(:not(pre)>code):not(:where([class~="not-prose"] *))' - ); - }) - ] -} satisfies Config; - -export default config; diff --git a/tsconfig.json b/tsconfig.json index 836f762bb..43447105a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,6 +9,6 @@ "skipLibCheck": true, "sourceMap": true, "strict": true, - "types": ["@figma/plugin-typings"] + "moduleResolution": "bundler" } } diff --git a/utils/check-size.ts b/utils/check-size.ts new file mode 100644 index 000000000..934931216 --- /dev/null +++ b/utils/check-size.ts @@ -0,0 +1,69 @@ +import { readdir, stat } from "fs/promises"; +import { join } from "path"; + +// ⚙️ Settings: +const dir = join(process.cwd(), "static", "library"); +const sizeLimit = 21 * 1024; // 21 KB + +function convertBytes(bytes: number, format: "KB" | "MB" = "KB"): string { + if (format === "KB") { + return (bytes / 1024).toFixed(2) + " KB"; + } else if (format === "MB") { + return (bytes / (1024 * 1024)).toFixed(2) + " MB"; + } else { + return 'Invalid format. Use "KB" or "MB".'; + } +} + +async function checkSize(): Promise { + const files = await readdir(dir); + let maxSize = 0; + const maxFiles: { filename: string; size: string }[] = []; + + try { + for (const file of files) { + const filePath = join(dir, file); + const stats = await stat(filePath); + + if (stats.size >= sizeLimit) { + maxFiles.push({ + filename: file, + size: convertBytes(stats.size), + }); + + if (stats.size > maxSize) { + maxSize = stats.size; + } + } + } + + if (maxFiles.length === 0) { + console.log(`✅ All files are smaller than ${convertBytes(sizeLimit)}.`); + } else { + const message = `❌ There are files bigger than ${convertBytes(sizeLimit)}.`; + throw new Error(message); + } + } catch (error) { + if (error instanceof Error) { + console.error(error.message); + } else { + console.error("❌ Unexpected error:", error); + } + throw error; + } finally { + if (maxFiles.length > 0) { + console.log("🔎 Files found:"); + console.table(maxFiles); + } + + console.log("⚙️ Settings:"); + console.log(`- 📁 Directory: ${dir}`); + console.log(`- 🧱 Size limit: ${convertBytes(sizeLimit)}`); + if (maxSize > 0) { + console.log(`- 🔔 Max size found: ${convertBytes(maxSize)}`); + } + } +} + +// Run the function +checkSize(); diff --git a/utils/check-size/index.js b/utils/check-size/index.js deleted file mode 100644 index c4dfb5cc9..000000000 --- a/utils/check-size/index.js +++ /dev/null @@ -1,67 +0,0 @@ -const { readdir, stat } = require('fs').promises; -const { join } = require('path'); - -// For GitHub Actions: -const core = require('@actions/core'); - -// 🔎 Settings: -const dir = '../../static/library'; -const sizeLimit = 21504; // 21kb; - -function convertBytes(bytes, format = 'KB') { - if (format === 'KB') { - return (bytes / 1024).toFixed(2) + ' KB'; - } else if (format === 'MB') { - return (bytes / (1024 * 1024)).toFixed(2) + ' MB'; - } else { - return 'Invalid format. Use "KB" or "MB".'; - } -} - -async function checkSize() { - const files = await readdir(dir); - let maxSize = 0; - let maxFiles = []; - let message = ''; - - try { - for (const file of files) { - const filePath = join(dir, file); - const stats = await stat(filePath); - - if (stats.size >= sizeLimit) { - maxFiles.push({ - filename: file, - size: convertBytes(stats.size) - }); - if (stats.size > maxSize) { - maxSize = stats.size; - } - } - } - - if (maxFiles.length === 0) { - message = `- ✅ All files are smaller than ${convertBytes(sizeLimit)}`; - core.setOutput('message', message); - } else { - message = `- ❌ There are files bigger than ${convertBytes(sizeLimit)}.`; - throw new Error(message); - } - } catch (err) { - core.setFailed(message); - } finally { - if (maxFiles.length > 0) { - console.log('🔎 Files found:'); - console.table(maxFiles); - } - console.log('⚙️ Settings:'); - console.log(`- 📁 Directory: ${dir}`); - console.log(`- 🧱 Size limit: ${convertBytes(sizeLimit)} bytes`); - if (maxSize > 0) { - console.log(`- 🔔 Max size found: ${convertBytes(maxSize, 'KB')}`); - } - } -} - -// Run the function -checkSize(); diff --git a/utils/check-size/package.json b/utils/check-size/package.json deleted file mode 100644 index e3486b24e..000000000 --- a/utils/check-size/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "@svgl/check-size", - "version": "1.0.0", - "description": "Limit the size of your SVG files", - "main": "index.js", - "author": "@pheralb_", - "license": "ISC", - "keywords": [ - "svg", - "size", - "limit", - "check" - ], - "scripts": { - "start": "node index.js" - }, - "dependencies": { - "@actions/core": "1.10.1", - "@actions/github": "6.0.0" - } -} diff --git a/utils/check-size/pnpm-lock.yaml b/utils/check-size/pnpm-lock.yaml deleted file mode 100644 index 6888c0392..000000000 --- a/utils/check-size/pnpm-lock.yaml +++ /dev/null @@ -1,193 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@actions/core': - specifier: 1.10.1 - version: 1.10.1 - '@actions/github': - specifier: 6.0.0 - version: 6.0.0 - -packages: - - '@actions/core@1.10.1': - resolution: {integrity: sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==} - - '@actions/github@6.0.0': - resolution: {integrity: sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g==} - - '@actions/http-client@2.2.0': - resolution: {integrity: sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==} - - '@fastify/busboy@2.1.0': - resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} - engines: {node: '>=14'} - - '@octokit/auth-token@4.0.0': - resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} - engines: {node: '>= 18'} - - '@octokit/core@5.0.2': - resolution: {integrity: sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg==} - engines: {node: '>= 18'} - - '@octokit/endpoint@9.0.4': - resolution: {integrity: sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==} - engines: {node: '>= 18'} - - '@octokit/graphql@7.0.2': - resolution: {integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==} - engines: {node: '>= 18'} - - '@octokit/openapi-types@19.1.0': - resolution: {integrity: sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==} - - '@octokit/plugin-paginate-rest@9.1.5': - resolution: {integrity: sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '>=5' - - '@octokit/plugin-rest-endpoint-methods@10.2.0': - resolution: {integrity: sha512-ePbgBMYtGoRNXDyKGvr9cyHjQ163PbwD0y1MkDJCpkO2YH4OeXX40c4wYHKikHGZcpGPbcRLuy0unPUuafco8Q==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '>=5' - - '@octokit/request-error@5.0.1': - resolution: {integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==} - engines: {node: '>= 18'} - - '@octokit/request@8.1.6': - resolution: {integrity: sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==} - engines: {node: '>= 18'} - - '@octokit/types@12.4.0': - resolution: {integrity: sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==} - - before-after-hook@2.2.3: - resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - - deprecation@2.3.1: - resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - tunnel@0.0.6: - resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} - engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - - undici@5.28.2: - resolution: {integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==} - engines: {node: '>=14.0'} - - universal-user-agent@6.0.1: - resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - -snapshots: - - '@actions/core@1.10.1': - dependencies: - '@actions/http-client': 2.2.0 - uuid: 8.3.2 - - '@actions/github@6.0.0': - dependencies: - '@actions/http-client': 2.2.0 - '@octokit/core': 5.0.2 - '@octokit/plugin-paginate-rest': 9.1.5(@octokit/core@5.0.2) - '@octokit/plugin-rest-endpoint-methods': 10.2.0(@octokit/core@5.0.2) - - '@actions/http-client@2.2.0': - dependencies: - tunnel: 0.0.6 - undici: 5.28.2 - - '@fastify/busboy@2.1.0': {} - - '@octokit/auth-token@4.0.0': {} - - '@octokit/core@5.0.2': - dependencies: - '@octokit/auth-token': 4.0.0 - '@octokit/graphql': 7.0.2 - '@octokit/request': 8.1.6 - '@octokit/request-error': 5.0.1 - '@octokit/types': 12.4.0 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.1 - - '@octokit/endpoint@9.0.4': - dependencies: - '@octokit/types': 12.4.0 - universal-user-agent: 6.0.1 - - '@octokit/graphql@7.0.2': - dependencies: - '@octokit/request': 8.1.6 - '@octokit/types': 12.4.0 - universal-user-agent: 6.0.1 - - '@octokit/openapi-types@19.1.0': {} - - '@octokit/plugin-paginate-rest@9.1.5(@octokit/core@5.0.2)': - dependencies: - '@octokit/core': 5.0.2 - '@octokit/types': 12.4.0 - - '@octokit/plugin-rest-endpoint-methods@10.2.0(@octokit/core@5.0.2)': - dependencies: - '@octokit/core': 5.0.2 - '@octokit/types': 12.4.0 - - '@octokit/request-error@5.0.1': - dependencies: - '@octokit/types': 12.4.0 - deprecation: 2.3.1 - once: 1.4.0 - - '@octokit/request@8.1.6': - dependencies: - '@octokit/endpoint': 9.0.4 - '@octokit/request-error': 5.0.1 - '@octokit/types': 12.4.0 - universal-user-agent: 6.0.1 - - '@octokit/types@12.4.0': - dependencies: - '@octokit/openapi-types': 19.1.0 - - before-after-hook@2.2.3: {} - - deprecation@2.3.1: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - tunnel@0.0.6: {} - - undici@5.28.2: - dependencies: - '@fastify/busboy': 2.1.0 - - universal-user-agent@6.0.1: {} - - uuid@8.3.2: {} - - wrappy@1.0.2: {} diff --git a/utils/fix-viewbox.ts b/utils/fix-viewbox.ts new file mode 100644 index 000000000..cf93aa644 --- /dev/null +++ b/utils/fix-viewbox.ts @@ -0,0 +1,71 @@ +import { readdir, stat, readFile, writeFile } from "fs/promises"; +import { join } from "path"; + +// ⚙️ Settings: +const dir = join(process.cwd(), "static", "library"); +const fileType = ".svg"; + +async function fixViewbox(): Promise { + try { + const files = await readdir(dir); + + let totalSVGs = 0; + let fixedCount = 0; + const fixedFiles: string[] = []; + + for (const file of files) { + const filePath = join(dir, file); + const fileStat = await stat(filePath); + + if (!fileStat.isFile() || !file.endsWith(fileType)) continue; + + totalSVGs++; + + const fileContent = await readFile(filePath, "utf-8"); + const viewBox = getViewBox(fileContent); + const width = getWidth(fileContent); + const height = getHeight(fileContent); + + if (!width || !height) { + continue; // saltar archivos inválidos + } + + if (!viewBox) { + const newFileContent = fileContent.replace( + " 0) { + console.table(fixedFiles.map((f) => ({ "Fixed SVG:": f }))); + } + + console.log("🚀 Done."); + } catch (error) { + console.error("❌ Error while processing files:", error); + } +} + +function getViewBox(content: string): string | null { + const viewBoxRegex = /viewBox="([^"]+)"/; + return viewBoxRegex.exec(content)?.[1] ?? null; +} + +function getWidth(content: string): string | null { + const widthRegex = /width="([^"]+)"/; + return widthRegex.exec(content)?.[1] ?? null; +} + +function getHeight(content: string): string | null { + const heightRegex = /height="([^"]+)"/; + return heightRegex.exec(content)?.[1] ?? null; +} + +fixViewbox(); diff --git a/utils/fix-viewbox/index.js b/utils/fix-viewbox/index.js deleted file mode 100644 index b902341cf..000000000 --- a/utils/fix-viewbox/index.js +++ /dev/null @@ -1,62 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -const { readdir, stat } = require('fs').promises; -const { readFile, writeFile } = require('fs/promises'); -const { join } = require('path'); - -// 🔎 Settings: -const dir = '../../static/library'; - -async function fixViewbox() { - const files = await readdir(dir); - const fileType = 'svg'; - let message = ''; - - for (const file of files) { - const filePath = join(dir, file); - const fileStat = await stat(filePath); - if (fileStat.isFile() && file.endsWith(fileType)) { - const fileContent = await readFile(filePath); - const viewBox = getViewBox(fileContent); - const width = getWidth(fileContent); - const height = getHeight(fileContent); - if (!viewBox) { - const newFileContent = fileContent - .toString() - .replace('=14'} - - '@octokit/auth-token@4.0.0': - resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} - engines: {node: '>= 18'} - - '@octokit/core@5.0.2': - resolution: {integrity: sha512-cZUy1gUvd4vttMic7C0lwPed8IYXWYp8kHIMatyhY8t8n3Cpw2ILczkV5pGMPqef7v0bLo0pOHrEHarsau2Ydg==} - engines: {node: '>= 18'} - - '@octokit/endpoint@9.0.4': - resolution: {integrity: sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==} - engines: {node: '>= 18'} - - '@octokit/graphql@7.0.2': - resolution: {integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==} - engines: {node: '>= 18'} - - '@octokit/openapi-types@19.1.0': - resolution: {integrity: sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw==} - - '@octokit/plugin-paginate-rest@9.1.5': - resolution: {integrity: sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '>=5' - - '@octokit/plugin-rest-endpoint-methods@10.2.0': - resolution: {integrity: sha512-ePbgBMYtGoRNXDyKGvr9cyHjQ163PbwD0y1MkDJCpkO2YH4OeXX40c4wYHKikHGZcpGPbcRLuy0unPUuafco8Q==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '>=5' - - '@octokit/request-error@5.0.1': - resolution: {integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==} - engines: {node: '>= 18'} - - '@octokit/request@8.1.6': - resolution: {integrity: sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==} - engines: {node: '>= 18'} - - '@octokit/types@12.4.0': - resolution: {integrity: sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==} - - before-after-hook@2.2.3: - resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - - deprecation@2.3.1: - resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - tunnel@0.0.6: - resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} - engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - - undici@5.28.2: - resolution: {integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==} - engines: {node: '>=14.0'} - - universal-user-agent@6.0.1: - resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - -snapshots: - - '@actions/core@1.10.1': - dependencies: - '@actions/http-client': 2.2.0 - uuid: 8.3.2 - - '@actions/github@6.0.0': - dependencies: - '@actions/http-client': 2.2.0 - '@octokit/core': 5.0.2 - '@octokit/plugin-paginate-rest': 9.1.5(@octokit/core@5.0.2) - '@octokit/plugin-rest-endpoint-methods': 10.2.0(@octokit/core@5.0.2) - - '@actions/http-client@2.2.0': - dependencies: - tunnel: 0.0.6 - undici: 5.28.2 - - '@fastify/busboy@2.1.0': {} - - '@octokit/auth-token@4.0.0': {} - - '@octokit/core@5.0.2': - dependencies: - '@octokit/auth-token': 4.0.0 - '@octokit/graphql': 7.0.2 - '@octokit/request': 8.1.6 - '@octokit/request-error': 5.0.1 - '@octokit/types': 12.4.0 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.1 - - '@octokit/endpoint@9.0.4': - dependencies: - '@octokit/types': 12.4.0 - universal-user-agent: 6.0.1 - - '@octokit/graphql@7.0.2': - dependencies: - '@octokit/request': 8.1.6 - '@octokit/types': 12.4.0 - universal-user-agent: 6.0.1 - - '@octokit/openapi-types@19.1.0': {} - - '@octokit/plugin-paginate-rest@9.1.5(@octokit/core@5.0.2)': - dependencies: - '@octokit/core': 5.0.2 - '@octokit/types': 12.4.0 - - '@octokit/plugin-rest-endpoint-methods@10.2.0(@octokit/core@5.0.2)': - dependencies: - '@octokit/core': 5.0.2 - '@octokit/types': 12.4.0 - - '@octokit/request-error@5.0.1': - dependencies: - '@octokit/types': 12.4.0 - deprecation: 2.3.1 - once: 1.4.0 - - '@octokit/request@8.1.6': - dependencies: - '@octokit/endpoint': 9.0.4 - '@octokit/request-error': 5.0.1 - '@octokit/types': 12.4.0 - universal-user-agent: 6.0.1 - - '@octokit/types@12.4.0': - dependencies: - '@octokit/openapi-types': 19.1.0 - - before-after-hook@2.2.3: {} - - deprecation@2.3.1: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - tunnel@0.0.6: {} - - undici@5.28.2: - dependencies: - '@fastify/busboy': 2.1.0 - - universal-user-agent@6.0.1: {} - - uuid@8.3.2: {} - - wrappy@1.0.2: {} diff --git a/utils/generate-registry.ts b/utils/generate-registry.ts new file mode 100644 index 000000000..b59263a1c --- /dev/null +++ b/utils/generate-registry.ts @@ -0,0 +1,343 @@ +import type { iSVG } from "../src/types/svg"; + +import fs from "fs"; +import path from "path"; +import { exec } from "child_process"; +import { promisify } from "util"; + +import { svgs } from "../src/data/svgs"; +import { optimizeSvg } from "../src/utils/optimizeSvg"; +import { parseSvgFilename } from "../src/utils/parseSvgFilename"; +import { parseReactSvgContent } from "../src/utils/parseReactSvgContent"; + +const execAsync = promisify(exec); + +// ⚙️ Settings: +const REGENERATE_ALL = true; +const SVGS_DATA = svgs; +const PUBLIC_FOLDER = "static"; +const SHADCN_COMMAND = "shadcn build --output ./static/r"; +const OUTPUT_DIR = "./static/components-generated"; + +// 🛠️ Shadcn Schema: +interface RegistryFile { + path: string; + type: string; + target: string; +} + +interface RegistryItem { + name: string; + type: string; + title: string; + files: RegistryFile[]; +} + +interface ShadcnSchema { + $schema: string; + name: string; + homepage: string; + items: RegistryItem[]; +} + +const shadcnSchema: ShadcnSchema = { + $schema: "https://ui.shadcn.com/schema/registry.json", + name: "svgl", + homepage: "https://svgl.app", + items: [], +}; + +// 🧑‍🚀 Function to prepare registry.json content: +function prepareRegistryJson(): ShadcnSchema { + const registryItems: RegistryItem[] = []; + + SVGS_DATA.forEach((svg) => { + if (!REGENERATE_ALL) return; + const componentName = svg.title + .toLowerCase() + .replace(/\s+/g, "-") + .replace(/[^a-z0-9-]/g, ""); + + const files: RegistryFile[] = []; + + const svgPaths = extractSvgPaths(svg); + + svgPaths.forEach((svgFile) => { + const tsxComponentName = parseSvgFilename({ + file: svgFile.filename, + log: false, + }); + files.push({ + path: `./${OUTPUT_DIR}/${tsxComponentName}.tsx`, + type: "registry:component", + target: `components/ui/svgs/${tsxComponentName}.tsx`, + }); + }); + + if (files.length > 0) { + registryItems.push({ + name: componentName, + type: "registry:component", + title: componentName, + files: files, + }); + } + }); + + return { + ...shadcnSchema, + items: registryItems, + }; +} + +// 🧑‍🚀 Function to generate registry.json: +async function generateRegistryJson(): Promise { + try { + const registryContent = prepareRegistryJson(); + const registryPath = "./registry.json"; + + await fs.promises.writeFile( + registryPath, + JSON.stringify(registryContent, null, 2), + "utf-8", + ); + + console.log( + `[📄] File registry.json generated with ${registryContent.items.length} TSX components`, + ); + } catch (error) { + console.error("[❌] Error generating registry.json:", error); + throw new Error(error as string); + } +} + +// 🧑‍🚀 Utility functions for extracting SVG paths: +function extractSvgPaths(svg: iSVG): { path: string; filename: string }[] { + const paths: { path: string; filename: string }[] = []; + + if (typeof svg.route === "string") { + paths.push({ + path: svg.route, + filename: svg.route.split("/").pop() || "", + }); + } else if ( + typeof svg.route === "object" && + svg.route.light && + svg.route.dark + ) { + paths.push( + { + path: svg.route.light, + filename: svg.route.light.split("/").pop() || "", + }, + { + path: svg.route.dark, + filename: svg.route.dark.split("/").pop() || "", + }, + ); + } + + if (svg.wordmark) { + if (typeof svg.wordmark === "string") { + paths.push({ + path: svg.wordmark, + filename: svg.wordmark.split("/").pop() || "", + }); + } else if ( + typeof svg.wordmark === "object" && + svg.wordmark.light && + svg.wordmark.dark + ) { + paths.push( + { + path: svg.wordmark.light, + filename: svg.wordmark.light.split("/").pop() || "", + }, + { + path: svg.wordmark.dark, + filename: svg.wordmark.dark.split("/").pop() || "", + }, + ); + } + } + + return paths; +} + +function getAllSvgFiles(): { path: string; filename: string }[] { + const allPaths: { path: string; filename: string }[] = []; + + SVGS_DATA.forEach((svg) => { + const paths = extractSvgPaths(svg); + allPaths.push(...paths); + }); + + const uniquePaths = allPaths.filter( + (path, index, self) => + index === self.findIndex((p) => p.filename === path.filename), + ); + + return uniquePaths; +} + +function convertToFilesystemPath(svgPath: string): string { + const cleanPath = svgPath.startsWith("/") ? svgPath.slice(1) : svgPath; + return `./${PUBLIC_FOLDER}/${cleanPath}`; +} + +async function convertSvgToReact(svgPath: string): Promise { + const rawSvg = await fs.promises.readFile(svgPath, "utf-8"); + const optimizedSvg = optimizeSvg({ svgCode: rawSvg }); + const componentName = parseSvgFilename({ + file: path.basename(svgPath, ".svg"), + log: true, + firstUpperCase: true, + }); + const code = await parseReactSvgContent({ + componentName, + svgCode: optimizedSvg, + typescript: true, + }); + return code; +} + +async function cleanupDirectory(dirPath: string) { + try { + if ( + await fs.promises + .access(dirPath) + .then(() => true) + .catch(() => false) + ) { + await fs.promises.rm(dirPath, { recursive: true, force: true }); + console.log(`[🗑️] Folder ${dirPath} deleted successfully`); + } + } catch (error) { + console.warn(`[⚠️] Could not delete folder ${dirPath}: ${error}`); + } +} + +async function runShadcnBuild() { + try { + console.log("[🔨] Running shadcn build..."); + const { stdout, stderr } = await execAsync(SHADCN_COMMAND); + + if (stdout) { + console.log("[✅] shadcn build completed:"); + console.log(stdout); + } + + if (stderr && !stderr.includes("warning")) { + console.error("[❌] Errors in shadcn build:"); + console.error(stderr); + } + } catch (error) { + console.error("[❌] Error running shadcn build:", error); + throw new Error(error as string); + } +} + +const checkFinallyDirs = async () => { + // Check if static/r directory exists + const rDirExists = await fs.promises + .access(`./${PUBLIC_FOLDER}/r`) + .then(() => true) + .catch(() => false); + + if (!rDirExists) { + console.error("[🔎] Error - Directory ./static/r does not exist"); + return; + } else { + console.log("[🔎] Directory ./static/r exists"); + } + + // Check if registry.json exists + const registryExists = await fs.promises + .access("./registry.json") + .then(() => true) + .catch(() => false); + + if (!registryExists) { + console.error("[🔎] Error - File registry.json does not exist"); + return; + } else { + console.log("[🔎] File registry.json exists"); + } +}; + +async function run() { + let convertedCount = 0; + let totalCount = 0; + + try { + await fs.promises.mkdir(OUTPUT_DIR, { recursive: true }); + + const svgFiles = REGENERATE_ALL + ? getAllSvgFiles() + : getAllSvgFiles().filter((svgFile) => { + const svgObj = SVGS_DATA.find((svg) => { + const paths = extractSvgPaths(svg); + return paths.some((p) => p.filename === svgFile.filename); + }); + return svgObj && !svgObj.shadcnCommand; + }); + totalCount = svgFiles.length; + + if (totalCount === 0) { + console.log("[❌] No SVG files found in SVGS_DATA."); + return; + } + + console.log(`[📦] Converting ${totalCount} SVGs converted to TSX...`); + + // Process files + for (const svgFile of svgFiles) { + try { + const filesystemPath = convertToFilesystemPath(svgFile.path); + + // Check if file exists before processing + const fileExists = await fs.promises + .access(filesystemPath) + .then(() => true) + .catch(() => false); + + if (!fileExists) { + console.error(`\n[⚠️] File not found: ${filesystemPath}`); + continue; + } + + const tsx = await convertSvgToReact(filesystemPath); + const outPath = path.join( + OUTPUT_DIR, + parseSvgFilename({ file: svgFile.filename, log: false }) + ".tsx", + ); + await fs.promises.writeFile(outPath, tsx, "utf-8"); + convertedCount++; + } catch (error) { + console.error(`\n[❌] Error processing ${svgFile.filename}:`, error); + throw new Error(error as string); + } + } + console.log( + `\n[📦] ✨ Conversion completed: ${convertedCount}/${totalCount} SVGs processed`, + ); + + if (convertedCount < totalCount) { + console.log(`[⚠️] ${totalCount - convertedCount} SVGs had errors.`); + } + + if (convertedCount > 0) { + await generateRegistryJson(); + await runShadcnBuild(); + } + } catch (error) { + console.error("[❌] Error:", error); + throw new Error(error as string); + } finally { + await checkFinallyDirs(); + await cleanupDirectory(OUTPUT_DIR); + console.log("[🎉] Process completed"); + } +} + +run(); diff --git a/vercel.json b/vercel.json deleted file mode 100644 index 53daa31b7..000000000 --- a/vercel.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "headers": [ - { - "source": "/:all*(ttf|otf|woff|woff2)", - "headers": [ - { - "key": "Cache-Control", - "value": "public, max-age=31536000, immutable" - } - ] - } - ], - "redirects": [ - { - "source": "/git", - "destination": "https://github.com/pheralb/svgl" - }, - { - "source": "/raycast", - "destination": "https://www.raycast.com/1weiho/svgl" - }, - { - "source": "/vscode", - "destination": "https://marketplace.visualstudio.com/items?itemName=EsteveSegura.svgl" - }, - { - "source": "/figma", - "destination": "https://www.figma.com/community/plugin/1320306989350693206/svgl" - }, - { - "source": "/terminal", - "destination": "https://github.com/sujjeee/svgls" - }, - { - "source": "/badges", - "destination": "https://svgl-badge.vercel.app/" - } - ] -} diff --git a/vite.config.ts b/vite.config.ts index 0131ff95d..512252de4 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,9 +1,10 @@ -import { sveltekit } from '@sveltejs/kit/vite'; -import { defineConfig } from 'vitest/config'; +import { defineConfig } from "vite"; + +// Plugins: +import tailwindcss from "@tailwindcss/vite"; +import { sveltekit } from "@sveltejs/kit/vite"; +import contentCollections from "@content-collections/vite"; export default defineConfig({ - plugins: [sveltekit()], - test: { - include: ['src/**/*.{test,spec}.{js,ts}'] - } + plugins: [tailwindcss(), sveltekit(), contentCollections()], });